From 8ed7a0530b3ff7edb40a480163a2fb3451d6b69d Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 19 Feb 2023 19:29:53 +0100 Subject: [PATCH 001/223] Fixed (bnd.) cell ranges and extend them to faces. On branch bojan_fixed_cell_ranges modified: Shared/Boundary_Mod.f90 new file: Shared/Browse.h90 modified: Shared/Grid_Mod.f90 modified: Shared/Grid_Mod/Bnd_Cond_Ranges.f90 modified: Shared/Grid_Mod/Sort_Faces_Smart.f90 --- Sources/Shared/Boundary_Mod.f90 | 2 + Sources/Shared/Browse.h90 | 13 +++ Sources/Shared/Grid_Mod.f90 | 1 + Sources/Shared/Grid_Mod/Bnd_Cond_Ranges.f90 | 88 +++++++++++++++++--- Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 | 31 +++---- 5 files changed, 109 insertions(+), 26 deletions(-) create mode 100644 Sources/Shared/Browse.h90 diff --git a/Sources/Shared/Boundary_Mod.f90 b/Sources/Shared/Boundary_Mod.f90 index f4b864821..17a0678fc 100644 --- a/Sources/Shared/Boundary_Mod.f90 +++ b/Sources/Shared/Boundary_Mod.f90 @@ -38,6 +38,8 @@ module Boundary_Mod integer, allocatable :: color(:) integer, allocatable :: color_s_cell(:) ! start bnd cell for color integer, allocatable :: color_e_cell(:) ! end bnd cell for color + integer, allocatable :: color_s_face(:) ! start bnd cell for color + integer, allocatable :: color_e_face(:) ! end bnd cell for color end type diff --git a/Sources/Shared/Browse.h90 b/Sources/Shared/Browse.h90 new file mode 100644 index 000000000..ffe95fdb7 --- /dev/null +++ b/Sources/Shared/Browse.h90 @@ -0,0 +1,13 @@ +!==============================================================================! +! Definition of potentially usefull macros in T-Flows. ! +!------------------------------------------------------------------------------! + +# define Browse_All_Cells(c) do c = -Grid % n_bnd_cells, Grid % n_cells +# define Browse_Boundary_Cells(c) do c = -Grid % n_bnd_cells, -1 +# define Browse_Inside_Cells(c) do c = 1, Grid % n_cells +# define Browse_Faces(c) do s = 1, Grid % n_faces + +# define Browse_Faces_In_Color(s, color) do s = Grid % bnd_cond % color_s_face(color), Grid % bnd_cond % color_e_face(color) +# define End_Browse end do + + diff --git a/Sources/Shared/Grid_Mod.f90 b/Sources/Shared/Grid_Mod.f90 index 419e17fdf..53a4b36fc 100644 --- a/Sources/Shared/Grid_Mod.f90 +++ b/Sources/Shared/Grid_Mod.f90 @@ -1,4 +1,5 @@ #include "../Shared/Assert.h90" +#include "../Shared/Browse.h90" !==============================================================================! module Grid_Mod diff --git a/Sources/Shared/Grid_Mod/Bnd_Cond_Ranges.f90 b/Sources/Shared/Grid_Mod/Bnd_Cond_Ranges.f90 index b1160c915..d8c9c6cd1 100644 --- a/Sources/Shared/Grid_Mod/Bnd_Cond_Ranges.f90 +++ b/Sources/Shared/Grid_Mod/Bnd_Cond_Ranges.f90 @@ -7,30 +7,94 @@ subroutine Bnd_Cond_Ranges(Grid) implicit none !---------------------------------[Arguments]----------------------------------! class(Grid_Type) :: Grid +!------------------------------[Local parameters]------------------------------! + logical, parameter :: DEBUG = .false. !-----------------------------------[Locals]-----------------------------------! - integer :: c, color + integer :: c2, color, s !==============================================================================! ! Allocate memory - allocate(Grid % bnd_cond % color_s_cell(Grid % n_bnd_cond)) - allocate(Grid % bnd_cond % color_e_cell(Grid % n_bnd_cond)) + allocate(Grid % bnd_cond % color_s_cell(0:Grid % n_bnd_cond)) + allocate(Grid % bnd_cond % color_e_cell(0:Grid % n_bnd_cond)) + + !-------------------! + ! Cells' ranges ! + !-------------------! ! Set non-realizable ranges Grid % bnd_cond % color_s_cell(:) = -1 - Grid % bnd_cond % color_e_cell(:) = 0 + Grid % bnd_cond % color_e_cell(:) = -HUGE_INT ! Browse forward and backward to find first and last cell for each range - do c = -1, -Grid % n_bnd_cells, -1 - color = Grid % bnd_cond % color(c) - if(c < Grid % bnd_cond % color_e_cell(color)) then - Grid % bnd_cond % color_e_cell(color) = c + do c2 = -Grid % n_bnd_cells, -1 + if(Grid % Comm % cell_proc(c2) .eq. this_proc) then + color = Grid % bnd_cond % color(c2) + if(c2 < Grid % bnd_cond % color_s_cell(color)) then + Grid % bnd_cond % color_s_cell(color) = c2 + end if end if end do - do c = -Grid % n_bnd_cells, -1 - color = Grid % bnd_cond % color(c) - if(c > Grid % bnd_cond % color_e_cell(color)) then - Grid % bnd_cond % color_s_cell(color) = c + + do c2 = -1, -Grid % n_bnd_cells, -1 + if(Grid % Comm % cell_proc(c2) .eq. this_proc) then + color = Grid % bnd_cond % color(c2) + if(c2 > Grid % bnd_cond % color_e_cell(color)) then + Grid % bnd_cond % color_e_cell(color) = c2 + end if end if end do + if(DEBUG) then + write(1000, '(a)') ' # Cell ranges' + do color = 1, Grid % n_bnd_cond + write(1000+this_proc,'(a,i3,i9,i9)') ' # Region: ', color, & + Grid % bnd_cond % color_s_cell(color), & + Grid % bnd_cond % color_e_cell(color) + end do + end if + + !-------------------! + ! Faces' ranges ! + !-------------------! + + ! Allocate memory + allocate(Grid % bnd_cond % color_s_face(0:Grid % n_bnd_cond)) + allocate(Grid % bnd_cond % color_e_face(0:Grid % n_bnd_cond)) + + ! Set non-realizable ranges + Grid % bnd_cond % color_s_face(:) = -1 + Grid % bnd_cond % color_e_face(:) = -HUGE_INT + + ! Browse through colors and faces to set faces' ranges + do color = 1, Grid % n_bnd_cond + do s = 1, Grid % n_faces + c2 = Grid % faces_c(2, s) + if(Grid % bnd_cond % color_s_cell(color) .eq. c2) then + Grid % bnd_cond % color_s_face(color) = s + end if + if(Grid % bnd_cond % color_e_cell(color) .eq. c2) then + Grid % bnd_cond % color_e_face(color) = s + end if + end do + end do + + if(DEBUG) then + write(2000, '(a)') ' # Face ranges' + do color = 1, Grid % n_bnd_cond + write(2000+this_proc,'(a,i3,i9,i9)') ' # Region: ', color, & + Grid % bnd_cond % color_s_face(color), & + Grid % bnd_cond % color_e_face(color) + end do + end if + + !-----------! + ! Check ! + !-----------! + do color = 1, Grid % n_bnd_cond + Browse_Faces_In_Color(s, color) + c2 = Grid % faces_c(2, s) + Assert(Grid % bnd_cond % color(c2) == color) + End_Browse + end do + end subroutine diff --git a/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 b/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 index ae94d87a9..4989811bb 100644 --- a/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 +++ b/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 @@ -12,8 +12,7 @@ subroutine Sort_Faces_Smart(Grid) !---------------------------------[Arguments]----------------------------------! class(Grid_Type) :: Grid !------------------------------[Local parameters]------------------------------! - integer, parameter :: BIG = 2147483647 ! Euler's prime number - logical, parameter :: VERBOSE = .false. + logical, parameter :: DEBUG = .false. !-----------------------------------[Locals]-----------------------------------! integer :: s, m, n, c, c1, c2, n_bc, color integer :: max_diff_1, max_diff_2, c1_s1, c2_s1, c1_s2, c2_s2 @@ -45,14 +44,10 @@ subroutine Sort_Faces_Smart(Grid) do s = 1, Grid % n_faces c1 = Grid % faces_c(1, s) c2 = Grid % faces_c(2, s) + criteria(s,1) = HUGE_INT + if(c2 < 0) criteria(s,1) = Grid % bnd_cond % color(c2) criteria(s,2) = c1 criteria(s,3) = c2 - if(c2 > 0) then - criteria(s,1) = BIG ! make sure that inside faces end up last - else - criteria(s,1) = Grid % bnd_cond % color(c2) - criteria(s,3) = -criteria(s,3) - end if Grid % old_f(s) = s end do @@ -74,15 +69,20 @@ subroutine Sort_Faces_Smart(Grid) Grid % faces_c(1,s) = criteria(s,2) Grid % faces_c(2,s) = criteria(s,3) + c2 = criteria(s,3) + ! ... but renumber c2 if on the boundary - if(criteria(s,1) .ne. BIG) then ! on the boundary - n_bc = n_bc + 1 ! increase the count - Grid % faces_c(2,s) = -n_bc ! set face_c properly - Grid % old_c(-n_bc) = -criteria(s,3) ! store the old number - else + if(criteria(s,1) .ne. HUGE_INT) then ! on the boundary + Grid % faces_c(2,s) = -Grid % n_bnd_cells + n_bc ! set face_c properly + Grid % old_c(-Grid % n_bnd_cells + n_bc) = c2 ! store the old number + n_bc = n_bc + 1 ! increase the count end if + end do + ! Check if counting ended well + Assert(n_bc == Grid % n_bnd_cells) + !------------------------------------------------------! ! Using the old boundary cell number, retreive ! ! their boundary colors and geometrical quantities ! @@ -166,7 +166,7 @@ subroutine Sort_Faces_Smart(Grid) ! Find boundary color ranges call Bnd_Cond_Ranges(Grid) - if(VERBOSE) then + if(DEBUG) then do s = 1, Grid % n_faces c1 = Grid % faces_c(1, s) c2 = Grid % faces_c(2, s) @@ -201,7 +201,10 @@ subroutine Sort_Faces_Smart(Grid) end if end if end do + + print '(a)', ' #==========================================================' print '(a)', ' # In Sort_Faces_Smart' + print '(a)', ' #----------------------------------------------------------' print '(a,i9)', ' # Maximum cell difference at single face: ', max_diff_1 print '(a,i9)', ' # Maximum cell difference betwen two faces: ', max_diff_2 From 1c55e053c5eb8e99830f0046fe119e014710d35a Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 19 Feb 2023 21:09:28 +0100 Subject: [PATCH 002/223] Renamed regions to ranges in Generator. (Regions would be more usefull globally) On branch bojan_fixed_cell_ranges modified: Generate/Domain_Mod.f90 renamed: Generate/Domain_Mod/Allocate_Regions.f90 -> Generate/Domain_Mod/Allocate_Ranges.f90 renamed: Generate/Domain_Mod/Distribute_Regions.f90 -> Generate/Domain_Mod/Distribute_Ranges.f90 modified: Generate/Generate_Mod/Load_Dom.f90 modified: Generate/Main_Gen.f90 renamed: Generate/Region_Mod.f90 -> Generate/Range_Mod.f90 modified: Generate/Refines_Mod.f90 modified: Generate/Refines_Mod/Allocate_Levels.f90 modified: Generate/Refines_Mod/Mark_Cells.f90 modified: Generate/makefile modified: Generate/makefile_explicit_dependencies --- Sources/Generate/Domain_Mod.f90 | 24 +++--- ...locate_Regions.f90 => Allocate_Ranges.f90} | 6 +- ...bute_Regions.f90 => Distribute_Ranges.f90} | 76 ++++++++--------- Sources/Generate/Generate_Mod/Load_Dom.f90 | 82 +++++++++---------- Sources/Generate/Main_Gen.f90 | 2 +- .../{Region_Mod.f90 => Range_Mod.f90} | 10 +-- Sources/Generate/Refines_Mod.f90 | 4 +- .../Generate/Refines_Mod/Allocate_Levels.f90 | 4 +- Sources/Generate/Refines_Mod/Mark_Cells.f90 | 22 ++--- Sources/Generate/makefile | 2 +- .../Generate/makefile_explicit_dependencies | 6 +- 11 files changed, 119 insertions(+), 119 deletions(-) rename Sources/Generate/Domain_Mod/{Allocate_Regions.f90 => Allocate_Ranges.f90} (80%) rename Sources/Generate/Domain_Mod/{Distribute_Regions.f90 => Distribute_Ranges.f90} (59%) rename Sources/Generate/{Region_Mod.f90 => Range_Mod.f90} (90%) diff --git a/Sources/Generate/Domain_Mod.f90 b/Sources/Generate/Domain_Mod.f90 index ec42caa57..595160dcf 100644 --- a/Sources/Generate/Domain_Mod.f90 +++ b/Sources/Generate/Domain_Mod.f90 @@ -3,11 +3,11 @@ module Domain_Mod !------------------------------------------------------------------------------! ! Domain as the one used in "Generator" ! !------------------------------------------------------------------------------! - use Gen_Mod ! a relict from the past - use Point_Mod, only: Point_Type - use Line_Mod, only: Line_Type - use Block_Mod, only: Block_Type - use Region_Mod, only: Region_Type ! to store boundary conditions + use Gen_Mod ! a relict from the past + use Point_Mod, only: Point_Type + use Line_Mod, only: Line_Type + use Block_Mod, only: Block_Type + use Range_Mod, only: Range_Type ! to store boundary conditions use Grid_Mod !------------------------------------------------------------------------------! implicit none @@ -21,13 +21,13 @@ module Domain_Mod integer :: n_points integer :: n_blocks integer :: n_lines - integer :: n_regions + integer :: n_ranges integer :: n_smooths - type(Point_Type), allocatable :: points(:) - type(Block_Type), allocatable :: blocks(:) - type(Line_Type), allocatable :: lines(:) - type(Region_Type), allocatable :: regions(:) + type(Point_Type), allocatable :: points(:) + type(Block_Type), allocatable :: blocks(:) + type(Line_Type), allocatable :: lines(:) + type(Range_Type), allocatable :: ranges(:) end type @@ -39,12 +39,12 @@ module Domain_Mod # include "Domain_Mod/Allocate_Points.f90" # include "Domain_Mod/Allocate_Blocks.f90" # include "Domain_Mod/Allocate_Lines.f90" -# include "Domain_Mod/Allocate_Regions.f90" +# include "Domain_Mod/Allocate_Ranges.f90" # include "Domain_Mod/Calculate_Node_Coordinates.f90" # include "Domain_Mod/Connect_Blocks.f90" # include "Domain_Mod/Connect_Periodicity.f90" # include "Domain_Mod/Distribute_Nodes.f90" -# include "Domain_Mod/Distribute_Regions.f90" +# include "Domain_Mod/Distribute_Ranges.f90" # include "Domain_Mod/Find_Line.f90" # include "Domain_Mod/Find_Surface.f90" # include "Domain_Mod/Is_Line_In_Block.f90" diff --git a/Sources/Generate/Domain_Mod/Allocate_Regions.f90 b/Sources/Generate/Domain_Mod/Allocate_Ranges.f90 similarity index 80% rename from Sources/Generate/Domain_Mod/Allocate_Regions.f90 rename to Sources/Generate/Domain_Mod/Allocate_Ranges.f90 index 2f430cb9d..5bb36f5d9 100644 --- a/Sources/Generate/Domain_Mod/Allocate_Regions.f90 +++ b/Sources/Generate/Domain_Mod/Allocate_Ranges.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Domain_Mod_Allocate_Regions(dom, n) + subroutine Domain_Mod_Allocate_Ranges(dom, n) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -7,7 +7,7 @@ subroutine Domain_Mod_Allocate_Regions(dom, n) integer :: n !==============================================================================! - dom % n_regions = n - allocate(dom % regions(n)) + dom % n_ranges = n + allocate(dom % ranges(n)) end subroutine diff --git a/Sources/Generate/Domain_Mod/Distribute_Regions.f90 b/Sources/Generate/Domain_Mod/Distribute_Ranges.f90 similarity index 59% rename from Sources/Generate/Domain_Mod/Distribute_Regions.f90 rename to Sources/Generate/Domain_Mod/Distribute_Ranges.f90 index 0e760bf18..cc656d443 100644 --- a/Sources/Generate/Domain_Mod/Distribute_Regions.f90 +++ b/Sources/Generate/Domain_Mod/Distribute_Ranges.f90 @@ -1,7 +1,7 @@ !==============================================================================! - subroutine Domain_Mod_Distribute_Regions(dom, Grid) + subroutine Domain_Mod_Distribute_Ranges(dom, Grid) !------------------------------------------------------------------------------! -! Distribute regions (defined in .dom file) to boundary conditions ! +! Distribute ranges (defined in .dom file) to boundary conditions ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -22,14 +22,14 @@ subroutine Domain_Mod_Distribute_Regions(dom, Grid) ! This is too much memory but that's OK ! (+1 is to store the default values) - allocate(Grid % bnd_cond % name(dom % n_regions + 1)) + allocate(Grid % bnd_cond % name(dom % n_ranges + 1)) ! Initialize number of boundary conditions n_bnd = 0 - do n = 1, dom % n_regions + do n = 1, dom % n_ranges - b = dom % regions(n) % block + b = dom % ranges(n) % block ! Block resolution ci = dom % blocks(b) % resolutions(1)-1 @@ -45,60 +45,60 @@ subroutine Domain_Mod_Distribute_Regions(dom, Grid) ke = ck ! Boundary conditions prescribed with mnemonics - if(dom % regions(n) % face .eq. 'IMIN') then - ie=1 + if(dom % ranges(n) % face .eq. 'IMIN') then + ie = 1 face = 5 - else if(dom % regions(n) % face .eq. 'IMAX') then - is=ci + else if(dom % ranges(n) % face .eq. 'IMAX') then + is = ci face = 3 - else if(dom % regions(n) % face .eq. 'JMIN') then - je=1 + else if(dom % ranges(n) % face .eq. 'JMIN') then + je = 1 face = 2 - else if(dom % regions(n) % face .eq. 'JMAX') then - js=cj + else if(dom % ranges(n) % face .eq. 'JMAX') then + js = cj face = 4 - else if(dom % regions(n) % face .eq. 'KMIN') then - ke=1 + else if(dom % ranges(n) % face .eq. 'KMIN') then + ke = 1 face = 1 - else if(dom % regions(n) % face .eq. 'KMAX') then - ks=ck + else if(dom % ranges(n) % face .eq. 'KMAX') then + ks = ck face = 6 ! Boundary conditions prescribed explicitly ! (error prone and difficult, but might be usefull) - else - is = dom % regions(n) % is - js = dom % regions(n) % js - ks = dom % regions(n) % ks - ie = dom % regions(n) % ie - je = dom % regions(n) % je - ke = dom % regions(n) % ke + else + is = dom % ranges(n) % is + js = dom % ranges(n) % js + ks = dom % ranges(n) % ks + ie = dom % ranges(n) % ie + je = dom % ranges(n) % je + ke = dom % ranges(n) % ke face = 0 - if( (is .eq. ie).and.(is .eq. 1) ) face=5 - if( (is .eq. ie).and.(is .eq. ci) ) face=3 - if( (js .eq. je).and.(js .eq. 1) ) face=2 - if( (js .eq. je).and.(js .eq. cj) ) face=4 - if( (ks .eq. ke).and.(ks .eq. 1) ) face=1 - if( (ks .eq. ke).and.(ks .eq. ck) ) face=6 + if( (is .eq. ie).and.(is .eq. 1) ) face = 5 + if( (is .eq. ie).and.(is .eq. ci) ) face = 3 + if( (js .eq. je).and.(js .eq. 1) ) face = 2 + if( (js .eq. je).and.(js .eq. cj) ) face = 4 + if( (ks .eq. ke).and.(ks .eq. 1) ) face = 1 + if( (ks .eq. ke).and.(ks .eq. ck) ) face = 6 end if - ! Store boundary condition - if(face .ne. 0) then + ! Store boundary condition + if(face .ne. 0) then - found = .false. + found = .false. do r=1,n_bnd if( Grid % bnd_cond % name(r) .eq. & - dom % regions(n) % name ) found = .true. + dom % ranges(n) % name ) found = .true. end do if( .not. found) then n_bnd = n_bnd + 1 - Grid % bnd_cond % name(n_bnd) = dom % regions(n) % name + Grid % bnd_cond % name(n_bnd) = dom % ranges(n) % name end if do i=is,ie do j=js,je do k=ks,ke - c = dom % blocks(b) % n_cells + (k-1)*ci*cj + (j-1)*ci + i + c = dom % blocks(b) % n_cells + (k-1)*ci*cj + (j-1)*ci + i Grid % cells_c(face,c) = -n_bnd end do end do @@ -106,10 +106,10 @@ subroutine Domain_Mod_Distribute_Regions(dom, Grid) end if - end do ! n_regions + end do ! n_ranges ! Store the number of boundary conditions - Grid % n_bnd_cond = n_bnd + Grid % n_bnd_cond = n_bnd call Grid % Print_Bnd_Cond_List() diff --git a/Sources/Generate/Generate_Mod/Load_Dom.f90 b/Sources/Generate/Generate_Mod/Load_Dom.f90 index 3f00eb080..d4e647fb1 100644 --- a/Sources/Generate/Generate_Mod/Load_Dom.f90 +++ b/Sources/Generate/Generate_Mod/Load_Dom.f90 @@ -290,38 +290,38 @@ subroutine Load_Dom(Generate, dom, smr, ref, Grid) ! Boundary conditions and materials ! !---------------------------------------! call File % Read_Line(fu) - read(Line % tokens(1), *) dom % n_regions ! number of regions (can be bnd. + read(Line % tokens(1), *) dom % n_ranges ! number of ranges (can be bnd. ! conditions or materials) - call Domain_Mod_Allocate_Regions(dom, dom % n_regions) + call Domain_Mod_Allocate_Ranges(dom, dom % n_ranges) - do n = 1, dom % n_regions - dom % regions(n) % face='' + do n = 1, dom % n_ranges + dom % ranges(n) % face='' call File % Read_Line(fu) if(Line % n_tokens .eq. 7) then - read(Line % whole,*) dum, & - dom % regions(n) % is, & - dom % regions(n) % js, & - dom % regions(n) % ks, & - dom % regions(n) % ie, & - dom % regions(n) % je, & - dom % regions(n) % ke + read(Line % whole,*) dum, & + dom % ranges(n) % is, & + dom % ranges(n) % js, & + dom % ranges(n) % ks, & + dom % ranges(n) % ie, & + dom % ranges(n) % je, & + dom % ranges(n) % ke else if(Line % n_tokens .eq. 2) then read(Line % tokens(1),*) dum read(Line % tokens(2),'(A4)') & - dom % regions(n) % face - call String % To_Upper_Case(dom % regions(n) % face) + dom % ranges(n) % face + call String % To_Upper_Case(dom % ranges(n) % face) end if call File % Read_Line(fu) - read(Line % tokens(1), *) dom % regions(n) % block - read(Line % tokens(2), *) dom % regions(n) % name - call String % To_Upper_Case(dom % regions(n) % name) + read(Line % tokens(1), *) dom % ranges(n) % block + read(Line % tokens(2), *) dom % ranges(n) % name + call String % To_Upper_Case(dom % ranges(n) % name) ! if( dom % blocks(b_cond(n,7)) % points(0) .eq. -1 ) then - ! call Swap_Int( dom % regions(n) % is,dom % regions(n) % js ) - ! call Swap_Int( dom % regions(n) % ie,dom % regions(n) % je ) + ! call Swap_Int( dom % ranges(n) % is,dom % ranges(n) % js ) + ! call Swap_Int( dom % ranges(n) % ie,dom % ranges(n) % je ) ! end if end do @@ -350,9 +350,9 @@ subroutine Load_Dom(Generate, dom, smr, ref, Grid) call File % Read_Line(fu) read(Line % tokens(1), *) dumi ! used to be number of copy boundaries - !-----------------------------------! - ! Refinement levels and regions ! - !-----------------------------------! + !----------------------------------! + ! Refinement levels and ranges ! + !----------------------------------! call File % Read_Line(fu) read(Line % tokens(1), *) ref % n_levels ! number of refinement levels print '(a38,i7)', '# Number of refinement levels: ', ref % n_levels @@ -362,40 +362,40 @@ subroutine Load_Dom(Generate, dom, smr, ref, Grid) do l = 1, ref % n_levels print *, '# Level: ', l call File % Read_Line(fu) - read(Line % tokens(2), *) ref % n_regions(l) + read(Line % tokens(2), *) ref % n_ranges(l) - ! Browse through regions in level "l" - do n = 1, ref % n_regions(l) + ! Browse through ranges in level "l" + do n = 1, ref % n_ranges(l) call File % Read_Line(fu) read(Line % tokens(3),*) answer call String % To_Upper_Case(answer) - ref % region(l,n) % shape = -1 - if(answer .eq. 'RECTANGLE') ref % region(l,n) % shape = RECTANGLE - if(answer .eq. 'ELIPSOID') ref % region(l,n) % shape = ELIPSOID - if(answer .eq. 'PLANE') ref % region(l,n) % shape = PLANE - if(ref % region(l,n) % shape .eq. -1) then + ref % range(l,n) % shape = -1 + if(answer .eq. 'RECTANGLE') ref % range(l,n) % shape = RECTANGLE + if(answer .eq. 'ELIPSOID') ref % range(l,n) % shape = ELIPSOID + if(answer .eq. 'PLANE') ref % range(l,n) % shape = PLANE + if(ref % range(l,n) % shape .eq. -1) then print *, 'ERROR! Refinement shape not specified well by: ', answer stop end if call File % Read_Line(fu) - read(Line % whole, *) & - ref % region(l,n) % pnt(1) % x, & - ref % region(l,n) % pnt(1) % y, & - ref % region(l,n) % pnt(1) % z, & - ref % region(l,n) % pnt(2) % x, & - ref % region(l,n) % pnt(2) % y, & - ref % region(l,n) % pnt(2) % z + read(Line % whole, *) & + ref % range(l,n) % pnt(1) % x, & + ref % range(l,n) % pnt(1) % y, & + ref % range(l,n) % pnt(1) % z, & + ref % range(l,n) % pnt(2) % x, & + ref % range(l,n) % pnt(2) % y, & + ref % range(l,n) % pnt(2) % z end do end do - !-----------------------! - ! Smoothing regions ! - !-----------------------! + !----------------------! + ! Smoothing ranges ! + !----------------------! call File % Read_Line(fu) - read(Line % tokens(1), *) smr % n_smooths ! number of smoothing regions + read(Line % tokens(1), *) smr % n_smooths ! number of smoothing ranges - print '(a38,i7)', '# Number of (non)smoothing regions: ', smr % n_smooths + print '(a38,i7)', '# Number of (non)smoothing ranges: ', smr % n_smooths call Smooths_Mod_Allocate_Smooths(smr, smr % n_smooths) diff --git a/Sources/Generate/Main_Gen.f90 b/Sources/Generate/Main_Gen.f90 index ee10766e7..9755bd375 100644 --- a/Sources/Generate/Main_Gen.f90 +++ b/Sources/Generate/Main_Gen.f90 @@ -37,7 +37,7 @@ program Generate_Prog ! Handle the domain ! !-----------------------! call Domain_Mod_Calculate_Node_Coordinates(dom, Grid) - call Domain_Mod_Distribute_Regions (dom, Grid) + call Domain_Mod_Distribute_Ranges (dom, Grid) call Domain_Mod_Connect_Blocks (dom, Grid) call Domain_Mod_Connect_Periodicity (dom, Grid) diff --git a/Sources/Generate/Region_Mod.f90 b/Sources/Generate/Range_Mod.f90 similarity index 90% rename from Sources/Generate/Region_Mod.f90 rename to Sources/Generate/Range_Mod.f90 index 6f3b1ebe6..fb78f243d 100644 --- a/Sources/Generate/Region_Mod.f90 +++ b/Sources/Generate/Range_Mod.f90 @@ -1,5 +1,5 @@ !==============================================================================! - module Region_Mod + module Range_Mod !------------------------------------------------------------------------------! ! This is used to read boundary conditions or materials in "Generator" ! !------------------------------------------------------------------------------! @@ -9,10 +9,10 @@ module Region_Mod implicit none !==============================================================================! - !-----------------! - ! Region type ! - !-----------------! - type Region_Type + !----------------! + ! Range type ! + !----------------! + type Range_Type integer :: block ! to which block it belons diff --git a/Sources/Generate/Refines_Mod.f90 b/Sources/Generate/Refines_Mod.f90 index 6ab005203..5a8e0e5d1 100644 --- a/Sources/Generate/Refines_Mod.f90 +++ b/Sources/Generate/Refines_Mod.f90 @@ -36,8 +36,8 @@ module Refines_Mod integer, allocatable :: cell_level(:) ! cells' refinement level logical, allocatable :: cell_marked(:) ! true if cell markered - integer, allocatable :: n_regions(:) ! number refin. regions - type(Shape_Type), allocatable :: region(:,:) ! over levels & regions + integer, allocatable :: n_ranges(:) ! number refin. regions + type(Shape_Type), allocatable :: range(:,:) ! over levels & regions end type diff --git a/Sources/Generate/Refines_Mod/Allocate_Levels.f90 b/Sources/Generate/Refines_Mod/Allocate_Levels.f90 index 29da4e91f..b14539be9 100644 --- a/Sources/Generate/Refines_Mod/Allocate_Levels.f90 +++ b/Sources/Generate/Refines_Mod/Allocate_Levels.f90 @@ -9,7 +9,7 @@ subroutine Refines_Mod_Allocate_Levels(ref, nl) ref % n_levels = nl - allocate(ref % n_regions(nl)) - allocate(ref % region(nl, MAX_SHAPES)) + allocate(ref % n_ranges(nl)) + allocate(ref % range(nl, MAX_SHAPES)) end subroutine diff --git a/Sources/Generate/Refines_Mod/Mark_Cells.f90 b/Sources/Generate/Refines_Mod/Mark_Cells.f90 index 432f6d019..d5a44153b 100644 --- a/Sources/Generate/Refines_Mod/Mark_Cells.f90 +++ b/Sources/Generate/Refines_Mod/Mark_Cells.f90 @@ -17,14 +17,14 @@ subroutine Refines_Mod_Mark_Cells(ref, Grid) do lev = 1, ref % n_levels - do reg = 1, ref % n_regions(lev) + do reg = 1, ref % n_ranges(lev) - x1 = ref % region(lev,reg) % pnt(1) % x - y1 = ref % region(lev,reg) % pnt(1) % y - z1 = ref % region(lev,reg) % pnt(1) % z - x8 = ref % region(lev,reg) % pnt(2) % x - y8 = ref % region(lev,reg) % pnt(2) % y - z8 = ref % region(lev,reg) % pnt(2) % z + x1 = ref % range(lev,reg) % pnt(1) % x + y1 = ref % range(lev,reg) % pnt(1) % y + z1 = ref % range(lev,reg) % pnt(1) % z + x8 = ref % range(lev,reg) % pnt(2) % x + y8 = ref % range(lev,reg) % pnt(2) % y + z8 = ref % range(lev,reg) % pnt(2) % z do c = 1, Grid % n_cells n1 = Grid % cells_n(1,c) @@ -49,23 +49,23 @@ subroutine Refines_Mod_Mark_Cells(ref, Grid) Grid % zn(n5) + Grid % zn(n6) + & Grid % zn(n7) + Grid % zn(n8)) - if(ref % region(lev,reg) % shape .eq. ELIPSOID) then + if(ref % range(lev,reg) % shape .eq. ELIPSOID) then if( ( ((x1-x0)/x8)**2 + & ((y1-y0)/y8)**2 + & ((z1-z0)/z8)**2) < 1.0 ) then ref % cell_marked(c) = .true. end if - else if(ref % region(lev,reg) % shape .eq. RECTANGLE) then + else if(ref % range(lev,reg) % shape .eq. RECTANGLE) then if( (x1 < x0) .and. (x0 < x8) .and. & (y1 < y0) .and. (y0 < y8) .and. & (z1 < z0) .and. (z0 < z8) ) then ref % cell_marked(c) = .true. end if - else if(ref % region(lev,reg) % shape .eq. PLANE) then + else if(ref % range(lev,reg) % shape .eq. PLANE) then if( (x0-x1)*x8+(y0-y1)*y8+(z0-z1)*z8 > 0.0 ) then ref % cell_marked(c) = .true. end if - end if + end if end do ! cells end do ! reg diff --git a/Sources/Generate/makefile b/Sources/Generate/makefile index 7e2501a1d..c5e5907d9 100644 --- a/Sources/Generate/makefile +++ b/Sources/Generate/makefile @@ -188,7 +188,7 @@ SRC_F_MOD = Const_Mod.f90 \ SRC_F_MOD += Point_Mod.f90 \ Line_Mod.f90 \ Block_Mod.f90 \ - Region_Mod.f90 \ + Range_Mod.f90 \ Smooths_Mod.f90 \ Refines_Mod.f90 \ Domain_Mod.f90 \ diff --git a/Sources/Generate/makefile_explicit_dependencies b/Sources/Generate/makefile_explicit_dependencies index f1d01ff61..b09672c5a 100644 --- a/Sources/Generate/makefile_explicit_dependencies +++ b/Sources/Generate/makefile_explicit_dependencies @@ -1,7 +1,7 @@ #--------------------------------------------------- -# Dependencies for: ./Region_Mod.f90 +# Dependencies for: ./Range_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Region_Mod.o:\ +$(DIR_OBJECT)/Range_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- @@ -13,7 +13,7 @@ $(DIR_OBJECT)/Connectivity.o: # Dependencies for: ./Domain_Mod.f90 #--------------------------------------------------- $(DIR_OBJECT)/Domain_Mod.o:\ -$(DIR_OBJECT)/Region_Mod.o \ +$(DIR_OBJECT)/Range_Mod.o \ $(DIR_OBJECT)/Point_Mod.o \ $(DIR_OBJECT)/Line_Mod.o \ $(DIR_OBJECT)/Grid_Mod.o \ From 5bcfc92a4c1cd3ddc3f30c1861e86584f1c78ec0 Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 20 Feb 2023 06:28:38 +0100 Subject: [PATCH 003/223] Shared/Boundary_Mod.f90 -> Shared/Region_Mod.f90 Boundary_Mod became Region_Mod. Also, along the same path, removed almost all occurences of variables "color" - it was a bit confusing for users of the code. On branch bojan_fixed_cell_ranges modified: Convert/Convert_Mod/Allocate_Memory.f90 modified: Convert/Convert_Mod/Calculate_Geometry.f90 modified: Convert/Convert_Mod/Create_Dual.f90 modified: Convert/Convert_Mod/Find_Faces.f90 modified: Convert/Convert_Mod/Find_Parents.f90 modified: Convert/Convert_Mod/Grid_Topology.f90 modified: Convert/Convert_Mod/Insert_Buildings.f90 modified: Convert/Convert_Mod/Load_Fluent.f90 modified: Convert/Convert_Mod/Load_Gambit.f90 modified: Convert/Convert_Mod/Load_Gmsh.f90 modified: Convert/Convert_Mod/N_Bnd_Cells_In_Color.f90 modified: Convert/Convert_Mod/N_Nodes_In_Bnd_Color.f90 modified: Convert/makefile modified: Convert/makefile_explicit_dependencies modified: Divide/makefile modified: Divide/makefile_explicit_dependencies modified: Generate/Domain_Mod/Distribute_Ranges.f90 modified: Generate/Generate_Mod/Load_Dom.f90 modified: Generate/Refines_Mod/Connectivity.f90 modified: Generate/makefile modified: Generate/makefile_explicit_dependencies modified: Process/Read_Controls_Mod/Boundary_Conditions.f90 modified: Process/makefile modified: Process/makefile_explicit_dependencies modified: Shared/Browse.h90 modified: Shared/Grid_Mod.f90 modified: Shared/Grid_Mod/Allocate_Cells.f90 modified: Shared/Grid_Mod/Bnd_Cond_Name.f90 modified: Shared/Grid_Mod/Bnd_Cond_Type.f90 modified: Shared/Grid_Mod/Calculate_Face_Geometry.f90 modified: Shared/Grid_Mod/Calculate_Wall_Distance.f90 modified: Shared/Grid_Mod/Load_Cfn.f90 renamed: Shared/Grid_Mod/Print_Bnd_Cond_List.f90 -> Shared/Grid_Mod/Print_Regions_List.f90 renamed: Shared/Grid_Mod/Bnd_Cond_Ranges.f90 -> Shared/Grid_Mod/Regions_Ranges.f90 modified: Shared/Grid_Mod/Save_Cfn.f90 modified: Shared/Grid_Mod/Save_Vtu_Faces.f90 modified: Shared/Grid_Mod/Sort_Faces_Smart.f90 modified: Shared/Grid_Mod/Write_Template_Control_File.f90 renamed: Shared/Boundary_Mod.f90 -> Shared/Region_Mod.f90 --- .../Convert/Convert_Mod/Allocate_Memory.f90 | 4 +- .../Convert_Mod/Calculate_Geometry.f90 | 46 +++++------ Sources/Convert/Convert_Mod/Create_Dual.f90 | 18 ++--- Sources/Convert/Convert_Mod/Find_Faces.f90 | 2 +- Sources/Convert/Convert_Mod/Find_Parents.f90 | 6 +- Sources/Convert/Convert_Mod/Grid_Topology.f90 | 9 ++- .../Convert/Convert_Mod/Insert_Buildings.f90 | 62 +++++++-------- Sources/Convert/Convert_Mod/Load_Fluent.f90 | 8 +- Sources/Convert/Convert_Mod/Load_Gambit.f90 | 8 +- Sources/Convert/Convert_Mod/Load_Gmsh.f90 | 10 +-- .../Convert_Mod/N_Bnd_Cells_In_Color.f90 | 2 +- .../Convert_Mod/N_Nodes_In_Bnd_Color.f90 | 2 +- Sources/Convert/makefile | 2 +- .../Convert/makefile_explicit_dependencies | 6 +- Sources/Divide/makefile | 2 +- Sources/Divide/makefile_explicit_dependencies | 6 +- .../Generate/Domain_Mod/Distribute_Ranges.f90 | 8 +- Sources/Generate/Generate_Mod/Load_Dom.f90 | 4 +- Sources/Generate/Refines_Mod/Connectivity.f90 | 10 +-- Sources/Generate/makefile | 2 +- .../Generate/makefile_explicit_dependencies | 6 +- .../Read_Controls_Mod/Boundary_Conditions.f90 | 78 +++++++++---------- Sources/Process/makefile | 2 +- .../Process/makefile_explicit_dependencies | 10 +-- Sources/Shared/Browse.h90 | 2 +- Sources/Shared/Grid_Mod.f90 | 14 ++-- Sources/Shared/Grid_Mod/Allocate_Cells.f90 | 4 +- Sources/Shared/Grid_Mod/Bnd_Cond_Name.f90 | 9 +-- Sources/Shared/Grid_Mod/Bnd_Cond_Type.f90 | 11 ++- .../Grid_Mod/Calculate_Face_Geometry.f90 | 6 +- .../Grid_Mod/Calculate_Wall_Distance.f90 | 6 +- Sources/Shared/Grid_Mod/Load_Cfn.f90 | 18 ++--- ...d_Cond_List.f90 => Print_Regions_List.f90} | 30 +++---- ...Bnd_Cond_Ranges.f90 => Regions_Ranges.f90} | 66 ++++++++-------- Sources/Shared/Grid_Mod/Save_Cfn.f90 | 4 +- Sources/Shared/Grid_Mod/Save_Vtu_Faces.f90 | 2 +- Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 | 30 +++---- .../Grid_Mod/Write_Template_Control_File.f90 | 2 +- .../{Boundary_Mod.f90 => Region_Mod.f90} | 28 +++---- 39 files changed, 272 insertions(+), 273 deletions(-) rename Sources/Shared/Grid_Mod/{Print_Bnd_Cond_List.f90 => Print_Regions_List.f90} (60%) rename Sources/Shared/Grid_Mod/{Bnd_Cond_Ranges.f90 => Regions_Ranges.f90} (50%) rename Sources/Shared/{Boundary_Mod.f90 => Region_Mod.f90} (64%) diff --git a/Sources/Convert/Convert_Mod/Allocate_Memory.f90 b/Sources/Convert/Convert_Mod/Allocate_Memory.f90 index 3bed11d27..8e69ab443 100644 --- a/Sources/Convert/Convert_Mod/Allocate_Memory.f90 +++ b/Sources/Convert/Convert_Mod/Allocate_Memory.f90 @@ -25,8 +25,8 @@ subroutine Allocate_Memory(Convert, Grid) call Grid % Allocate_Faces(Grid % n_faces, 0) end if - allocate(Grid % bnd_cond % color(-Grid % n_bnd_cells * F:-1)) - Grid % bnd_cond % color = 0 + allocate(Grid % region % at_cell(-Grid % n_bnd_cells * F:-1)) + Grid % region % at_cell = 0 ! (Dirty) trick to allocate additional memory for cities Grid % n_bnd_cells = Grid % n_bnd_cells / F diff --git a/Sources/Convert/Convert_Mod/Calculate_Geometry.f90 b/Sources/Convert/Convert_Mod/Calculate_Geometry.f90 index a676085b0..6b49c6920 100644 --- a/Sources/Convert/Convert_Mod/Calculate_Geometry.f90 +++ b/Sources/Convert/Convert_Mod/Calculate_Geometry.f90 @@ -19,7 +19,7 @@ subroutine Calculate_Geometry(Convert, Grid, ask) !-----------------------------------[Locals]-----------------------------------! integer :: c, c1, c2, n, n1, n2, s, b, i, j integer :: c11, c12, c21, c22, s1, s2, bou_cen, cnt_bnd, cnt_per - integer :: color_per, n_per, number_faces + integer :: reg_per, n_per, number_faces real :: xs2, ys2, zs2 real :: t, tot_surf, dis, min_dis, max_dis real :: v(3), k(3), v_o(3), v_r(3), theta ! for rotation @@ -288,7 +288,7 @@ subroutine Calculate_Geometry(Convert, Grid, ask) answer = '' do while(answer .ne. 'SKIP') - call Grid % Print_Bnd_Cond_List() + call Grid % Print_Regions_List() n_per = 0 print *, '#==============================================================' print *, '# Enter the ordinal number(s) of periodic-boundary condition(s)' @@ -300,13 +300,13 @@ subroutine Calculate_Geometry(Convert, Grid, ask) call String % To_Upper_Case(answer) if( answer .eq. 'SKIP' ) then - color_per = 0 + reg_per = 0 exit end if - read(Line % tokens(1), *) color_per - if( color_per > Grid % n_bnd_cond ) then - print *, '# Critical error: boundary condition ', color_per, & + read(Line % tokens(1), *) reg_per + if( reg_per > Grid % n_bnd_cond ) then + print *, '# Critical error: boundary condition ', reg_per, & ' doesn''t exist!' print *, '# Exiting! ' stop @@ -322,7 +322,7 @@ subroutine Calculate_Geometry(Convert, Grid, ask) do s = 1, Grid % n_faces c2 = Grid % faces_c(2,s) if(c2 < 0) then - if(Grid % bnd_cond % color(c2) .eq. color_per) then + if(Grid % region % at_cell(c2) .eq. reg_per) then cnt_per = cnt_per + 1 ! This is a dot product of surface vector and vector 1.0, 1.0, 1,0 @@ -354,7 +354,7 @@ subroutine Calculate_Geometry(Convert, Grid, ask) do s = 1, Grid % n_faces c2 = Grid % faces_c(2,s) if(c2 < 0) then - if(Grid % bnd_cond % color(c2) .eq. color_per) then + if(Grid % region % at_cell(c2) .eq. reg_per) then v_o(1) = Grid % xf(s) v_o(2) = Grid % yf(s) v_o(3) = Grid % zf(s) @@ -465,7 +465,7 @@ subroutine Calculate_Geometry(Convert, Grid, ask) cnt_bnd = 0 Grid % new_c = 0 do c = -1, -Grid % n_bnd_cells, -1 - if(Grid % bnd_cond % color(c) .ne. color_per) then + if(Grid % region % at_cell(c) .ne. reg_per) then cnt_bnd = cnt_bnd + 1 Grid % new_c(c) = -cnt_bnd end if @@ -477,7 +477,7 @@ subroutine Calculate_Geometry(Convert, Grid, ask) Grid % xc(Grid % new_c(c)) = Grid % xc(c) Grid % yc(Grid % new_c(c)) = Grid % yc(c) Grid % zc(Grid % new_c(c)) = Grid % zc(c) - Grid % bnd_cond % color(Grid % new_c(c)) = Grid % bnd_cond % color(c) + Grid % region % at_cell(Grid % new_c(c)) = Grid % region % at_cell(c) end if end do @@ -493,36 +493,36 @@ subroutine Calculate_Geometry(Convert, Grid, ask) Grid % n_bnd_cells = cnt_bnd print *, '# Kept boundary cells: ', Grid % n_bnd_cells - !--------------------------------------------------------------------! - ! Remove boundary condition with color_per and compress the rest ! - !--------------------------------------------------------------------! - if(color_per < Grid % n_bnd_cond) then + !------------------------------------------------------------------! + ! Remove boundary condition with reg_per and compress the rest ! + !------------------------------------------------------------------! + if(reg_per < Grid % n_bnd_cond) then - ! Set the color of boundary selected to be periodic to zero + ! Set the regions of boundary selected to be periodic to zero do c = -1, -Grid % n_bnd_cells, -1 - if(Grid % bnd_cond % color(c) .eq. color_per) then - Grid % bnd_cond % color(c) = 0 + if(Grid % region % at_cell(c) .eq. reg_per) then + Grid % region % at_cell(c) = 0 end if end do ! Shift the rest of the boundary cells do b = 1, Grid % n_bnd_cond - 1 - if(b .ge. color_per) then + if(b .ge. reg_per) then ! Correct the names - Grid % bnd_cond % name(b) = Grid % bnd_cond % name (b+1) + Grid % region % name(b) = Grid % region % name (b+1) - ! Correct all boundary colors too + ! Correct all boundary regions too do c = -1, -Grid % n_bnd_cells, -1 - if(Grid % bnd_cond % color(c) .eq. (b+1)) then - Grid % bnd_cond % color(c) = b + if(Grid % region % at_cell(c) .eq. (b+1)) then + Grid % region % at_cell(c) = b end if end do end if end do else - Grid % bnd_cond % name(Grid % n_bnd_cond) = '' + Grid % region % name(Grid % n_bnd_cond) = '' end if Grid % n_bnd_cond = Grid % n_bnd_cond - 1 diff --git a/Sources/Convert/Convert_Mod/Create_Dual.f90 b/Sources/Convert/Convert_Mod/Create_Dual.f90 index aaa072551..8348440d9 100644 --- a/Sources/Convert/Convert_Mod/Create_Dual.f90 +++ b/Sources/Convert/Convert_Mod/Create_Dual.f90 @@ -14,7 +14,7 @@ subroutine Create_Dual(Convert, Prim, Dual) integer :: n_p, n_d, f_d, b_d, f_p, c_p, cnt integer, allocatable :: full_edge_n (:,:) ! edges, nodes integer, allocatable :: full_edge_fb(:) ! edges' faces at boundary - integer, allocatable :: full_edge_bc(:) ! edges' faces boundary colors + integer, allocatable :: full_edge_bc(:) ! edges' faces boundary regions integer, allocatable :: comp_edge_f(:) ! compressed edge first integer, allocatable :: comp_edge_l(:) ! compressed edge last integer, allocatable :: cell_to_node(:) @@ -87,7 +87,7 @@ subroutine Create_Dual(Convert, Prim, Dual) if(c2 > 0) then full_edge_bc(Prim % n_edges) = 0 ! not a boundary face else - full_edge_bc(Prim % n_edges) = Prim % bnd_cond % color(c2) ! store color + full_edge_bc(Prim % n_edges) = Prim % region % at_cell(c2) ! store reg end if end do end do @@ -192,10 +192,10 @@ subroutine Create_Dual(Convert, Prim, Dual) ! ! !-------------------------! Dual % n_bnd_cond = Prim % n_bnd_cond - allocate(Dual % bnd_cond % name(Dual % n_bnd_cond)) + allocate(Dual % region % name(Dual % n_bnd_cond)) do bc = 1, Prim % n_bnd_cond - Dual % bnd_cond % name(bc) = Prim % bnd_cond % name(bc) - call String % To_Upper_Case(Dual % bnd_cond % name(bc)) + Dual % region % name(bc) = Prim % region % name(bc) + call String % To_Upper_Case(Dual % region % name(bc)) end do !----------------------------------! @@ -363,9 +363,9 @@ subroutine Create_Dual(Convert, Prim, Dual) do bc = 1, Prim % n_bnd_cond - !----------------------------------------------------! - ! Call this to mark boundary cells in this color ! - !----------------------------------------------------! + !-----------------------------------------------------! + ! Call this to mark boundary cells in this region ! + !-----------------------------------------------------! dual_f_here = Convert % N_Nodes_In_Bnd_Color(Prim, bc, node_data) unused = Convert % N_Bnd_Cells_In_Color(Prim, bc, cell_data) unused = Convert % N_Edges_In_Bnd_Color(Prim, bc, edge_data) @@ -391,7 +391,7 @@ subroutine Create_Dual(Convert, Prim, Dual) Dual % cells_n_nodes(b_d) = Dual % cells_n_nodes(b_d) + 1 call Adjust_First_Dim(Dual % cells_n_nodes(b_d), Dual % cells_n) Dual % cells_n(Dual % cells_n_nodes(b_d), b_d) = cell_to_node(c) - Dual % bnd_cond % color(b_d) = bc + Dual % region % at_cell(b_d) = bc ! Store node_to_face (for the next step, adding edges) node_to_face(n_p) = f_d diff --git a/Sources/Convert/Convert_Mod/Find_Faces.f90 b/Sources/Convert/Convert_Mod/Find_Faces.f90 index db0432a28..934b4bdff 100644 --- a/Sources/Convert/Convert_Mod/Find_Faces.f90 +++ b/Sources/Convert/Convert_Mod/Find_Faces.f90 @@ -53,7 +53,7 @@ subroutine Find_Faces(Convert, Grid) if(Grid % cells_n_nodes(c) .eq. 6) fn = WED if(Grid % cells_n_nodes(c) .eq. 8) fn = HEX do i_fac = 1, 6 - if(Grid % cells_bnd_color(i_fac, c) .eq. 0) then + if(Grid % cells_bnd_region(i_fac, c) .eq. 0) then ! Fetch face nodes (-1 becomes HUGE_INT and it will be the biggest) do i_nod = 1, 4 diff --git a/Sources/Convert/Convert_Mod/Find_Parents.f90 b/Sources/Convert/Convert_Mod/Find_Parents.f90 index 81294ac58..665baf8b3 100644 --- a/Sources/Convert/Convert_Mod/Find_Parents.f90 +++ b/Sources/Convert/Convert_Mod/Find_Parents.f90 @@ -47,7 +47,7 @@ subroutine Find_Parents(Convert, Grid) ! Mark all nodes on the boundary is_node_bnd(:) = .false. do c2 = -Grid % n_bnd_cells, -1 - if( Grid % bnd_cond % color(c2) .gt. 0 ) then + if( Grid % region % at_cell(c2) .gt. 0 ) then do i_nod = 1, Grid % cells_n_nodes(c2) ! 3 or 4 is_node_bnd( Grid % cells_n(i_nod, c2) ) = .true. end do @@ -94,7 +94,7 @@ subroutine Find_Parents(Convert, Grid) cnt_f = 0 do c2 = -Grid % n_bnd_cells, -1 - if( Grid % bnd_cond % color(c2) .eq. bc ) then + if( Grid % region % at_cell(c2) .eq. bc ) then ! Increase total face count cnt_f = cnt_f + 1 @@ -180,7 +180,7 @@ subroutine Find_Parents(Convert, Grid) c1 = w1(j_fac) dir = w2(j_fac) end if - Grid % cells_bnd_color(dir, c1) = bc + Grid % cells_bnd_region(dir, c1) = bc end if end if diff --git a/Sources/Convert/Convert_Mod/Grid_Topology.f90 b/Sources/Convert/Convert_Mod/Grid_Topology.f90 index be7e4f17b..eac1fbd7e 100644 --- a/Sources/Convert/Convert_Mod/Grid_Topology.f90 +++ b/Sources/Convert/Convert_Mod/Grid_Topology.f90 @@ -30,13 +30,14 @@ subroutine Grid_Topology(Convert, Grid) Grid % n_faces = 0 do i = 1, Grid % n_cells do j = 1, 6 - if(Grid % cells_bnd_color(j,i) .ne. 0) then + if(Grid % cells_bnd_region(j,i) .ne. 0) then Grid % n_bnd_cells = Grid % n_bnd_cells + 1 - ! Grid % bnd_cond % color - Grid % bnd_cond % color(-Grid % n_bnd_cells) = & - Grid % cells_bnd_color(j,i) + ! Grid % region % at_cell + Grid % region % at_cell(-Grid % n_bnd_cells) & + = Grid % cells_bnd_region(j,i) + ! Faces Grid % n_faces = Grid % n_faces + 1 Grid % faces_c(1,Grid % n_faces) = i diff --git a/Sources/Convert/Convert_Mod/Insert_Buildings.f90 b/Sources/Convert/Convert_Mod/Insert_Buildings.f90 index 000cf0979..a29feeadb 100644 --- a/Sources/Convert/Convert_Mod/Insert_Buildings.f90 +++ b/Sources/Convert/Convert_Mod/Insert_Buildings.f90 @@ -242,8 +242,8 @@ subroutine Insert_Buildings(Convert, Grid) n_ground_cells = 0 do c = 1, Grid % n_cells do dir = 1, 6 - if(Grid % cells_bnd_color(dir, c) .ne. 0) then - bc_name = trim(Grid % bnd_cond % name(Grid % cells_bnd_color(dir, c))) + if(Grid % cells_bnd_region(dir, c) .ne. 0) then + bc_name = trim(Grid % region % name(Grid % cells_bnd_region(dir, c))) call String % To_Upper_Case(bc_name) if(bc_name(1:8) .eq. 'BUILDING' .or. & bc_name .eq. 'GROUND') then @@ -316,7 +316,7 @@ subroutine Insert_Buildings(Convert, Grid) do c = 1, Grid % n_cells i_work_1(c) = Grid % cells_n_nodes(c) i_work_2(1:8, c) = Grid % cells_n(1:8, c) - i_work_3(1:6, c) = Grid % cells_bnd_color(1:6, c) + i_work_3(1:6, c) = Grid % cells_bnd_region(1:6, c) end do !--------------------------! @@ -346,9 +346,9 @@ subroutine Insert_Buildings(Convert, Grid) ! Do the sorting of data pertinent to cells ! !-----------------------------------------------! do c = 1, Grid % n_cells - Grid % cells_n_nodes (new_c(c)) = i_work_1(c) - Grid % cells_n (1:8, new_c(c)) = i_work_2(1:8, c) - Grid % cells_bnd_color(1:6, new_c(c)) = i_work_3(1:6, c) + Grid % cells_n_nodes (new_c(c)) = i_work_1(c) + Grid % cells_n (1:8, new_c(c)) = i_work_2(1:8, c) + Grid % cells_bnd_region(1:6, new_c(c)) = i_work_3(1:6, c) end do call Sort % Real_By_Index(Grid % n_cells, Grid % xc(1), new_c(1)) call Sort % Real_By_Index(Grid % n_cells, Grid % yc(1), new_c(1)) @@ -386,8 +386,8 @@ subroutine Insert_Buildings(Convert, Grid) cell_in_building(:) = .false. do c = 1, Grid % n_cells do dir = 1, 6 - if(Grid % cells_bnd_color(dir, c) .ne. 0) then - bc_name = trim(Grid % bnd_cond % name(Grid % cells_bnd_color(dir, c))) + if(Grid % cells_bnd_region(dir, c) .ne. 0) then + bc_name = trim(Grid % region % name(Grid % cells_bnd_region(dir, c))) call String % To_Upper_Case(bc_name) if(bc_name(1:8) .eq. 'BUILDING') then read(bc_name(10:12), *) height @@ -409,7 +409,7 @@ subroutine Insert_Buildings(Convert, Grid) allocate(cell_in_chimney(Grid % n_cells)) cell_in_chimney(:) = 0 do bc = 1, Grid % n_bnd_cond - bc_name = trim(Grid % bnd_cond % name(bc)) + bc_name = trim(Grid % region % name(bc)) call String % To_Upper_Case(bc_name) if(bc_name(1:7) .eq. 'CHIMNEY') then @@ -420,7 +420,7 @@ subroutine Insert_Buildings(Convert, Grid) do c = 1, Grid % n_cells do dir = 1, 6 - if(Grid % cells_bnd_color(dir, c) .eq. bc) then + if(Grid % cells_bnd_region(dir, c) .eq. bc) then do cu = c, c + n_hor_layers - 1 if(Grid % zc(cu) - height >= Grid % zc(c)) exit cell_in_chimney(cu) = chimney ! mark cell as in this chimney @@ -475,7 +475,7 @@ subroutine Insert_Buildings(Convert, Grid) ! Find ground b.c. number (only used to eliminate BUILDING_000) do bc = 1, Grid % n_bnd_cond - bc_name = trim(Grid % bnd_cond % name(bc)) + bc_name = trim(Grid % region % name(bc)) call String % To_Upper_Case(bc_name) if(bc_name .eq. 'GROUND') then ground_bc = bc @@ -484,13 +484,13 @@ subroutine Insert_Buildings(Convert, Grid) ! Eliminate building_000 b.c. do bc = 1, Grid % n_bnd_cond - bc_name = trim(Grid % bnd_cond % name(bc)) + bc_name = trim(Grid % region % name(bc)) call String % To_Upper_Case(bc_name) if(bc_name .eq. 'BUILDING_000') then do c = 1, Grid % n_cells do dir = 1, 6 - if(Grid % cells_bnd_color(dir, c) .eq. bc) then - Grid % cells_bnd_color(dir, c) = ground_bc + if(Grid % cells_bnd_region(dir, c) .eq. bc) then + Grid % cells_bnd_region(dir, c) = ground_bc end if end do end do @@ -499,15 +499,15 @@ subroutine Insert_Buildings(Convert, Grid) cnt = 0 do bc = 1, Grid % n_bnd_cond - bc_name = trim(Grid % bnd_cond % name(bc)) + bc_name = trim(Grid % region % name(bc)) call String % To_Upper_Case(bc_name) if(bc_name(1:8) .ne. 'BUILDING') then cnt = cnt + 1 - Grid % bnd_cond % name(cnt) = Grid % bnd_cond % name(bc) + Grid % region % name(cnt) = Grid % region % name(bc) do c = 1, Grid % n_cells do dir = 1, 6 - if(Grid % cells_bnd_color(dir, c) .eq. bc) then - Grid % cells_bnd_color(dir, c) = cnt + if(Grid % cells_bnd_region(dir, c) .eq. bc) then + Grid % cells_bnd_region(dir, c) = cnt end if end do end do @@ -518,11 +518,11 @@ subroutine Insert_Buildings(Convert, Grid) ! Shift all by one up (to be able to insert building walls as first) if(buildings_exist) then do bc = Grid % n_bnd_cond, 1, -1 - Grid % bnd_cond % name(bc+1) = Grid % bnd_cond % name(bc) + Grid % region % name(bc+1) = Grid % region % name(bc) do c = 1, Grid % n_cells do dir = 1, 6 - if(Grid % cells_bnd_color(dir, c) .eq. bc) then - Grid % cells_bnd_color(dir, c) = bc+1 + if(Grid % cells_bnd_region(dir, c) .eq. bc) then + Grid % cells_bnd_region(dir, c) = bc+1 end if end do end do @@ -530,7 +530,7 @@ subroutine Insert_Buildings(Convert, Grid) Grid % n_bnd_cond = Grid % n_bnd_cond + 1 ! Add first boundary condition for walls - Grid % bnd_cond % name(1) = 'BUILDING_WALLS' + Grid % region % name(1) = 'BUILDING_WALLS' end if !------------------------------------------------------------! @@ -552,7 +552,7 @@ subroutine Insert_Buildings(Convert, Grid) do c = 1, Grid % n_cells i_work_1(c) = Grid % cells_n_nodes(c) i_work_2(1:8, c) = Grid % cells_n(1:8, c) - i_work_3(1:6, c) = Grid % cells_bnd_color(1:6, c) + i_work_3(1:6, c) = Grid % cells_bnd_region(1:6, c) end do !------------------------------------------------------! @@ -578,7 +578,7 @@ subroutine Insert_Buildings(Convert, Grid) if(new_c(c) .ne. 0) then Grid % cells_n_nodes (new_c(c)) = i_work_1(c) Grid % cells_n (1:8, new_c(c)) = i_work_2(1:8, c) - Grid % cells_bnd_color(1:6, new_c(c)) = i_work_3(1:6, c) + Grid % cells_bnd_region(1:6, new_c(c)) = i_work_3(1:6, c) end if end do Grid % n_cells = cnt @@ -605,7 +605,7 @@ subroutine Insert_Buildings(Convert, Grid) if(Grid % cells_n_nodes(c) .eq. 8) fn = HEX do dir = 1, 6 - if(Grid % cells_bnd_color(dir, c) .eq. 0) then + if(Grid % cells_bnd_region(dir, c) .eq. 0) then n_f_nod = 0 f_nod(1:4) = -1 @@ -626,13 +626,13 @@ subroutine Insert_Buildings(Convert, Grid) node_on_building(f_nod(2)) .and. & node_on_building(f_nod(3)) .and. & node_on_building(f_nod(4)) ) then - Grid % cells_bnd_color(dir, c) = 1 + Grid % cells_bnd_region(dir, c) = 1 end if else if( node_on_building(f_nod(1)) .and. & node_on_building(f_nod(2)) .and. & node_on_building(f_nod(3)) ) then - Grid % cells_bnd_color(dir, c) = 1 + Grid % cells_bnd_region(dir, c) = 1 end if end if end if @@ -643,7 +643,7 @@ subroutine Insert_Buildings(Convert, Grid) end if do bc = 1, Grid % n_bnd_cond - bc_name = trim(Grid % bnd_cond % name(bc)) + bc_name = trim(Grid % region % name(bc)) call String % To_Upper_Case(bc_name) if(bc_name(1:7) .eq. 'CHIMNEY') then @@ -657,7 +657,7 @@ subroutine Insert_Buildings(Convert, Grid) if(Grid % cells_n_nodes(c) .eq. 8) fn = HEX do dir = 1, 6 - if(Grid % cells_bnd_color(dir, c) .eq. 0) then + if(Grid % cells_bnd_region(dir, c) .eq. 0) then n_f_nod = 0 f_nod(1:4) = -1 @@ -678,13 +678,13 @@ subroutine Insert_Buildings(Convert, Grid) node_on_chimney(f_nod(2)) .eq. chimney .and. & node_on_chimney(f_nod(3)) .eq. chimney .and. & node_on_chimney(f_nod(4)) .eq. chimney ) then - Grid % cells_bnd_color(dir, c) = bc + Grid % cells_bnd_region(dir, c) = bc end if else if( node_on_chimney(f_nod(1)) .eq. chimney .and. & node_on_chimney(f_nod(2)) .eq. chimney .and. & node_on_chimney(f_nod(3)) .eq. chimney ) then - Grid % cells_bnd_color(dir, c) = bc + Grid % cells_bnd_region(dir, c) = bc end if end if end if diff --git a/Sources/Convert/Convert_Mod/Load_Fluent.f90 b/Sources/Convert/Convert_Mod/Load_Fluent.f90 index f10b628f3..bfdf12ef1 100644 --- a/Sources/Convert/Convert_Mod/Load_Fluent.f90 +++ b/Sources/Convert/Convert_Mod/Load_Fluent.f90 @@ -254,7 +254,7 @@ subroutine Load_Fluent(Convert, Grid, file_name) Grid % n_bnd_cells = n_bnd_cells Grid % n_bnd_cond = n_bnd_cond - allocate(Grid % bnd_cond % name(n_bnd_cond)) + allocate(Grid % region % name(n_bnd_cond)) !--------------------------------------------! ! ! @@ -652,14 +652,14 @@ subroutine Load_Fluent(Convert, Grid, file_name) n_bnd_cells = n_bnd_cells + 1 Grid % faces_c(1, s) = c2 Grid % faces_c(2, s) = -n_bnd_cells - Grid % bnd_cond % color(-n_bnd_cells) = face_sect_bnd(n_face_sect) + Grid % region % at_cell(-n_bnd_cells) = face_sect_bnd(n_face_sect) ! Case when c2 is a boundary cell else if(c2 .eq. 0) then n_bnd_cells = n_bnd_cells + 1 Grid % faces_c(1, s) = c1 Grid % faces_c(2, s) = -n_bnd_cells - Grid % bnd_cond % color(-n_bnd_cells) = face_sect_bnd(n_face_sect) + Grid % region % at_cell(-n_bnd_cells) = face_sect_bnd(n_face_sect) ! Neither c1 nor c2 are boundary cells else @@ -1085,7 +1085,7 @@ subroutine Load_Fluent(Convert, Grid, file_name) if(face_sect_bnd(n) .ne. 0) then if(face_sect_pos(n) .eq. pos) then call String % To_Upper_Case(one_token) - Grid % bnd_cond % name(face_sect_bnd(n)) = one_token + Grid % region % name(face_sect_bnd(n)) = one_token end if end if end do diff --git a/Sources/Convert/Convert_Mod/Load_Gambit.f90 b/Sources/Convert/Convert_Mod/Load_Gambit.f90 index c36b04229..5769c1b6d 100644 --- a/Sources/Convert/Convert_Mod/Load_Gambit.f90 +++ b/Sources/Convert/Convert_Mod/Load_Gambit.f90 @@ -162,17 +162,17 @@ subroutine Load_Gambit(Convert, Grid, file_name) ! Boundary conditions ! !-------------------------! Grid % n_bnd_cond = n_bnd_sect - allocate(Grid % bnd_cond % name(n_bnd_sect)) + allocate(Grid % region % name(n_bnd_sect)) do j = 1, n_bnd_sect call File % Read_Line(fu) ! BOUNDARY CONDITIONS call File % Read_Line(fu) call String % To_Upper_Case(Line % tokens(1)) - Grid % bnd_cond % name(j) = Line % tokens(1) + Grid % region % name(j) = Line % tokens(1) read(Line % tokens(3),'(i8)') dum1 do i = 1, dum1 read(fu,*) c, dum2, dir - Grid % cells_bnd_color(dir,c) = j + Grid % cells_bnd_region(dir,c) = j end do call File % Read_Line(fu) ! ENDOFSECTION end do @@ -180,7 +180,7 @@ subroutine Load_Gambit(Convert, Grid, file_name) !------------------------------------! ! Pring boundary conditions info ! !------------------------------------! - call Grid % Print_Bnd_Cond_List() + call Grid % Print_Regions_List() close(fu) diff --git a/Sources/Convert/Convert_Mod/Load_Gmsh.f90 b/Sources/Convert/Convert_Mod/Load_Gmsh.f90 index 39547686d..ba8cc2404 100644 --- a/Sources/Convert/Convert_Mod/Load_Gmsh.f90 +++ b/Sources/Convert/Convert_Mod/Load_Gmsh.f90 @@ -430,7 +430,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) end if if(dim .eq. 2) then - Grid % bnd_cond % color(c) = phys_tags(s_tag) + Grid % region % at_cell(c) = phys_tags(s_tag) n_bnd_cells(phys_tags(s_tag)) = n_bnd_cells(phys_tags(s_tag)) + 1 end if end do @@ -515,11 +515,11 @@ subroutine Load_Gmsh(Convert, Grid, file_name) ! ! !----------------------------------! Grid % n_bnd_cond = n_bnd_sect - allocate(Grid % bnd_cond % name(n_bnd_sect)) + allocate(Grid % region % name(n_bnd_sect)) do i = 1, n_bnd_sect - Grid % bnd_cond % name(i) = phys_names(i) - call String % To_Upper_Case(Grid % bnd_cond % name(i)) + Grid % region % name(i) = phys_names(i) + call String % To_Upper_Case(Grid % region % name(i)) end do !------------------------------------! @@ -527,7 +527,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) ! Print boundary conditions info ! ! ! !------------------------------------! - call Grid % Print_Bnd_Cond_List() + call Grid % Print_Regions_List() close(fu) diff --git a/Sources/Convert/Convert_Mod/N_Bnd_Cells_In_Color.f90 b/Sources/Convert/Convert_Mod/N_Bnd_Cells_In_Color.f90 index 2f6564981..fcdc6ac02 100644 --- a/Sources/Convert/Convert_Mod/N_Bnd_Cells_In_Color.f90 +++ b/Sources/Convert/Convert_Mod/N_Bnd_Cells_In_Color.f90 @@ -18,7 +18,7 @@ integer function N_Bnd_Cells_In_Color(Convert, Grid, bc, cell_data) cell_data(:) = 0 do c = -Grid % n_bnd_cells, -1 - if( Grid % bnd_cond % color(c) .eq. bc ) then + if( Grid % region % at_cell(c) .eq. bc ) then cnt = cnt + 1 cell_data(c) = cell_data(c) + 1 end if diff --git a/Sources/Convert/Convert_Mod/N_Nodes_In_Bnd_Color.f90 b/Sources/Convert/Convert_Mod/N_Nodes_In_Bnd_Color.f90 index 2dd648708..2e9ebe2dd 100644 --- a/Sources/Convert/Convert_Mod/N_Nodes_In_Bnd_Color.f90 +++ b/Sources/Convert/Convert_Mod/N_Nodes_In_Bnd_Color.f90 @@ -20,7 +20,7 @@ integer function N_Nodes_In_Bnd_Color(Convert, Grid, bc, node_data) ! Browse through all boundary cells and mark nodes ! of those cells in the given boundary condition do c = -Grid % n_bnd_cells, -1 - if( Grid % bnd_cond % color(c) .eq. bc ) then + if( Grid % region % at_cell(c) .eq. bc ) then do i_nod = 1, Grid % cells_n_nodes(c) n = Grid % cells_n(i_nod, c) if(node_data(n) .eq. 0) then ! hasn't been marked yet diff --git a/Sources/Convert/makefile b/Sources/Convert/makefile index 971a676a3..fb457897f 100644 --- a/Sources/Convert/makefile +++ b/Sources/Convert/makefile @@ -180,7 +180,7 @@ SRC_F_MOD = Const_Mod.f90 \ Gen_Mod.f90 \ Vtk_Mod.f90 \ Metis_Mod.f90 \ - Boundary_Mod.f90 \ + Region_Mod.f90 \ Swap_Mod.f90 \ Sort_Mod.f90 \ Grid_Mod.f90 \ diff --git a/Sources/Convert/makefile_explicit_dependencies b/Sources/Convert/makefile_explicit_dependencies index 0ac6a1da4..830c3844a 100644 --- a/Sources/Convert/makefile_explicit_dependencies +++ b/Sources/Convert/makefile_explicit_dependencies @@ -222,7 +222,7 @@ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Boundary_Mod.o +$(DIR_OBJECT)/Region_Mod.o #--------------------------------------------------- # Dependencies for: ./File_Mod.f90 @@ -327,9 +327,9 @@ $(DIR_OBJECT)/Thick_Line.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Boundary_Mod.f90 +# Dependencies for: ./Region_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Boundary_Mod.o:\ +$(DIR_OBJECT)/Region_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- diff --git a/Sources/Divide/makefile b/Sources/Divide/makefile index 1b965cc9a..13766e5d1 100644 --- a/Sources/Divide/makefile +++ b/Sources/Divide/makefile @@ -175,7 +175,7 @@ SRC_F_MOD = Const_Mod.f90 \ Gen_Mod.f90 \ Vtk_Mod.f90 \ Metis_Mod.f90 \ - Boundary_Mod.f90 \ + Region_Mod.f90 \ Swap_Mod.f90 \ Sort_Mod.f90 \ Grid_Mod.f90 diff --git a/Sources/Divide/makefile_explicit_dependencies b/Sources/Divide/makefile_explicit_dependencies index 3caf30f18..bb1754972 100644 --- a/Sources/Divide/makefile_explicit_dependencies +++ b/Sources/Divide/makefile_explicit_dependencies @@ -61,7 +61,7 @@ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Boundary_Mod.o +$(DIR_OBJECT)/Region_Mod.o #--------------------------------------------------- # Dependencies for: ./File_Mod.f90 @@ -166,9 +166,9 @@ $(DIR_OBJECT)/Thick_Line.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Boundary_Mod.f90 +# Dependencies for: ./Region_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Boundary_Mod.o:\ +$(DIR_OBJECT)/Region_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- diff --git a/Sources/Generate/Domain_Mod/Distribute_Ranges.f90 b/Sources/Generate/Domain_Mod/Distribute_Ranges.f90 index cc656d443..542fd2791 100644 --- a/Sources/Generate/Domain_Mod/Distribute_Ranges.f90 +++ b/Sources/Generate/Domain_Mod/Distribute_Ranges.f90 @@ -22,7 +22,7 @@ subroutine Domain_Mod_Distribute_Ranges(dom, Grid) ! This is too much memory but that's OK ! (+1 is to store the default values) - allocate(Grid % bnd_cond % name(dom % n_ranges + 1)) + allocate(Grid % region % name(dom % n_ranges + 1)) ! Initialize number of boundary conditions n_bnd = 0 @@ -87,12 +87,12 @@ subroutine Domain_Mod_Distribute_Ranges(dom, Grid) found = .false. do r=1,n_bnd - if( Grid % bnd_cond % name(r) .eq. & + if( Grid % region % name(r) .eq. & dom % ranges(n) % name ) found = .true. end do if( .not. found) then n_bnd = n_bnd + 1 - Grid % bnd_cond % name(n_bnd) = dom % ranges(n) % name + Grid % region % name(n_bnd) = dom % ranges(n) % name end if do i=is,ie @@ -111,6 +111,6 @@ subroutine Domain_Mod_Distribute_Ranges(dom, Grid) ! Store the number of boundary conditions Grid % n_bnd_cond = n_bnd - call Grid % Print_Bnd_Cond_List() + call Grid % Print_Regions_List() end subroutine diff --git a/Sources/Generate/Generate_Mod/Load_Dom.f90 b/Sources/Generate/Generate_Mod/Load_Dom.f90 index d4e647fb1..f677bb13f 100644 --- a/Sources/Generate/Generate_Mod/Load_Dom.f90 +++ b/Sources/Generate/Generate_Mod/Load_Dom.f90 @@ -59,8 +59,8 @@ subroutine Load_Dom(Generate, dom, smr, ref, Grid) print *, '#', Grid % max_n_bnd_cells, ' boundary cells' print *, '#', Grid % max_n_faces, ' cell faces' - allocate (Grid % bnd_cond % color(-Grid % max_n_bnd_cells-1:-1)) - Grid % bnd_cond % color = 0 + allocate (Grid % region % at_cell(-Grid % max_n_bnd_cells-1:-1)) + Grid % region % at_cell = 0 ! Variables in Grid_Mod call Grid % Allocate_Nodes(Grid % max_n_nodes) diff --git a/Sources/Generate/Refines_Mod/Connectivity.f90 b/Sources/Generate/Refines_Mod/Connectivity.f90 index 3cc6b1e59..eab3bdeba 100644 --- a/Sources/Generate/Refines_Mod/Connectivity.f90 +++ b/Sources/Generate/Refines_Mod/Connectivity.f90 @@ -35,8 +35,8 @@ subroutine Refines_Mod_Connectivity(ref, Grid, real_run) if(Grid % cells_c(m,c) < 0) then Grid % n_bnd_cells = Grid % n_bnd_cells + 1 - ! Remember the boundary color, take positive value for color - Grid % bnd_cond % color(-Grid % n_bnd_cells) = -Grid % cells_c(m,c) + ! Remember the boundary region, take positive value for region + Grid % region % at_cell(-Grid % n_bnd_cells) = -Grid % cells_c(m,c) ! Put new boundary cell into place Grid % cells_c(m,c) = -Grid % n_bnd_cells @@ -111,10 +111,10 @@ subroutine Refines_Mod_Connectivity(ref, Grid, real_run) do c = 1, Grid % n_cells do m = 1, 24 ! neighbour cells if(Grid % cells_c(m,c) < 0) then - Grid % n_bnd_cells = Grid % n_bnd_cells + 1 + Grid % n_bnd_cells = Grid % n_bnd_cells + 1 - ! Restore the boundary color, take positive value for color - Grid % cells_c(m,c) = -Grid % bnd_cond % color(-Grid % n_bnd_cells) + ! Restore the boundary region, take positive value for region + Grid % cells_c(m,c) = -Grid % region % at_cell(-Grid % n_bnd_cells) end if end do end do diff --git a/Sources/Generate/makefile b/Sources/Generate/makefile index c5e5907d9..3be2283c9 100644 --- a/Sources/Generate/makefile +++ b/Sources/Generate/makefile @@ -179,7 +179,7 @@ SRC_F_MOD = Const_Mod.f90 \ Gen_Mod.f90 \ Vtk_Mod.f90 \ Metis_Mod.f90 \ - Boundary_Mod.f90 \ + Region_Mod.f90 \ Swap_Mod.f90 \ Sort_Mod.f90 \ Grid_Mod.f90 diff --git a/Sources/Generate/makefile_explicit_dependencies b/Sources/Generate/makefile_explicit_dependencies index b09672c5a..77d858acf 100644 --- a/Sources/Generate/makefile_explicit_dependencies +++ b/Sources/Generate/makefile_explicit_dependencies @@ -136,7 +136,7 @@ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Boundary_Mod.o +$(DIR_OBJECT)/Region_Mod.o #--------------------------------------------------- # Dependencies for: ./File_Mod.f90 @@ -241,9 +241,9 @@ $(DIR_OBJECT)/Thick_Line.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Boundary_Mod.f90 +# Dependencies for: ./Region_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Boundary_Mod.o:\ +$(DIR_OBJECT)/Region_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- diff --git a/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 b/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 index 562d0897e..cbc84ec06 100644 --- a/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 +++ b/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 @@ -25,11 +25,11 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) character(SL) :: bc_type_name, try_str integer :: bc_type_tag character(SL) :: keys(128) - real :: vals(0:128) ! they start from zero! - integer :: types_per_color(128) ! how many types in a color - character(SL) :: types_names(128) ! name of each type - logical :: types_file(128) ! type specified in a file? - integer :: c_types ! counter types + real :: vals(0:128) ! they start from zero! + integer :: types_per_reg(128) ! how many types in a region + character(SL) :: types_names(128) ! name of each type + logical :: types_file(128) ! type specified in a file? + integer :: c_types ! counter types integer :: edd_n real :: edd_r real :: edd_i @@ -60,14 +60,14 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) ! Count number of types per boundary condition, total number ! ! of types specified, and also extract their names ! !----------------------------------------------------------------! - types_per_color(:) = 0 + types_per_reg(:) = 0 types_file(:) = .false. c_types = 0 do bc = 1, Grid % n_bnd_cond - call Control_Mod_Position_At_Two_Keys('BOUNDARY_CONDITION', & - Grid % bnd_cond % name(bc), & - found, & + call Control_Mod_Position_At_Two_Keys('BOUNDARY_CONDITION', & + Grid % region % name(bc), & + found, & .false.) if(found) then 1 continue @@ -82,7 +82,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) call Control_Mod_Read_Char_Item_On('VARIABLES', 'VOID', try_str, .false.) call Control_Mod_Read_Char_Item_On('VALUES', 'VOID', try_str, .false.) - types_per_color(bc) = types_per_color(bc) + 1 + types_per_reg(bc) = types_per_reg(bc) + 1 c_types = c_types + 1 types_names(c_types) = bc_type_name @@ -96,7 +96,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) else if(this_proc < 2) then print *, '# ERROR! Boundary conditions for ', & - trim(Grid % bnd_cond % name(bc)), & + trim(Grid % region % name(bc)), & ' not specified in the control file!' print *, '# Exiting the program.' end if @@ -120,11 +120,11 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) do bc = 1, Grid % n_bnd_cond ! Position yourself well - call Control_Mod_Position_At_Two_Keys('BOUNDARY_CONDITION', & - Grid % bnd_cond % name(bc), & - found, & + call Control_Mod_Position_At_Two_Keys('BOUNDARY_CONDITION', & + Grid % region % name(bc), & + found, & .false.) - do l = 1, types_per_color(bc) + do l = 1, types_per_reg(bc) ! Update the counter c_types = c_types + 1 @@ -140,25 +140,25 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) ! Copy boundary conditions which were given for the Grid if( bc_type_name .eq. 'INFLOW') then bc_type_tag = INFLOW - Grid % bnd_cond % type(bc) = INFLOW + Grid % region % type(bc) = INFLOW else if( bc_type_name .eq. 'WALL') then bc_type_tag = WALL - Grid % bnd_cond % type(bc) = WALL + Grid % region % type(bc) = WALL else if( bc_type_name .eq. 'OUTFLOW') then bc_type_tag = OUTFLOW - Grid % bnd_cond % type(bc) = OUTFLOW + Grid % region % type(bc) = OUTFLOW else if( bc_type_name .eq. 'SYMMETRY') then bc_type_tag = SYMMETRY - Grid % bnd_cond % type(bc) = SYMMETRY + Grid % region % type(bc) = SYMMETRY else if( bc_type_name .eq. 'WALL_FLUX') then bc_type_tag = WALLFL - Grid % bnd_cond % type(bc) = WALLFL + Grid % region % type(bc) = WALLFL else if( bc_type_name .eq. 'CONVECTIVE') then bc_type_tag = CONVECT - Grid % bnd_cond % type(bc) = CONVECT + Grid % region % type(bc) = CONVECT else if( bc_type_name .eq. 'PRESSURE') then bc_type_tag = PRESSURE - Grid % bnd_cond % type(bc) = PRESSURE + Grid % region % type(bc) = PRESSURE else if(this_proc < 2) then print *, '# ERROR! Read_Control_Boundary_Conditions: '// & @@ -194,7 +194,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) ! Distribute b.c. tags only. do c = -1, -Grid % n_bnd_cells, -1 - if(Grid % bnd_cond % color(c) .eq. bc) then + if(Grid % region % at_cell(c) .eq. bc) then ! Temperature if(Flow % heat_transfer) then @@ -202,13 +202,13 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) if(i > 0) then t % bnd_cond_type(c) = bc_type_tag if(bc_type_tag .eq. WALLFL) t % bnd_cond_type(c) = WALL - if(bc_type_tag .eq. WALLFL) Grid % bnd_cond % type(bc) = WALL + if(bc_type_tag .eq. WALLFL) Grid % region % type(bc) = WALL end if i = Key_Ind('Q', keys, nks) if(i > 0) then t % bnd_cond_type(c) = bc_type_tag if(bc_type_tag .eq. WALL) t % bnd_cond_type(c) = WALLFL - if(bc_type_tag .eq. WALL) Grid % bnd_cond % type(bc) = WALLFL + if(bc_type_tag .eq. WALL) Grid % region % type(bc) = WALLFL end if end if @@ -238,7 +238,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) ! Distribute b.c. values do c = -1, -Grid % n_bnd_cells, -1 - if(Grid % bnd_cond % color(c) .eq. bc) then + if(Grid % region % at_cell(c) .eq. bc) then ! For velocity, pressure and wall roughness i = Key_Ind('U', keys, nks); if(i > 0) u % b(c) = vals(i) @@ -355,7 +355,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) do c = -1, -Grid % n_bnd_cells, -1 ! Distribute b.c. types - if(Grid % bnd_cond % color(c) .eq. bc) then + if(Grid % region % at_cell(c) .eq. bc) then ! For temperature if(Flow % heat_transfer) then @@ -363,13 +363,13 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) if(i > 0) then t % bnd_cond_type(c) = bc_type_tag if(bc_type_tag .eq. WALLFL) t % bnd_cond_type(c) = WALL - if(bc_type_tag .eq. WALLFL) Grid % bnd_cond % type(bc) = WALL + if(bc_type_tag .eq. WALLFL) Grid % region % type(bc) = WALL end if i = Key_Ind('Q', keys, nks) if(i > 0) then t % bnd_cond_type(c) = bc_type_tag if(bc_type_tag .eq. WALL) t % bnd_cond_type(c) = WALLFL - if(bc_type_tag .eq. WALL) Grid % bnd_cond % type(bc) = WALLFL + if(bc_type_tag .eq. WALL) Grid % region % type(bc) = WALLFL end if end if @@ -388,7 +388,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) end if ! Distribute b.c. values - if(Grid % bnd_cond % color(c) .eq. bc) then + if(Grid % region % at_cell(c) .eq. bc) then dist_min = HUGE do m = 1, n_points @@ -484,7 +484,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) i = Key_Ind('F22', keys, nks); if(i>0) f22 % b(c) = prof(k,i) end if end if - end if !end if(Grid % bnd_cond % color(c) .eq. n) + end if !end if(Grid % region % at_cell(c) .eq. n) end do !end do c = -1, -Grid % n_bnd_cells, -1 !----------------------------! @@ -494,7 +494,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) do c = -1, -Grid % n_bnd_cells, -1 - if(Grid % bnd_cond % color(c) .eq. bc) then + if(Grid % region % at_cell(c) .eq. bc) then do m = 1, n_points-1 here = .false. @@ -554,14 +554,14 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) t % bnd_cond_type(c) = bc_type_tag if(bc_type_tag .eq. WALLFL) t % bnd_cond_type(c) = WALL if(bc_type_tag .eq. WALLFL) & - Grid % bnd_cond % type(bc) = WALL + Grid % region % type(bc) = WALL end if i = Key_Ind('Q',keys,nks) if(i > 0) then t % bnd_cond_type(c) = bc_type_tag if(bc_type_tag .eq. WALL) t % bnd_cond_type(c) = WALLFL if(bc_type_tag .eq. WALL) & - Grid % bnd_cond % type(bc) = WALLFL + Grid % region % type(bc) = WALLFL end if end if @@ -581,7 +581,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) end do ! m, points end if ! bnd_color .eq. bc - if(Grid % bnd_cond % color(c) .eq. bc) then + if(Grid % region % at_cell(c) .eq. bc) then do m = 1, n_points-1 here = .false. @@ -655,7 +655,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) t % bnd_cond_type(c) = bc_type_tag if(bc_type_tag .eq. WALLFL) t % bnd_cond_type(c) = WALL if(bc_type_tag .eq. WALLFL) & - Grid % bnd_cond % type(bc) = WALL + Grid % region % type(bc) = WALL end if i = Key_Ind('Q',keys,nks) if(i > 0) t % q(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) @@ -663,7 +663,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) t % bnd_cond_type(c) = bc_type_tag if(bc_type_tag .eq. WALL) t % bnd_cond_type(c) = WALLFL if(bc_type_tag .eq. WALL) & - Grid % bnd_cond % type(bc) = WALLFL + Grid % region % type(bc) = WALLFL end if end if @@ -780,7 +780,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) turb_planes % n_planes = 0 do bc = 1, Grid % n_bnd_cond ! imagine there are as many eddies as bcs call Control_Mod_Position_At_Two_Keys('SYNTHETIC_EDDIES', & - Grid % bnd_cond % name(bc), & + Grid % region % name(bc), & found, & .false.) if(found) then @@ -793,7 +793,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) edd_r, & edd_i, & Flow, & - Grid % bnd_cond % name(bc)) + Grid % region % name(bc)) end if end do if(turb_planes % n_planes > 0 .and. this_proc < 2) then diff --git a/Sources/Process/makefile b/Sources/Process/makefile index db261c0cb..04f5b88fe 100644 --- a/Sources/Process/makefile +++ b/Sources/Process/makefile @@ -250,7 +250,7 @@ SRC_F_MOD = Const_Mod.f90 \ File_Mod.f90 \ Control_Mod.f90 \ Vtk_Mod.f90 \ - Boundary_Mod.f90 \ + Region_Mod.f90 \ Metis_Mod.f90 \ Grid_Mod.f90 \ Work_Mod.f90 \ diff --git a/Sources/Process/makefile_explicit_dependencies b/Sources/Process/makefile_explicit_dependencies index dcf79ac87..158ffed72 100644 --- a/Sources/Process/makefile_explicit_dependencies +++ b/Sources/Process/makefile_explicit_dependencies @@ -310,9 +310,9 @@ Solver_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Process_Mod/Update_Boundary_Values.f90 +# Dependencies for: ./Process_Mod/Update_Region_Values.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Update_Boundary_Values.o:\ +$(DIR_OBJECT)/Update_Region_Values.o:\ $(DIR_OBJECT)/Vof_Mod.o \ Vof_Mod/*/*.f90 \ $(DIR_OBJECT)/Turb_Mod.o \ @@ -426,14 +426,14 @@ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Boundary_Mod.o \ +$(DIR_OBJECT)/Region_Mod.o \ $(DIR_OBJECT)/Assert_Mod.o \ $(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Boundary_Mod.f90 +# Dependencies for: ./Region_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Boundary_Mod.o:\ +$(DIR_OBJECT)/Region_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- diff --git a/Sources/Shared/Browse.h90 b/Sources/Shared/Browse.h90 index ffe95fdb7..eb807ed48 100644 --- a/Sources/Shared/Browse.h90 +++ b/Sources/Shared/Browse.h90 @@ -7,7 +7,7 @@ # define Browse_Inside_Cells(c) do c = 1, Grid % n_cells # define Browse_Faces(c) do s = 1, Grid % n_faces -# define Browse_Faces_In_Color(s, color) do s = Grid % bnd_cond % color_s_face(color), Grid % bnd_cond % color_e_face(color) +# define Browse_Faces_In_Color(s, color) do s = Grid % region % f_face(color), Grid % region % l_face(color) # define End_Browse end do diff --git a/Sources/Shared/Grid_Mod.f90 b/Sources/Shared/Grid_Mod.f90 index 53a4b36fc..f26bd75f4 100644 --- a/Sources/Shared/Grid_Mod.f90 +++ b/Sources/Shared/Grid_Mod.f90 @@ -11,7 +11,7 @@ module Grid_Mod use Assert_Mod use Profiler_Mod use File_Mod - use Boundary_Mod + use Region_Mod use Vtk_Mod use Metis_Mod use Sort_Mod @@ -93,7 +93,7 @@ module Grid_Mod integer, allocatable :: cells_bnd_face(:) ! For each cell; type of the boundary condition in a given direction - integer, allocatable :: cells_bnd_color(:,:) + integer, allocatable :: cells_bnd_region(:,:) !-------------------------! ! Face-based variables ! @@ -133,7 +133,7 @@ module Grid_Mod ! Node coordinates real, allocatable :: xn(:), yn(:), zn(:) - type(Boundary_Type) :: bnd_cond + type(Region_Type) :: region ! Maximum number of cells, boundary cells and faces ! (Used for tentative memory allocation in Generator) @@ -181,7 +181,6 @@ module Grid_Mod procedure :: Allocate_Nodes procedure :: Bnd_Cond_Name procedure :: Bnd_Cond_Type - procedure :: Bnd_Cond_Ranges procedure :: Bounding_Box procedure :: Calculate_Cell_Centers procedure :: Calculate_Cell_Inertia @@ -212,8 +211,9 @@ module Grid_Mod procedure :: Load_Cfn procedure :: Load_Dim procedure :: Merge_Duplicate_Nodes - procedure :: Print_Bnd_Cond_List + procedure :: Print_Regions_List procedure :: Print_Grid_Statistics + procedure :: Regions_Ranges procedure :: Save_Cfn procedure :: Save_Dim procedure :: Save_Debug_Vtu @@ -235,7 +235,6 @@ module Grid_Mod # include "Grid_Mod/Allocate_Nodes.f90" # include "Grid_Mod/Bnd_Cond_Name.f90" # include "Grid_Mod/Bnd_Cond_Type.f90" -# include "Grid_Mod/Bnd_Cond_Ranges.f90" # include "Grid_Mod/Bounding_Box.f90" # include "Grid_Mod/Calculate_Cell_Centers.f90" # include "Grid_Mod/Calculate_Cell_Inertia.f90" @@ -266,8 +265,9 @@ module Grid_Mod # include "Grid_Mod/Load_Cfn.f90" # include "Grid_Mod/Load_Dim.f90" # include "Grid_Mod/Merge_Duplicate_Nodes.f90" -# include "Grid_Mod/Print_Bnd_Cond_List.f90" +# include "Grid_Mod/Print_Regions_List.f90" # include "Grid_Mod/Print_Grid_Statistics.f90" +# include "Grid_Mod/Regions_Ranges.f90" # include "Grid_Mod/Save_Cfn.f90" # include "Grid_Mod/Save_Dim.f90" # include "Grid_Mod/Save_Debug_Vtu.f90" diff --git a/Sources/Shared/Grid_Mod/Allocate_Cells.f90 b/Sources/Shared/Grid_Mod/Allocate_Cells.f90 index 6ce69c4b7..3026ca569 100644 --- a/Sources/Shared/Grid_Mod/Allocate_Cells.f90 +++ b/Sources/Shared/Grid_Mod/Allocate_Cells.f90 @@ -45,10 +45,10 @@ subroutine Allocate_Cells(Grid, nc, nb) allocate(Grid % cells_n_faces(-nb:nc)); Grid % cells_n_faces(:) = 0 allocate(Grid % cells_n_cells(-nb:nc)); Grid % cells_n_cells(:) = 0 - ! Boundary condition color in a given direction + ! Boundary condition region in a given direction ! (These go up to 6 because they are needed for ! non-polyhedral meshes creted in Gambit/Gmsh) - allocate(Grid % cells_bnd_color(6, -nb:nc)) + allocate(Grid % cells_bnd_region(6, -nb:nc)) ! Allocate processor i.d. allocate(Grid % Comm % cell_proc(-nb:nc)); Grid % Comm % cell_proc(:) = 0 diff --git a/Sources/Shared/Grid_Mod/Bnd_Cond_Name.f90 b/Sources/Shared/Grid_Mod/Bnd_Cond_Name.f90 index 63fe32a3d..d7eee90be 100644 --- a/Sources/Shared/Grid_Mod/Bnd_Cond_Name.f90 +++ b/Sources/Shared/Grid_Mod/Bnd_Cond_Name.f90 @@ -1,16 +1,15 @@ !==============================================================================! - character(SL) function Bnd_Cond_Name(Grid, bnd_cell) + character(SL) function Bnd_Cond_Name(Grid, cell) !------------------------------------------------------------------------------! ! Provides a shortcut to obtain boundary condition type. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Grid_Type) :: Grid - integer :: bnd_cell + class(Grid_Type) :: Grid + integer, intent(in) :: cell !==============================================================================! - Bnd_Cond_Name = & - Grid % bnd_cond % name(Grid % bnd_cond % color(bnd_cell)) + Bnd_Cond_Name = Grid % region % name(Grid % region % at_cell(cell)) end function diff --git a/Sources/Shared/Grid_Mod/Bnd_Cond_Type.f90 b/Sources/Shared/Grid_Mod/Bnd_Cond_Type.f90 index c18c2ae57..494ed8be1 100644 --- a/Sources/Shared/Grid_Mod/Bnd_Cond_Type.f90 +++ b/Sources/Shared/Grid_Mod/Bnd_Cond_Type.f90 @@ -1,18 +1,17 @@ !==============================================================================! - integer function Bnd_Cond_Type(Grid, bnd_cell) + integer function Bnd_Cond_Type(Grid, cell) !------------------------------------------------------------------------------! ! Provides a shortcut to obtain boundary condition type. ! ! Warning: avoid calling this function for temperature and species (scalars) ! -! since they may have different b.c. for the same color. ! +! since they may have different b.c. for the same region. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Grid_Type) :: Grid - integer :: bnd_cell + class(Grid_Type) :: Grid + integer, intent(in) :: cell !==============================================================================! - Bnd_Cond_Type = & - Grid % bnd_cond % type(Grid % bnd_cond % color(bnd_cell)) + Bnd_Cond_Type = Grid % region % type(Grid % region % at_cell(cell)) end function diff --git a/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 b/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 index d61371028..83e36a8d1 100644 --- a/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 +++ b/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 @@ -194,7 +194,7 @@ subroutine Calculate_Face_Geometry(Grid) if(abs(Grid % xc(c2) - Grid % xc(c1) ) > 1.5 * abs(Grid % dx(s))) then if(Grid % xc(c2) > Grid % xc(c1)) then Assert(Grid % faces_s(s) > 0) - Grid % bnd_cond % color(s) = Grid % n_bnd_cond + 1 + Grid % region % at_cell(s) = Grid % n_bnd_cond + 1 end if end if end if @@ -203,7 +203,7 @@ subroutine Calculate_Face_Geometry(Grid) if(abs(Grid % yc(c2) - Grid % yc(c1) ) > 1.5 * abs(Grid % dy(s))) then if(Grid % yc(c2) > Grid % yc(c1)) then Assert(Grid % faces_s(s) > 0) - Grid % bnd_cond % color(s) = Grid % n_bnd_cond + 2 + Grid % region % at_cell(s) = Grid % n_bnd_cond + 2 end if end if end if @@ -212,7 +212,7 @@ subroutine Calculate_Face_Geometry(Grid) if(abs(Grid % zc(c2) - Grid % zc(c1) ) > 1.5 * abs(Grid % dz(s))) then if(Grid % zc(c2) > Grid % zc(c1)) then Assert(Grid % faces_s(s) > 0) - Grid % bnd_cond % color(s) = Grid % n_bnd_cond + 3 + Grid % region % at_cell(s) = Grid % n_bnd_cond + 3 end if end if end if diff --git a/Sources/Shared/Grid_Mod/Calculate_Wall_Distance.f90 b/Sources/Shared/Grid_Mod/Calculate_Wall_Distance.f90 index 09d7ba4f8..e2307e40b 100644 --- a/Sources/Shared/Grid_Mod/Calculate_Wall_Distance.f90 +++ b/Sources/Shared/Grid_Mod/Calculate_Wall_Distance.f90 @@ -24,7 +24,7 @@ subroutine Calculate_Wall_Distance(Grid) !------------------------------------------------------------------! Grid % wall_dist = HUGE - call Print_Bnd_Cond_List(Grid) + call Print_Regions_List(Grid) call Message % Framed(60, & 'Calculating distance from the walls ', & 'Type ordinal number(s) of wall or wall_flux boundary condition(s) ' // & @@ -74,8 +74,8 @@ subroutine Calculate_Wall_Distance(Grid) ' % complete...', achar(13) do b = 1, n_wall_colors - do c2 = Grid % bnd_cond % color_s_cell( wall_colors(b) ), & - Grid % bnd_cond % color_e_cell( wall_colors(b) ), & + do c2 = Grid % region % f_cell( wall_colors(b) ), & + Grid % region % l_cell( wall_colors(b) ), & -1 Grid % wall_dist(c1) = & min(Grid % wall_dist(c1), & diff --git a/Sources/Shared/Grid_Mod/Load_Cfn.f90 b/Sources/Shared/Grid_Mod/Load_Cfn.f90 index 412c10ecb..e0b9c459a 100644 --- a/Sources/Shared/Grid_Mod/Load_Cfn.f90 +++ b/Sources/Shared/Grid_Mod/Load_Cfn.f90 @@ -70,8 +70,8 @@ subroutine Load_Cfn(Grid, this_proc, domain) ! Boundary conditions' keys ! (Go from zero for faces which are not at the boundary) - allocate(Grid % bnd_cond % name(0 : Grid % n_bnd_cond + 3)) - allocate(Grid % bnd_cond % type(0 : Grid % n_bnd_cond + 3)) + allocate(Grid % region % name(0 : Grid % n_bnd_cond + 3)) + allocate(Grid % region % type(0 : Grid % n_bnd_cond + 3)) !-----------------! ! Domain name ! @@ -82,15 +82,15 @@ subroutine Load_Cfn(Grid, this_proc, domain) ! Boundary conditions list ! !------------------------------! do n = 1, Grid % n_bnd_cond - read(fu) Grid % bnd_cond % name(n) + read(fu) Grid % region % name(n) end do ! The last three are reserved for perodicity ! and used for inlet copy boundary condition. Don't delete these thinking ! they are useless. They are assigned in Calculate_Face_Geometry - Grid % bnd_cond % name(Grid % n_bnd_cond + 1) = 'PERIODIC_X' - Grid % bnd_cond % name(Grid % n_bnd_cond + 2) = 'PERIODIC_Y' - Grid % bnd_cond % name(Grid % n_bnd_cond + 3) = 'PERIODIC_Z' + Grid % region % name(Grid % n_bnd_cond + 1) = 'PERIODIC_X' + Grid % region % name(Grid % n_bnd_cond + 2) = 'PERIODIC_Y' + Grid % region % name(Grid % n_bnd_cond + 3) = 'PERIODIC_Z' !--------------------------! ! Nodes global numbers ! @@ -272,10 +272,10 @@ subroutine Load_Cfn(Grid, this_proc, domain) ! Physical boundary cells (and all the faces) ! (This opens the oportunity to store bounary condition info in ... ! ... the faces thus ridding us of the "if(c2 < 0) then" checks) - allocate (Grid % bnd_cond % color(-Grid % n_bnd_cells-1:Grid % n_faces)) - read(fu) (Grid % bnd_cond % color(c), c = -Grid % n_bnd_cells, -1) + allocate (Grid % region % at_cell(-Grid % n_bnd_cells-1:Grid % n_faces)) + read(fu) (Grid % region % at_cell(c), c = -Grid % n_bnd_cells, -1) - call Bnd_Cond_Ranges(Grid) + call Regions_Ranges(Grid) close(fu) diff --git a/Sources/Shared/Grid_Mod/Print_Bnd_Cond_List.f90 b/Sources/Shared/Grid_Mod/Print_Regions_List.f90 similarity index 60% rename from Sources/Shared/Grid_Mod/Print_Bnd_Cond_List.f90 rename to Sources/Shared/Grid_Mod/Print_Regions_List.f90 index ddd170768..e1633221a 100644 --- a/Sources/Shared/Grid_Mod/Print_Bnd_Cond_List.f90 +++ b/Sources/Shared/Grid_Mod/Print_Regions_List.f90 @@ -1,18 +1,18 @@ !==============================================================================! - subroutine Print_Bnd_Cond_List(Grid) + subroutine Print_Regions_List(Grid) !------------------------------------------------------------------------------! -! Prints a list of boundary conditions in a grid. ! +! Prints a list of regions (boundary conditions) in a grid. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! class(Grid_Type) :: Grid !-----------------------------------[Locals]-----------------------------------! integer :: j, ll, lc - character(MAX_TOKENS*2) :: bnd_cond_list + character(MAX_TOKENS*2) :: reg_list !==============================================================================! ! Clear the list - bnd_cond_list(:) = ' ' + reg_list(:) = ' ' !--------------------------------------! ! Form the boundary condition list ! @@ -20,18 +20,18 @@ subroutine Print_Bnd_Cond_List(Grid) ll = 1 do j = 1, Grid % n_bnd_cond if(j < Grid % n_bnd_cond) then - lc = len_trim(Grid % bnd_cond % name(j)) + 8 - write(bnd_cond_list(ll:ll+lc), '(i2,a2,a,a4)') & - j, & - '. ', & - trim(Grid % bnd_cond % name(j)), & + lc = len_trim(Grid % region % name(j)) + 8 + write(reg_list(ll:ll+lc), '(i2,a2,a,a4)') & + j, & + '. ', & + trim(Grid % region % name(j)), & ' \n ' else - lc = len_trim(Grid % bnd_cond % name(j)) + 4 - write(bnd_cond_list(ll:ll+lc), '(i2,a2,a,a4)') & - j, & - '. ', & - trim(Grid % bnd_cond % name(j)) + lc = len_trim(Grid % region % name(j)) + 4 + write(reg_list(ll:ll+lc), '(i2,a2,a,a4)') & + j, & + '. ', & + trim(Grid % region % name(j)) end if ll = ll + lc + 1 end do @@ -41,6 +41,6 @@ subroutine Print_Bnd_Cond_List(Grid) !-------------------------------! call Message % Framed(20, & "Grid currently has the following boundary conditions:", & - bnd_cond_list(1:ll)) + reg_list(1:ll)) end subroutine diff --git a/Sources/Shared/Grid_Mod/Bnd_Cond_Ranges.f90 b/Sources/Shared/Grid_Mod/Regions_Ranges.f90 similarity index 50% rename from Sources/Shared/Grid_Mod/Bnd_Cond_Ranges.f90 rename to Sources/Shared/Grid_Mod/Regions_Ranges.f90 index d8c9c6cd1..96184b899 100644 --- a/Sources/Shared/Grid_Mod/Bnd_Cond_Ranges.f90 +++ b/Sources/Shared/Grid_Mod/Regions_Ranges.f90 @@ -1,8 +1,8 @@ !==============================================================================! - subroutine Bnd_Cond_Ranges(Grid) + subroutine Regions_Ranges(Grid) !------------------------------------------------------------------------------! ! Allocates memory and finds the range (first and last boundary cell) ! -! for each of the boundary condition colors. ! +! for each of the boundary condition region. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -10,46 +10,46 @@ subroutine Bnd_Cond_Ranges(Grid) !------------------------------[Local parameters]------------------------------! logical, parameter :: DEBUG = .false. !-----------------------------------[Locals]-----------------------------------! - integer :: c2, color, s + integer :: c2, reg, s !==============================================================================! ! Allocate memory - allocate(Grid % bnd_cond % color_s_cell(0:Grid % n_bnd_cond)) - allocate(Grid % bnd_cond % color_e_cell(0:Grid % n_bnd_cond)) + allocate(Grid % region % f_cell(0:Grid % n_bnd_cond)) + allocate(Grid % region % l_cell(0:Grid % n_bnd_cond)) !-------------------! ! Cells' ranges ! !-------------------! ! Set non-realizable ranges - Grid % bnd_cond % color_s_cell(:) = -1 - Grid % bnd_cond % color_e_cell(:) = -HUGE_INT + Grid % region % f_cell(:) = -1 + Grid % region % l_cell(:) = -HUGE_INT ! Browse forward and backward to find first and last cell for each range do c2 = -Grid % n_bnd_cells, -1 if(Grid % Comm % cell_proc(c2) .eq. this_proc) then - color = Grid % bnd_cond % color(c2) - if(c2 < Grid % bnd_cond % color_s_cell(color)) then - Grid % bnd_cond % color_s_cell(color) = c2 + reg = Grid % region % at_cell(c2) + if(c2 < Grid % region % f_cell(reg)) then + Grid % region % f_cell(reg) = c2 end if end if end do do c2 = -1, -Grid % n_bnd_cells, -1 if(Grid % Comm % cell_proc(c2) .eq. this_proc) then - color = Grid % bnd_cond % color(c2) - if(c2 > Grid % bnd_cond % color_e_cell(color)) then - Grid % bnd_cond % color_e_cell(color) = c2 + reg = Grid % region % at_cell(c2) + if(c2 > Grid % region % l_cell(reg)) then + Grid % region % l_cell(reg) = c2 end if end if end do if(DEBUG) then write(1000, '(a)') ' # Cell ranges' - do color = 1, Grid % n_bnd_cond - write(1000+this_proc,'(a,i3,i9,i9)') ' # Region: ', color, & - Grid % bnd_cond % color_s_cell(color), & - Grid % bnd_cond % color_e_cell(color) + do reg = 1, Grid % n_bnd_cond + write(1000+this_proc,'(a,i3,i9,i9)') ' # Region: ', reg, & + Grid % region % f_cell(reg), & + Grid % region % l_cell(reg) end do end if @@ -58,42 +58,42 @@ subroutine Bnd_Cond_Ranges(Grid) !-------------------! ! Allocate memory - allocate(Grid % bnd_cond % color_s_face(0:Grid % n_bnd_cond)) - allocate(Grid % bnd_cond % color_e_face(0:Grid % n_bnd_cond)) + allocate(Grid % region % f_face(0:Grid % n_bnd_cond)) + allocate(Grid % region % l_face(0:Grid % n_bnd_cond)) ! Set non-realizable ranges - Grid % bnd_cond % color_s_face(:) = -1 - Grid % bnd_cond % color_e_face(:) = -HUGE_INT + Grid % region % f_face(:) = -1 + Grid % region % l_face(:) = -HUGE_INT ! Browse through colors and faces to set faces' ranges - do color = 1, Grid % n_bnd_cond + do reg = 1, Grid % n_bnd_cond do s = 1, Grid % n_faces c2 = Grid % faces_c(2, s) - if(Grid % bnd_cond % color_s_cell(color) .eq. c2) then - Grid % bnd_cond % color_s_face(color) = s + if(Grid % region % f_cell(reg) .eq. c2) then + Grid % region % f_face(reg) = s end if - if(Grid % bnd_cond % color_e_cell(color) .eq. c2) then - Grid % bnd_cond % color_e_face(color) = s + if(Grid % region % l_cell(reg) .eq. c2) then + Grid % region % l_face(reg) = s end if end do end do if(DEBUG) then write(2000, '(a)') ' # Face ranges' - do color = 1, Grid % n_bnd_cond - write(2000+this_proc,'(a,i3,i9,i9)') ' # Region: ', color, & - Grid % bnd_cond % color_s_face(color), & - Grid % bnd_cond % color_e_face(color) + do reg = 1, Grid % n_bnd_cond + write(2000+this_proc,'(a,i3,i9,i9)') ' # Region: ', reg, & + Grid % region % f_face(reg), & + Grid % region % l_face(reg) end do end if !-----------! ! Check ! !-----------! - do color = 1, Grid % n_bnd_cond - Browse_Faces_In_Color(s, color) + do reg = 1, Grid % n_bnd_cond + Browse_Faces_In_Color(s, reg) c2 = Grid % faces_c(2, s) - Assert(Grid % bnd_cond % color(c2) == color) + Assert(Grid % region % at_cell(c2) == reg) End_Browse end do diff --git a/Sources/Shared/Grid_Mod/Save_Cfn.f90 b/Sources/Shared/Grid_Mod/Save_Cfn.f90 index 53cb0a0df..9156ed97e 100644 --- a/Sources/Shared/Grid_Mod/Save_Cfn.f90 +++ b/Sources/Shared/Grid_Mod/Save_Cfn.f90 @@ -63,7 +63,7 @@ subroutine Save_Cfn(Grid, & ! Boundary conditions list ! !------------------------------! do n = 1, Grid % n_bnd_cond - write(fu) Grid % bnd_cond % name(n) + write(fu) Grid % region % name(n) end do !--------------------------! @@ -329,7 +329,7 @@ subroutine Save_Cfn(Grid, & ! Physical boundary cells do c = -Grid % n_bnd_cells, -1 if(Grid % old_c(c) .ne. 0) then - write(fu) Grid % bnd_cond % color(Grid % old_c(c)) + write(fu) Grid % region % at_cell(Grid % old_c(c)) end if end do diff --git a/Sources/Shared/Grid_Mod/Save_Vtu_Faces.f90 b/Sources/Shared/Grid_Mod/Save_Vtu_Faces.f90 index bcba08191..d2d6f3158 100644 --- a/Sources/Shared/Grid_Mod/Save_Vtu_Faces.f90 +++ b/Sources/Shared/Grid_Mod/Save_Vtu_Faces.f90 @@ -252,7 +252,7 @@ subroutine Save_Vtu_Faces(Grid, plot_shadows, phi_f) c2 = Grid % faces_c(2,s) if(c2 < 0) then - write(fu) Grid % bnd_cond % color(c2) + write(fu) Grid % region % at_cell(c2) else write(fu) 0 end if diff --git a/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 b/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 index 4989811bb..28e804d75 100644 --- a/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 +++ b/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 @@ -14,7 +14,7 @@ subroutine Sort_Faces_Smart(Grid) !------------------------------[Local parameters]------------------------------! logical, parameter :: DEBUG = .false. !-----------------------------------[Locals]-----------------------------------! - integer :: s, m, n, c, c1, c2, n_bc, color + integer :: s, m, n, c, c1, c2, n_bc, reg integer :: max_diff_1, max_diff_2, c1_s1, c2_s1, c1_s2, c2_s2 integer, allocatable :: old_nn (:) integer, allocatable :: old_shad(:) @@ -33,7 +33,7 @@ subroutine Sort_Faces_Smart(Grid) !--------------------------------------------------------! ! Form the three criteria: ! - ! 1 - the strongest is boundary condition color; to ! + ! 1 - the strongest is boundary condition region; to ! ! sort faces by boundary condition colors first ! ! 2 - the second on the list is cell number, so that ! ! inside cells are later browsed in a straight- ! @@ -45,7 +45,7 @@ subroutine Sort_Faces_Smart(Grid) c1 = Grid % faces_c(1, s) c2 = Grid % faces_c(2, s) criteria(s,1) = HUGE_INT - if(c2 < 0) criteria(s,1) = Grid % bnd_cond % color(c2) + if(c2 < 0) criteria(s,1) = Grid % region % at_cell(c2) criteria(s,2) = c1 criteria(s,3) = c2 Grid % old_f(s) = s @@ -72,10 +72,10 @@ subroutine Sort_Faces_Smart(Grid) c2 = criteria(s,3) ! ... but renumber c2 if on the boundary - if(criteria(s,1) .ne. HUGE_INT) then ! on the boundary - Grid % faces_c(2,s) = -Grid % n_bnd_cells + n_bc ! set face_c properly - Grid % old_c(-Grid % n_bnd_cells + n_bc) = c2 ! store the old number - n_bc = n_bc + 1 ! increase the count + if(criteria(s,1) .ne. HUGE_INT) then ! on the boundary + Grid % faces_c(2,s) = -Grid % n_bnd_cells + n_bc ! set face_c properly + Grid % old_c(-Grid % n_bnd_cells + n_bc) = c2 ! store the old number + n_bc = n_bc + 1 ! increase the count end if end do @@ -88,13 +88,13 @@ subroutine Sort_Faces_Smart(Grid) ! their boundary colors and geometrical quantities ! !------------------------------------------------------! do c=-1, -Grid % n_bnd_cells, -1 - old_nn ( -c) = Grid % bnd_cond % color(Grid % old_c(c)) ! use old_nn ... + old_nn ( -c) = Grid % region % at_cell(Grid % old_c(c)) ! use old_nn ... old_bxyz(1,c) = Grid % xc(Grid % old_c(c)) ! ... for colors old_bxyz(2,c) = Grid % yc(Grid % old_c(c)) old_bxyz(3,c) = Grid % zc(Grid % old_c(c)) end do do c=-1, -Grid % n_bnd_cells, -1 - Grid % bnd_cond % color(c) = old_nn (-c) + Grid % region % at_cell(c) = old_nn(-c) Grid % xc(c) = old_bxyz(1,c) Grid % yc(c) = old_bxyz(2,c) Grid % zc(c) = old_bxyz(3,c) @@ -163,21 +163,21 @@ subroutine Sort_Faces_Smart(Grid) end do end do - ! Find boundary color ranges - call Bnd_Cond_Ranges(Grid) + ! Find boundary reg ranges + call Regions_Ranges(Grid) if(DEBUG) then do s = 1, Grid % n_faces c1 = Grid % faces_c(1, s) c2 = Grid % faces_c(2, s) if(c2 < 0) then - print '(4i6)', s, c1, c2, Grid % bnd_cond % color(c2) + print '(4i6)', s, c1, c2, Grid % region % at_cell(c2) end if end do - do color = 1, Grid % n_bnd_cond - print '(2i6)', Grid % bnd_cond % color_s_cell(color), & - Grid % bnd_cond % color_e_cell(color) + do reg = 1, Grid % n_bnd_cond + print '(2i6)', Grid % region % f_cell(reg), & + Grid % region % l_cell(reg) end do end if diff --git a/Sources/Shared/Grid_Mod/Write_Template_Control_File.f90 b/Sources/Shared/Grid_Mod/Write_Template_Control_File.f90 index 3dea24607..b210964b9 100644 --- a/Sources/Shared/Grid_Mod/Write_Template_Control_File.f90 +++ b/Sources/Shared/Grid_Mod/Write_Template_Control_File.f90 @@ -52,7 +52,7 @@ subroutine Write_Template_Control_File(Grid) write(fu,'(a)') '#-----------------------------------------------------------' do j = 1, Grid % n_bnd_cond - work = Grid % bnd_cond % name(j) + work = Grid % region % name(j) call String % To_Lower_Case(work) write(fu,'(a,a)') ' BOUNDARY_CONDITION ', trim(work) write(fu,'(a)') ' TYPE wall (or: ' // & diff --git a/Sources/Shared/Boundary_Mod.f90 b/Sources/Shared/Region_Mod.f90 similarity index 64% rename from Sources/Shared/Boundary_Mod.f90 rename to Sources/Shared/Region_Mod.f90 index 17a0678fc..9f1847fb4 100644 --- a/Sources/Shared/Boundary_Mod.f90 +++ b/Sources/Shared/Region_Mod.f90 @@ -1,7 +1,7 @@ !==============================================================================! - module Boundary_Mod + module Region_Mod !------------------------------------------------------------------------------! -! This is used to store boundary conditions within a Grid_Type ! +! This is used to store regions (boundary conditions) within a Grid_Type ! !------------------------------------------------------------------------------! !----------------------------------[Modules]-----------------------------------! use Const_Mod @@ -20,26 +20,26 @@ module Boundary_Mod integer, parameter :: WALLFL = 10067 integer, parameter :: PRESSURE = 10069 - !-------------------! - ! Boundary type ! - !-------------------! - type Boundary_Type + !-----------------! + ! Region type ! + !-----------------! + type Region_Type ! Name of the boundary conditions specified in grid generation - ! It ranges through number of boundary conditions (aka colors) + ! It ranges through number of boundary conditions (aka regions) character(SL), allocatable :: name(:) - ! Boundary types, ranging through all colors + ! Boundary types, ranging through all regions integer, allocatable :: type(:) - ! Boundary condition color ranging through boundary cells. + ! Boundary condition ranging through boundary cells. ! Values start from one, zero is internal cell ! (Follows nomenclature from "../Shared/Comm_Mod_Par.f90") - integer, allocatable :: color(:) - integer, allocatable :: color_s_cell(:) ! start bnd cell for color - integer, allocatable :: color_e_cell(:) ! end bnd cell for color - integer, allocatable :: color_s_face(:) ! start bnd cell for color - integer, allocatable :: color_e_face(:) ! end bnd cell for color + integer, allocatable :: at_cell(:) ! region at cell + integer, allocatable :: f_cell(:) ! first (bnd) cell for region + integer, allocatable :: l_cell(:) ! last (bnd) cell for region + integer, allocatable :: f_face(:) ! first (bnd) cell for region + integer, allocatable :: l_face(:) ! last (bnd) cell for region end type From a5361a2828d310f0f3bb9b32a57f43cb2211ee47 Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 20 Feb 2023 07:37:02 +0100 Subject: [PATCH 004/223] Continuation of previous commit: color and bnd_cond are giving space to regions On branch bojan_fixed_cell_ranges modified: Convert/Convert_Mod.f90 modified: Convert/Convert_Mod/Calculate_Geometry.f90 modified: Convert/Convert_Mod/Create_Dual.f90 modified: Convert/Convert_Mod/Find_Parents.f90 modified: Convert/Convert_Mod/Insert_Buildings.f90 modified: Convert/Convert_Mod/Load_Fluent.f90 modified: Convert/Convert_Mod/Load_Gambit.f90 modified: Convert/Convert_Mod/Load_Gmsh.f90 renamed: Convert/Convert_Mod/N_Bnd_Cells_In_Color.f90 -> Convert/Convert_Mod/N_Bnd_Cells_In_Region.f90 renamed: Convert/Convert_Mod/N_Edges_In_Bnd_Color.f90 -> Convert/Convert_Mod/N_Edges_In_Region.f90 renamed: Convert/Convert_Mod/N_Nodes_In_Bnd_Color.f90 -> Convert/Convert_Mod/N_Nodes_In_Region.f90 modified: Convert/Convert_Mod/N_Sharp_Edges.f90 modified: Generate/Domain_Mod/Distribute_Ranges.f90 modified: Process/Read_Controls_Mod/Boundary_Conditions.f90 modified: Shared/Grid_Mod.f90 modified: Shared/Grid_Mod/Calculate_Face_Geometry.f90 modified: Shared/Grid_Mod/Load_Cfn.f90 modified: Shared/Grid_Mod/Print_Regions_List.f90 modified: Shared/Grid_Mod/Regions_Ranges.f90 modified: Shared/Grid_Mod/Save_Cfn.f90 modified: Shared/Grid_Mod/Sort_Faces_Smart.f90 modified: Shared/Grid_Mod/Write_Template_Control_File.f90 --- Sources/Convert/Convert_Mod.f90 | 12 +++++------ .../Convert_Mod/Calculate_Geometry.f90 | 10 +++++----- Sources/Convert/Convert_Mod/Create_Dual.f90 | 20 +++++++++---------- Sources/Convert/Convert_Mod/Find_Parents.f90 | 2 +- .../Convert/Convert_Mod/Insert_Buildings.f90 | 16 +++++++-------- Sources/Convert/Convert_Mod/Load_Fluent.f90 | 14 ++++++------- Sources/Convert/Convert_Mod/Load_Gambit.f90 | 2 +- Sources/Convert/Convert_Mod/Load_Gmsh.f90 | 2 +- ...In_Color.f90 => N_Bnd_Cells_In_Region.f90} | 4 ++-- ...In_Bnd_Color.f90 => N_Edges_In_Region.f90} | 6 +++--- ...In_Bnd_Color.f90 => N_Nodes_In_Region.f90} | 4 ++-- Sources/Convert/Convert_Mod/N_Sharp_Edges.f90 | 8 ++++++-- .../Generate/Domain_Mod/Distribute_Ranges.f90 | 2 +- .../Read_Controls_Mod/Boundary_Conditions.f90 | 6 +++--- Sources/Shared/Grid_Mod.f90 | 2 +- .../Grid_Mod/Calculate_Face_Geometry.f90 | 6 +++--- Sources/Shared/Grid_Mod/Load_Cfn.f90 | 14 ++++++------- .../Shared/Grid_Mod/Print_Regions_List.f90 | 4 ++-- Sources/Shared/Grid_Mod/Regions_Ranges.f90 | 16 +++++++-------- Sources/Shared/Grid_Mod/Save_Cfn.f90 | 8 ++++---- Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 | 2 +- .../Grid_Mod/Write_Template_Control_File.f90 | 2 +- 22 files changed, 83 insertions(+), 79 deletions(-) rename Sources/Convert/Convert_Mod/{N_Bnd_Cells_In_Color.f90 => N_Bnd_Cells_In_Region.f90} (91%) rename Sources/Convert/Convert_Mod/{N_Edges_In_Bnd_Color.f90 => N_Edges_In_Region.f90} (96%) rename Sources/Convert/Convert_Mod/{N_Nodes_In_Bnd_Color.f90 => N_Nodes_In_Region.f90} (92%) diff --git a/Sources/Convert/Convert_Mod.f90 b/Sources/Convert/Convert_Mod.f90 index 340dfc4e1..f5b750b63 100644 --- a/Sources/Convert/Convert_Mod.f90 +++ b/Sources/Convert/Convert_Mod.f90 @@ -30,9 +30,9 @@ module Convert_Mod procedure :: Load_Gmsh procedure :: Load_Obj procedure :: Logo_Con - procedure :: N_Bnd_Cells_In_Color - procedure :: N_Edges_In_Bnd_Color - procedure :: N_Nodes_In_Bnd_Color + procedure :: N_Bnd_Cells_In_Region + procedure :: N_Edges_In_Region + procedure :: N_Nodes_In_Region procedure :: N_Sharp_Corners procedure :: N_Sharp_Edges procedure :: Sort_Face_Nodes @@ -162,9 +162,9 @@ module Convert_Mod # include "Convert_Mod/Load_Gmsh.f90" # include "Convert_Mod/Load_Obj.f90" # include "Convert_Mod/Logo_Con.f90" -# include "Convert_Mod/N_Bnd_Cells_In_Color.f90" -# include "Convert_Mod/N_Edges_In_Bnd_Color.f90" -# include "Convert_Mod/N_Nodes_In_Bnd_Color.f90" +# include "Convert_Mod/N_Bnd_Cells_In_Region.f90" +# include "Convert_Mod/N_Edges_In_Region.f90" +# include "Convert_Mod/N_Nodes_In_Region.f90" # include "Convert_Mod/N_Sharp_Corners.f90" # include "Convert_Mod/N_Sharp_Edges.f90" # include "Convert_Mod/Sort_Face_Nodes.f90" diff --git a/Sources/Convert/Convert_Mod/Calculate_Geometry.f90 b/Sources/Convert/Convert_Mod/Calculate_Geometry.f90 index 6b49c6920..cb46091e3 100644 --- a/Sources/Convert/Convert_Mod/Calculate_Geometry.f90 +++ b/Sources/Convert/Convert_Mod/Calculate_Geometry.f90 @@ -305,7 +305,7 @@ subroutine Calculate_Geometry(Convert, Grid, ask) end if read(Line % tokens(1), *) reg_per - if( reg_per > Grid % n_bnd_cond ) then + if( reg_per > Grid % n_regions ) then print *, '# Critical error: boundary condition ', reg_per, & ' doesn''t exist!' print *, '# Exiting! ' @@ -496,7 +496,7 @@ subroutine Calculate_Geometry(Convert, Grid, ask) !------------------------------------------------------------------! ! Remove boundary condition with reg_per and compress the rest ! !------------------------------------------------------------------! - if(reg_per < Grid % n_bnd_cond) then + if(reg_per < Grid % n_regions) then ! Set the regions of boundary selected to be periodic to zero do c = -1, -Grid % n_bnd_cells, -1 @@ -506,7 +506,7 @@ subroutine Calculate_Geometry(Convert, Grid, ask) end do ! Shift the rest of the boundary cells - do b = 1, Grid % n_bnd_cond - 1 + do b = 1, Grid % n_regions - 1 if(b .ge. reg_per) then ! Correct the names @@ -522,9 +522,9 @@ subroutine Calculate_Geometry(Convert, Grid, ask) end if end do else - Grid % region % name(Grid % n_bnd_cond) = '' + Grid % region % name(Grid % n_regions) = '' end if - Grid % n_bnd_cond = Grid % n_bnd_cond - 1 + Grid % n_regions = Grid % n_regions - 1 end do ! while answer .ne. 'SKIP' end if ! ask == 0 diff --git a/Sources/Convert/Convert_Mod/Create_Dual.f90 b/Sources/Convert/Convert_Mod/Create_Dual.f90 index 8348440d9..f23179e49 100644 --- a/Sources/Convert/Convert_Mod/Create_Dual.f90 +++ b/Sources/Convert/Convert_Mod/Create_Dual.f90 @@ -33,7 +33,7 @@ subroutine Create_Dual(Convert, Prim, Dual) !==============================================================================! ! Alias(es) - n_bc = Prim % n_bnd_cond + n_bc = Prim % n_regions !-----------------------------! ! ! @@ -191,9 +191,9 @@ subroutine Create_Dual(Convert, Prim, Dual) ! numbers and names ! ! ! !-------------------------! - Dual % n_bnd_cond = Prim % n_bnd_cond - allocate(Dual % region % name(Dual % n_bnd_cond)) - do bc = 1, Prim % n_bnd_cond + Dual % n_regions = Prim % n_regions + allocate(Dual % region % name(Dual % n_regions)) + do bc = 1, Prim % n_regions Dual % region % name(bc) = Prim % region % name(bc) call String % To_Upper_Case(Dual % region % name(bc)) end do @@ -217,9 +217,9 @@ subroutine Create_Dual(Convert, Prim, Dual) ! Count boundary cells (and boundary faces) for the Dual grid ! (Remember that nodes in Prim correspond to cells in Dual) Dual % n_bnd_cells = 0 - do bc = 1, Prim % n_bnd_cond + do bc = 1, Prim % n_regions Dual % n_bnd_cells = Dual % n_bnd_cells & - + Convert % N_Nodes_In_Bnd_Color(Prim, bc, node_data) + + Convert % N_Nodes_In_Region(Prim, bc, node_data) end do Dual % n_faces = Prim % n_edges & ! for faces inside + Dual % n_bnd_cells ! for faces on the boundary @@ -361,14 +361,14 @@ subroutine Create_Dual(Convert, Prim, Dual) curr_f_d = Prim % n_edges curr_b_d = 0 - do bc = 1, Prim % n_bnd_cond + do bc = 1, Prim % n_regions !-----------------------------------------------------! ! Call this to mark boundary cells in this region ! !-----------------------------------------------------! - dual_f_here = Convert % N_Nodes_In_Bnd_Color(Prim, bc, node_data) - unused = Convert % N_Bnd_Cells_In_Color(Prim, bc, cell_data) - unused = Convert % N_Edges_In_Bnd_Color(Prim, bc, edge_data) + dual_f_here = Convert % N_Nodes_In_Region(Prim, bc, node_data) + unused = Convert % N_Bnd_Cells_In_Region(Prim, bc, cell_data) + unused = Convert % N_Edges_In_Region(Prim, bc, edge_data) !-----------------------------------------! ! Find Dual's boundary face, and Dual ! diff --git a/Sources/Convert/Convert_Mod/Find_Parents.f90 b/Sources/Convert/Convert_Mod/Find_Parents.f90 index 665baf8b3..9fe6109a5 100644 --- a/Sources/Convert/Convert_Mod/Find_Parents.f90 +++ b/Sources/Convert/Convert_Mod/Find_Parents.f90 @@ -84,7 +84,7 @@ subroutine Find_Parents(Convert, Grid) ! Real work begins ! !----------------------! - do bc = 1, Grid % n_bnd_cond + do bc = 1, Grid % n_regions cr1(:) = HUGE_INT cr2(:) = HUGE_INT diff --git a/Sources/Convert/Convert_Mod/Insert_Buildings.f90 b/Sources/Convert/Convert_Mod/Insert_Buildings.f90 index a29feeadb..69e253f5b 100644 --- a/Sources/Convert/Convert_Mod/Insert_Buildings.f90 +++ b/Sources/Convert/Convert_Mod/Insert_Buildings.f90 @@ -408,7 +408,7 @@ subroutine Insert_Buildings(Convert, Grid) n_chimneys = 0 allocate(cell_in_chimney(Grid % n_cells)) cell_in_chimney(:) = 0 - do bc = 1, Grid % n_bnd_cond + do bc = 1, Grid % n_regions bc_name = trim(Grid % region % name(bc)) call String % To_Upper_Case(bc_name) if(bc_name(1:7) .eq. 'CHIMNEY') then @@ -474,7 +474,7 @@ subroutine Insert_Buildings(Convert, Grid) !-----------------------------------------------------------! ! Find ground b.c. number (only used to eliminate BUILDING_000) - do bc = 1, Grid % n_bnd_cond + do bc = 1, Grid % n_regions bc_name = trim(Grid % region % name(bc)) call String % To_Upper_Case(bc_name) if(bc_name .eq. 'GROUND') then @@ -483,7 +483,7 @@ subroutine Insert_Buildings(Convert, Grid) end do ! Eliminate building_000 b.c. - do bc = 1, Grid % n_bnd_cond + do bc = 1, Grid % n_regions bc_name = trim(Grid % region % name(bc)) call String % To_Upper_Case(bc_name) if(bc_name .eq. 'BUILDING_000') then @@ -498,7 +498,7 @@ subroutine Insert_Buildings(Convert, Grid) end do cnt = 0 - do bc = 1, Grid % n_bnd_cond + do bc = 1, Grid % n_regions bc_name = trim(Grid % region % name(bc)) call String % To_Upper_Case(bc_name) if(bc_name(1:8) .ne. 'BUILDING') then @@ -513,11 +513,11 @@ subroutine Insert_Buildings(Convert, Grid) end do end if end do - Grid % n_bnd_cond = cnt + Grid % n_regions = cnt ! Shift all by one up (to be able to insert building walls as first) if(buildings_exist) then - do bc = Grid % n_bnd_cond, 1, -1 + do bc = Grid % n_regions, 1, -1 Grid % region % name(bc+1) = Grid % region % name(bc) do c = 1, Grid % n_cells do dir = 1, 6 @@ -527,7 +527,7 @@ subroutine Insert_Buildings(Convert, Grid) end do end do end do - Grid % n_bnd_cond = Grid % n_bnd_cond + 1 + Grid % n_regions = Grid % n_regions + 1 ! Add first boundary condition for walls Grid % region % name(1) = 'BUILDING_WALLS' @@ -642,7 +642,7 @@ subroutine Insert_Buildings(Convert, Grid) end if - do bc = 1, Grid % n_bnd_cond + do bc = 1, Grid % n_regions bc_name = trim(Grid % region % name(bc)) call String % To_Upper_Case(bc_name) if(bc_name(1:7) .eq. 'CHIMNEY') then diff --git a/Sources/Convert/Convert_Mod/Load_Fluent.f90 b/Sources/Convert/Convert_Mod/Load_Fluent.f90 index bfdf12ef1..5c0e1da2f 100644 --- a/Sources/Convert/Convert_Mod/Load_Fluent.f90 +++ b/Sources/Convert/Convert_Mod/Load_Fluent.f90 @@ -25,7 +25,7 @@ subroutine Load_Fluent(Convert, Grid, file_name) integer :: n_face_sect ! number of face sections integer :: face_sect_pos(2048) ! where did Fluent store it integer :: face_sect_bnd(2048) ! where does T-Flows store it - integer :: n_bnd_cond ! number of boundary conditions + integer :: n_regions ! number of boundary conditions logical :: this_sect_bnd ! .true. if bnd cond section logical :: the_end ! end of file reached? logical :: ascii ! is file in ascii format? @@ -131,7 +131,7 @@ subroutine Load_Fluent(Convert, Grid, file_name) face_sect_pos(:) = 0 face_sect_bnd(:) = 0 n_face_sect = 0 - n_bnd_cond = 0 + n_regions = 0 n_bnd_cells = 0 n_faces = 0 the_end = .false. @@ -233,10 +233,10 @@ subroutine Load_Fluent(Convert, Grid, file_name) if( this_sect_bnd ) then ! Increase the number of boundary condition sections and ... - n_bnd_cond = n_bnd_cond + 1 + n_regions = n_regions + 1 ! ... store mapping of this face section to T-Flows boundary condition - face_sect_bnd(n_face_sect) = n_bnd_cond + face_sect_bnd(n_face_sect) = n_regions end if end if @@ -250,11 +250,11 @@ subroutine Load_Fluent(Convert, Grid, file_name) end if print '(a34,i9)', ' # Boundary cells from face data: ', n_bnd_cells - print '(a34,i9)', ' # Boundary condition sections: ', n_bnd_cond + print '(a34,i9)', ' # Boundary condition sections: ', n_regions Grid % n_bnd_cells = n_bnd_cells - Grid % n_bnd_cond = n_bnd_cond - allocate(Grid % region % name(n_bnd_cond)) + Grid % n_regions = n_regions + allocate(Grid % region % name(n_regions)) !--------------------------------------------! ! ! diff --git a/Sources/Convert/Convert_Mod/Load_Gambit.f90 b/Sources/Convert/Convert_Mod/Load_Gambit.f90 index 5769c1b6d..f4d4208b3 100644 --- a/Sources/Convert/Convert_Mod/Load_Gambit.f90 +++ b/Sources/Convert/Convert_Mod/Load_Gambit.f90 @@ -161,7 +161,7 @@ subroutine Load_Gambit(Convert, Grid, file_name) !-------------------------! ! Boundary conditions ! !-------------------------! - Grid % n_bnd_cond = n_bnd_sect + Grid % n_regions = n_bnd_sect allocate(Grid % region % name(n_bnd_sect)) do j = 1, n_bnd_sect diff --git a/Sources/Convert/Convert_Mod/Load_Gmsh.f90 b/Sources/Convert/Convert_Mod/Load_Gmsh.f90 index ba8cc2404..82a27a4a8 100644 --- a/Sources/Convert/Convert_Mod/Load_Gmsh.f90 +++ b/Sources/Convert/Convert_Mod/Load_Gmsh.f90 @@ -514,7 +514,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) ! Copy boundary condition info ! ! ! !----------------------------------! - Grid % n_bnd_cond = n_bnd_sect + Grid % n_regions = n_bnd_sect allocate(Grid % region % name(n_bnd_sect)) do i = 1, n_bnd_sect diff --git a/Sources/Convert/Convert_Mod/N_Bnd_Cells_In_Color.f90 b/Sources/Convert/Convert_Mod/N_Bnd_Cells_In_Region.f90 similarity index 91% rename from Sources/Convert/Convert_Mod/N_Bnd_Cells_In_Color.f90 rename to Sources/Convert/Convert_Mod/N_Bnd_Cells_In_Region.f90 index fcdc6ac02..90aa03360 100644 --- a/Sources/Convert/Convert_Mod/N_Bnd_Cells_In_Color.f90 +++ b/Sources/Convert/Convert_Mod/N_Bnd_Cells_In_Region.f90 @@ -1,5 +1,5 @@ !==============================================================================! - integer function N_Bnd_Cells_In_Color(Convert, Grid, bc, cell_data) + integer function N_Bnd_Cells_In_Region(Convert, Grid, bc, cell_data) !------------------------------------------------------------------------------! ! Counts and marks (with cell_data) boundary cells in given boundary color ! !------------------------------------------------------------------------------! @@ -25,7 +25,7 @@ integer function N_Bnd_Cells_In_Color(Convert, Grid, bc, cell_data) end do ! Return a sum of all marked boundary cells - N_Bnd_Cells_In_Color = cnt + N_Bnd_Cells_In_Region = cnt end function diff --git a/Sources/Convert/Convert_Mod/N_Edges_In_Bnd_Color.f90 b/Sources/Convert/Convert_Mod/N_Edges_In_Region.f90 similarity index 96% rename from Sources/Convert/Convert_Mod/N_Edges_In_Bnd_Color.f90 rename to Sources/Convert/Convert_Mod/N_Edges_In_Region.f90 index efd76dbf4..342704402 100644 --- a/Sources/Convert/Convert_Mod/N_Edges_In_Bnd_Color.f90 +++ b/Sources/Convert/Convert_Mod/N_Edges_In_Region.f90 @@ -1,5 +1,5 @@ !==============================================================================! - integer function N_Edges_In_Bnd_Color(Convert, Grid, bc, edge_data) + integer function N_Edges_In_Region(Convert, Grid, bc, edge_data) !------------------------------------------------------------------------------! ! Counts and marks (with edge_data) edges in the given boundary color ! !------------------------------------------------------------------------------! @@ -106,7 +106,7 @@ integer function N_Edges_In_Bnd_Color(Convert, Grid, bc, edge_data) !------------------------! do e = 1, Grid % n_edges if(Grid % edges_bc(bc, e) .gt. 0) then - if( sum(Grid % edges_bc(1:Grid % n_bnd_cond, e)) .gt. 1 ) then + if( sum(Grid % edges_bc(1:Grid % n_regions, e)) .gt. 1 ) then if(edge_data(e) .eq. 0) then ! hasn't been marked yet cnt = cnt + 1 edge_data(e) = 1 @@ -116,7 +116,7 @@ integer function N_Edges_In_Bnd_Color(Convert, Grid, bc, edge_data) end do ! Return a sum of all marked nodes - N_Edges_In_Bnd_Color = cnt + N_Edges_In_Region = cnt end function diff --git a/Sources/Convert/Convert_Mod/N_Nodes_In_Bnd_Color.f90 b/Sources/Convert/Convert_Mod/N_Nodes_In_Region.f90 similarity index 92% rename from Sources/Convert/Convert_Mod/N_Nodes_In_Bnd_Color.f90 rename to Sources/Convert/Convert_Mod/N_Nodes_In_Region.f90 index 2e9ebe2dd..c1fbf3d02 100644 --- a/Sources/Convert/Convert_Mod/N_Nodes_In_Bnd_Color.f90 +++ b/Sources/Convert/Convert_Mod/N_Nodes_In_Region.f90 @@ -1,5 +1,5 @@ !==============================================================================! - integer function N_Nodes_In_Bnd_Color(Convert, Grid, bc, node_data) + integer function N_Nodes_In_Region(Convert, Grid, bc, node_data) !------------------------------------------------------------------------------! ! Counts and marks (with node_data) nodes in the given boundary color ! !------------------------------------------------------------------------------! @@ -32,7 +32,7 @@ integer function N_Nodes_In_Bnd_Color(Convert, Grid, bc, node_data) end do ! Return a sum of all marked nodes - N_Nodes_In_Bnd_Color = cnt + N_Nodes_In_Region = cnt end function diff --git a/Sources/Convert/Convert_Mod/N_Sharp_Edges.f90 b/Sources/Convert/Convert_Mod/N_Sharp_Edges.f90 index 97d44e61b..be37f0bba 100644 --- a/Sources/Convert/Convert_Mod/N_Sharp_Edges.f90 +++ b/Sources/Convert/Convert_Mod/N_Sharp_Edges.f90 @@ -87,7 +87,11 @@ integer function N_Sharp_Edges(Convert, Grid, edge_data) edge_data(e) = -1 else - print '(A,99F12.3)', 'BAD', norm2(vec_ef(1:3)), norm_1, norm_2, dot_product(norm_1(1:3), norm_2(1:3)) + print '(a,99f12.3)', 'BAD', norm2(vec_ef(1:3)), & + norm_1, & + norm_2, & + dot_product(norm_1(1:3), & + norm_2(1:3)) end if end if @@ -102,7 +106,7 @@ integer function N_Sharp_Edges(Convert, Grid, edge_data) ! ! !-------------------------------------------------------------------! do e = 1, Grid % n_edges - if( sum(Grid % edges_bc(1:Grid % n_bnd_cond, e)) .gt. 1 ) then + if( sum(Grid % edges_bc(1:Grid % n_regions, e)) .gt. 1 ) then if(edge_data(e) .eq. 0) then ! hasn't been marked yet cnt = cnt + 1 edge_data(e) = 1 diff --git a/Sources/Generate/Domain_Mod/Distribute_Ranges.f90 b/Sources/Generate/Domain_Mod/Distribute_Ranges.f90 index 542fd2791..e10928bb9 100644 --- a/Sources/Generate/Domain_Mod/Distribute_Ranges.f90 +++ b/Sources/Generate/Domain_Mod/Distribute_Ranges.f90 @@ -109,7 +109,7 @@ subroutine Domain_Mod_Distribute_Ranges(dom, Grid) end do ! n_ranges ! Store the number of boundary conditions - Grid % n_bnd_cond = n_bnd + Grid % n_regions = n_bnd call Grid % Print_Regions_List() diff --git a/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 b/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 index cbc84ec06..6f28b7bf6 100644 --- a/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 +++ b/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 @@ -64,7 +64,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) types_file(:) = .false. c_types = 0 - do bc = 1, Grid % n_bnd_cond + do bc = 1, Grid % n_regions call Control_Mod_Position_At_Two_Keys('BOUNDARY_CONDITION', & Grid % region % name(bc), & found, & @@ -117,7 +117,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) !------------------------------------------------! c_types = 0 - do bc = 1, Grid % n_bnd_cond + do bc = 1, Grid % n_regions ! Position yourself well call Control_Mod_Position_At_Two_Keys('BOUNDARY_CONDITION', & @@ -778,7 +778,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) ! ! !-----------------------------------! turb_planes % n_planes = 0 - do bc = 1, Grid % n_bnd_cond ! imagine there are as many eddies as bcs + do bc = 1, Grid % n_regions ! imagine there are as many eddies as bcs call Control_Mod_Position_At_Two_Keys('SYNTHETIC_EDDIES', & Grid % region % name(bc), & found, & diff --git a/Sources/Shared/Grid_Mod.f90 b/Sources/Shared/Grid_Mod.f90 index f26bd75f4..aa306fad9 100644 --- a/Sources/Shared/Grid_Mod.f90 +++ b/Sources/Shared/Grid_Mod.f90 @@ -39,7 +39,7 @@ module Grid_Mod integer :: n_cells = 0 ! ... cells integer :: n_faces = 0 ! ... faces integer :: n_bnd_cells = 0 ! ... boundary cells - integer :: n_bnd_cond = 0 ! ... boundary conditions + integer :: n_regions = 0 ! ... boundary conditions integer :: n_shadows = 0 ! ... shadow faces integer :: n_edges = 0 ! ... edges (needed to create dual grid) diff --git a/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 b/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 index 83e36a8d1..f3288f3be 100644 --- a/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 +++ b/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 @@ -194,7 +194,7 @@ subroutine Calculate_Face_Geometry(Grid) if(abs(Grid % xc(c2) - Grid % xc(c1) ) > 1.5 * abs(Grid % dx(s))) then if(Grid % xc(c2) > Grid % xc(c1)) then Assert(Grid % faces_s(s) > 0) - Grid % region % at_cell(s) = Grid % n_bnd_cond + 1 + Grid % region % at_cell(s) = Grid % n_regions + 1 end if end if end if @@ -203,7 +203,7 @@ subroutine Calculate_Face_Geometry(Grid) if(abs(Grid % yc(c2) - Grid % yc(c1) ) > 1.5 * abs(Grid % dy(s))) then if(Grid % yc(c2) > Grid % yc(c1)) then Assert(Grid % faces_s(s) > 0) - Grid % region % at_cell(s) = Grid % n_bnd_cond + 2 + Grid % region % at_cell(s) = Grid % n_regions + 2 end if end if end if @@ -212,7 +212,7 @@ subroutine Calculate_Face_Geometry(Grid) if(abs(Grid % zc(c2) - Grid % zc(c1) ) > 1.5 * abs(Grid % dz(s))) then if(Grid % zc(c2) > Grid % zc(c1)) then Assert(Grid % faces_s(s) > 0) - Grid % region % at_cell(s) = Grid % n_bnd_cond + 3 + Grid % region % at_cell(s) = Grid % n_regions + 3 end if end if end if diff --git a/Sources/Shared/Grid_Mod/Load_Cfn.f90 b/Sources/Shared/Grid_Mod/Load_Cfn.f90 index e0b9c459a..126cfe70a 100644 --- a/Sources/Shared/Grid_Mod/Load_Cfn.f90 +++ b/Sources/Shared/Grid_Mod/Load_Cfn.f90 @@ -56,7 +56,7 @@ subroutine Load_Cfn(Grid, this_proc, domain) read(fu) Grid % n_bnd_cells ! number of boundary cells read(fu) Grid % n_faces ! number of faces (with buffer faces) read(fu) Grid % n_shadows ! number of shadow faces - read(fu) Grid % n_bnd_cond ! number of boundary conditions + read(fu) Grid % n_regions ! number of boundary conditions !-------------------------------------! ! Does grid have polyhedral cells ! @@ -70,8 +70,8 @@ subroutine Load_Cfn(Grid, this_proc, domain) ! Boundary conditions' keys ! (Go from zero for faces which are not at the boundary) - allocate(Grid % region % name(0 : Grid % n_bnd_cond + 3)) - allocate(Grid % region % type(0 : Grid % n_bnd_cond + 3)) + allocate(Grid % region % name(0 : Grid % n_regions + 3)) + allocate(Grid % region % type(0 : Grid % n_regions + 3)) !-----------------! ! Domain name ! @@ -81,16 +81,16 @@ subroutine Load_Cfn(Grid, this_proc, domain) !------------------------------! ! Boundary conditions list ! !------------------------------! - do n = 1, Grid % n_bnd_cond + do n = 1, Grid % n_regions read(fu) Grid % region % name(n) end do ! The last three are reserved for perodicity ! and used for inlet copy boundary condition. Don't delete these thinking ! they are useless. They are assigned in Calculate_Face_Geometry - Grid % region % name(Grid % n_bnd_cond + 1) = 'PERIODIC_X' - Grid % region % name(Grid % n_bnd_cond + 2) = 'PERIODIC_Y' - Grid % region % name(Grid % n_bnd_cond + 3) = 'PERIODIC_Z' + Grid % region % name(Grid % n_regions + 1) = 'PERIODIC_X' + Grid % region % name(Grid % n_regions + 2) = 'PERIODIC_Y' + Grid % region % name(Grid % n_regions + 3) = 'PERIODIC_Z' !--------------------------! ! Nodes global numbers ! diff --git a/Sources/Shared/Grid_Mod/Print_Regions_List.f90 b/Sources/Shared/Grid_Mod/Print_Regions_List.f90 index e1633221a..a9389d0b1 100644 --- a/Sources/Shared/Grid_Mod/Print_Regions_List.f90 +++ b/Sources/Shared/Grid_Mod/Print_Regions_List.f90 @@ -18,8 +18,8 @@ subroutine Print_Regions_List(Grid) ! Form the boundary condition list ! !--------------------------------------! ll = 1 - do j = 1, Grid % n_bnd_cond - if(j < Grid % n_bnd_cond) then + do j = 1, Grid % n_regions + if(j < Grid % n_regions) then lc = len_trim(Grid % region % name(j)) + 8 write(reg_list(ll:ll+lc), '(i2,a2,a,a4)') & j, & diff --git a/Sources/Shared/Grid_Mod/Regions_Ranges.f90 b/Sources/Shared/Grid_Mod/Regions_Ranges.f90 index 96184b899..3ea82950e 100644 --- a/Sources/Shared/Grid_Mod/Regions_Ranges.f90 +++ b/Sources/Shared/Grid_Mod/Regions_Ranges.f90 @@ -14,8 +14,8 @@ subroutine Regions_Ranges(Grid) !==============================================================================! ! Allocate memory - allocate(Grid % region % f_cell(0:Grid % n_bnd_cond)) - allocate(Grid % region % l_cell(0:Grid % n_bnd_cond)) + allocate(Grid % region % f_cell(0:Grid % n_regions)) + allocate(Grid % region % l_cell(0:Grid % n_regions)) !-------------------! ! Cells' ranges ! @@ -46,7 +46,7 @@ subroutine Regions_Ranges(Grid) if(DEBUG) then write(1000, '(a)') ' # Cell ranges' - do reg = 1, Grid % n_bnd_cond + do reg = 1, Grid % n_regions write(1000+this_proc,'(a,i3,i9,i9)') ' # Region: ', reg, & Grid % region % f_cell(reg), & Grid % region % l_cell(reg) @@ -58,15 +58,15 @@ subroutine Regions_Ranges(Grid) !-------------------! ! Allocate memory - allocate(Grid % region % f_face(0:Grid % n_bnd_cond)) - allocate(Grid % region % l_face(0:Grid % n_bnd_cond)) + allocate(Grid % region % f_face(0:Grid % n_regions)) + allocate(Grid % region % l_face(0:Grid % n_regions)) ! Set non-realizable ranges Grid % region % f_face(:) = -1 Grid % region % l_face(:) = -HUGE_INT ! Browse through colors and faces to set faces' ranges - do reg = 1, Grid % n_bnd_cond + do reg = 1, Grid % n_regions do s = 1, Grid % n_faces c2 = Grid % faces_c(2, s) if(Grid % region % f_cell(reg) .eq. c2) then @@ -80,7 +80,7 @@ subroutine Regions_Ranges(Grid) if(DEBUG) then write(2000, '(a)') ' # Face ranges' - do reg = 1, Grid % n_bnd_cond + do reg = 1, Grid % n_regions write(2000+this_proc,'(a,i3,i9,i9)') ' # Region: ', reg, & Grid % region % f_face(reg), & Grid % region % l_face(reg) @@ -90,7 +90,7 @@ subroutine Regions_Ranges(Grid) !-----------! ! Check ! !-----------! - do reg = 1, Grid % n_bnd_cond + do reg = 1, Grid % n_regions Browse_Faces_In_Color(s, reg) c2 = Grid % faces_c(2, s) Assert(Grid % region % at_cell(c2) == reg) diff --git a/Sources/Shared/Grid_Mod/Save_Cfn.f90 b/Sources/Shared/Grid_Mod/Save_Cfn.f90 index 9156ed97e..9c503c76f 100644 --- a/Sources/Shared/Grid_Mod/Save_Cfn.f90 +++ b/Sources/Shared/Grid_Mod/Save_Cfn.f90 @@ -43,11 +43,11 @@ subroutine Save_Cfn(Grid, & ! Number of cells, boundary cells and faces ! !-----------------------------------------------! write(fu) nn_sub - write(fu) nc_sub ! new way: add buffer cells to cells - write(fu) nbc_sub ! number of boundary cells + write(fu) nc_sub ! new way: add buffer cells to cells + write(fu) nbc_sub ! number of boundary cells write(fu) nf_sub write(fu) ns_sub - write(fu) Grid % n_bnd_cond ! number of bounary conditions + write(fu) Grid % n_regions ! number of bounary conditions !-------------------------------------! ! Does grid have polyhedral cells ! @@ -62,7 +62,7 @@ subroutine Save_Cfn(Grid, & !------------------------------! ! Boundary conditions list ! !------------------------------! - do n = 1, Grid % n_bnd_cond + do n = 1, Grid % n_regions write(fu) Grid % region % name(n) end do diff --git a/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 b/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 index 28e804d75..f52104c38 100644 --- a/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 +++ b/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 @@ -175,7 +175,7 @@ subroutine Sort_Faces_Smart(Grid) end if end do - do reg = 1, Grid % n_bnd_cond + do reg = 1, Grid % n_regions print '(2i6)', Grid % region % f_cell(reg), & Grid % region % l_cell(reg) end do diff --git a/Sources/Shared/Grid_Mod/Write_Template_Control_File.f90 b/Sources/Shared/Grid_Mod/Write_Template_Control_File.f90 index b210964b9..dbb350b66 100644 --- a/Sources/Shared/Grid_Mod/Write_Template_Control_File.f90 +++ b/Sources/Shared/Grid_Mod/Write_Template_Control_File.f90 @@ -51,7 +51,7 @@ subroutine Write_Template_Control_File(Grid) write(fu,'(a)') '# "eps", "zeta" and "f22"' write(fu,'(a)') '#-----------------------------------------------------------' - do j = 1, Grid % n_bnd_cond + do j = 1, Grid % n_regions work = Grid % region % name(j) call String % To_Lower_Case(work) write(fu,'(a,a)') ' BOUNDARY_CONDITION ', trim(work) From 07e4b8eb6e73f14a94e8db543d711d02ccd538c7 Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 21 Feb 2023 10:17:21 +0100 Subject: [PATCH 005/223] Added a better test for shadows with assertion. On branch bojan_fixed_cell_ranges modified: Convert/Main_Con.f90 modified: Generate/Main_Gen.f90 --- Sources/Convert/Main_Con.f90 | 12 +++++++----- Sources/Generate/Main_Gen.f90 | 10 ++++++---- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/Sources/Convert/Main_Con.f90 b/Sources/Convert/Main_Con.f90 index 6ec3eab83..8cb94c935 100644 --- a/Sources/Convert/Main_Con.f90 +++ b/Sources/Convert/Main_Con.f90 @@ -19,7 +19,7 @@ program Convert_Prog character(SL) :: app_up character(SL) :: file_name character(SL) :: file_format ! 'UNKNOWN', 'FLUENT', 'GAMBIT', 'GMSH' - integer :: l, p, g, n_grids + integer :: s, l, p, g, n_grids logical :: city !==============================================================================! @@ -164,13 +164,15 @@ program Convert_Prog call Grid(g) % Initialize_New_Numbers() ! Note #1 about shadows: - ! At this point you have grid % n_faces faces and grid % n_shadows (on top) + ! At this point you have Grid % n_faces faces and Grid % n_shadows (on top) ! and they are pointing to each other. Besides, both real face and its ! shadow have the same c1 and c2, both inside cells with positive indices ! Real faces which do not have shadows have index "0" for shadow. - ! Should check like this: do s = 1, grid % n_faces + grid % n_shadows - ! Should check like this: write(20, '(99i9)') s, grid % faces_s(s) - ! Should check like this: end do + do s = 1, Grid(g) % n_faces + Grid(g) % n_shadows + if(Grid(g) % faces_s(s) .ne. 0) then + Assert(Grid(g) % faces_s(Grid(g) % faces_s(s)) .eq. s) + end if + end do ! Similar note is in Generate, also called Note #1 call Grid(g) % Print_Grid_Statistics() diff --git a/Sources/Generate/Main_Gen.f90 b/Sources/Generate/Main_Gen.f90 index 9755bd375..c4f4bcb6c 100644 --- a/Sources/Generate/Main_Gen.f90 +++ b/Sources/Generate/Main_Gen.f90 @@ -19,7 +19,7 @@ program Generate_Prog type(Grid_Type) :: Grid ! Grid which will be generated type(Smooths_Type) :: smooths ! smoothing regions type(Refines_Type) :: refines ! refinement regions and levels - integer :: c ! cell counter + integer :: c, s ! cell counter !==============================================================================! ! Initialize program profler @@ -71,9 +71,11 @@ program Generate_Prog ! and they are pointing to each other. Besides, both real face and its ! shadow have the same c1 and c2, both inside cells with positive indices ! Real faces which do not have shadows have "0" for shadow. - ! Checked like this: do s = 1, Grid % n_faces + Grid % n_shadows - ! Checked like this: write(20, '(99i9)') s, Grid % faces_s(s) - ! Checked like this: end do + do s = 1, Grid % n_faces + Grid % n_shadows + if(Grid % faces_s(s) .ne. 0) then + Assert(Grid % faces_s(Grid % faces_s(s)) .eq. s) + end if + end do ! Similar note is in Convert, also called Note #1 !------------------------------! From 58b29cfc31ff58f8172d8b6ab4eb28a634b8cf28 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 22 Feb 2023 05:01:34 +0100 Subject: [PATCH 006/223] Uses MPI_IN_PLACE to avoid local memory allocation I didn't see hell of improvements on performance, if any, but logic tells me this is a better way to implement these procedures. On branch bojan_fixed_cell_ranges modified: Shared/Comm_Mod/Parallel/Global_Lor_Log_Array.f90 modified: Shared/Comm_Mod/Parallel/Global_Sum_Int_Array.f90 modified: Shared/Comm_Mod/Parallel/Global_Sum_Real_Array.f90 --- .../Parallel/Global_Lor_Log_Array.f90 | 15 ++++-------- .../Parallel/Global_Sum_Int_Array.f90 | 15 ++++-------- .../Parallel/Global_Sum_Real_Array.f90 | 23 ++++++++----------- 3 files changed, 19 insertions(+), 34 deletions(-) diff --git a/Sources/Shared/Comm_Mod/Parallel/Global_Lor_Log_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Global_Lor_Log_Array.f90 index 1e4a9e115..7cbc91cfc 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Global_Lor_Log_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Global_Lor_Log_Array.f90 @@ -5,23 +5,18 @@ subroutine Comm_Mod_Global_Lor_Log_Array(n, phi) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer :: n - logical :: phi(n) + integer, intent(in) :: n + logical, intent(inout) :: phi(n) !-----------------------------------[Locals]-----------------------------------! - logical, allocatable :: phi_res(:) - integer :: error + integer :: error !==============================================================================! - allocate(phi_res(n)) - - call Mpi_Allreduce(phi, & ! send buffer - phi_res, & ! recv buffer + call Mpi_Allreduce(MPI_IN_PLACE, & ! indicate that send and recv are same + phi, & ! send and recv buffer n, & ! length comm_type_log, & ! datatype MPI_LOR, & ! operation MPI_COMM_WORLD, & error) - phi(1:n) = phi_res(1:n) - end subroutine diff --git a/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Int_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Int_Array.f90 index 35ff59400..ee8a1b083 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Int_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Int_Array.f90 @@ -5,23 +5,18 @@ subroutine Comm_Mod_Global_Sum_Int_Array(n, phi) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer :: n - integer :: phi(n) + integer, intent(in) :: n + integer, intent(inout) :: phi(n) !-----------------------------------[Locals]-----------------------------------! - integer, allocatable :: phi_res(:) - integer :: error + integer :: error !==============================================================================! - allocate(phi_res(n)) - - call Mpi_Allreduce(phi, & ! send buffer - phi_res, & ! recv buffer + call Mpi_Allreduce(MPI_IN_PLACE, & ! indicate that send and recv are same + phi, & ! send and recv buffer n, & ! length comm_type_int, & ! datatype MPI_SUM, & ! operation MPI_COMM_WORLD, & error) - phi(1:n) = phi_res(1:n) - end subroutine diff --git a/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Real_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Real_Array.f90 index 91f80e652..de9a443c0 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Real_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Real_Array.f90 @@ -5,23 +5,18 @@ subroutine Comm_Mod_Global_Sum_Real_Array(n, phi) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer :: n - real :: phi(n) + integer, intent(in) :: n + real, intent(inout) :: phi(n) !-----------------------------------[Locals]-----------------------------------! - real, allocatable :: phi_res(:) - integer :: error + integer :: error !==============================================================================! - allocate(phi_res(n)) - - call Mpi_Allreduce(phi, & ! send buffer - phi_res, & ! recv buffer - n, & ! length - comm_type_real, & ! datatype - MPI_SUM, & ! operation - MPI_COMM_WORLD, & + call Mpi_Allreduce(MPI_IN_PLACE, & ! indicate that send and recv are same + phi, & ! send and recv buffer + n, & ! length + comm_type_real, & ! datatype + MPI_SUM, & ! operation + MPI_COMM_WORLD, & error) - phi(1:n) = phi_res(1:n) - end subroutine From 6a0857090c639060bf218df54935ee5e71fcf0db Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 22 Feb 2023 05:11:48 +0100 Subject: [PATCH 007/223] Renamed n_regions to n_bnd_regions This is to allow sub-sequent introductions of new n_region which will entail inside regions, for both cells and faces. In a few places, regions for faces periodic in x, y, and z can be seen (per_x_reg, per_y_reg, per_z_reg). On branch bojan_fixed_cell_ranges modified: Convert/Convert_Mod/Calculate_Geometry.f90 modified: Convert/Convert_Mod/Create_Dual.f90 modified: Convert/Convert_Mod/Find_Parents.f90 modified: Convert/Convert_Mod/Insert_Buildings.f90 modified: Convert/Convert_Mod/Load_Fluent.f90 modified: Convert/Convert_Mod/Load_Gambit.f90 modified: Convert/Convert_Mod/Load_Gmsh.f90 modified: Convert/Convert_Mod/N_Edges_In_Region.f90 modified: Convert/Convert_Mod/N_Sharp_Edges.f90 modified: Generate/Domain_Mod/Distribute_Ranges.f90 modified: Process/Read_Controls_Mod/Boundary_Conditions.f90 modified: Shared/Grid_Mod.f90 modified: Shared/Grid_Mod/Calculate_Face_Geometry.f90 modified: Shared/Grid_Mod/Load_Cfn.f90 modified: Shared/Grid_Mod/Print_Regions_List.f90 modified: Shared/Grid_Mod/Regions_Ranges.f90 modified: Shared/Grid_Mod/Save_Cfn.f90 modified: Shared/Grid_Mod/Write_Template_Control_File.f90 --- .../Convert_Mod/Calculate_Geometry.f90 | 10 +- Sources/Convert/Convert_Mod/Create_Dual.f90 | 12 +- Sources/Convert/Convert_Mod/Find_Parents.f90 | 2 +- .../Convert/Convert_Mod/Insert_Buildings.f90 | 16 +-- Sources/Convert/Convert_Mod/Load_Fluent.f90 | 17 +-- Sources/Convert/Convert_Mod/Load_Gambit.f90 | 2 +- Sources/Convert/Convert_Mod/Load_Gmsh.f90 | 5 +- .../Convert/Convert_Mod/N_Edges_In_Region.f90 | 2 +- Sources/Convert/Convert_Mod/N_Sharp_Edges.f90 | 2 +- .../Generate/Domain_Mod/Distribute_Ranges.f90 | 2 +- .../Read_Controls_Mod/Boundary_Conditions.f90 | 6 +- Sources/Shared/Grid_Mod.f90 | 18 ++- .../Grid_Mod/Calculate_Face_Geometry.f90 | 6 +- Sources/Shared/Grid_Mod/Load_Cfn.f90 | 20 +-- .../Shared/Grid_Mod/Print_Regions_List.f90 | 4 +- Sources/Shared/Grid_Mod/Regions_Ranges.f90 | 134 ++++++++++++------ Sources/Shared/Grid_Mod/Save_Cfn.f90 | 4 +- .../Grid_Mod/Write_Template_Control_File.f90 | 2 +- 18 files changed, 162 insertions(+), 102 deletions(-) diff --git a/Sources/Convert/Convert_Mod/Calculate_Geometry.f90 b/Sources/Convert/Convert_Mod/Calculate_Geometry.f90 index cb46091e3..351d095bb 100644 --- a/Sources/Convert/Convert_Mod/Calculate_Geometry.f90 +++ b/Sources/Convert/Convert_Mod/Calculate_Geometry.f90 @@ -305,7 +305,7 @@ subroutine Calculate_Geometry(Convert, Grid, ask) end if read(Line % tokens(1), *) reg_per - if( reg_per > Grid % n_regions ) then + if( reg_per > Grid % n_bnd_regions ) then print *, '# Critical error: boundary condition ', reg_per, & ' doesn''t exist!' print *, '# Exiting! ' @@ -496,7 +496,7 @@ subroutine Calculate_Geometry(Convert, Grid, ask) !------------------------------------------------------------------! ! Remove boundary condition with reg_per and compress the rest ! !------------------------------------------------------------------! - if(reg_per < Grid % n_regions) then + if(reg_per < Grid % n_bnd_regions) then ! Set the regions of boundary selected to be periodic to zero do c = -1, -Grid % n_bnd_cells, -1 @@ -506,7 +506,7 @@ subroutine Calculate_Geometry(Convert, Grid, ask) end do ! Shift the rest of the boundary cells - do b = 1, Grid % n_regions - 1 + do b = 1, Grid % n_bnd_regions - 1 if(b .ge. reg_per) then ! Correct the names @@ -522,9 +522,9 @@ subroutine Calculate_Geometry(Convert, Grid, ask) end if end do else - Grid % region % name(Grid % n_regions) = '' + Grid % region % name(Grid % n_bnd_regions) = '' end if - Grid % n_regions = Grid % n_regions - 1 + Grid % n_bnd_regions = Grid % n_bnd_regions - 1 end do ! while answer .ne. 'SKIP' end if ! ask == 0 diff --git a/Sources/Convert/Convert_Mod/Create_Dual.f90 b/Sources/Convert/Convert_Mod/Create_Dual.f90 index f23179e49..664a65471 100644 --- a/Sources/Convert/Convert_Mod/Create_Dual.f90 +++ b/Sources/Convert/Convert_Mod/Create_Dual.f90 @@ -33,7 +33,7 @@ subroutine Create_Dual(Convert, Prim, Dual) !==============================================================================! ! Alias(es) - n_bc = Prim % n_regions + n_bc = Prim % n_bnd_regions !-----------------------------! ! ! @@ -191,9 +191,9 @@ subroutine Create_Dual(Convert, Prim, Dual) ! numbers and names ! ! ! !-------------------------! - Dual % n_regions = Prim % n_regions - allocate(Dual % region % name(Dual % n_regions)) - do bc = 1, Prim % n_regions + Dual % n_bnd_regions = Prim % n_bnd_regions + allocate(Dual % region % name(Dual % n_bnd_regions)) + do bc = 1, Prim % n_bnd_regions Dual % region % name(bc) = Prim % region % name(bc) call String % To_Upper_Case(Dual % region % name(bc)) end do @@ -217,7 +217,7 @@ subroutine Create_Dual(Convert, Prim, Dual) ! Count boundary cells (and boundary faces) for the Dual grid ! (Remember that nodes in Prim correspond to cells in Dual) Dual % n_bnd_cells = 0 - do bc = 1, Prim % n_regions + do bc = 1, Prim % n_bnd_regions Dual % n_bnd_cells = Dual % n_bnd_cells & + Convert % N_Nodes_In_Region(Prim, bc, node_data) end do @@ -361,7 +361,7 @@ subroutine Create_Dual(Convert, Prim, Dual) curr_f_d = Prim % n_edges curr_b_d = 0 - do bc = 1, Prim % n_regions + do bc = 1, Prim % n_bnd_regions !-----------------------------------------------------! ! Call this to mark boundary cells in this region ! diff --git a/Sources/Convert/Convert_Mod/Find_Parents.f90 b/Sources/Convert/Convert_Mod/Find_Parents.f90 index 9fe6109a5..0605f89cb 100644 --- a/Sources/Convert/Convert_Mod/Find_Parents.f90 +++ b/Sources/Convert/Convert_Mod/Find_Parents.f90 @@ -84,7 +84,7 @@ subroutine Find_Parents(Convert, Grid) ! Real work begins ! !----------------------! - do bc = 1, Grid % n_regions + do bc = 1, Grid % n_bnd_regions cr1(:) = HUGE_INT cr2(:) = HUGE_INT diff --git a/Sources/Convert/Convert_Mod/Insert_Buildings.f90 b/Sources/Convert/Convert_Mod/Insert_Buildings.f90 index 69e253f5b..269055ba0 100644 --- a/Sources/Convert/Convert_Mod/Insert_Buildings.f90 +++ b/Sources/Convert/Convert_Mod/Insert_Buildings.f90 @@ -408,7 +408,7 @@ subroutine Insert_Buildings(Convert, Grid) n_chimneys = 0 allocate(cell_in_chimney(Grid % n_cells)) cell_in_chimney(:) = 0 - do bc = 1, Grid % n_regions + do bc = 1, Grid % n_bnd_regions bc_name = trim(Grid % region % name(bc)) call String % To_Upper_Case(bc_name) if(bc_name(1:7) .eq. 'CHIMNEY') then @@ -474,7 +474,7 @@ subroutine Insert_Buildings(Convert, Grid) !-----------------------------------------------------------! ! Find ground b.c. number (only used to eliminate BUILDING_000) - do bc = 1, Grid % n_regions + do bc = 1, Grid % n_bnd_regions bc_name = trim(Grid % region % name(bc)) call String % To_Upper_Case(bc_name) if(bc_name .eq. 'GROUND') then @@ -483,7 +483,7 @@ subroutine Insert_Buildings(Convert, Grid) end do ! Eliminate building_000 b.c. - do bc = 1, Grid % n_regions + do bc = 1, Grid % n_bnd_regions bc_name = trim(Grid % region % name(bc)) call String % To_Upper_Case(bc_name) if(bc_name .eq. 'BUILDING_000') then @@ -498,7 +498,7 @@ subroutine Insert_Buildings(Convert, Grid) end do cnt = 0 - do bc = 1, Grid % n_regions + do bc = 1, Grid % n_bnd_regions bc_name = trim(Grid % region % name(bc)) call String % To_Upper_Case(bc_name) if(bc_name(1:8) .ne. 'BUILDING') then @@ -513,11 +513,11 @@ subroutine Insert_Buildings(Convert, Grid) end do end if end do - Grid % n_regions = cnt + Grid % n_bnd_regions = cnt ! Shift all by one up (to be able to insert building walls as first) if(buildings_exist) then - do bc = Grid % n_regions, 1, -1 + do bc = Grid % n_bnd_regions, 1, -1 Grid % region % name(bc+1) = Grid % region % name(bc) do c = 1, Grid % n_cells do dir = 1, 6 @@ -527,7 +527,7 @@ subroutine Insert_Buildings(Convert, Grid) end do end do end do - Grid % n_regions = Grid % n_regions + 1 + Grid % n_bnd_regions = Grid % n_bnd_regions + 1 ! Add first boundary condition for walls Grid % region % name(1) = 'BUILDING_WALLS' @@ -642,7 +642,7 @@ subroutine Insert_Buildings(Convert, Grid) end if - do bc = 1, Grid % n_regions + do bc = 1, Grid % n_bnd_regions bc_name = trim(Grid % region % name(bc)) call String % To_Upper_Case(bc_name) if(bc_name(1:7) .eq. 'CHIMNEY') then diff --git a/Sources/Convert/Convert_Mod/Load_Fluent.f90 b/Sources/Convert/Convert_Mod/Load_Fluent.f90 index 5c0e1da2f..a63a4b757 100644 --- a/Sources/Convert/Convert_Mod/Load_Fluent.f90 +++ b/Sources/Convert/Convert_Mod/Load_Fluent.f90 @@ -25,7 +25,7 @@ subroutine Load_Fluent(Convert, Grid, file_name) integer :: n_face_sect ! number of face sections integer :: face_sect_pos(2048) ! where did Fluent store it integer :: face_sect_bnd(2048) ! where does T-Flows store it - integer :: n_regions ! number of boundary conditions + integer :: n_bnd_reg ! number of boundary conditions logical :: this_sect_bnd ! .true. if bnd cond section logical :: the_end ! end of file reached? logical :: ascii ! is file in ascii format? @@ -131,7 +131,7 @@ subroutine Load_Fluent(Convert, Grid, file_name) face_sect_pos(:) = 0 face_sect_bnd(:) = 0 n_face_sect = 0 - n_regions = 0 + n_bnd_reg = 0 n_bnd_cells = 0 n_faces = 0 the_end = .false. @@ -233,10 +233,10 @@ subroutine Load_Fluent(Convert, Grid, file_name) if( this_sect_bnd ) then ! Increase the number of boundary condition sections and ... - n_regions = n_regions + 1 + n_bnd_reg = n_bnd_reg + 1 ! ... store mapping of this face section to T-Flows boundary condition - face_sect_bnd(n_face_sect) = n_regions + face_sect_bnd(n_face_sect) = n_bnd_reg end if end if @@ -250,11 +250,12 @@ subroutine Load_Fluent(Convert, Grid, file_name) end if print '(a34,i9)', ' # Boundary cells from face data: ', n_bnd_cells - print '(a34,i9)', ' # Boundary condition sections: ', n_regions + print '(a34,i9)', ' # Boundary condition sections: ', n_bnd_reg - Grid % n_bnd_cells = n_bnd_cells - Grid % n_regions = n_regions - allocate(Grid % region % name(n_regions)) + Grid % n_bnd_cells = n_bnd_cells + Grid % n_bnd_regions = n_bnd_reg + Grid % n_regions = Grid % n_bnd_regions + 1 ! this is inside region + allocate(Grid % region % name(Grid % n_regions)) !--------------------------------------------! ! ! diff --git a/Sources/Convert/Convert_Mod/Load_Gambit.f90 b/Sources/Convert/Convert_Mod/Load_Gambit.f90 index f4d4208b3..8ea0c4033 100644 --- a/Sources/Convert/Convert_Mod/Load_Gambit.f90 +++ b/Sources/Convert/Convert_Mod/Load_Gambit.f90 @@ -161,7 +161,7 @@ subroutine Load_Gambit(Convert, Grid, file_name) !-------------------------! ! Boundary conditions ! !-------------------------! - Grid % n_regions = n_bnd_sect + Grid % n_bnd_regions = n_bnd_sect allocate(Grid % region % name(n_bnd_sect)) do j = 1, n_bnd_sect diff --git a/Sources/Convert/Convert_Mod/Load_Gmsh.f90 b/Sources/Convert/Convert_Mod/Load_Gmsh.f90 index 82a27a4a8..adaece2bd 100644 --- a/Sources/Convert/Convert_Mod/Load_Gmsh.f90 +++ b/Sources/Convert/Convert_Mod/Load_Gmsh.f90 @@ -514,8 +514,9 @@ subroutine Load_Gmsh(Convert, Grid, file_name) ! Copy boundary condition info ! ! ! !----------------------------------! - Grid % n_regions = n_bnd_sect - allocate(Grid % region % name(n_bnd_sect)) + Grid % n_bnd_regions = n_bnd_sect + Grid % n_regions = Grid % n_bnd_regions + 1 ! this is inside region + allocate(Grid % region % name(Grid % n_regions)) do i = 1, n_bnd_sect Grid % region % name(i) = phys_names(i) diff --git a/Sources/Convert/Convert_Mod/N_Edges_In_Region.f90 b/Sources/Convert/Convert_Mod/N_Edges_In_Region.f90 index 342704402..1486eb2d1 100644 --- a/Sources/Convert/Convert_Mod/N_Edges_In_Region.f90 +++ b/Sources/Convert/Convert_Mod/N_Edges_In_Region.f90 @@ -106,7 +106,7 @@ integer function N_Edges_In_Region(Convert, Grid, bc, edge_data) !------------------------! do e = 1, Grid % n_edges if(Grid % edges_bc(bc, e) .gt. 0) then - if( sum(Grid % edges_bc(1:Grid % n_regions, e)) .gt. 1 ) then + if( sum(Grid % edges_bc(1:Grid % n_bnd_regions, e)) .gt. 1 ) then if(edge_data(e) .eq. 0) then ! hasn't been marked yet cnt = cnt + 1 edge_data(e) = 1 diff --git a/Sources/Convert/Convert_Mod/N_Sharp_Edges.f90 b/Sources/Convert/Convert_Mod/N_Sharp_Edges.f90 index be37f0bba..59bab95f0 100644 --- a/Sources/Convert/Convert_Mod/N_Sharp_Edges.f90 +++ b/Sources/Convert/Convert_Mod/N_Sharp_Edges.f90 @@ -106,7 +106,7 @@ integer function N_Sharp_Edges(Convert, Grid, edge_data) ! ! !-------------------------------------------------------------------! do e = 1, Grid % n_edges - if( sum(Grid % edges_bc(1:Grid % n_regions, e)) .gt. 1 ) then + if( sum(Grid % edges_bc(1:Grid % n_bnd_regions, e)) .gt. 1 ) then if(edge_data(e) .eq. 0) then ! hasn't been marked yet cnt = cnt + 1 edge_data(e) = 1 diff --git a/Sources/Generate/Domain_Mod/Distribute_Ranges.f90 b/Sources/Generate/Domain_Mod/Distribute_Ranges.f90 index e10928bb9..b5c792544 100644 --- a/Sources/Generate/Domain_Mod/Distribute_Ranges.f90 +++ b/Sources/Generate/Domain_Mod/Distribute_Ranges.f90 @@ -109,7 +109,7 @@ subroutine Domain_Mod_Distribute_Ranges(dom, Grid) end do ! n_ranges ! Store the number of boundary conditions - Grid % n_regions = n_bnd + Grid % n_bnd_regions = n_bnd call Grid % Print_Regions_List() diff --git a/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 b/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 index 6f28b7bf6..db835cdbc 100644 --- a/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 +++ b/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 @@ -64,7 +64,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) types_file(:) = .false. c_types = 0 - do bc = 1, Grid % n_regions + do bc = 1, Grid % n_bnd_regions call Control_Mod_Position_At_Two_Keys('BOUNDARY_CONDITION', & Grid % region % name(bc), & found, & @@ -117,7 +117,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) !------------------------------------------------! c_types = 0 - do bc = 1, Grid % n_regions + do bc = 1, Grid % n_bnd_regions ! Position yourself well call Control_Mod_Position_At_Two_Keys('BOUNDARY_CONDITION', & @@ -778,7 +778,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) ! ! !-----------------------------------! turb_planes % n_planes = 0 - do bc = 1, Grid % n_regions ! imagine there are as many eddies as bcs + do bc = 1, Grid % n_bnd_regions ! imagine there are as many eddies as bcs call Control_Mod_Position_At_Two_Keys('SYNTHETIC_EDDIES', & Grid % region % name(bc), & found, & diff --git a/Sources/Shared/Grid_Mod.f90 b/Sources/Shared/Grid_Mod.f90 index aa306fad9..b2dac6471 100644 --- a/Sources/Shared/Grid_Mod.f90 +++ b/Sources/Shared/Grid_Mod.f90 @@ -35,13 +35,17 @@ module Grid_Mod logical :: polyhedral = .false. ! Number of ... - integer :: n_nodes = 0 ! ... nodes - integer :: n_cells = 0 ! ... cells - integer :: n_faces = 0 ! ... faces - integer :: n_bnd_cells = 0 ! ... boundary cells - integer :: n_regions = 0 ! ... boundary conditions - integer :: n_shadows = 0 ! ... shadow faces - integer :: n_edges = 0 ! ... edges (needed to create dual grid) + integer :: n_nodes = 0 ! nodes + integer :: n_cells = 0 ! cells + integer :: n_faces = 0 ! faces + integer :: n_bnd_cells = 0 ! boundary cells + integer :: n_bnd_regions = 0 ! boundary conditions + integer :: n_regions = 0 ! all conditions (bnd, inside, per ...) + integer :: n_shadows = 0 ! shadow faces + integer :: n_edges = 0 ! edges (needed to create dual grid) + integer :: per_x_reg = 0 ! periodic x region + integer :: per_y_reg = 0 ! periodic y region + integer :: per_z_reg = 0 ! periodic z region ! Periodic span real :: per_x, per_y, per_z diff --git a/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 b/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 index f3288f3be..6daba51b0 100644 --- a/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 +++ b/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 @@ -194,7 +194,7 @@ subroutine Calculate_Face_Geometry(Grid) if(abs(Grid % xc(c2) - Grid % xc(c1) ) > 1.5 * abs(Grid % dx(s))) then if(Grid % xc(c2) > Grid % xc(c1)) then Assert(Grid % faces_s(s) > 0) - Grid % region % at_cell(s) = Grid % n_regions + 1 + Grid % region % at_cell(s) = Grid % per_x_reg end if end if end if @@ -203,7 +203,7 @@ subroutine Calculate_Face_Geometry(Grid) if(abs(Grid % yc(c2) - Grid % yc(c1) ) > 1.5 * abs(Grid % dy(s))) then if(Grid % yc(c2) > Grid % yc(c1)) then Assert(Grid % faces_s(s) > 0) - Grid % region % at_cell(s) = Grid % n_regions + 2 + Grid % region % at_cell(s) = Grid % per_y_reg end if end if end if @@ -212,7 +212,7 @@ subroutine Calculate_Face_Geometry(Grid) if(abs(Grid % zc(c2) - Grid % zc(c1) ) > 1.5 * abs(Grid % dz(s))) then if(Grid % zc(c2) > Grid % zc(c1)) then Assert(Grid % faces_s(s) > 0) - Grid % region % at_cell(s) = Grid % n_regions + 3 + Grid % region % at_cell(s) = Grid % per_z_reg end if end if end if diff --git a/Sources/Shared/Grid_Mod/Load_Cfn.f90 b/Sources/Shared/Grid_Mod/Load_Cfn.f90 index 126cfe70a..5acfaa548 100644 --- a/Sources/Shared/Grid_Mod/Load_Cfn.f90 +++ b/Sources/Shared/Grid_Mod/Load_Cfn.f90 @@ -56,7 +56,7 @@ subroutine Load_Cfn(Grid, this_proc, domain) read(fu) Grid % n_bnd_cells ! number of boundary cells read(fu) Grid % n_faces ! number of faces (with buffer faces) read(fu) Grid % n_shadows ! number of shadow faces - read(fu) Grid % n_regions ! number of boundary conditions + read(fu) Grid % n_bnd_regions ! number of boundary conditions !-------------------------------------! ! Does grid have polyhedral cells ! @@ -70,8 +70,12 @@ subroutine Load_Cfn(Grid, this_proc, domain) ! Boundary conditions' keys ! (Go from zero for faces which are not at the boundary) - allocate(Grid % region % name(0 : Grid % n_regions + 3)) - allocate(Grid % region % type(0 : Grid % n_regions + 3)) + Grid % n_regions = Grid % n_bnd_regions + 1 ! this is inside region + Grid % per_x_reg = Grid % n_bnd_regions + 2 ! for periodic_x region + Grid % per_y_reg = Grid % n_bnd_regions + 3 ! for periodic_x region + Grid % per_z_reg = Grid % n_bnd_regions + 4 ! for periodic_x region + allocate(Grid % region % name(Grid % n_regions + 3)) + allocate(Grid % region % type(Grid % n_regions + 3)) !-----------------! ! Domain name ! @@ -81,16 +85,16 @@ subroutine Load_Cfn(Grid, this_proc, domain) !------------------------------! ! Boundary conditions list ! !------------------------------! - do n = 1, Grid % n_regions + do n = 1, Grid % n_bnd_regions read(fu) Grid % region % name(n) end do ! The last three are reserved for perodicity ! and used for inlet copy boundary condition. Don't delete these thinking ! they are useless. They are assigned in Calculate_Face_Geometry - Grid % region % name(Grid % n_regions + 1) = 'PERIODIC_X' - Grid % region % name(Grid % n_regions + 2) = 'PERIODIC_Y' - Grid % region % name(Grid % n_regions + 3) = 'PERIODIC_Z' + Grid % region % name(Grid % per_x_reg) = 'PERIODIC_X' + Grid % region % name(Grid % per_y_reg) = 'PERIODIC_Y' + Grid % region % name(Grid % per_z_reg) = 'PERIODIC_Z' !--------------------------! ! Nodes global numbers ! @@ -275,7 +279,7 @@ subroutine Load_Cfn(Grid, this_proc, domain) allocate (Grid % region % at_cell(-Grid % n_bnd_cells-1:Grid % n_faces)) read(fu) (Grid % region % at_cell(c), c = -Grid % n_bnd_cells, -1) - call Regions_Ranges(Grid) + call Grid % Regions_Ranges() close(fu) diff --git a/Sources/Shared/Grid_Mod/Print_Regions_List.f90 b/Sources/Shared/Grid_Mod/Print_Regions_List.f90 index a9389d0b1..90c420335 100644 --- a/Sources/Shared/Grid_Mod/Print_Regions_List.f90 +++ b/Sources/Shared/Grid_Mod/Print_Regions_List.f90 @@ -18,8 +18,8 @@ subroutine Print_Regions_List(Grid) ! Form the boundary condition list ! !--------------------------------------! ll = 1 - do j = 1, Grid % n_regions - if(j < Grid % n_regions) then + do j = 1, Grid % n_bnd_regions + if(j < Grid % n_bnd_regions) then lc = len_trim(Grid % region % name(j)) + 8 write(reg_list(ll:ll+lc), '(i2,a2,a,a4)') & j, & diff --git a/Sources/Shared/Grid_Mod/Regions_Ranges.f90 b/Sources/Shared/Grid_Mod/Regions_Ranges.f90 index 3ea82950e..f7b747d38 100644 --- a/Sources/Shared/Grid_Mod/Regions_Ranges.f90 +++ b/Sources/Shared/Grid_Mod/Regions_Ranges.f90 @@ -10,12 +10,14 @@ subroutine Regions_Ranges(Grid) !------------------------------[Local parameters]------------------------------! logical, parameter :: DEBUG = .false. !-----------------------------------[Locals]-----------------------------------! - integer :: c2, reg, s + integer :: c, c1, c2, reg, s, siz !==============================================================================! + Grid % n_regions = Grid % n_bnd_regions + 1 ! this is for inside + ! Allocate memory - allocate(Grid % region % f_cell(0:Grid % n_regions)) - allocate(Grid % region % l_cell(0:Grid % n_regions)) + allocate(Grid % region % f_cell(Grid % n_regions)) + allocate(Grid % region % l_cell(Grid % n_regions)) !-------------------! ! Cells' ranges ! @@ -23,33 +25,50 @@ subroutine Regions_Ranges(Grid) ! Set non-realizable ranges Grid % region % f_cell(:) = -1 - Grid % region % l_cell(:) = -HUGE_INT + Grid % region % l_cell(:) = -Grid % n_bnd_cells ! Browse forward and backward to find first and last cell for each range - do c2 = -Grid % n_bnd_cells, -1 - if(Grid % Comm % cell_proc(c2) .eq. this_proc) then - reg = Grid % region % at_cell(c2) - if(c2 < Grid % region % f_cell(reg)) then - Grid % region % f_cell(reg) = c2 + do c = -Grid % n_bnd_cells, -1 + if(Grid % Comm % cell_proc(c) .eq. this_proc) then + reg = Grid % region % at_cell(c) + if(c < Grid % region % f_cell(reg)) then + Grid % region % f_cell(reg) = c end if end if end do - do c2 = -1, -Grid % n_bnd_cells, -1 - if(Grid % Comm % cell_proc(c2) .eq. this_proc) then - reg = Grid % region % at_cell(c2) - if(c2 > Grid % region % l_cell(reg)) then - Grid % region % l_cell(reg) = c2 + do c = -1, -Grid % n_bnd_cells, -1 + if(Grid % Comm % cell_proc(c) .eq. this_proc) then + reg = Grid % region % at_cell(c) + if(c > Grid % region % l_cell(reg)) then + Grid % region % l_cell(reg) = c + end if + end if + end do + + ! Inside cells + reg = Grid % n_regions + Grid % region % f_cell(reg) = Grid % n_cells + Grid % region % l_cell(reg) = 1 + do c = 1, Grid % n_cells + if(Grid % Comm % cell_proc(c) .eq. this_proc) then + if(c < Grid % region % f_cell(reg)) then + Grid % region % f_cell(reg) = c + end if + if(c > Grid % region % l_cell(reg)) then + Grid % region % l_cell(reg) = c end if end if end do if(DEBUG) then - write(1000, '(a)') ' # Cell ranges' - do reg = 1, Grid % n_regions - write(1000+this_proc,'(a,i3,i9,i9)') ' # Region: ', reg, & - Grid % region % f_cell(reg), & - Grid % region % l_cell(reg) + write(1000+this_proc, '(a)') ' # Cell ranges' + do reg = Boundary_And_Inside_Regions() + siz = Grid % region % l_cell(reg) - Grid % region % f_cell(reg) + 1 + write(1000+this_proc,'(a,i3,i15,i15,i15,a)') ' # Region: ', reg, & + Grid % region % f_cell(reg), & + Grid % region % l_cell(reg), & + max(siz, 0) end do end if @@ -58,43 +77,74 @@ subroutine Regions_Ranges(Grid) !-------------------! ! Allocate memory - allocate(Grid % region % f_face(0:Grid % n_regions)) - allocate(Grid % region % l_face(0:Grid % n_regions)) + allocate(Grid % region % f_face(Grid % n_regions)) + allocate(Grid % region % l_face(Grid % n_regions)) ! Set non-realizable ranges - Grid % region % f_face(:) = -1 - Grid % region % l_face(:) = -HUGE_INT + Grid % region % f_face(:) = 0 + Grid % region % l_face(:) = -1 ! Browse through colors and faces to set faces' ranges - do reg = 1, Grid % n_regions - do s = 1, Grid % n_faces - c2 = Grid % faces_c(2, s) - if(Grid % region % f_cell(reg) .eq. c2) then - Grid % region % f_face(reg) = s - end if - if(Grid % region % l_cell(reg) .eq. c2) then - Grid % region % l_face(reg) = s + do reg = Boundary_Regions() + if(Grid % region % f_cell(reg) < Grid % region % l_cell(reg)) then + do s = 1, Grid % n_faces + c = Grid % faces_c(2, s) + if(Grid % region % f_cell(reg) .eq. c) then + Grid % region % f_face(reg) = s + end if + if(Grid % region % l_cell(reg) .eq. c) then + Grid % region % l_face(reg) = s + end if + end do + end if + end do + + ! Inside faces + reg = Grid % n_regions + Grid % region % f_face(reg) = Grid % n_faces + Grid % region % l_face(reg) = 1 + do s = 1, Grid % n_faces + c1 = Grid % faces_c(1, s) + c2 = Grid % faces_c(2, s) + if(c2 > 0) then ! limit to inside faces + if(Grid % Comm % cell_proc(c1) .eq. this_proc .or. & + Grid % Comm % cell_proc(c2) .eq. this_proc) then + if(s <= Grid % region % f_face(reg)) then + Grid % region % f_face(reg) = s + end if + if(s >= Grid % region % l_face(reg)) then + Grid % region % l_face(reg) = s + end if + Assert(Grid % Comm % cell_proc(c1) .eq. this_proc) ! this should hold end if - end do + end if ! c2 > 0 + end do + + do s = Faces_In_Domain() + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + Assert(c2 > 0) end do if(DEBUG) then - write(2000, '(a)') ' # Face ranges' - do reg = 1, Grid % n_regions - write(2000+this_proc,'(a,i3,i9,i9)') ' # Region: ', reg, & - Grid % region % f_face(reg), & - Grid % region % l_face(reg) + write(2000+this_proc, '(a)') ' # Face ranges' + do reg = Boundary_And_Inside_Regions() + siz = Grid % region % l_face(reg) - Grid % region % f_face(reg) + 1 + write(2000+this_proc,'(a,i3,i15,i15,i15,a)') ' # Region: ', reg, & + Grid % region % f_face(reg), & + Grid % region % l_face(reg), & + max(siz, 0) end do end if !-----------! ! Check ! !-----------! - do reg = 1, Grid % n_regions - Browse_Faces_In_Color(s, reg) - c2 = Grid % faces_c(2, s) - Assert(Grid % region % at_cell(c2) == reg) - End_Browse + do reg = Boundary_Regions() + do s = Faces_In_Region(reg) + c = Grid % faces_c(2, s) + Assert(Grid % region % at_cell(c) == reg) + end do end do end subroutine diff --git a/Sources/Shared/Grid_Mod/Save_Cfn.f90 b/Sources/Shared/Grid_Mod/Save_Cfn.f90 index 9c503c76f..77c17b96a 100644 --- a/Sources/Shared/Grid_Mod/Save_Cfn.f90 +++ b/Sources/Shared/Grid_Mod/Save_Cfn.f90 @@ -47,7 +47,7 @@ subroutine Save_Cfn(Grid, & write(fu) nbc_sub ! number of boundary cells write(fu) nf_sub write(fu) ns_sub - write(fu) Grid % n_regions ! number of bounary conditions + write(fu) Grid % n_bnd_regions ! number of bounary conditions !-------------------------------------! ! Does grid have polyhedral cells ! @@ -62,7 +62,7 @@ subroutine Save_Cfn(Grid, & !------------------------------! ! Boundary conditions list ! !------------------------------! - do n = 1, Grid % n_regions + do n = 1, Grid % n_bnd_regions write(fu) Grid % region % name(n) end do diff --git a/Sources/Shared/Grid_Mod/Write_Template_Control_File.f90 b/Sources/Shared/Grid_Mod/Write_Template_Control_File.f90 index dbb350b66..d4404940c 100644 --- a/Sources/Shared/Grid_Mod/Write_Template_Control_File.f90 +++ b/Sources/Shared/Grid_Mod/Write_Template_Control_File.f90 @@ -51,7 +51,7 @@ subroutine Write_Template_Control_File(Grid) write(fu,'(a)') '# "eps", "zeta" and "f22"' write(fu,'(a)') '#-----------------------------------------------------------' - do j = 1, Grid % n_regions + do j = 1, Grid % n_bnd_regions work = Grid % region % name(j) call String % To_Lower_Case(work) write(fu,'(a,a)') ' BOUNDARY_CONDITION ', trim(work) From 91845f4f6a16809f8b421effb7ae67f7499c7b1e Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 22 Feb 2023 05:14:03 +0100 Subject: [PATCH 008/223] Uses face and cell ranges and macros for browsing On branch bojan_fixed_cell_ranges modified: Process/Field_Mod/Gradients/Calculate_Grad_Matrix.f90 modified: Process/Field_Mod/Gradients/Grad_Component.f90 modified: Process/Field_Mod/Gradients/Grad_Component_No_Refresh.f90 modified: Process/Field_Mod/Gradients/Grad_Gauss.f90 modified: Process/Numerics_Mod/Advection_Term.f90 modified: Process/Numerics_Mod/Inertial_Term.f90 modified: Process/Process_Mod/Balance_Volume.f90 modified: Process/Process_Mod/Compute_Momentum.f90 modified: Process/Process_Mod/Compute_Momentum_Explicit.f90 modified: Process/Process_Mod/Convective_Outflow.f90 modified: Process/Process_Mod/Rhie_And_Chow.f90 modified: Process/Process_Mod/Update_Boundary_Values.f90 modified: Shared/Browse.h90 modified: Shared/Grid_Mod/Sort_Faces_Smart.f90 renamed: Process/Field_Mod/Utilities/Correct_Fluxes_With_Body_Forces.f90 -> Process/Field_Mod/Utilities/Unused/Correct_Fluxes_With_Body_Forces.f90 renamed: Process/Field_Mod/Utilities/Inertial_Term_Momentum.f90 -> Process/Field_Mod/Utilities/Unused/Inertial_Term_Momentum.f90 --- .../Gradients/Calculate_Grad_Matrix.f90 | 57 +++-- .../Field_Mod/Gradients/Grad_Component.f90 | 57 ++--- .../Gradients/Grad_Component_No_Refresh.f90 | 53 +++-- .../Field_Mod/Gradients/Grad_Gauss.f90 | 36 +-- .../Correct_Fluxes_With_Body_Forces.f90 | 0 .../{ => Unused}/Inertial_Term_Momentum.f90 | 0 .../Process/Numerics_Mod/Advection_Term.f90 | 64 ++++-- .../Process/Numerics_Mod/Inertial_Term.f90 | 4 +- .../Process/Process_Mod/Balance_Volume.f90 | 115 +++++----- .../Process/Process_Mod/Compute_Momentum.f90 | 14 +- .../Process_Mod/Compute_Momentum_Explicit.f90 | 13 +- .../Process_Mod/Convective_Outflow.f90 | 213 ++++++++---------- Sources/Process/Process_Mod/Rhie_And_Chow.f90 | 4 +- .../Process_Mod/Update_Boundary_Values.f90 | 33 ++- Sources/Shared/Browse.h90 | 20 +- Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 | 2 +- 16 files changed, 361 insertions(+), 324 deletions(-) rename Sources/Process/Field_Mod/Utilities/{ => Unused}/Correct_Fluxes_With_Body_Forces.f90 (100%) rename Sources/Process/Field_Mod/Utilities/{ => Unused}/Inertial_Term_Momentum.f90 (100%) diff --git a/Sources/Process/Field_Mod/Gradients/Calculate_Grad_Matrix.f90 b/Sources/Process/Field_Mod/Gradients/Calculate_Grad_Matrix.f90 index 3340f80e7..d0ef4d85f 100644 --- a/Sources/Process/Field_Mod/Gradients/Calculate_Grad_Matrix.f90 +++ b/Sources/Process/Field_Mod/Gradients/Calculate_Grad_Matrix.f90 @@ -12,7 +12,7 @@ subroutine Calculate_Grad_Matrix(Flow) logical, parameter :: DEBUG = .false. !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid - integer :: c, c1, c2, s + integer :: c, c1, c2, s, reg real :: dx_c1, dy_c1, dz_c1, dx_c2, dy_c2, dz_c2 real :: jac, g_inv(6) real, contiguous, pointer :: g1(:), g2(:), g3(:), g4(:), g5(:), g6(:) @@ -28,7 +28,7 @@ subroutine Calculate_Grad_Matrix(Flow) !--------------------------------------------! ! Initialize gradient matrices for cells ! !--------------------------------------------! - do c = 1, Grid % n_cells + do c = Cells_In_Domain() Flow % grad_c2c(1,c) = 0.0 Flow % grad_c2c(2,c) = 0.0 Flow % grad_c2c(3,c) = 0.0 @@ -40,7 +40,27 @@ subroutine Calculate_Grad_Matrix(Flow) !----------------------------------------------------------------------! ! Compute the gradient matrix for all cells browsing through faces ! !----------------------------------------------------------------------! - do s = 1, Grid % n_faces + + ! Boundary cells + do reg = Boundary_Regions() + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + + dx_c1 = Grid % dx(s) + dy_c1 = Grid % dy(s) + dz_c1 = Grid % dz(s) + + Flow % grad_c2c(1,c1)=Flow % grad_c2c(1,c1) + dx_c1*dx_c1 ! 1,1 + Flow % grad_c2c(2,c1)=Flow % grad_c2c(2,c1) + dy_c1*dy_c1 ! 2,2 + Flow % grad_c2c(3,c1)=Flow % grad_c2c(3,c1) + dz_c1*dz_c1 ! 3,3 + Flow % grad_c2c(4,c1)=Flow % grad_c2c(4,c1) + dx_c1*dy_c1 ! 1,2 & 2,1 + Flow % grad_c2c(5,c1)=Flow % grad_c2c(5,c1) + dx_c1*dz_c1 ! 1,3 & 3,1 + Flow % grad_c2c(6,c1)=Flow % grad_c2c(6,c1) + dy_c1*dz_c1 ! 2,3 & 3,2 + end do + end do + + ! Faces inside the domain + do s = Faces_In_Domain() c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) @@ -51,27 +71,26 @@ subroutine Calculate_Grad_Matrix(Flow) dy_c2 = Grid % dy(s) dz_c2 = Grid % dz(s) - Flow % grad_c2c(1,c1)=Flow % grad_c2c(1,c1) + dx_c1*dx_c1 ! 1,1 - Flow % grad_c2c(2,c1)=Flow % grad_c2c(2,c1) + dy_c1*dy_c1 ! 2,2 - Flow % grad_c2c(3,c1)=Flow % grad_c2c(3,c1) + dz_c1*dz_c1 ! 3,3 - Flow % grad_c2c(4,c1)=Flow % grad_c2c(4,c1) + dx_c1*dy_c1 ! 1,2 & 2,1 - Flow % grad_c2c(5,c1)=Flow % grad_c2c(5,c1) + dx_c1*dz_c1 ! 1,3 & 3,1 - Flow % grad_c2c(6,c1)=Flow % grad_c2c(6,c1) + dy_c1*dz_c1 ! 2,3 & 3,2 - if(c2 > 0) then ! this is enough even for parallel - Flow % grad_c2c(1,c2)=Flow % grad_c2c(1,c2) + dx_c2*dx_c2 ! 1,1 - Flow % grad_c2c(2,c2)=Flow % grad_c2c(2,c2) + dy_c2*dy_c2 ! 2,2 - Flow % grad_c2c(3,c2)=Flow % grad_c2c(3,c2) + dz_c2*dz_c2 ! 3,3 - Flow % grad_c2c(4,c2)=Flow % grad_c2c(4,c2) + dx_c2*dy_c2 ! 1,2 & 2,1 - Flow % grad_c2c(5,c2)=Flow % grad_c2c(5,c2) + dx_c2*dz_c2 ! 1,3 & 3,1 - Flow % grad_c2c(6,c2)=Flow % grad_c2c(6,c2) + dy_c2*dz_c2 ! 2,3 & 3,2 - end if + Flow % grad_c2c(1,c1)=Flow % grad_c2c(1,c1) + dx_c1*dx_c1 ! 1,1 + Flow % grad_c2c(2,c1)=Flow % grad_c2c(2,c1) + dy_c1*dy_c1 ! 2,2 + Flow % grad_c2c(3,c1)=Flow % grad_c2c(3,c1) + dz_c1*dz_c1 ! 3,3 + Flow % grad_c2c(4,c1)=Flow % grad_c2c(4,c1) + dx_c1*dy_c1 ! 1,2 & 2,1 + Flow % grad_c2c(5,c1)=Flow % grad_c2c(5,c1) + dx_c1*dz_c1 ! 1,3 & 3,1 + Flow % grad_c2c(6,c1)=Flow % grad_c2c(6,c1) + dy_c1*dz_c1 ! 2,3 & 3,2 + + Flow % grad_c2c(1,c2)=Flow % grad_c2c(1,c2) + dx_c2*dx_c2 ! 1,1 + Flow % grad_c2c(2,c2)=Flow % grad_c2c(2,c2) + dy_c2*dy_c2 ! 2,2 + Flow % grad_c2c(3,c2)=Flow % grad_c2c(3,c2) + dz_c2*dz_c2 ! 3,3 + Flow % grad_c2c(4,c2)=Flow % grad_c2c(4,c2) + dx_c2*dy_c2 ! 1,2 & 2,1 + Flow % grad_c2c(5,c2)=Flow % grad_c2c(5,c2) + dx_c2*dz_c2 ! 1,3 & 3,1 + Flow % grad_c2c(6,c2)=Flow % grad_c2c(6,c2) + dy_c2*dz_c2 ! 2,3 & 3,2 end do !--------------------------------! ! Find the inverse of matrix ! !--------------------------------! - do c = 1, Grid % n_cells - Grid % Comm % n_buff_cells + do c = Cells_In_Domain() jac = Flow % grad_c2c(1,c) * Flow % grad_c2c(2,c) * Flow % grad_c2c(3,c) & - Flow % grad_c2c(1,c) * Flow % grad_c2c(6,c) * Flow % grad_c2c(6,c) & - Flow % grad_c2c(4,c) * Flow % grad_c2c(4,c) * Flow % grad_c2c(3,c) & @@ -102,7 +121,7 @@ subroutine Calculate_Grad_Matrix(Flow) end do if(DEBUG) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain() g1(c) = Flow % grad_c2c(1,c) g2(c) = Flow % grad_c2c(2,c) g3(c) = Flow % grad_c2c(3,c) diff --git a/Sources/Process/Field_Mod/Gradients/Grad_Component.f90 b/Sources/Process/Field_Mod/Gradients/Grad_Component.f90 index 11e33ec90..8a19389b9 100644 --- a/Sources/Process/Field_Mod/Gradients/Grad_Component.f90 +++ b/Sources/Process/Field_Mod/Gradients/Grad_Component.f90 @@ -14,7 +14,7 @@ subroutine Grad_Component(Flow, phi, i, phii) :Flow % pnt_grid % n_cells) !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid - integer :: s, c1, c2 + integer :: s, c1, c2, reg real :: dphi1, dphi2 !-----------------------------[Local parameters]-------------------------------! integer, dimension(3,3), parameter :: MAP = reshape((/ 1, 4, 5, & @@ -31,39 +31,40 @@ subroutine Grad_Component(Flow, phi, i, phii) ! Initialize gradients phii(1:Grid % n_cells) = 0. - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - dphi1 = phi(c2) - phi(c1) - dphi2 = phi(c2) - phi(c1) + ! On the boundaries update only c1 - if not symmetry + do reg = Boundary_Regions() + if(Grid % region % type(reg) .ne. SYMMETRY) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) - ! On the boundaries - if(c2 < 0) then + dphi1 = phi(c2)-phi(c1) - if(Grid % Bnd_Cond_Type(c2) .eq. SYMMETRY) then - dphi1 = 0. - end if + phii(c1) = phii(c1) & + + dphi1 * ( Flow % grad_c2c(MAP(i,1),c1) * Grid % dx(s) & + + Flow % grad_c2c(MAP(i,2),c1) * Grid % dy(s) & + + Flow % grad_c2c(MAP(i,3),c1) * Grid % dz(s)) + end do + end if ! symmetry + end do - phii(c1) = phii(c1) & - + dphi1 * ( Flow % grad_c2c(MAP(i,1),c1) * Grid % dx(s) & - + Flow % grad_c2c(MAP(i,2),c1) * Grid % dy(s) & - + Flow % grad_c2c(MAP(i,3),c1) * Grid % dz(s)) - end if + ! Inside the domain + do s = Faces_In_Domain() + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) - ! Inside the domain - if(c2 > 0) then + dphi1 = phi(c2)-phi(c1) + dphi2 = phi(c2)-phi(c1) - phii(c1) = phii(c1) & - + dphi1 * ( Flow % grad_c2c(MAP(i,1),c1) * Grid % dx(s) & - + Flow % grad_c2c(MAP(i,2),c1) * Grid % dy(s) & - + Flow % grad_c2c(MAP(i,3),c1) * Grid % dz(s)) + phii(c1) = phii(c1) & + + dphi1 * ( Flow % grad_c2c(MAP(i,1),c1) * Grid % dx(s) & + + Flow % grad_c2c(MAP(i,2),c1) * Grid % dy(s) & + + Flow % grad_c2c(MAP(i,3),c1) * Grid % dz(s)) - phii(c2) = phii(c2) & - + dphi2 * ( Flow % grad_c2c(MAP(i,1),c2) * Grid % dx(s) & - + Flow % grad_c2c(MAP(i,2),c2) * Grid % dy(s) & - + Flow % grad_c2c(MAP(i,3),c2) * Grid % dz(s)) - end if + phii(c2) = phii(c2) & + + dphi2 * ( Flow % grad_c2c(MAP(i,1),c2) * Grid % dx(s) & + + Flow % grad_c2c(MAP(i,2),c2) * Grid % dy(s) & + + Flow % grad_c2c(MAP(i,3),c2) * Grid % dz(s)) end do call Grid % Exchange_Cells_Real(phii) diff --git a/Sources/Process/Field_Mod/Gradients/Grad_Component_No_Refresh.f90 b/Sources/Process/Field_Mod/Gradients/Grad_Component_No_Refresh.f90 index 4d6e934df..326f0255b 100644 --- a/Sources/Process/Field_Mod/Gradients/Grad_Component_No_Refresh.f90 +++ b/Sources/Process/Field_Mod/Gradients/Grad_Component_No_Refresh.f90 @@ -14,7 +14,7 @@ subroutine Grad_Component_No_Refresh(Flow, phi, i, phii) :Flow % pnt_grid % n_cells) !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid - integer :: s, c1, c2 + integer :: s, c1, c2, reg real :: dphi1, dphi2 !-----------------------------[Local parameters]-------------------------------! integer, dimension(3,3), parameter :: MAP = reshape((/ 1, 4, 5, & @@ -28,37 +28,40 @@ subroutine Grad_Component_No_Refresh(Flow, phi, i, phii) ! Initialize gradients phii(1:Grid % n_cells) = 0. - do s = 1, Grid % n_faces + ! On the boundaries update only c1 - if not symmetry + do reg = Boundary_Regions() + if(Grid % region % type(reg) .ne. SYMMETRY) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + + dphi1 = phi(c2)-phi(c1) + + phii(c1) = phii(c1) & + + dphi1 * ( Flow % grad_c2c(MAP(i,1),c1) * Grid % dx(s) & + + Flow % grad_c2c(MAP(i,2),c1) * Grid % dy(s) & + + Flow % grad_c2c(MAP(i,3),c1) * Grid % dz(s)) + end do + end if ! symmetry + end do + + ! Inside the domain + do s = Faces_In_Domain() c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) dphi1 = phi(c2)-phi(c1) dphi2 = phi(c2)-phi(c1) - ! On the boundaries - if(c2 < 0) then - if(Grid % Bnd_Cond_Type(c2) .eq. SYMMETRY) then - dphi1 = 0. - end if - - phii(c1) = phii(c1) & - + dphi1 * ( Flow % grad_c2c(MAP(i,1),c1) * Grid % dx(s) & - + Flow % grad_c2c(MAP(i,2),c1) * Grid % dy(s) & - + Flow % grad_c2c(MAP(i,3),c1) * Grid % dz(s)) - end if - - ! Inside the domain - if(c2 > 0) then - phii(c1) = phii(c1) & - + dphi1 * ( Flow % grad_c2c(MAP(i,1),c1) * Grid % dx(s) & - + Flow % grad_c2c(MAP(i,2),c1) * Grid % dy(s) & - + Flow % grad_c2c(MAP(i,3),c1) * Grid % dz(s)) + phii(c1) = phii(c1) & + + dphi1 * ( Flow % grad_c2c(MAP(i,1),c1) * Grid % dx(s) & + + Flow % grad_c2c(MAP(i,2),c1) * Grid % dy(s) & + + Flow % grad_c2c(MAP(i,3),c1) * Grid % dz(s)) - phii(c2) = phii(c2) & - + dphi2 * ( Flow % grad_c2c(MAP(i,1),c2) * Grid % dx(s) & - + Flow % grad_c2c(MAP(i,2),c2) * Grid % dy(s) & - + Flow % grad_c2c(MAP(i,3),c2) * Grid % dz(s)) - end if + phii(c2) = phii(c2) & + + dphi2 * ( Flow % grad_c2c(MAP(i,1),c2) * Grid % dx(s) & + + Flow % grad_c2c(MAP(i,2),c2) * Grid % dy(s) & + + Flow % grad_c2c(MAP(i,3),c2) * Grid % dz(s)) end do end subroutine diff --git a/Sources/Process/Field_Mod/Gradients/Grad_Gauss.f90 b/Sources/Process/Field_Mod/Gradients/Grad_Gauss.f90 index 9156f7bca..17a66b17a 100644 --- a/Sources/Process/Field_Mod/Gradients/Grad_Gauss.f90 +++ b/Sources/Process/Field_Mod/Gradients/Grad_Gauss.f90 @@ -20,7 +20,7 @@ subroutine Grad_Gauss(Flow, phi_f, phi_x, phi_y, phi_z) Flow % pnt_grid % n_cells) !----------------------------------[Locals]------------------------------------! type(Grid_Type), pointer :: Grid - integer :: s, c1, c2, c + integer :: s, c1, c2, c, reg !==============================================================================! ! Take alias @@ -29,34 +29,38 @@ subroutine Grad_Gauss(Flow, phi_f, phi_x, phi_y, phi_z) !-----------------------------------------------! ! Update gradients from the values at faces ! !-----------------------------------------------! - do c = 1, Grid % n_cells + do c = Cells_In_Domain() phi_x(c) = 0.0 phi_y(c) = 0.0 phi_z(c) = 0.0 end do - do s = 1, Grid % n_faces + ! Faces in boundary region first + do reg = Boundary_Regions() + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - if(c2 > 0) then phi_x(c1) = phi_x(c1) - phi_f(s) * Grid % sx(s) phi_y(c1) = phi_y(c1) - phi_f(s) * Grid % sy(s) phi_z(c1) = phi_z(c1) - phi_f(s) * Grid % sz(s) + end do + end do - phi_x(c2) = phi_x(c2) + phi_f(s) * Grid % sx(s) - phi_y(c2) = phi_y(c2) + phi_f(s) * Grid % sy(s) - phi_z(c2) = phi_z(c2) + phi_f(s) * Grid % sz(s) - else - phi_x(c1) = phi_x(c1) - phi_f(s) * Grid % sx(s) - phi_y(c1) = phi_y(c1) - phi_f(s) * Grid % sy(s) - phi_z(c1) = phi_z(c1) - phi_f(s) * Grid % sz(s) - end if + ! Faces inside the domain + do s = Faces_In_Domain() + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + + phi_x(c1) = phi_x(c1) - phi_f(s) * Grid % sx(s) + phi_y(c1) = phi_y(c1) - phi_f(s) * Grid % sy(s) + phi_z(c1) = phi_z(c1) - phi_f(s) * Grid % sz(s) + phi_x(c2) = phi_x(c2) + phi_f(s) * Grid % sx(s) + phi_y(c2) = phi_y(c2) + phi_f(s) * Grid % sy(s) + phi_z(c2) = phi_z(c2) + phi_f(s) * Grid % sz(s) end do - do c = 1, Grid % n_cells + do c = Cells_In_Domain() phi_x(c) = -phi_x(c) / Grid % vol(c) phi_y(c) = -phi_y(c) / Grid % vol(c) phi_z(c) = -phi_z(c) / Grid % vol(c) diff --git a/Sources/Process/Field_Mod/Utilities/Correct_Fluxes_With_Body_Forces.f90 b/Sources/Process/Field_Mod/Utilities/Unused/Correct_Fluxes_With_Body_Forces.f90 similarity index 100% rename from Sources/Process/Field_Mod/Utilities/Correct_Fluxes_With_Body_Forces.f90 rename to Sources/Process/Field_Mod/Utilities/Unused/Correct_Fluxes_With_Body_Forces.f90 diff --git a/Sources/Process/Field_Mod/Utilities/Inertial_Term_Momentum.f90 b/Sources/Process/Field_Mod/Utilities/Unused/Inertial_Term_Momentum.f90 similarity index 100% rename from Sources/Process/Field_Mod/Utilities/Inertial_Term_Momentum.f90 rename to Sources/Process/Field_Mod/Utilities/Unused/Inertial_Term_Momentum.f90 diff --git a/Sources/Process/Numerics_Mod/Advection_Term.f90 b/Sources/Process/Numerics_Mod/Advection_Term.f90 index 1934e9332..a0bf84d97 100644 --- a/Sources/Process/Numerics_Mod/Advection_Term.f90 +++ b/Sources/Process/Numerics_Mod/Advection_Term.f90 @@ -13,10 +13,12 @@ subroutine Numerics_Mod_Advection_Term(phi, coef, v_flux, b) !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid real :: phif ! phi and coef at the cell face - integer :: c, c1, c2, s + integer :: c, c1, c2, s, reg real, contiguous, pointer :: phi_min(:), phi_max(:), advect(:), upwind(:) !==============================================================================! + call Profiler % Start('Advection_Term') + ! Take alias to Grid Grid => phi % pnt_grid @@ -35,11 +37,41 @@ subroutine Numerics_Mod_Advection_Term(phi, coef, v_flux, b) advect(:) = 0.0 upwind(:) = 0.0 - !----------------------------------! - ! Browse through all the faces ! - !----------------------------------! - do s=1, Grid % n_faces + !-----------------------------------! + ! Browse through boundary faces ! + !-----------------------------------! + do reg = Boundary_Regions() + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + + ! This could be computed with gradient extrapolation + phif = Grid % f(s) * phi % n(c1) & + + (1.0-Grid % f(s)) * phi % n(c2) + + ! Compute phif with desired advection scheme + if(phi % adv_scheme .ne. CENTRAL) then + call Numerics_Mod_Advection_Scheme(phif, s, phi, & + phi_min, phi_max, v_flux) + end if + + ! Compute advection term (volume-conservative form) + advect(c1) = advect(c1) - v_flux(s) * phif * coef(c1) + + ! Store upwinded part of the advection term + if(v_flux(s) .lt. 0) then ! from c2 to c1 + upwind(c1) = upwind(c1) - v_flux(s) * phi % n(c2) * coef(c1) + else + upwind(c1) = upwind(c1) - v_flux(s) * phi % n(c1) * coef(c1) + end if + + end do ! faces + end do ! regions + !---------------------------------! + ! Browse through inside faces ! + !---------------------------------! + do s = Faces_In_Domain() c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) @@ -53,36 +85,30 @@ subroutine Numerics_Mod_Advection_Term(phi, coef, v_flux, b) end if ! Compute advection term (volume-conservative form) - if(c2 > 0) then - advect(c1) = advect(c1) - v_flux(s) * phif * coef(c1) - advect(c2) = advect(c2) + v_flux(s) * phif * coef(c2) - else - advect(c1) = advect(c1) - v_flux(s) * phif * coef(c1) - end if + advect(c1) = advect(c1) - v_flux(s) * phif * coef(c1) + advect(c2) = advect(c2) + v_flux(s) * phif * coef(c2) ! Store upwinded part of the advection term if(v_flux(s) .lt. 0) then ! from c2 to c1 upwind(c1) = upwind(c1) - v_flux(s) * phi % n(c2) * coef(c1) - if(c2 > 0) then - upwind(c2) = upwind(c2) + v_flux(s) * phi % n(c2) * coef(c2) - end if + upwind(c2) = upwind(c2) + v_flux(s) * phi % n(c2) * coef(c2) else upwind(c1) = upwind(c1) - v_flux(s) * phi % n(c1) * coef(c1) - if(c2 > 0) then - upwind(c2) = upwind(c2) + v_flux(s) * phi % n(c1) * coef(c2) - end if + upwind(c2) = upwind(c2) + v_flux(s) * phi % n(c1) * coef(c2) end if - end do ! through faces + end do ! through faces in domain !------------------------------------------------! ! Source term contains difference between ! ! explicity and implicitly treated advection ! !------------------------------------------------! - do c = 1, Grid % n_cells + do c = Cells_In_Domain() b(c) = b(c) + advect(c) - upwind(c) end do call Work % Disconnect_Real_Cell(phi_min, phi_max, advect, upwind) + call Profiler % Stop('Advection_Term') + end subroutine diff --git a/Sources/Process/Numerics_Mod/Inertial_Term.f90 b/Sources/Process/Numerics_Mod/Inertial_Term.f90 index d966b520c..935a555a1 100644 --- a/Sources/Process/Numerics_Mod/Inertial_Term.f90 +++ b/Sources/Process/Numerics_Mod/Inertial_Term.f90 @@ -22,7 +22,7 @@ subroutine Numerics_Mod_Inertial_Term(phi, coef, A, b, dt) ! Two time levels; Linear interpolation if(phi % td_scheme .eq. LINEAR) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain() a0 = coef(c) * Grid % vol(c) / dt A % val(A % dia(c)) = A % val(A % dia(c)) + a0 b(c) = b(c) + a0 * phi % o(c) @@ -31,7 +31,7 @@ subroutine Numerics_Mod_Inertial_Term(phi, coef, A, b, dt) ! Three time levels; parabolic interpolation if(phi % td_scheme .eq. PARABOLIC) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain() a0 = coef(c) * Grid % vol(c) / dt A % val(A % dia(c)) = A % val(A % dia(c)) + 1.5 * a0 b(c) = b(c) + 2.0 * a0 * phi % o(c) - 0.5 * a0 * phi % oo(c) diff --git a/Sources/Process/Process_Mod/Balance_Volume.f90 b/Sources/Process/Process_Mod/Balance_Volume.f90 index 55caf79e4..a223499fb 100644 --- a/Sources/Process/Process_Mod/Balance_Volume.f90 +++ b/Sources/Process/Process_Mod/Balance_Volume.f90 @@ -26,10 +26,12 @@ subroutine Balance_Volume(Process, Flow, Vof) type(Bulk_Type), pointer :: bulk type(Var_Type), pointer :: u, v, w type(Face_Type), pointer :: v_flux - integer :: s, c1, c2 + integer :: s, c2, reg real :: fac, vol_outflow, area_outflow !==============================================================================! + call Profiler % Start('Balance_Volume') + ! Take aliases Grid => Flow % pnt_grid bulk => Flow % bulk @@ -43,7 +45,6 @@ subroutine Balance_Volume(Process, Flow, Vof) ! ! !--------------------------------------------------------! do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) ! Side is on the boundary @@ -77,13 +78,11 @@ subroutine Balance_Volume(Process, Flow, Vof) !----------------------------------------------------------! vol_outflow = 0.0 area_outflow = 0.0 - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0 .and. Grid % Comm % cell_proc(c1) .eq. this_proc) then - if(Grid % Bnd_Cond_Type(c2) .eq. PRESSURE .or. & - Grid % Bnd_Cond_Type(c2) .eq. OUTFLOW .or. & - Grid % Bnd_Cond_Type(c2) .eq. CONVECT) then + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. PRESSURE .or. & + Grid % region % type(reg) .eq. OUTFLOW .or. & + Grid % region % type(reg) .eq. CONVECT) then + do s = Faces_In_Region(reg) ! Integrate volume flux only where something does come out if(v_flux % n(s) > 0.0) then @@ -92,7 +91,8 @@ subroutine Balance_Volume(Process, Flow, Vof) ! Integrate area everywhere where outflow is specified area_outflow = area_outflow + Grid % s(s) - end if + + end do end if end do call Comm_Mod_Global_Sum_Real(vol_outflow) @@ -112,17 +112,13 @@ subroutine Balance_Volume(Process, Flow, Vof) ! This works better if domain features pressure outflow ... ! !---------------------------------------------------------------! if(Flow % has_pressure) then - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - ! Volume flux at the boundary face - if(c2 < 0 .and. Grid % Comm % cell_proc(c1) .eq. this_proc) then - if(Grid % Bnd_Cond_Type(c2) .eq. INFLOW .or. & - Grid % Bnd_Cond_Type(c2) .eq. OUTFLOW .or. & - Grid % Bnd_Cond_Type(c2) .eq. CONVECT .or. & - Grid % Bnd_Cond_Type(c2) .eq. PRESSURE) then + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. INFLOW .or. & + Grid % region % type(reg) .eq. OUTFLOW .or. & + Grid % region % type(reg) .eq. CONVECT .or. & + Grid % region % type(reg) .eq. PRESSURE) then + do s = Faces_In_Region(reg) if(v_flux % n(s) > 0.0) then bulk % vol_out = bulk % vol_out + v_flux % n(s) bulk % area_out = bulk % area_out + Grid % s(s) @@ -130,37 +126,32 @@ subroutine Balance_Volume(Process, Flow, Vof) bulk % vol_in = bulk % vol_in - v_flux % n(s) bulk % area_in = bulk % area_in + Grid % s(s) end if - end if - - end if - end do + end do ! faces + end if ! boundary conditions + end do ! regions !-----------------------------------------------------------------------! ! ... but this variant works better for all other types of outflows ! !-----------------------------------------------------------------------! else - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - ! Volume flux at the boundary face - if(c2 < 0 .and. Grid % Comm % cell_proc(c1) .eq. this_proc) then - - if(Grid % Bnd_Cond_Type(c2) .eq. INFLOW) then + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. INFLOW) then + do s = Faces_In_Region(reg) bulk % vol_in = bulk % vol_in - v_flux % n(s) bulk % area_in = bulk % area_in + Grid % s(s) - end if - - if(Grid % Bnd_Cond_Type(c2) .eq. OUTFLOW .or. & - Grid % Bnd_Cond_Type(c2) .eq. CONVECT .or. & - Grid % Bnd_Cond_Type(c2) .eq. PRESSURE) then + end do + end if ! boundary condition + if(Grid % region % type(reg) .eq. OUTFLOW .or. & + Grid % region % type(reg) .eq. CONVECT .or. & + Grid % region % type(reg) .eq. PRESSURE) then + do s = Faces_In_Region(reg) bulk % vol_out = bulk % vol_out + v_flux % n(s) bulk % area_out = bulk % area_out + Grid % s(s) - end if + end do + end if ! boundary condition + end do ! regions - end if - end do - end if + end if ! flow has pressure call Comm_Mod_Global_Sum_Real(bulk % vol_in) call Comm_Mod_Global_Sum_Real(bulk % vol_out) @@ -187,13 +178,13 @@ subroutine Balance_Volume(Process, Flow, Vof) if(Math % Approx_Real(vol_outflow, 0.0, tol=FEMTO)) then bulk % vol_out = 0.0 - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0 .and. Grid % Comm % cell_proc(c1) .eq. this_proc) then - if(Grid % Bnd_Cond_Type(c2) .eq. OUTFLOW .or. & - Grid % Bnd_Cond_Type(c2) .eq. CONVECT .or. & - Grid % Bnd_Cond_Type(c2) .eq. PRESSURE) then + + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. OUTFLOW .or. & + Grid % region % type(reg) .eq. CONVECT .or. & + Grid % region % type(reg) .eq. PRESSURE) then + do s = Faces_In_Region(reg) + c2 = Grid % faces_c(2,s) ! Update velocity components ... u % n(c2) = (bulk % vol_in + bulk % vol_src) / area_outflow & @@ -210,9 +201,9 @@ subroutine Balance_Volume(Process, Flow, Vof) ! ... and bulk volume out bulk % vol_out = bulk % vol_out + v_flux % n(s) - end if - end if - end do + end do ! faces + end if ! boundary condition + end do ! region ! Holy mackrele: summ it up over all processors call Comm_Mod_Global_Sum_Real(bulk % vol_out) @@ -229,13 +220,13 @@ subroutine Balance_Volume(Process, Flow, Vof) ! ... and correct all velocities bulk % vol_out = 0.0 - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0) then - if(Grid % Bnd_Cond_Type(c2) .eq. OUTFLOW .or. & - Grid % Bnd_Cond_Type(c2) .eq. CONVECT .or. & - Grid % Bnd_Cond_Type(c2) .eq. PRESSURE) then + + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. OUTFLOW .or. & + Grid % region % type(reg) .eq. CONVECT .or. & + Grid % region % type(reg) .eq. PRESSURE) then + do s = Faces_In_Region(reg) + c2 = Grid % faces_c(2,s) ! Update velocity components ... u % n(c2) = u % n(c2) * fac + bulk % vol_src / bulk % area_out & @@ -252,9 +243,9 @@ subroutine Balance_Volume(Process, Flow, Vof) ! ... and bulk volume out bulk % vol_out = bulk % vol_out + v_flux % n(s) - end if - end if - end do + end do ! faces + end if ! boundary condition + end do ! regions ! Holy mackrele: summ it up over all processors call Comm_Mod_Global_Sum_Real(bulk % vol_out) ! not checked @@ -266,4 +257,6 @@ subroutine Balance_Volume(Process, Flow, Vof) call Grid % Exchange_Cells_Real(v % n) call Grid % Exchange_Cells_Real(w % n) + call Profiler % Stop('Balance_Volume') + end subroutine diff --git a/Sources/Process/Process_Mod/Compute_Momentum.f90 b/Sources/Process/Process_Mod/Compute_Momentum.f90 index 4773c6028..d97f96b04 100644 --- a/Sources/Process/Process_Mod/Compute_Momentum.f90 +++ b/Sources/Process/Process_Mod/Compute_Momentum.f90 @@ -175,7 +175,7 @@ subroutine Compute_Momentum(Process, Flow, Turb, Vof, Por, Sol, curr_dt, ini) ! Old values (o) and older than old (oo) if(.not. Flow % inside_piso_loop) then if(ini .eq. 1) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain() ui % oo(c) = ui % o(c) ui % o (c) = ui % n(c) end do @@ -269,7 +269,7 @@ subroutine Compute_Momentum(Process, Flow, Turb, Vof, Por, Sol, curr_dt, ini) ! Explicit treatment for cross diffusion terms ! (Shouldn't theese, in an ideal world, ! also be treated in Rhie and Chow?) - do c = 1, Grid % n_cells + do c = Cells_In_Domain() fi(c) = fi(c) + cross(c) end do @@ -289,14 +289,14 @@ subroutine Compute_Momentum(Process, Flow, Turb, Vof, Por, Sol, curr_dt, ini) !--------------------------! ! Global pressure drop ! !--------------------------! - do c = 1, Grid % n_cells + do c = Cells_In_Domain() fi(c) = fi(c) + p_drop_i * Grid % vol(c) end do !--------------------! ! Buoyancy force ! !--------------------! - do c = 1, Grid % n_cells + do c = Cells_In_Domain() fi(c) = fi(c) + cell_fi(c) * Grid % vol(c) end do @@ -310,7 +310,7 @@ subroutine Compute_Momentum(Process, Flow, Turb, Vof, Por, Sol, curr_dt, ini) ! (Note: pressure gradients are not with other forces. ! ! Same is true for surface tension, see nex comments) ! !-----------------------------------------------------------! - do c = 1, Grid % n_cells + do c = Cells_In_Domain() b(c) = fi(c) - p_i(c) * Grid % vol(c) end do @@ -321,7 +321,7 @@ subroutine Compute_Momentum(Process, Flow, Turb, Vof, Por, Sol, curr_dt, ini) !----------------------------------------------------------------! if(Flow % with_interface) then call Vof % Surface_Tension_Force(i) - do c = 1, Grid % n_cells + do c = Cells_In_Domain() b(c) = b(c) + st_i(c) * Grid % vol(c) end do end if @@ -335,7 +335,7 @@ subroutine Compute_Momentum(Process, Flow, Turb, Vof, Por, Sol, curr_dt, ini) ! from under-relaxation factors and Majumdar ! ! correction in Rhie_And_Chow is not needed ! !------------------------------------------------! - do c = 1, Grid % n_cells + do c = Cells_In_Domain() M % sav(c) = M % val(M % dia(c)) end do diff --git a/Sources/Process/Process_Mod/Compute_Momentum_Explicit.f90 b/Sources/Process/Process_Mod/Compute_Momentum_Explicit.f90 index 4f664318e..75c00896a 100644 --- a/Sources/Process/Process_Mod/Compute_Momentum_Explicit.f90 +++ b/Sources/Process/Process_Mod/Compute_Momentum_Explicit.f90 @@ -31,19 +31,16 @@ subroutine Compute_Momentum_Explicit(Process, Flow, ui, Nat) ! Sum of neighbours sum_neigh(:) = 0.0 - do s = 1, Grid % n_faces + do s = Faces_In_Domain() c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) - if(Grid % Comm % cell_proc(c1) .eq. this_proc) then - if(c2 > 0) then - sum_neigh(c1) = sum_neigh(c1) - M % val(M % pos(1,s)) * ui % n(c2) - sum_neigh(c2) = sum_neigh(c2) - M % val(M % pos(2,s)) * ui % n(c1) - end if - end if + + sum_neigh(c1) = sum_neigh(c1) - M % val(M % pos(1,s)) * ui % n(c2) + sum_neigh(c2) = sum_neigh(c2) - M % val(M % pos(2,s)) * ui % n(c1) end do ! Solve velocity explicitely (no under relaxation!!) - do c = 1, Grid % n_cells - Grid % Comm % n_buff_cells + do c = Cells_In_Domain() ui % n(c) = (sum_neigh(c) + b(c)) / M % val(M % dia(c)) end do diff --git a/Sources/Process/Process_Mod/Convective_Outflow.f90 b/Sources/Process/Process_Mod/Convective_Outflow.f90 index 0d1bbc07e..ddb321af0 100644 --- a/Sources/Process/Process_Mod/Convective_Outflow.f90 +++ b/Sources/Process/Process_Mod/Convective_Outflow.f90 @@ -19,7 +19,7 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) type(Var_Type), pointer :: kin, eps, zeta, f22, t2 type(Var_Type), pointer :: uu, vv, ww, uv, uw, vw type(Face_Type), pointer :: v_flux - integer :: c1, c2, s, sc + integer :: c1, c2, s, sc, reg real :: nx, ny, nz, bulk_vel, phi_n, dt !==============================================================================! @@ -58,13 +58,11 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) call Flow % Grad_Variable(Flow % v) call Flow % Grad_Variable(Flow % w) - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - ! On the boundary perform the extrapolation - if(c2 < 0) then - if( (Grid % Bnd_Cond_Type(c2) .eq. CONVECT) ) then + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. CONVECT) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) call Grid % Face_Normal(s, nx, ny, nz) phi_n = u % x(c1) * nx + u % y(c1) * ny + u % z(c1) * nz @@ -75,25 +73,24 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) phi_n = w % x(c1) * nx + w % y(c1) * ny + w % z(c1) * nz w % n(c2) = w % n(c2) - bulk_vel * phi_n * dt - end if - end if - end do ! s + end do ! face + end if ! boundary condition + end do ! region else ! curr_dt <= BEGIN - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. CONVECT) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) - ! On the boundary perform the extrapolation - if(c2 < 0) then - if( (Grid % Bnd_Cond_Type(c2) .eq. CONVECT) ) then u % n(c2) = u % n(c1) v % n(c2) = v % n(c1) w % n(c2) = w % n(c1) - end if - end if - end do ! s + end do ! face + end if ! boundary condition + end do ! region end if ! curr_dt > BEGIN @@ -116,13 +113,11 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) call Flow % Grad_Variable(t2) end if - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - ! On the boundary perform the extrapolation - if(c2 < 0) then - if( (Grid % Bnd_Cond_Type(c2) .eq. CONVECT) ) then + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. CONVECT) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) call Grid % Face_Normal(s, nx, ny, nz) phi_n = kin % x(c1) * nx + kin % y(c1) * ny + kin % z(c1) * nz @@ -135,27 +130,26 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) phi_n = t2 % x(c1) * nx + t2 % y(c1) * ny + t2 % z(c1) * nz t2 % n(c2) = t2 % n(c2) - bulk_vel * phi_n * dt end if - end if - end if - end do ! s + end do ! face + end if ! boundary condition + end do ! region else ! curr_dt <= BEGIN - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. CONVECT) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) - ! On the boundary perform the extrapolation - if(c2 < 0) then - if( (Grid % Bnd_Cond_Type(c2) .eq. CONVECT) ) then kin % n(c2) = kin % n(c1) eps % n(c2) = eps % n(c1) if(Flow % heat_transfer) then t2 % n(c2) = t2 % n(c1) end if - end if - end if - end do ! s + end do ! face + end if ! boundary condition + end do ! region end if ! curr_dt > BEGIN @@ -177,13 +171,12 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) call Flow % Grad_Variable(t2) end if - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - ! On the boundary perform the extrapolation - if(c2 < 0) then - if( (Grid % Bnd_Cond_Type(c2) .eq. CONVECT) ) then + ! On the boundary perform the extrapolation + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. CONVECT) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) call Grid % Face_Normal(s, nx, ny, nz) phi_n = kin % x(c1) * nx + kin % y(c1) * ny + kin % z(c1) * nz @@ -202,19 +195,19 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) phi_n = t2 % x(c1) * nx + t2 % y(c1) * ny + t2 % z(c1) * nz t2 % n(c2) = t2 % n(c2) - bulk_vel * phi_n * dt end if - end if - end if - end do ! s + end do ! face + end if ! boundary condition + end do ! region else ! curr_dt <= BEGIN - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) + ! On the boundary perform the extrapolation + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. CONVECT) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) - ! On the boundary perform the extrapolation - if(c2 < 0) then - if( (Grid % Bnd_Cond_Type(c2) .eq. CONVECT) ) then kin % n(c2) = kin % n(c1) eps % n(c2) = eps % n(c1) f22 % n(c2) = f22 % n(c1) @@ -222,9 +215,9 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) if(Flow % heat_transfer) then t2 % n(c2) = t2 % n(c1) end if - end if - end if - end do ! s + end do ! face + end if ! boundary condition + end do ! region end if ! curr_dt > BEGIN @@ -250,13 +243,11 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) call Flow % Grad_Variable(f22) end if - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - ! On the boundary perform the extrapolation - if(c2 < 0) then - if( (Grid % Bnd_Cond_Type(c2) .eq. CONVECT) ) then + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. CONVECT) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) call Grid % Face_Normal(s, nx, ny, nz) phi_n = uu % x(c1) * nx + uu % y(c1) * ny + uu % z(c1) * nz @@ -284,19 +275,18 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) phi_n = f22 % x(c1) * nx + f22 % y(c1) * ny + f22 % z(c1) * nz f22 % n(c2) = f22 % n(c2) - bulk_vel * phi_n * dt end if - end if - end if - end do ! s + end do ! face + end if ! boundary condition + end do ! region else ! curr_dt <= BEGIN - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. CONVECT) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) - ! On the boundary perform the extrapolation - if(c2 < 0) then - if( (Grid % Bnd_Cond_Type(c2) .eq. CONVECT) ) then uu % n(c2) = uu % n(c1) vv % n(c2) = vv % n(c1) ww % n(c2) = ww % n(c1) @@ -307,9 +297,9 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) if(Turb % model .eq. RSM_MANCEAU_HANJALIC) then f22 % n(c2) = f22 % n(c1) end if - end if - end if - end do ! s + end do ! face + end if ! boundary condition + end do ! region end if ! curr_dt > BEGIN @@ -328,34 +318,31 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) call Flow % Grad_Variable(phi) - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - ! On the boundary perform the extrapolation - if(c2 < 0) then - if( (Grid % Bnd_Cond_Type(c2) .eq. CONVECT) ) then + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. CONVECT) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) call Grid % Face_Normal(s, nx, ny, nz) phi_n = phi % x(c1) * nx + phi % y(c1) * ny + phi % z(c1) * nz phi % n(c2) = phi % n(c2) - bulk_vel * phi_n * dt - end if - end if - end do ! s + end do ! face + end if ! boundary condition + end do ! region else ! curr_dt <= BEGIN - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. CONVECT) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) - ! On the boundary perform the extrapolation - if(c2 < 0) then - if( (Grid % Bnd_Cond_Type(c2) .eq. CONVECT) ) then phi % n(c2) = phi % n(c1) - end if - end if - end do ! s + end do ! face + end if ! boundary condition + end do ! region end if ! curr_dt > BEGIN @@ -375,33 +362,31 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) ! stored already in t % x, t % y and t % z, check it call Flow % Grad_Variable(t) - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - ! On the boundary perform the extrapolation - if(c2 < 0) then - if( (Grid % Bnd_Cond_Type(c2) .eq. CONVECT) ) then + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. CONVECT) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) call Grid % Face_Normal(s, nx, ny, nz) phi_n = t % x(c1) * nx + t % y(c1) * ny + t % z(c1) * nz t % n(c2) = t % n(c2) - bulk_vel * phi_n * dt - end if - end if - end do ! s + end do ! face + end if ! boundary condition + end do ! region else ! curr_dt <= BEGIN - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. CONVECT) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) - if(c2 < 0) then - if( (Grid % Bnd_Cond_Type(c2) .eq. CONVECT) ) then t % n(c2) = t % n(c1) - end if - end if - end do ! s + end do ! face + end if ! boundary condition + end do ! region end if ! curr_dt < BEGIN diff --git a/Sources/Process/Process_Mod/Rhie_And_Chow.f90 b/Sources/Process/Process_Mod/Rhie_And_Chow.f90 index d2ec940c8..755f538be 100644 --- a/Sources/Process/Process_Mod/Rhie_And_Chow.f90 +++ b/Sources/Process/Process_Mod/Rhie_And_Chow.f90 @@ -157,11 +157,13 @@ subroutine Rhie_And_Chow(Process, Flow, Vof, Nat) !-------------------------------------------------! ! Calculate the mass fluxes on the cell faces ! !-------------------------------------------------! - do s = 1, Grid % n_faces + do s = Faces_In_Domain() c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) fs = Grid % f(s) + Assert(c2 > 0) + ! Face is inside the domain if(c2 > 0) then diff --git a/Sources/Process/Process_Mod/Update_Boundary_Values.f90 b/Sources/Process/Process_Mod/Update_Boundary_Values.f90 index fc469aec9..4aabb1be2 100644 --- a/Sources/Process/Process_Mod/Update_Boundary_Values.f90 +++ b/Sources/Process/Process_Mod/Update_Boundary_Values.f90 @@ -32,10 +32,12 @@ subroutine Update_Boundary_Values(Process, Flow, Turb, Vof, update) type(Var_Type), pointer :: u, v, w, t, phi, fun type(Var_Type), pointer :: kin, eps, zeta, f22, vis, t2 type(Var_Type), pointer :: uu, vv, ww, uv, uw, vw - integer :: c0, c1, c2, i_fac, s, s1, sc + integer :: c0, c1, c2, i_fac, s, s1, sc, reg real :: kin_vis, u_tau, dt_dn !==============================================================================! + call Profiler % Start('Update_Boundary_Values') + ! Take aliases Grid => Flow % pnt_grid vis => Turb % vis @@ -68,23 +70,21 @@ subroutine Update_Boundary_Values(Process, Flow, Turb, Vof, update) !--------------! if( (update .eq. 'MOMENTUM' .or. update .eq. 'ALL') ) then - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - ! On the boundary perform the extrapolation - if(c2 < 0) then + ! On the boundary perform the extrapolation + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. OUTFLOW .or. & + Grid % region % type(reg) .eq. PRESSURE .or. & + Grid % region % type(reg) .eq. SYMMETRY) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) - ! Extrapolate velocities on the outflow boundary - if( Grid % Bnd_Cond_Type(c2) .eq. OUTFLOW .or. & - Grid % Bnd_Cond_Type(c2) .eq. PRESSURE .or. & - Grid % Bnd_Cond_Type(c2) .eq. SYMMETRY ) then u % n(c2) = u % n(c1) v % n(c2) = v % n(c1) w % n(c2) = w % n(c1) - end if - end if ! c2 < 0 - end do + end do ! faces + end if ! boundary condition + end do ! region end if ! update momentum @@ -168,7 +168,6 @@ subroutine Update_Boundary_Values(Process, Flow, Turb, Vof, update) if(Turb % model .eq. K_EPS_ZETA_F .or. & Turb % model .eq. HYBRID_LES_RANS) then if(Grid % Bnd_Cond_Type(c2) .eq. OUTFLOW .or. & - Grid % Bnd_Cond_Type(c2) .eq. CONVECT .or. & Grid % Bnd_Cond_Type(c2) .eq. PRESSURE .or. & Grid % Bnd_Cond_Type(c2) .eq. SYMMETRY) then kin % n(c2) = kin % n(c1) @@ -185,7 +184,6 @@ subroutine Update_Boundary_Values(Process, Flow, Turb, Vof, update) ! k-epsilon if(Turb % model .eq. K_EPS) then if(Grid % Bnd_Cond_Type(c2) .eq. OUTFLOW .or. & - Grid % Bnd_Cond_Type(c2) .eq. CONVECT .or. & Grid % Bnd_Cond_Type(c2) .eq. PRESSURE .or. & Grid % Bnd_Cond_Type(c2) .eq. SYMMETRY) then kin % n(c2) = kin % n(c1) @@ -199,7 +197,6 @@ subroutine Update_Boundary_Values(Process, Flow, Turb, Vof, update) if(Turb % model .eq. RSM_MANCEAU_HANJALIC .or. & Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then if(Grid % Bnd_Cond_Type(c2) .eq. OUTFLOW .or. & - Grid % Bnd_Cond_Type(c2) .eq. CONVECT .or. & Grid % Bnd_Cond_Type(c2) .eq. PRESSURE) then uu % n(c2) = uu % n(c1) vv % n(c2) = vv % n(c1) @@ -436,4 +433,6 @@ subroutine Update_Boundary_Values(Process, Flow, Turb, Vof, update) end if ! update_scalars + call Profiler % Stop('Update_Boundary_Values') + end subroutine diff --git a/Sources/Shared/Browse.h90 b/Sources/Shared/Browse.h90 index eb807ed48..a31e2ba1f 100644 --- a/Sources/Shared/Browse.h90 +++ b/Sources/Shared/Browse.h90 @@ -2,12 +2,20 @@ ! Definition of potentially usefull macros in T-Flows. ! !------------------------------------------------------------------------------! -# define Browse_All_Cells(c) do c = -Grid % n_bnd_cells, Grid % n_cells -# define Browse_Boundary_Cells(c) do c = -Grid % n_bnd_cells, -1 -# define Browse_Inside_Cells(c) do c = 1, Grid % n_cells -# define Browse_Faces(c) do s = 1, Grid % n_faces +# define Boundary_Regions() \ + 1, Grid % n_bnd_regions -# define Browse_Faces_In_Color(s, color) do s = Grid % region % f_face(color), Grid % region % l_face(color) -# define End_Browse end do +# define Boundary_And_Inside_Regions() \ + 1, Grid % n_regions +# define Faces_In_Region(reg) \ + Grid % region % f_face(reg), \ + Grid % region % l_face(reg) +# define Faces_In_Domain() \ + Grid % region % f_face(Grid % n_regions), \ + Grid % region % l_face(Grid % n_regions) + +# define Cells_In_Domain() \ + Grid % region % f_cell(Grid % n_regions), \ + Grid % region % l_cell(Grid % n_regions) diff --git a/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 b/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 index f52104c38..66db17668 100644 --- a/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 +++ b/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 @@ -175,7 +175,7 @@ subroutine Sort_Faces_Smart(Grid) end if end do - do reg = 1, Grid % n_regions + do reg = Boundary_Regions() print '(2i6)', Grid % region % f_cell(reg), & Grid % region % l_cell(reg) end do From 4bdb58a24f5655bee6369c9e2236d62a758e2bc2 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 22 Feb 2023 05:17:22 +0100 Subject: [PATCH 009/223] Added include statement for macros On branch bojan_fixed_cell_ranges modified: Divide/Divide_Mod.f90 modified: Process/Field_Mod.f90 modified: Process/Numerics_Mod.f90 modified: Process/Process_Mod.f90 --- Sources/Divide/Divide_Mod.f90 | 3 +++ Sources/Process/Field_Mod.f90 | 1 + Sources/Process/Numerics_Mod.f90 | 2 ++ Sources/Process/Process_Mod.f90 | 1 + 4 files changed, 7 insertions(+) diff --git a/Sources/Divide/Divide_Mod.f90 b/Sources/Divide/Divide_Mod.f90 index 630cef022..f0cc181dc 100644 --- a/Sources/Divide/Divide_Mod.f90 +++ b/Sources/Divide/Divide_Mod.f90 @@ -1,3 +1,6 @@ +#include "../Shared/Assert.h90" +#include "../Shared/Browse.h90" + !==============================================================================! module Divide_Mod !------------------------------------------------------------------------------! diff --git a/Sources/Process/Field_Mod.f90 b/Sources/Process/Field_Mod.f90 index a37f01d83..8d107396c 100644 --- a/Sources/Process/Field_Mod.f90 +++ b/Sources/Process/Field_Mod.f90 @@ -1,4 +1,5 @@ #include "../Shared/Assert.h90" +#include "../Shared/Browse.h90" !==============================================================================! module Field_Mod diff --git a/Sources/Process/Numerics_Mod.f90 b/Sources/Process/Numerics_Mod.f90 index b2a85e2ed..10f121a1f 100644 --- a/Sources/Process/Numerics_Mod.f90 +++ b/Sources/Process/Numerics_Mod.f90 @@ -1,3 +1,5 @@ +#include "../Shared/Browse.h90" + !==============================================================================! module Numerics_Mod !------------------------------------------------------------------------------! diff --git a/Sources/Process/Process_Mod.f90 b/Sources/Process/Process_Mod.f90 index f4b555436..e776d4063 100644 --- a/Sources/Process/Process_Mod.f90 +++ b/Sources/Process/Process_Mod.f90 @@ -1,4 +1,5 @@ #include "../Shared/Assert.h90" +#include "../Shared/Browse.h90" !==============================================================================! module Process_Mod From cf7ca1ec8d3a612e253f049ef239ed47fb31c165 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 22 Feb 2023 05:19:04 +0100 Subject: [PATCH 010/223] IMPORTANT: Essence of the fix to cell ranges! The cell ranges didn't work in parallel, because this procedure wasn't taking at all the proper order of boundary cells in the regions. It has now been fix, but saving of backup files from Process will also be influenced, which is addressed in the next commit. On branch bojan_fixed_cell_ranges modified: Divide/Divide_Mod/Save_Subdomains.f90 --- Sources/Divide/Divide_Mod/Save_Subdomains.f90 | 154 ++++++++++-------- 1 file changed, 90 insertions(+), 64 deletions(-) diff --git a/Sources/Divide/Divide_Mod/Save_Subdomains.f90 b/Sources/Divide/Divide_Mod/Save_Subdomains.f90 index a2a96cdbc..35d541daa 100644 --- a/Sources/Divide/Divide_Mod/Save_Subdomains.f90 +++ b/Sources/Divide/Divide_Mod/Save_Subdomains.f90 @@ -5,14 +5,24 @@ subroutine Save_Subdomains(Divide, Grid, n_buff_layers) ! ! ! Warning: Unfortunatelly, if you change the order in which cells are ! ! stored here, it might have an impact on map creation for backup file. ! +! ! +! Region-wise, at this point you have: ! +! ! +! Faces: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ! +! ! +! Cells: -16 -15 -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 ! +! ! +! Reg: |<----------- 1 ----------->|<----- 2 ----->|<------ 3 ------>| ! +! ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Divide_Type) :: Divide - type(Grid_Type) :: Grid - integer :: n_buff_layers ! number of buffer layers, keep it here + class(Divide_Type) :: Divide + type(Grid_Type) :: Grid + integer, intent(in) :: n_buff_layers ! number of buffer layers, keep it here !-----------------------------------[Locals]-----------------------------------! - integer :: c, n, s, c1, c2, sub, subo, i_nod, ss, sr, nn !exp:, lev + integer :: c, n, s, c1, c2, sub, subo, i_nod + integer :: ss, sr, nn, reg, bc_indx !exp:, lev integer :: nn_sub ! number of nodes in the subdomain integer :: nc_sub ! number of cells in the subdomain integer :: nf_sub ! number of faces in the subdomain @@ -133,7 +143,8 @@ subroutine Save_Subdomains(Divide, Grid, n_buff_layers) ! Boundary cells ! ! ! !--------------------! - nbc_sub = 0 ! number of boundary cells in subdomain + bc_indx = -Grid % n_bnd_cells ! number of boundary cells in subdomain, ... + ! ... start from the smallest possible Grid % new_c(-Grid % n_bnd_cells:-1) = 0 Grid % old_c(-Grid % n_bnd_cells:-1) = 0 @@ -143,18 +154,18 @@ subroutine Save_Subdomains(Divide, Grid, n_buff_layers) do subo = 1, maxval(Grid % Comm % cell_proc(:)) if(subo .ne. sub) then - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0) then + do reg = Boundary_Regions() + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + Assert(c2 < 0) if( Grid % Comm % cell_proc(c1) .eq. subo .and. & Grid % new_c(c1) .ne. 0) then - nbc_sub = nbc_sub + 1 ! increase n. of bnd. cells - Grid % new_c(c2) = -nbc_sub ! new loc. number of bnd. cell - Grid % old_c(-nbc_sub) = c2 + Grid % new_c(c2) = bc_indx ! new loc. number of bnd. cell + bc_indx = bc_indx + 1 ! increase boundary cell counter end if - end if - end do + end do ! s + end do ! region end if ! subo .ne. sub end do ! subo @@ -162,15 +173,27 @@ subroutine Save_Subdomains(Divide, Grid, n_buff_layers) !----------------------------------------------! ! Step 2: boundary cells in the domain sub ! !----------------------------------------------! - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0) then + do reg = Boundary_Regions() + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + Assert(c2 < 0) if( Grid % Comm % cell_proc(c1) .eq. sub ) then - nbc_sub = nbc_sub + 1 ! increase n. of bnd. cells - Grid % new_c(c2) = -nbc_sub ! new loc. number of bnd. cell - Grid % old_c(-nbc_sub) = c2 + Grid % new_c(c2) = bc_indx ! new loc. number of bnd. cell + bc_indx = bc_indx + 1 ! increase boundary cell counter end if + end do + end do + + ! At this point, new boundary cell counters go from -Grid % n_bnd_cells + ! That is too low, all indices have to be increased in a way that maximum + ! boundary cell index is -1 + nbc_sub = 0 + do c = -Grid % n_bnd_cells, -1 + if(Grid % new_c(c) .ne. 0) then + Grid % new_c(c) = Grid % new_c(c) - bc_indx + Grid % old_c(Grid % new_c(c)) = c + nbc_sub = nbc_sub + 1 end if end do @@ -191,17 +214,19 @@ subroutine Save_Subdomains(Divide, Grid, n_buff_layers) ! If the faces in the original grid started from ! ! boundary faces, it should be the case here too.) ! !---------------------------------------------------------! - do s = 1, Grid % n_faces ! + n_shadows? probably not, shadows at the end - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - ! Both cells are in the domain - if( Grid % Comm % cell_proc(c1) .eq. sub .and. & - Grid % Comm % cell_proc(c2) .eq. sub ) then - nf_sub = nf_sub + 1 - Grid % new_f(s) = nf_sub - Grid % old_f(nf_sub) = s - end if + do reg = Boundary_And_Inside_Regions() ! shadows? probably not, at the end + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + + ! Both cells are in the domain + if( Grid % Comm % cell_proc(c1) .eq. sub .and. & + Grid % Comm % cell_proc(c2) .eq. sub ) then + nf_sub = nf_sub + 1 + Grid % new_f(s) = nf_sub + Grid % old_f(nf_sub) = s + end if + end do end do !-------------------------------------! @@ -211,24 +236,24 @@ subroutine Save_Subdomains(Divide, Grid, n_buff_layers) if(subo .ne. sub) then ! Faces half in the domain, half in the buffers - do s = 1, Grid % n_faces ! + n_shadows? naah, shadows at the end + do s = Faces_In_Domain() c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) - if(c2 > 0) then - if( (Grid % Comm % cell_proc(c1) .eq. sub) .and. & - (Grid % Comm % cell_proc(c2) .eq. subo) ) then - nf_sub = nf_sub + 1 - Grid % new_f(s) = nf_sub - Grid % old_f(nf_sub) = s - end if - if( (Grid % Comm % cell_proc(c2) .eq. sub) .and. & - (Grid % Comm % cell_proc(c1) .eq. subo) ) then - nf_sub = nf_sub + 1 - Grid % new_f(s) = nf_sub - Grid % old_f(nf_sub) = s - end if - end if ! c2 > 0 - end do ! through faces + + if( (Grid % Comm % cell_proc(c1) .eq. sub) .and. & + (Grid % Comm % cell_proc(c2) .eq. subo) ) then + nf_sub = nf_sub + 1 + Grid % new_f(s) = nf_sub + Grid % old_f(nf_sub) = s + end if + if( (Grid % Comm % cell_proc(c2) .eq. sub) .and. & + (Grid % Comm % cell_proc(c1) .eq. subo) ) then + nf_sub = nf_sub + 1 + Grid % new_f(s) = nf_sub + Grid % old_f(nf_sub) = s + end if + + end do ! through inside faces (region 0) end if ! subo .ne. sub end do ! subo @@ -236,23 +261,24 @@ subroutine Save_Subdomains(Divide, Grid, n_buff_layers) !------------------------------------------------! ! Step 3: All the remaining faces in buffers ! !------------------------------------------------! - do s = 1, Grid % n_faces ! + n_shadows? naah, shadows at the end - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - ! If any of its cells have been marked for saving ... - if(Grid % new_c(c1) .ne. 0 .or. & - Grid % new_c(c2) .ne. 0) then - - ! ... but the face hasn't, do it now! - if(Grid % new_f(s) .eq. 0) then - nf_sub = nf_sub + 1 - Grid % new_f(s) = nf_sub - Grid % old_f(nf_sub) = s + do reg = Boundary_And_Inside_Regions() ! shadows? probably not, at the end + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + + ! If any of its cells have been marked for saving ... + if(Grid % new_c(c1) .ne. 0 .or. & + Grid % new_c(c2) .ne. 0) then + + ! ... but the face hasn't, do it now! + if(Grid % new_f(s) .eq. 0) then + nf_sub = nf_sub + 1 + Grid % new_f(s) = nf_sub + Grid % old_f(nf_sub) = s + end if end if - - end if ! new_c(c) .ne. 0 - end do ! c + end do + end do !--------------------------! ! Step 4: shadow faces ! From 647017a84a487dafa9f8a6eb26f027f136db4242 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 22 Feb 2023 05:21:12 +0100 Subject: [PATCH 011/223] Unfortunate, but every time cell numbering changes the formation of cell mappings for parallel backup saving has to be addressed to. The changes done here follow the fix of cell ranges in fix cf7ca1ec8d3a612e253f049ef239ed47fb31c165 I hope this variant will be a bit more robust, time will tell. On branch bojan_fixed_cell_ranges modified: Shared/Grid_Mod/Form_Maps.f90 --- Sources/Shared/Grid_Mod/Form_Maps.f90 | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/Sources/Shared/Grid_Mod/Form_Maps.f90 b/Sources/Shared/Grid_Mod/Form_Maps.f90 index b26b662b7..4f211e003 100644 --- a/Sources/Shared/Grid_Mod/Form_Maps.f90 +++ b/Sources/Shared/Grid_Mod/Form_Maps.f90 @@ -7,7 +7,7 @@ subroutine Form_Maps(Grid) !---------------------------------[Arguments]----------------------------------! class(Grid_Type) :: Grid !-----------------------------------[Locals]-----------------------------------! - integer :: c, cnt + integer :: c, cnt, reg !==============================================================================! ! There is an issue with this procedure, but it's more related to MPI/IO ! ! functions than T-Flows. In cases a subdomain has no physical boundary ! @@ -30,9 +30,15 @@ subroutine Form_Maps(Grid) end if end do - ! First and last cell to send - Grid % Comm % nb_f = Grid % n_bnd_cells - Grid % Comm % nb_l = Grid % n_bnd_cells - Grid % Comm % nb_sub + 1 + ! First and last cell to send are found through regions + Grid % Comm % nb_l = Grid % n_bnd_cells + Grid % Comm % nb_f = 1 + do reg = Boundary_Regions() + if(Grid % region % l_cell(reg) >= Grid % region % f_cell(reg)) then + Grid % Comm % nb_l = min(Grid % Comm % nb_l, -Grid % region % l_cell(reg)) + Grid % Comm % nb_f = max(Grid % Comm % nb_f, -Grid % region % f_cell(reg)) + end if + end do ! Initialize total number of cells Grid % Comm % nc_tot = Grid % Comm % nc_sub @@ -97,11 +103,13 @@ subroutine Form_Maps(Grid) ! Boundary cell map ! !-----------------------! cnt = 0 - do c = -Grid % Comm % nb_f, -Grid % Comm % nb_l - cnt = cnt + 1 - Grid % Comm % bnd_cell_map(cnt) = int( Grid % Comm % cell_glo(c) & - + Grid % Comm % nb_tot, SP) - end do + do reg = Boundary_Regions() + do c = Grid % region % f_cell(reg), Grid % region % l_cell(reg) + cnt = cnt + 1 + Grid % Comm % bnd_cell_map(cnt) = int( Grid % Comm % cell_glo(c) & + + Grid % Comm % nb_tot, SP) + end do + end do ! region ! If domain has zero boundary cells, make the only ! (fictitious) member in the map point it to zero. From fd2978e5ed3e572b036ad7961b8824dda3a16ab0 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 22 Feb 2023 09:02:36 +0100 Subject: [PATCH 012/223] Added macro "Cells_In_Region" On branch bojan_fixed_cell_ranges modified: Shared/Browse.h90 --- Sources/Shared/Browse.h90 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Sources/Shared/Browse.h90 b/Sources/Shared/Browse.h90 index a31e2ba1f..9e7ce2f7b 100644 --- a/Sources/Shared/Browse.h90 +++ b/Sources/Shared/Browse.h90 @@ -16,6 +16,10 @@ Grid % region % f_face(Grid % n_regions), \ Grid % region % l_face(Grid % n_regions) +# define Cells_In_Region(reg) \ + Grid % region % f_cell(reg), \ + Grid % region % l_cell(reg) + # define Cells_In_Domain() \ Grid % region % f_cell(Grid % n_regions), \ Grid % region % l_cell(Grid % n_regions) From 304d7715d8734d37bb95d575e6e8130c8f5e3cf6 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 22 Feb 2023 09:04:07 +0100 Subject: [PATCH 013/223] Uses macro Boundary_Regions() On branch bojan_fixed_cell_ranges modified: Convert/Convert_Mod.f90 modified: Convert/Convert_Mod/Find_Parents.f90 modified: Convert/Convert_Mod/Insert_Buildings.f90 modified: Shared/Grid_Mod/Load_Cfn.f90 modified: Shared/Grid_Mod/Save_Cfn.f90 modified: Shared/Grid_Mod/Write_Template_Control_File.f90 --- Sources/Convert/Convert_Mod.f90 | 2 ++ Sources/Convert/Convert_Mod/Find_Parents.f90 | 2 +- Sources/Convert/Convert_Mod/Insert_Buildings.f90 | 10 +++++----- Sources/Shared/Grid_Mod/Load_Cfn.f90 | 2 +- Sources/Shared/Grid_Mod/Save_Cfn.f90 | 2 +- .../Shared/Grid_Mod/Write_Template_Control_File.f90 | 2 +- 6 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Sources/Convert/Convert_Mod.f90 b/Sources/Convert/Convert_Mod.f90 index f5b750b63..58e484529 100644 --- a/Sources/Convert/Convert_Mod.f90 +++ b/Sources/Convert/Convert_Mod.f90 @@ -1,3 +1,5 @@ +#include "../Shared/Browse.h90" + !==============================================================================! module Convert_Mod !------------------------------------------------------------------------------! diff --git a/Sources/Convert/Convert_Mod/Find_Parents.f90 b/Sources/Convert/Convert_Mod/Find_Parents.f90 index 0605f89cb..e34f8c79d 100644 --- a/Sources/Convert/Convert_Mod/Find_Parents.f90 +++ b/Sources/Convert/Convert_Mod/Find_Parents.f90 @@ -84,7 +84,7 @@ subroutine Find_Parents(Convert, Grid) ! Real work begins ! !----------------------! - do bc = 1, Grid % n_bnd_regions + do bc = Boundary_Regions() cr1(:) = HUGE_INT cr2(:) = HUGE_INT diff --git a/Sources/Convert/Convert_Mod/Insert_Buildings.f90 b/Sources/Convert/Convert_Mod/Insert_Buildings.f90 index 269055ba0..cf5c8f7b3 100644 --- a/Sources/Convert/Convert_Mod/Insert_Buildings.f90 +++ b/Sources/Convert/Convert_Mod/Insert_Buildings.f90 @@ -408,7 +408,7 @@ subroutine Insert_Buildings(Convert, Grid) n_chimneys = 0 allocate(cell_in_chimney(Grid % n_cells)) cell_in_chimney(:) = 0 - do bc = 1, Grid % n_bnd_regions + do bc = Boundary_Regions() bc_name = trim(Grid % region % name(bc)) call String % To_Upper_Case(bc_name) if(bc_name(1:7) .eq. 'CHIMNEY') then @@ -474,7 +474,7 @@ subroutine Insert_Buildings(Convert, Grid) !-----------------------------------------------------------! ! Find ground b.c. number (only used to eliminate BUILDING_000) - do bc = 1, Grid % n_bnd_regions + do bc = Boundary_Regions() bc_name = trim(Grid % region % name(bc)) call String % To_Upper_Case(bc_name) if(bc_name .eq. 'GROUND') then @@ -483,7 +483,7 @@ subroutine Insert_Buildings(Convert, Grid) end do ! Eliminate building_000 b.c. - do bc = 1, Grid % n_bnd_regions + do bc = Boundary_Regions() bc_name = trim(Grid % region % name(bc)) call String % To_Upper_Case(bc_name) if(bc_name .eq. 'BUILDING_000') then @@ -498,7 +498,7 @@ subroutine Insert_Buildings(Convert, Grid) end do cnt = 0 - do bc = 1, Grid % n_bnd_regions + do bc = Boundary_Regions() bc_name = trim(Grid % region % name(bc)) call String % To_Upper_Case(bc_name) if(bc_name(1:8) .ne. 'BUILDING') then @@ -642,7 +642,7 @@ subroutine Insert_Buildings(Convert, Grid) end if - do bc = 1, Grid % n_bnd_regions + do bc = Boundary_Regions() bc_name = trim(Grid % region % name(bc)) call String % To_Upper_Case(bc_name) if(bc_name(1:7) .eq. 'CHIMNEY') then diff --git a/Sources/Shared/Grid_Mod/Load_Cfn.f90 b/Sources/Shared/Grid_Mod/Load_Cfn.f90 index 5acfaa548..c3a2abdec 100644 --- a/Sources/Shared/Grid_Mod/Load_Cfn.f90 +++ b/Sources/Shared/Grid_Mod/Load_Cfn.f90 @@ -85,7 +85,7 @@ subroutine Load_Cfn(Grid, this_proc, domain) !------------------------------! ! Boundary conditions list ! !------------------------------! - do n = 1, Grid % n_bnd_regions + do n = Boundary_Regions() read(fu) Grid % region % name(n) end do diff --git a/Sources/Shared/Grid_Mod/Save_Cfn.f90 b/Sources/Shared/Grid_Mod/Save_Cfn.f90 index 77c17b96a..4680f69b3 100644 --- a/Sources/Shared/Grid_Mod/Save_Cfn.f90 +++ b/Sources/Shared/Grid_Mod/Save_Cfn.f90 @@ -62,7 +62,7 @@ subroutine Save_Cfn(Grid, & !------------------------------! ! Boundary conditions list ! !------------------------------! - do n = 1, Grid % n_bnd_regions + do n = Boundary_Regions() write(fu) Grid % region % name(n) end do diff --git a/Sources/Shared/Grid_Mod/Write_Template_Control_File.f90 b/Sources/Shared/Grid_Mod/Write_Template_Control_File.f90 index d4404940c..f158c47ca 100644 --- a/Sources/Shared/Grid_Mod/Write_Template_Control_File.f90 +++ b/Sources/Shared/Grid_Mod/Write_Template_Control_File.f90 @@ -51,7 +51,7 @@ subroutine Write_Template_Control_File(Grid) write(fu,'(a)') '# "eps", "zeta" and "f22"' write(fu,'(a)') '#-----------------------------------------------------------' - do j = 1, Grid % n_bnd_regions + do j = Boundary_Regions() work = Grid % region % name(j) call String % To_Lower_Case(work) write(fu,'(a,a)') ' BOUNDARY_CONDITION ', trim(work) From 5f5b4ffb5587756e36ed23b156be2b5f78ee3858 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 22 Feb 2023 09:06:42 +0100 Subject: [PATCH 014/223] Uses macros Cells_In_Region and Boundary_Regions On branch bojan_fixed_cell_ranges modified: Process/Read_Controls_Mod.f90 modified: Process/Read_Controls_Mod/Boundary_Conditions.f90 --- Sources/Process/Read_Controls_Mod.f90 | 2 + .../Read_Controls_Mod/Boundary_Conditions.f90 | 1003 ++++++++--------- 2 files changed, 497 insertions(+), 508 deletions(-) diff --git a/Sources/Process/Read_Controls_Mod.f90 b/Sources/Process/Read_Controls_Mod.f90 index 03d547a99..ecf8eaa96 100644 --- a/Sources/Process/Read_Controls_Mod.f90 +++ b/Sources/Process/Read_Controls_Mod.f90 @@ -1,3 +1,5 @@ +#include "../Shared/Browse.h90" + !==============================================================================! module Read_Controls_Mod !------------------------------------------------------------------------------! diff --git a/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 b/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 index db835cdbc..ce0e18fda 100644 --- a/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 +++ b/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 @@ -64,7 +64,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) types_file(:) = .false. c_types = 0 - do bc = 1, Grid % n_bnd_regions + do bc = Boundary_Regions() call Control_Mod_Position_At_Two_Keys('BOUNDARY_CONDITION', & Grid % region % name(bc), & found, & @@ -117,7 +117,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) !------------------------------------------------! c_types = 0 - do bc = 1, Grid % n_bnd_regions + do bc = Boundary_Regions() ! Position yourself well call Control_Mod_Position_At_Two_Keys('BOUNDARY_CONDITION', & @@ -193,127 +193,122 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) !--------------------------------------------------! ! Distribute b.c. tags only. - do c = -1, -Grid % n_bnd_cells, -1 - if(Grid % region % at_cell(c) .eq. bc) then - - ! Temperature - if(Flow % heat_transfer) then - i = Key_Ind('T', keys, nks) - if(i > 0) then - t % bnd_cond_type(c) = bc_type_tag - if(bc_type_tag .eq. WALLFL) t % bnd_cond_type(c) = WALL - if(bc_type_tag .eq. WALLFL) Grid % region % type(bc) = WALL - end if - i = Key_Ind('Q', keys, nks) - if(i > 0) then - t % bnd_cond_type(c) = bc_type_tag - if(bc_type_tag .eq. WALL) t % bnd_cond_type(c) = WALLFL - if(bc_type_tag .eq. WALL) Grid % region % type(bc) = WALLFL - end if + do c = Cells_In_Region(bc) + + ! Temperature + if(Flow % heat_transfer) then + i = Key_Ind('T', keys, nks) + if(i > 0) then + t % bnd_cond_type(c) = bc_type_tag + if(bc_type_tag .eq. WALLFL) t % bnd_cond_type(c) = WALL + if(bc_type_tag .eq. WALLFL) Grid % region % type(bc) = WALL end if - - ! Volume of fluid -> still to be worked around - if (Flow % with_interface) then - i = Key_Ind('VOF', keys, nks) - if(i > 0) fun % bnd_cond_type(c) = bc_type_tag - i = Key_Ind('VOF_C_ANG', keys, nks) - if(i > 0) fun % bnd_cond_type(c) = bc_type_tag + i = Key_Ind('Q', keys, nks) + if(i > 0) then + t % bnd_cond_type(c) = bc_type_tag + if(bc_type_tag .eq. WALL) t % bnd_cond_type(c) = WALLFL + if(bc_type_tag .eq. WALL) Grid % region % type(bc) = WALLFL end if + end if - ! For scalars - do sc = 1, Flow % n_scalars - i = Key_Ind(scalar(sc) % name, keys, nks) - if(i > 0) then - scalar(sc) % bnd_cond_type(c) = bc_type_tag - end if - i = Key_Ind(scalar(sc) % flux_name, keys, nks) - if(i > 0) then - scalar(sc) % bnd_cond_type(c) = WALLFL - end if - end do + ! Volume of fluid -> still to be worked around + if (Flow % with_interface) then + i = Key_Ind('VOF', keys, nks) + if(i > 0) fun % bnd_cond_type(c) = bc_type_tag + i = Key_Ind('VOF_C_ANG', keys, nks) + if(i > 0) fun % bnd_cond_type(c) = bc_type_tag + end if - end if ! bnd_color .eq. bc + ! For scalars + do sc = 1, Flow % n_scalars + i = Key_Ind(scalar(sc) % name, keys, nks) + if(i > 0) then + scalar(sc) % bnd_cond_type(c) = bc_type_tag + end if + i = Key_Ind(scalar(sc) % flux_name, keys, nks) + if(i > 0) then + scalar(sc) % bnd_cond_type(c) = WALLFL + end if + end do - end do + end do ! Cells_In_Region ! Distribute b.c. values - do c = -1, -Grid % n_bnd_cells, -1 - if(Grid % region % at_cell(c) .eq. bc) then - - ! For velocity, pressure and wall roughness - i = Key_Ind('U', keys, nks); if(i > 0) u % b(c) = vals(i) - i = Key_Ind('V', keys, nks); if(i > 0) v % b(c) = vals(i) - i = Key_Ind('W', keys, nks); if(i > 0) w % b(c) = vals(i) - i = Key_Ind('P', keys, nks); if(i > 0) p % b(c) = vals(i) - i = Key_Ind('Z_O', keys, nks); if(i > 0) z_o (c) = vals(i) - - ! Temperature - if(Flow % heat_transfer) then - i = Key_Ind('T', keys, nks) - if(i > 0) t % b(c) = vals(i) - i = Key_Ind('Q', keys, nks) - if(i > 0) t % q(c) = vals(i) - end if - - ! Multiphase Flow - if (Flow % with_interface) then - i = Key_Ind('VOF', keys, nks) - if(i > 0) fun % b(c) = vals(i) - i = Key_Ind('VOF_C_ANG', keys, nks) - if(i > 0) fun % q(c) = vals(i) - end if + do c = Cells_In_Region(bc) + + ! For velocity, pressure and wall roughness + i = Key_Ind('U', keys, nks); if(i > 0) u % b(c) = vals(i) + i = Key_Ind('V', keys, nks); if(i > 0) v % b(c) = vals(i) + i = Key_Ind('W', keys, nks); if(i > 0) w % b(c) = vals(i) + i = Key_Ind('P', keys, nks); if(i > 0) p % b(c) = vals(i) + i = Key_Ind('Z_O', keys, nks); if(i > 0) z_o (c) = vals(i) + + ! Temperature + if(Flow % heat_transfer) then + i = Key_Ind('T', keys, nks) + if(i > 0) t % b(c) = vals(i) + i = Key_Ind('Q', keys, nks) + if(i > 0) t % q(c) = vals(i) + end if - ! For scalars - do sc = 1, Flow % n_scalars - i = Key_Ind(scalar(sc) % name, keys, nks) - if(i > 0) scalar(sc) % b(c) = vals(i) - i = Key_Ind(scalar(sc) % flux_name, keys, nks) - if(i > 0) scalar(sc) % q(c) = vals(i) - end do + ! Multiphase Flow + if (Flow % with_interface) then + i = Key_Ind('VOF', keys, nks) + if(i > 0) fun % b(c) = vals(i) + i = Key_Ind('VOF_C_ANG', keys, nks) + if(i > 0) fun % q(c) = vals(i) + end if - ! For turbulence models - if(Turb % model .eq. RSM_MANCEAU_HANJALIC .or. & - Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then - i = Key_Ind('UU', keys, nks); if(i > 0) uu % b(c) = vals(i) - i = Key_Ind('VV', keys, nks); if(i > 0) vv % b(c) = vals(i) - i = Key_Ind('WW', keys, nks); if(i > 0) ww % b(c) = vals(i) - i = Key_Ind('UV', keys, nks); if(i > 0) uv % b(c) = vals(i) - i = Key_Ind('UW', keys, nks); if(i > 0) uw % b(c) = vals(i) - i = Key_Ind('VW', keys, nks); if(i > 0) vw % b(c) = vals(i) - i = Key_Ind('EPS', keys, nks); if(i > 0) eps % b(c) = vals(i) + ! For scalars + do sc = 1, Flow % n_scalars + i = Key_Ind(scalar(sc) % name, keys, nks) + if(i > 0) scalar(sc) % b(c) = vals(i) + i = Key_Ind(scalar(sc) % flux_name, keys, nks) + if(i > 0) scalar(sc) % q(c) = vals(i) + end do - if(Turb % model .eq. RSM_MANCEAU_HANJALIC) then - i = Key_Ind('F22', keys, nks); if(i > 0) f22 % b(c) = vals(i) - end if + ! For turbulence models + if(Turb % model .eq. RSM_MANCEAU_HANJALIC .or. & + Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then + i = Key_Ind('UU', keys, nks); if(i > 0) uu % b(c) = vals(i) + i = Key_Ind('VV', keys, nks); if(i > 0) vv % b(c) = vals(i) + i = Key_Ind('WW', keys, nks); if(i > 0) ww % b(c) = vals(i) + i = Key_Ind('UV', keys, nks); if(i > 0) uv % b(c) = vals(i) + i = Key_Ind('UW', keys, nks); if(i > 0) uw % b(c) = vals(i) + i = Key_Ind('VW', keys, nks); if(i > 0) vw % b(c) = vals(i) + i = Key_Ind('EPS', keys, nks); if(i > 0) eps % b(c) = vals(i) + + if(Turb % model .eq. RSM_MANCEAU_HANJALIC) then + i = Key_Ind('F22', keys, nks); if(i > 0) f22 % b(c) = vals(i) end if + end if - if(Turb % model .eq. K_EPS) then - i = Key_Ind('KIN', keys, nks); if(i > 0) kin % b(c) = vals(i) - i = Key_Ind('EPS', keys, nks); if(i > 0) eps % b(c) = vals(i) - Turb % y_plus(c) = 1.1 - if(Flow % heat_transfer) then - i = Key_Ind('T2', keys, nks); if(i > 0) t2 % b(c) = vals(i) - end if + if(Turb % model .eq. K_EPS) then + i = Key_Ind('KIN', keys, nks); if(i > 0) kin % b(c) = vals(i) + i = Key_Ind('EPS', keys, nks); if(i > 0) eps % b(c) = vals(i) + Turb % y_plus(c) = 1.1 + if(Flow % heat_transfer) then + i = Key_Ind('T2', keys, nks); if(i > 0) t2 % b(c) = vals(i) end if + end if - if(Turb % model .eq. K_EPS_ZETA_F .or. & - Turb % model .eq. HYBRID_LES_RANS) then - i = Key_Ind('KIN', keys, nks); if(i > 0) kin % b(c) = vals(i) - i = Key_Ind('EPS', keys, nks); if(i > 0) eps % b(c) = vals(i) - i = Key_Ind('ZETA', keys, nks); if(i > 0) zeta % b(c) = vals(i) - i = Key_Ind('F22', keys, nks); if(i > 0) f22 % b(c) = vals(i) - if(Flow % heat_transfer) then - i = Key_Ind('T2', keys, nks); if(i > 0) t2 % b(c) = vals(i) - end if + if(Turb % model .eq. K_EPS_ZETA_F .or. & + Turb % model .eq. HYBRID_LES_RANS) then + i = Key_Ind('KIN', keys, nks); if(i > 0) kin % b(c) = vals(i) + i = Key_Ind('EPS', keys, nks); if(i > 0) eps % b(c) = vals(i) + i = Key_Ind('ZETA', keys, nks); if(i > 0) zeta % b(c) = vals(i) + i = Key_Ind('F22', keys, nks); if(i > 0) f22 % b(c) = vals(i) + if(Flow % heat_transfer) then + i = Key_Ind('T2', keys, nks); if(i > 0) t2 % b(c) = vals(i) end if + end if - if(Turb % model .eq. SPALART_ALLMARAS .or. & - Turb % model .eq. DES_SPALART) then - i = Key_Ind('VIS', keys, nks); if(i > 0) vis % b(c) = vals(i) - end if + if(Turb % model .eq. SPALART_ALLMARAS .or. & + Turb % model .eq. DES_SPALART) then + i = Key_Ind('VIS', keys, nks); if(i > 0) vis % b(c) = vals(i) end if - end do + end do ! Cells_In_Region !---------------------------------------------! ! ! @@ -352,414 +347,404 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) keys(1) .eq. 'Y' .and. keys(2) .eq. 'Z') then ! Set the closest point - do c = -1, -Grid % n_bnd_cells, -1 + do c = Cells_In_Region(bc) ! Distribute b.c. types - if(Grid % region % at_cell(c) .eq. bc) then - ! For temperature - if(Flow % heat_transfer) then - i = Key_Ind('T', keys, nks) - if(i > 0) then - t % bnd_cond_type(c) = bc_type_tag - if(bc_type_tag .eq. WALLFL) t % bnd_cond_type(c) = WALL - if(bc_type_tag .eq. WALLFL) Grid % region % type(bc) = WALL - end if - i = Key_Ind('Q', keys, nks) - if(i > 0) then - t % bnd_cond_type(c) = bc_type_tag - if(bc_type_tag .eq. WALL) t % bnd_cond_type(c) = WALLFL - if(bc_type_tag .eq. WALL) Grid % region % type(bc) = WALLFL - end if + ! For temperature + if(Flow % heat_transfer) then + i = Key_Ind('T', keys, nks) + if(i > 0) then + t % bnd_cond_type(c) = bc_type_tag + if(bc_type_tag .eq. WALLFL) t % bnd_cond_type(c) = WALL + if(bc_type_tag .eq. WALLFL) Grid % region % type(bc) = WALL + end if + i = Key_Ind('Q', keys, nks) + if(i > 0) then + t % bnd_cond_type(c) = bc_type_tag + if(bc_type_tag .eq. WALL) t % bnd_cond_type(c) = WALLFL + if(bc_type_tag .eq. WALL) Grid % region % type(bc) = WALLFL end if - - ! For scalars - do sc = 1, Flow % n_scalars - i = Key_Ind(scalar(sc) % name, keys, nks) - if(i > 0) then - scalar(sc) % bnd_cond_type(c) = bc_type_tag - end if - i = Key_Ind(scalar(sc) % flux_name, keys, nks) - if(i > 0) then - scalar(sc) % bnd_cond_type(c) = WALLFL - end if - end do - end if + ! For scalars + do sc = 1, Flow % n_scalars + i = Key_Ind(scalar(sc) % name, keys, nks) + if(i > 0) then + scalar(sc) % bnd_cond_type(c) = bc_type_tag + end if + i = Key_Ind(scalar(sc) % flux_name, keys, nks) + if(i > 0) then + scalar(sc) % bnd_cond_type(c) = WALLFL + end if + end do + ! Distribute b.c. values - if(Grid % region % at_cell(c) .eq. bc) then + dist_min = HUGE + do m = 1, n_points - dist_min = HUGE - do m = 1, n_points + i = Key_Ind('X', keys, nks); prof(m,0) = 0.0; x = prof(m,i) + i = Key_Ind('Y', keys, nks); prof(m,0) = 0.0; y = prof(m,i) + i = Key_Ind('Z', keys, nks); prof(m,0) = 0.0; z = prof(m,i) - i = Key_Ind('X', keys, nks); prof(m,0) = 0.0; x = prof(m,i) - i = Key_Ind('Y', keys, nks); prof(m,0) = 0.0; y = prof(m,i) - i = Key_Ind('Z', keys, nks); prof(m,0) = 0.0; z = prof(m,i) + if(keys(1) .eq. 'Y' .and. keys(2) .eq. 'Z') then + dist = Math % Distance( & + y, z, 0.0, & + Grid % yc(c), Grid % zc(c), 0.0) - if(keys(1) .eq. 'Y' .and. keys(2) .eq. 'Z') then - dist = Math % Distance( & - y, z, 0.0, & - Grid % yc(c), Grid % zc(c), 0.0) + else if(keys(1) .eq. 'X' .and. keys(2) .eq. 'Z') then + dist = Math % Distance( & + x, z, 0.0, & + Grid % xc(c), Grid % zc(c), 0.0) - else if(keys(1) .eq. 'X' .and. keys(2) .eq. 'Z') then - dist = Math % Distance( & - x, z, 0.0, & - Grid % xc(c), Grid % zc(c), 0.0) + else if(keys(1) .eq. 'X' .and. keys(2) .eq. 'Y') then + dist = Math % Distance( & + x, y, 0.0, & + Grid % xc(c), Grid % yc(c), 0.0) - else if(keys(1) .eq. 'X' .and. keys(2) .eq. 'Y') then - dist = Math % Distance( & - x, y, 0.0, & - Grid % xc(c), Grid % yc(c), 0.0) + end if - end if + ! Store closest point in k + if(dist < dist_min) then + dist_min = dist + k = m + end if - ! Store closest point in k - if(dist < dist_min) then - dist_min = dist - k = m - end if + end do - end do + ! For velocity, pressure and wall roughness + i = Key_Ind('U', keys, nks); if(i > 0) u % b(c) = prof(k,i) + i = Key_Ind('V', keys, nks); if(i > 0) v % b(c) = prof(k,i) + i = Key_Ind('W', keys, nks); if(i > 0) w % b(c) = prof(k,i) + i = Key_Ind('P', keys, nks); if(i > 0) p % b(c) = prof(k,i) + i = Key_Ind('Z_O', keys, nks); if(i > 0) z_o (c) = prof(k,i) - ! For velocity, pressure and wall roughness - i = Key_Ind('U', keys, nks); if(i > 0) u % b(c) = prof(k,i) - i = Key_Ind('V', keys, nks); if(i > 0) v % b(c) = prof(k,i) - i = Key_Ind('W', keys, nks); if(i > 0) w % b(c) = prof(k,i) - i = Key_Ind('P', keys, nks); if(i > 0) p % b(c) = prof(k,i) - i = Key_Ind('Z_O', keys, nks); if(i > 0) z_o (c) = prof(k,i) + ! For temperature + if(Flow % heat_transfer) then + i = Key_Ind('T', keys, nks) + if(i > 0) t % b(c) = prof(k,i) + i = Key_Ind('Q', keys, nks) + if(i > 0) t % q(c) = prof(k,i) + end if + + ! For scalars + do sc = 1, Flow % n_scalars + i = Key_Ind(scalar(sc) % name, keys, nks) + if(i > 0) scalar(sc) % b(c) = prof(k,i) + i = Key_Ind(scalar(sc) % flux_name, keys, nks) + if(i > 0) scalar(sc) % q(c) = prof(k,i) + end do - ! For temperature + ! For turbulence models + if(Turb % model .eq. K_EPS) then + i = Key_Ind('KIN', keys, nks); if(i > 0) kin % b(c) = prof(k,i) + i = Key_Ind('EPS', keys, nks); if(i > 0) eps % b(c) = prof(k,i) if(Flow % heat_transfer) then - i = Key_Ind('T', keys, nks) - if(i > 0) t % b(c) = prof(k,i) - i = Key_Ind('Q', keys, nks) - if(i > 0) t % q(c) = prof(k,i) + i = Key_Ind('T2', keys, nks); if(i>0) t2 % b(c) = prof(k,i) end if + end if - ! For scalars - do sc = 1, Flow % n_scalars - i = Key_Ind(scalar(sc) % name, keys, nks) - if(i > 0) scalar(sc) % b(c) = prof(k,i) - i = Key_Ind(scalar(sc) % flux_name, keys, nks) - if(i > 0) scalar(sc) % q(c) = prof(k,i) - end do - - ! For turbulence models - if(Turb % model .eq. K_EPS) then - i = Key_Ind('KIN', keys, nks); if(i > 0) kin % b(c) = prof(k,i) - i = Key_Ind('EPS', keys, nks); if(i > 0) eps % b(c) = prof(k,i) - if(Flow % heat_transfer) then - i = Key_Ind('T2', keys, nks); if(i>0) t2 % b(c) = prof(k,i) - end if + if(Turb % model .eq. K_EPS_ZETA_F .or. & + Turb % model .eq. HYBRID_LES_RANS) then + i = Key_Ind('KIN', keys, nks); if(i>0) kin % b(c) = prof(k,i) + i = Key_Ind('EPS', keys, nks); if(i>0) eps % b(c) = prof(k,i) + i = Key_Ind('ZETA', keys, nks); if(i>0) zeta % b(c) = prof(k,i) + i = Key_Ind('F22', keys, nks); if(i>0) f22 % b(c) = prof(k,i) + if(Flow % heat_transfer) then + i = Key_Ind('T2', keys, nks); if(i>0) t2 % b(c) = prof(k,i) end if + end if - if(Turb % model .eq. K_EPS_ZETA_F .or. & - Turb % model .eq. HYBRID_LES_RANS) then - i = Key_Ind('KIN', keys, nks); if(i>0) kin % b(c) = prof(k,i) - i = Key_Ind('EPS', keys, nks); if(i>0) eps % b(c) = prof(k,i) - i = Key_Ind('ZETA', keys, nks); if(i>0) zeta % b(c) = prof(k,i) - i = Key_Ind('F22', keys, nks); if(i>0) f22 % b(c) = prof(k,i) - if(Flow % heat_transfer) then - i = Key_Ind('T2', keys, nks); if(i>0) t2 % b(c) = prof(k,i) - end if - end if + if(Turb % model .eq. SPALART_ALLMARAS .or. & + Turb % model .eq. DES_SPALART) then + i = Key_Ind('VIS', keys, nks); if(i > 0) vis % b(c) = prof(k,i) + end if - if(Turb % model .eq. SPALART_ALLMARAS .or. & - Turb % model .eq. DES_SPALART) then - i = Key_Ind('VIS', keys, nks); if(i > 0) vis % b(c) = prof(k,i) - end if + if(Turb % model .eq. RSM_MANCEAU_HANJALIC .or. & + Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then + i = Key_Ind('UU', keys, nks); if(i > 0) uu % b(c) = prof(k,i) + i = Key_Ind('VV', keys, nks); if(i > 0) vv % b(c) = prof(k,i) + i = Key_Ind('WW', keys, nks); if(i > 0) ww % b(c) = prof(k,i) + i = Key_Ind('UV', keys, nks); if(i > 0) uv % b(c) = prof(k,i) + i = Key_Ind('UW', keys, nks); if(i > 0) uw % b(c) = prof(k,i) + i = Key_Ind('VW', keys, nks); if(i > 0) vw % b(c) = prof(k,i) + i = Key_Ind('EPS',keys, nks); if(i > 0) eps % b(c) = prof(k,i) - if(Turb % model .eq. RSM_MANCEAU_HANJALIC .or. & - Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then - i = Key_Ind('UU', keys, nks); if(i > 0) uu % b(c) = prof(k,i) - i = Key_Ind('VV', keys, nks); if(i > 0) vv % b(c) = prof(k,i) - i = Key_Ind('WW', keys, nks); if(i > 0) ww % b(c) = prof(k,i) - i = Key_Ind('UV', keys, nks); if(i > 0) uv % b(c) = prof(k,i) - i = Key_Ind('UW', keys, nks); if(i > 0) uw % b(c) = prof(k,i) - i = Key_Ind('VW', keys, nks); if(i > 0) vw % b(c) = prof(k,i) - i = Key_Ind('EPS',keys, nks); if(i > 0) eps % b(c) = prof(k,i) - - if(Turb % model .eq. RSM_MANCEAU_HANJALIC) then - i = Key_Ind('F22', keys, nks); if(i>0) f22 % b(c) = prof(k,i) - end if + if(Turb % model .eq. RSM_MANCEAU_HANJALIC) then + i = Key_Ind('F22', keys, nks); if(i>0) f22 % b(c) = prof(k,i) end if - end if !end if(Grid % region % at_cell(c) .eq. n) - end do !end do c = -1, -Grid % n_bnd_cells, -1 + end if + + end do ! Cells_In_Region !----------------------------! ! A plane is not defined ! !----------------------------! else ! dir .eq. "XPL" ... - do c = -1, -Grid % n_bnd_cells, -1 - - if(Grid % region % at_cell(c) .eq. bc) then - - do m = 1, n_points-1 - here = .false. - - i = Key_Ind(keys(1), keys, nks) - prof(m, 0) = 0.0; - prof(m+1, 0) = 0.0; - x = prof(m,i) - xp = prof(m+1,i) - - ! Compute the weight factors - if( keys(1) .eq. 'X' .and. & - Grid % xc(c) >= x .and. Grid % xc(c) <= xp ) then - wi = ( xp - Grid % xc(c) ) / (xp - x) - here = .true. - else if( keys(1) .eq. 'Y' .and. & - Grid % yc(c) >= x .and. Grid % yc(c) <= xp ) then - wi = ( xp - Grid % yc(c) ) / (xp - x) - here = .true. - else if( keys(1) .eq. 'Z' .and. & - Grid % zc(c) >= x .and. Grid % zc(c) <= xp ) then - wi = ( xp - Grid % zc(c) ) / (xp - x) - here = .true. - - ! Beware; for cylindrical coordinates you have "inversion" - else if( (keys(1) .eq. 'RX' .and. & - sqrt(Grid % yc(c)**2 + Grid % zc(c)**2) >= xp .and. & - sqrt(Grid % yc(c)**2 + Grid % zc(c)**2) <= x) ) then - wi = ( xp - sqrt(Grid % yc(c)**2 + Grid % zc(c)**2) ) / (xp-x) - here = .true. - else if( (keys(1) .eq. 'RY' .and. & - sqrt(Grid % xc(c)**2 + Grid % zc(c)**2) >= xp .and. & - sqrt(Grid % xc(c)**2 + Grid % zc(c)**2) <= x) ) then - wi = ( xp - sqrt(Grid % xc(c)**2 + Grid % zc(c)**2) ) / (xp-x) - here = .true. - else if( (keys(1) .eq. 'RZ' .and. & - sqrt(Grid % xc(c)**2 + Grid % yc(c)**2) >= xp .and. & - sqrt(Grid % xc(c)**2 + Grid % yc(c)**2) <= x) ) then - wi = ( xp - sqrt(Grid % xc(c)**2 + Grid % yc(c)**2) ) / (xp-x) - here = .true. - - ! Wall distance too - else if( (keys(1) .eq. 'WD' .and. & - Grid % wall_dist(c) >= min(x,xp) .and. & - Grid % wall_dist(c) <= max(x,xp)) ) then - wi = ( max(x,xp) - Grid % wall_dist(c) ) & - / ( max(x,xp) - min(x,xp) ) - here = .true. - end if + do c = Cells_In_Region(bc) + + do m = 1, n_points-1 + here = .false. + + i = Key_Ind(keys(1), keys, nks) + prof(m, 0) = 0.0; + prof(m+1, 0) = 0.0; + x = prof(m,i) + xp = prof(m+1,i) + + ! Compute the weight factors + if( keys(1) .eq. 'X' .and. & + Grid % xc(c) >= x .and. Grid % xc(c) <= xp ) then + wi = ( xp - Grid % xc(c) ) / (xp - x) + here = .true. + else if( keys(1) .eq. 'Y' .and. & + Grid % yc(c) >= x .and. Grid % yc(c) <= xp ) then + wi = ( xp - Grid % yc(c) ) / (xp - x) + here = .true. + else if( keys(1) .eq. 'Z' .and. & + Grid % zc(c) >= x .and. Grid % zc(c) <= xp ) then + wi = ( xp - Grid % zc(c) ) / (xp - x) + here = .true. + + ! Beware; for cylindrical coordinates you have "inversion" + else if( (keys(1) .eq. 'RX' .and. & + sqrt(Grid % yc(c)**2 + Grid % zc(c)**2) >= xp .and. & + sqrt(Grid % yc(c)**2 + Grid % zc(c)**2) <= x) ) then + wi = ( xp - sqrt(Grid % yc(c)**2 + Grid % zc(c)**2) ) / (xp-x) + here = .true. + else if( (keys(1) .eq. 'RY' .and. & + sqrt(Grid % xc(c)**2 + Grid % zc(c)**2) >= xp .and. & + sqrt(Grid % xc(c)**2 + Grid % zc(c)**2) <= x) ) then + wi = ( xp - sqrt(Grid % xc(c)**2 + Grid % zc(c)**2) ) / (xp-x) + here = .true. + else if( (keys(1) .eq. 'RZ' .and. & + sqrt(Grid % xc(c)**2 + Grid % yc(c)**2) >= xp .and. & + sqrt(Grid % xc(c)**2 + Grid % yc(c)**2) <= x) ) then + wi = ( xp - sqrt(Grid % xc(c)**2 + Grid % yc(c)**2) ) / (xp-x) + here = .true. + + ! Wall distance too + else if( (keys(1) .eq. 'WD' .and. & + Grid % wall_dist(c) >= min(x,xp) .and. & + Grid % wall_dist(c) <= max(x,xp)) ) then + wi = ( max(x,xp) - Grid % wall_dist(c) ) & + / ( max(x,xp) - min(x,xp) ) + here = .true. + end if - if(here) then + if(here) then - ! For temperature - if(Flow % heat_transfer) then - i = Key_Ind('T',keys,nks) - if(i > 0) then - t % bnd_cond_type(c) = bc_type_tag - if(bc_type_tag .eq. WALLFL) t % bnd_cond_type(c) = WALL - if(bc_type_tag .eq. WALLFL) & - Grid % region % type(bc) = WALL - end if - i = Key_Ind('Q',keys,nks) - if(i > 0) then - t % bnd_cond_type(c) = bc_type_tag - if(bc_type_tag .eq. WALL) t % bnd_cond_type(c) = WALLFL - if(bc_type_tag .eq. WALL) & - Grid % region % type(bc) = WALLFL - end if + ! For temperature + if(Flow % heat_transfer) then + i = Key_Ind('T',keys,nks) + if(i > 0) then + t % bnd_cond_type(c) = bc_type_tag + if(bc_type_tag .eq. WALLFL) t % bnd_cond_type(c) = WALL + if(bc_type_tag .eq. WALLFL) & + Grid % region % type(bc) = WALL + end if + i = Key_Ind('Q',keys,nks) + if(i > 0) then + t % bnd_cond_type(c) = bc_type_tag + if(bc_type_tag .eq. WALL) t % bnd_cond_type(c) = WALLFL + if(bc_type_tag .eq. WALL) & + Grid % region % type(bc) = WALLFL + end if + end if + + ! For scalars + do sc = 1, Flow % n_scalars + i = Key_Ind(scalar(sc) % name, keys, nks) + if(i > 0) then + scalar(sc) % bnd_cond_type(c) = bc_type_tag + end if + i = Key_Ind(scalar(sc) % flux_name, keys, nks) + if(i > 0) then + scalar(sc) % bnd_cond_type(c) = WALLFL end if + end do + + end if ! here + end do ! m, points + + do m = 1, n_points-1 + here = .false. + + i = Key_Ind(keys(1), keys, nks) + prof(m, 0) = 0.0; + prof(m+1, 0) = 0.0; + x = prof(m,i) + xp = prof(m+1,i) + + ! Compute the weight factors + if( keys(1) .eq. 'X' .and. & + Grid % xc(c) >= x .and. Grid % xc(c) <= xp ) then + wi = ( xp - Grid % xc(c) ) / (xp - x) + here = .true. + else if( keys(1) .eq. 'Y' .and. & + Grid % yc(c) >= x .and. Grid % yc(c) <= xp ) then + wi = ( xp - Grid % yc(c) ) / (xp - x) + here = .true. + else if( keys(1) .eq. 'Z' .and. & + Grid % zc(c) >= x .and. Grid % zc(c) <= xp ) then + wi = ( xp - Grid % zc(c) ) / (xp - x) + here = .true. + + ! Beware; for cylindrical coordinates you have "inversion" + else if( (keys(1) .eq. 'RX' .and. & + sqrt(Grid % yc(c)**2 + Grid % zc(c)**2) >= xp .and. & + sqrt(Grid % yc(c)**2 + Grid % zc(c)**2) <= x) ) then + wi = ( xp - sqrt(Grid % yc(c)**2 + Grid % zc(c)**2) ) / (xp-x) + here = .true. + else if( (keys(1) .eq. 'RY' .and. & + sqrt(Grid % xc(c)**2 + Grid % zc(c)**2) >= xp .and. & + sqrt(Grid % xc(c)**2 + Grid % zc(c)**2) <= x) ) then + wi = ( xp - sqrt(Grid % xc(c)**2 + Grid % zc(c)**2) ) / (xp-x) + here = .true. + else if( (keys(1) .eq. 'RZ' .and. & + sqrt(Grid % xc(c)**2 + Grid % yc(c)**2) >= xp .and. & + sqrt(Grid % xc(c)**2 + Grid % yc(c)**2) <= x) ) then + wi = ( xp - sqrt(Grid % xc(c)**2 + Grid % yc(c)**2) ) / (xp-x) + here = .true. + + ! Wall distance too + else if( (keys(1) .eq. 'WD' .and. & + Grid % wall_dist(c) >= min(x,xp) .and. & + Grid % wall_dist(c) <= max(x,xp)) ) then + wi = ( max(x,xp) - Grid % wall_dist(c) ) & + / ( max(x,xp) - min(x,xp) ) + here = .true. + end if - ! For scalars - do sc = 1, Flow % n_scalars - i = Key_Ind(scalar(sc) % name, keys, nks) - if(i > 0) then - scalar(sc) % bnd_cond_type(c) = bc_type_tag - end if - i = Key_Ind(scalar(sc) % flux_name, keys, nks) - if(i > 0) then - scalar(sc) % bnd_cond_type(c) = WALLFL - end if - end do - - end if ! here - end do ! m, points - end if ! bnd_color .eq. bc - - if(Grid % region % at_cell(c) .eq. bc) then - - do m = 1, n_points-1 - here = .false. - - i = Key_Ind(keys(1), keys, nks) - prof(m, 0) = 0.0; - prof(m+1, 0) = 0.0; - x = prof(m,i) - xp = prof(m+1,i) - - ! Compute the weight factors - if( keys(1) .eq. 'X' .and. & - Grid % xc(c) >= x .and. Grid % xc(c) <= xp ) then - wi = ( xp - Grid % xc(c) ) / (xp - x) - here = .true. - else if( keys(1) .eq. 'Y' .and. & - Grid % yc(c) >= x .and. Grid % yc(c) <= xp ) then - wi = ( xp - Grid % yc(c) ) / (xp - x) - here = .true. - else if( keys(1) .eq. 'Z' .and. & - Grid % zc(c) >= x .and. Grid % zc(c) <= xp ) then - wi = ( xp - Grid % zc(c) ) / (xp - x) - here = .true. - - ! Beware; for cylindrical coordinates you have "inversion" - else if( (keys(1) .eq. 'RX' .and. & - sqrt(Grid % yc(c)**2 + Grid % zc(c)**2) >= xp .and. & - sqrt(Grid % yc(c)**2 + Grid % zc(c)**2) <= x) ) then - wi = ( xp - sqrt(Grid % yc(c)**2 + Grid % zc(c)**2) ) / (xp-x) - here = .true. - else if( (keys(1) .eq. 'RY' .and. & - sqrt(Grid % xc(c)**2 + Grid % zc(c)**2) >= xp .and. & - sqrt(Grid % xc(c)**2 + Grid % zc(c)**2) <= x) ) then - wi = ( xp - sqrt(Grid % xc(c)**2 + Grid % zc(c)**2) ) / (xp-x) - here = .true. - else if( (keys(1) .eq. 'RZ' .and. & - sqrt(Grid % xc(c)**2 + Grid % yc(c)**2) >= xp .and. & - sqrt(Grid % xc(c)**2 + Grid % yc(c)**2) <= x) ) then - wi = ( xp - sqrt(Grid % xc(c)**2 + Grid % yc(c)**2) ) / (xp-x) - here = .true. - - ! Wall distance too - else if( (keys(1) .eq. 'WD' .and. & - Grid % wall_dist(c) >= min(x,xp) .and. & - Grid % wall_dist(c) <= max(x,xp)) ) then - wi = ( max(x,xp) - Grid % wall_dist(c) ) & - / ( max(x,xp) - min(x,xp) ) - here = .true. + ! Interpolate the profiles + if(here) then + + ! For velocity, pressure and wall roughness + i = Key_Ind('U',keys,nks) + if(i > 0) u % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) + i = Key_Ind('V',keys,nks) + if(i > 0) v % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) + i = Key_Ind('W',keys,nks) + if(i > 0) w % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) + i = Key_Ind('P',keys,nks) + if(i > 0) p % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) + i = Key_Ind('Z_O',keys,nks) + if(i > 0) z_o (c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) + + ! For temperature + if(Flow % heat_transfer) then + i = Key_Ind('T',keys,nks) + if(i > 0) t % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) + if(i > 0) then + t % bnd_cond_type(c) = bc_type_tag + if(bc_type_tag .eq. WALLFL) t % bnd_cond_type(c) = WALL + if(bc_type_tag .eq. WALLFL) & + Grid % region % type(bc) = WALL + end if + i = Key_Ind('Q',keys,nks) + if(i > 0) t % q(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) + if(i > 0) then + t % bnd_cond_type(c) = bc_type_tag + if(bc_type_tag .eq. WALL) t % bnd_cond_type(c) = WALLFL + if(bc_type_tag .eq. WALL) & + Grid % region % type(bc) = WALLFL + end if end if - ! Interpolate the profiles - if(here) then - - ! For velocity, pressure and wall roughness - i = Key_Ind('U',keys,nks) - if(i > 0) u % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - i = Key_Ind('V',keys,nks) - if(i > 0) v % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - i = Key_Ind('W',keys,nks) - if(i > 0) w % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - i = Key_Ind('P',keys,nks) - if(i > 0) p % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - i = Key_Ind('Z_O',keys,nks) - if(i > 0) z_o (c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - - ! For temperature - if(Flow % heat_transfer) then - i = Key_Ind('T',keys,nks) - if(i > 0) t % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - if(i > 0) then - t % bnd_cond_type(c) = bc_type_tag - if(bc_type_tag .eq. WALLFL) t % bnd_cond_type(c) = WALL - if(bc_type_tag .eq. WALLFL) & - Grid % region % type(bc) = WALL - end if - i = Key_Ind('Q',keys,nks) - if(i > 0) t % q(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - if(i > 0) then - t % bnd_cond_type(c) = bc_type_tag - if(bc_type_tag .eq. WALL) t % bnd_cond_type(c) = WALLFL - if(bc_type_tag .eq. WALL) & - Grid % region % type(bc) = WALLFL - end if + ! For scalars + do sc = 1, Flow % n_scalars + i = Key_Ind(scalar(sc) % name, keys, nks) + if(i > 0) then + scalar(sc) % b(c)=wi*prof(m,i)+(1.-wi)*prof(m+1,i) + scalar(sc) % bnd_cond_type(c) = bc_type_tag + end if + i = Key_Ind(scalar(sc) % flux_name, keys, nks) + if(i > 0) then + scalar(sc) % q(c)=wi*prof(m,i)+(1.-wi)*prof(m+1,i) + scalar(sc) % bnd_cond_type(c) = WALLFL end if + end do - ! For scalars - do sc = 1, Flow % n_scalars - i = Key_Ind(scalar(sc) % name, keys, nks) - if(i > 0) then - scalar(sc) % b(c)=wi*prof(m,i)+(1.-wi)*prof(m+1,i) - scalar(sc) % bnd_cond_type(c) = bc_type_tag - end if - i = Key_Ind(scalar(sc) % flux_name, keys, nks) - if(i > 0) then - scalar(sc) % q(c)=wi*prof(m,i)+(1.-wi)*prof(m+1,i) - scalar(sc) % bnd_cond_type(c) = WALLFL - end if - end do - - ! For turbulence models - if(Turb % model .eq. K_EPS) then - - i = Key_Ind('KIN',keys,nks) - if(i > 0) kin % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - - i = Key_Ind('EPS',keys,nks) - if(i > 0) eps % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - - if(Flow % heat_transfer) then - i = Key_Ind('T2',keys,nks) - if(i > 0) t2 % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - end if + ! For turbulence models + if(Turb % model .eq. K_EPS) then + i = Key_Ind('KIN',keys,nks) + if(i > 0) kin % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) + + i = Key_Ind('EPS',keys,nks) + if(i > 0) eps % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) + + if(Flow % heat_transfer) then + i = Key_Ind('T2',keys,nks) + if(i > 0) t2 % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) end if - if(Turb % model .eq. K_EPS_ZETA_F .or. & - Turb % model .eq. HYBRID_LES_RANS) then + end if - i = Key_Ind('KIN',keys,nks) - if(i > 0) kin % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) + if(Turb % model .eq. K_EPS_ZETA_F .or. & + Turb % model .eq. HYBRID_LES_RANS) then - i = Key_Ind('EPS',keys,nks) - if(i > 0) eps % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) + i = Key_Ind('KIN',keys,nks) + if(i > 0) kin % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - i = Key_Ind('ZETA',keys,nks) - if(i > 0) zeta % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) + i = Key_Ind('EPS',keys,nks) + if(i > 0) eps % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - i = Key_Ind('F22',keys,nks) - if(i > 0) f22 % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) + i = Key_Ind('ZETA',keys,nks) + if(i > 0) zeta % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - if(Flow % heat_transfer) then - i = Key_Ind('T2',keys,nks) - if(i > 0) t2 % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - end if + i = Key_Ind('F22',keys,nks) + if(i > 0) f22 % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) + if(Flow % heat_transfer) then + i = Key_Ind('T2',keys,nks) + if(i > 0) t2 % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) end if - if(Turb % model .eq. RSM_MANCEAU_HANJALIC .or. & - Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then + end if - i = Key_Ind('UU', keys, nks) - if(i > 0) uu % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) + if(Turb % model .eq. RSM_MANCEAU_HANJALIC .or. & + Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then - i = Key_Ind('VV', keys, nks) - if(i > 0) vv % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) + i = Key_Ind('UU', keys, nks) + if(i > 0) uu % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - i = Key_Ind('WW', keys, nks) - if(i > 0) ww % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) + i = Key_Ind('VV', keys, nks) + if(i > 0) vv % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - i = Key_Ind('UV', keys, nks) - if(i > 0) uv % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) + i = Key_Ind('WW', keys, nks) + if(i > 0) ww % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - i = Key_Ind('UW', keys, nks) - if(i > 0) uw % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) + i = Key_Ind('UV', keys, nks) + if(i > 0) uv % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - i = Key_Ind('VW', keys, nks) - if(i > 0) vw % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) + i = Key_Ind('UW', keys, nks) + if(i > 0) uw % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - i = Key_Ind('EPS', keys, nks) - if(i > 0) eps % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) + i = Key_Ind('VW', keys, nks) + if(i > 0) vw % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - if(Turb % model .eq. RSM_MANCEAU_HANJALIC) then - i = Key_Ind('F22', keys, nks) - if(i > 0)f22 % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - end if - end if + i = Key_Ind('EPS', keys, nks) + if(i > 0) eps % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - if(Turb % model .eq. SPALART_ALLMARAS .or. & - Turb % model .eq. DES_SPALART) then - i = Key_Ind('VIS',keys,nks) - if(i > 0) vis % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) + if(Turb % model .eq. RSM_MANCEAU_HANJALIC) then + i = Key_Ind('F22', keys, nks) + if(i > 0)f22 % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) end if + end if - end if ! (here) - end do ! m = 1, n_points-1 - end if - end do ! c = -1, -Grid % n_bnd_cells, -1 - end if ! plane is defined? + if(Turb % model .eq. SPALART_ALLMARAS .or. & + Turb % model .eq. DES_SPALART) then + i = Key_Ind('VIS',keys,nks) + if(i > 0) vis % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) + end if + + end if ! (here) + end do ! m = 1, n_points-1 + + end do ! Cells_In_Region + end if ! plane is defined? close(fu) !-----------------------------! @@ -778,7 +763,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) ! ! !-----------------------------------! turb_planes % n_planes = 0 - do bc = 1, Grid % n_bnd_regions ! imagine there are as many eddies as bcs + do bc = Boundary_Regions() ! imagine there are as many eddies as bcs call Control_Mod_Position_At_Two_Keys('SYNTHETIC_EDDIES', & Grid % region % name(bc), & found, & @@ -807,83 +792,85 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) ! ! ! ! !---------------------------------------! - do c = -1, -Grid % n_bnd_cells, -1 + do bc = Boundary_Regions() + do c = Cells_In_Region(bc) - u % n(c) = u % b(c) - v % n(c) = v % b(c) - w % n(c) = w % b(c) - p % n(c) = p % b(c) + u % n(c) = u % b(c) + v % n(c) = v % b(c) + w % n(c) = w % b(c) + p % n(c) = p % b(c) - if(Flow % heat_transfer) then - t % n(c) = t % b(c) - end if + if(Flow % heat_transfer) then + t % n(c) = t % b(c) + end if - if (Flow % with_interface) then - fun % n(c) = fun % b(c) - end if + if (Flow % with_interface) then + fun % n(c) = fun % b(c) + end if - do sc = 1, Flow % n_scalars - scalar(sc) % n(c) = scalar(sc) % b(c) - end do + do sc = 1, Flow % n_scalars + scalar(sc) % n(c) = scalar(sc) % b(c) + end do - if(Turb % model .eq. RSM_MANCEAU_HANJALIC .or. & - Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then - uu % n(c) = uu % b(c) - vv % n(c) = vv % b(c) - ww % n(c) = ww % b(c) - uv % n(c) = uv % b(c) - uw % n(c) = uw % b(c) - vw % n(c) = vw % b(c) - eps % n(c) = eps % b(c) - - if(Turb % model .eq. RSM_MANCEAU_HANJALIC) then - f22 % n(c) = f22 % b(c) + if(Turb % model .eq. RSM_MANCEAU_HANJALIC .or. & + Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then + uu % n(c) = uu % b(c) + vv % n(c) = vv % b(c) + ww % n(c) = ww % b(c) + uv % n(c) = uv % b(c) + uw % n(c) = uw % b(c) + vw % n(c) = vw % b(c) + eps % n(c) = eps % b(c) + + if(Turb % model .eq. RSM_MANCEAU_HANJALIC) then + f22 % n(c) = f22 % b(c) + end if end if - end if - if(Turb % model .eq. K_EPS) then - kin % n(c) = kin % b(c) - eps % n(c) = eps % b(c) - if(Flow % heat_transfer) then - t2 % n(c) = t2 % b(c) + if(Turb % model .eq. K_EPS) then + kin % n(c) = kin % b(c) + eps % n(c) = eps % b(c) + if(Flow % heat_transfer) then + t2 % n(c) = t2 % b(c) + end if end if - end if - if(Turb % model .eq. K_EPS_ZETA_F .or. & - Turb % model .eq. HYBRID_LES_RANS) then - kin % n(c) = kin % b(c) - eps % n(c) = eps % b(c) - zeta % n(c) = zeta % b(c) - f22 % n(c) = f22 % b(c) - if(Flow % heat_transfer) then - t2 % n(c) = t2 % b(c) + if(Turb % model .eq. K_EPS_ZETA_F .or. & + Turb % model .eq. HYBRID_LES_RANS) then + kin % n(c) = kin % b(c) + eps % n(c) = eps % b(c) + zeta % n(c) = zeta % b(c) + f22 % n(c) = f22 % b(c) + if(Flow % heat_transfer) then + t2 % n(c) = t2 % b(c) + end if end if - end if - if(Turb % model .eq. SPALART_ALLMARAS .or. & - Turb % model .eq. DES_SPALART) then - vis % n(c) = vis % b(c) - end if + if(Turb % model .eq. SPALART_ALLMARAS .or. & + Turb % model .eq. DES_SPALART) then + vis % n(c) = vis % b(c) + end if - end do ! through boundary cells + end do ! boundary cells + end do ! boundary regions !------------------------------! ! Find the near-wall cells ! !------------------------------! Grid % cell_near_wall = .false. - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) + do bc = Boundary_Regions() + if(Grid % region % type(bc) .eq. WALL .or. & + Grid % region % type(bc) .eq. WALLFL) then + do s = Faces_In_Region(bc) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) - if(c2 < 0) then - if(Grid % Bnd_Cond_Type(c2) .eq. WALL .or. & - Grid % Bnd_Cond_Type(c2) .eq. WALLFL) then Grid % cell_near_wall(c1) = .true. - end if + end do end if - end do ! faces + end do ! boundary regions call Grid % Exchange_Cells_Log(Grid % cell_near_wall) From 7d2b0ec25b04d54a3987e732fed86d3d90273f33 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 22 Feb 2023 17:41:37 +0100 Subject: [PATCH 015/223] VERY IMPORTANT FIX in calculation of wall distance Since the definition of f_cell and l_cell changed, it was not entering the loop for calculation of wall distance. It has been fixed by the introduction of a macro for browsing. On branch bojan_fixed_cell_ranges modified: Shared/Grid_Mod/Calculate_Wall_Distance.f90 --- Sources/Shared/Grid_Mod/Calculate_Wall_Distance.f90 | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Sources/Shared/Grid_Mod/Calculate_Wall_Distance.f90 b/Sources/Shared/Grid_Mod/Calculate_Wall_Distance.f90 index e2307e40b..8bee86269 100644 --- a/Sources/Shared/Grid_Mod/Calculate_Wall_Distance.f90 +++ b/Sources/Shared/Grid_Mod/Calculate_Wall_Distance.f90 @@ -74,9 +74,7 @@ subroutine Calculate_Wall_Distance(Grid) ' % complete...', achar(13) do b = 1, n_wall_colors - do c2 = Grid % region % f_cell( wall_colors(b) ), & - Grid % region % l_cell( wall_colors(b) ), & - -1 + do c2 = Cells_In_Region( wall_colors(b) ) Grid % wall_dist(c1) = & min(Grid % wall_dist(c1), & Math % Distance_Squared(Grid % xc(c1), & From 23795605be29876ce83d7cbe8bd10714cdc9ecd0 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 22 Feb 2023 17:45:21 +0100 Subject: [PATCH 016/223] Uses macros for browsing. On branch bojan_fixed_cell_ranges modified: Shared/Grid_Mod/Form_Maps.f90 modified: Shared/Grid_Mod/Sort_Faces_Smart.f90 --- Sources/Shared/Grid_Mod/Form_Maps.f90 | 4 +++- Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 | 3 +-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Sources/Shared/Grid_Mod/Form_Maps.f90 b/Sources/Shared/Grid_Mod/Form_Maps.f90 index 4f211e003..7204f6e1b 100644 --- a/Sources/Shared/Grid_Mod/Form_Maps.f90 +++ b/Sources/Shared/Grid_Mod/Form_Maps.f90 @@ -104,8 +104,10 @@ subroutine Form_Maps(Grid) !-----------------------! cnt = 0 do reg = Boundary_Regions() - do c = Grid % region % f_cell(reg), Grid % region % l_cell(reg) + do c = Cells_In_Region(reg) cnt = cnt + 1 + ! Keep in mind there that for boundary cells, cell_glo is negative, so + ! adding the nb_tot to all the indices, shifts them all to positive Grid % Comm % bnd_cell_map(cnt) = int( Grid % Comm % cell_glo(c) & + Grid % Comm % nb_tot, SP) end do diff --git a/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 b/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 index 66db17668..664e52f90 100644 --- a/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 +++ b/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 @@ -176,8 +176,7 @@ subroutine Sort_Faces_Smart(Grid) end do do reg = Boundary_Regions() - print '(2i6)', Grid % region % f_cell(reg), & - Grid % region % l_cell(reg) + print '(2i6)', Cells_In_Region(reg) end do end if From c98022a72c350d7af7e44e14fbaa8a8b0f08ffa2 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 22 Feb 2023 18:33:24 +0100 Subject: [PATCH 017/223] User_Mod can now include macros. The problem was with the paths. They are simply not the same for Fortran's include and preprocessor's #include. Along the way, I also removed some redundant and unused user functions. On branch bojan_fixed_cell_ranges modified: Sources/Process/User_Mod.f90 modified: Tests/Laminar/Flat_Plate/User_Mod/Save_Results.f90 modified: Tests/Laminar/Membrane/2_Domains/User_Mod/Beginning_Of_Iteration.f90 modified: Tests/Laminar/Membrane/2_Domains/User_Mod/Initialize_Variables.f90 modified: Tests/Laminar/Membrane/2_Domains/User_Mod/Interface_Exchange.f90 modified: Tests/Laminar/Membrane/2_Domains/User_Mod/Jump_Cond.f90 modified: Tests/Laminar/Membrane/2_Domains/User_Mod/Pv_Sat_Salt.f90 modified: Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Results.f90 modified: Tests/Rans/Backstep_Re_28000/User_Mod/Save_Results.f90 modified: Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Results.f90 deleted: Tests/Vof/Dam_Break_3d/User_Mod/Check_Inside_Box.f90 modified: Tests/Vof/Dam_Break_3d/User_Mod/Initialize_Variables.f90 deleted: Tests/Vof/Dam_Break_3d/User_Mod/Vof_Initialization_Box.f90 deleted: Tests/Vof/Dam_Break_3d/User_Mod/Vof_Interface_Box.f90 typechange: Tests/Vof/Dam_Break_3d/User_Mod/Vof_Quick_Sort.f90 typechange: Tests/Vof/Mencinger_And_Zun/User_Mod/Check_Inside_Box.f90 modified: Tests/Vof/Mencinger_And_Zun/User_Mod/Initialize_Variables.f90 typechange: Tests/Vof/Mencinger_And_Zun/User_Mod/Vof_Initialization_Box.f90 typechange: Tests/Vof/Mencinger_And_Zun/User_Mod/Vof_Interface_Box.f90 typechange: Tests/Vof/Stefan/User_Mod/Check_Inside_Box.f90 modified: Tests/Vof/Stefan/User_Mod/Initialize_Variables.f90 typechange: Tests/Vof/Stefan/User_Mod/Vof_Initialization_Box.f90 typechange: Tests/Vof/Stefan/User_Mod/Vof_Interface_Box.f90 deleted: Tests/Vof/User_Mod/Check_Inside_Box.f90 deleted: Tests/Vof/User_Mod/Vof_Area_Square_Circle.f90 deleted: Tests/Vof/User_Mod/Vof_Divide_Cuboid.f90 deleted: Tests/Vof/User_Mod/Vof_Exact_Cylinder.f90 deleted: Tests/Vof/User_Mod/Vof_Initialization_Box.f90 deleted: Tests/Vof/User_Mod/Vof_Initialization_Cylinder.f90 deleted: Tests/Vof/User_Mod/Vof_Initialization_Ellipsoid.f90 deleted: Tests/Vof/User_Mod/Vof_Initialization_Plane.f90 deleted: Tests/Vof/User_Mod/Vof_Interface_Box.f90 deleted: Tests/Vof/User_Mod/Vof_Interface_Cylinder.f90 deleted: Tests/Vof/User_Mod/Vof_Interface_Ellipsoid.f90 deleted: Tests/Vof/User_Mod/Vof_Interface_Plane.f90 deleted: Tests/Vof/User_Mod/Vof_Quick_Sort.f90 deleted: Tests/Vof/User_Mod/readme modified: Tests/test_user_functions_compile.sh --- Sources/Process/User_Mod.f90 | 57 ++++---- .../Flat_Plate/User_Mod/Save_Results.f90 | 4 +- .../User_Mod/Beginning_Of_Iteration.f90 | 2 +- .../User_Mod/Initialize_Variables.f90 | 2 +- .../2_Domains/User_Mod/Interface_Exchange.f90 | 6 +- .../Membrane/2_Domains/User_Mod/Jump_Cond.f90 | 2 +- .../2_Domains/User_Mod/Pv_Sat_Salt.f90 | 2 +- .../User_Mod/Save_Results.f90 | 4 +- .../User_Mod/Save_Results.f90 | 4 +- .../User_Mod/Save_Results.f90 | 4 +- .../User_Mod/Check_Inside_Box.f90 | 1 - .../User_Mod/Initialize_Variables.f90 | 9 +- .../User_Mod/Vof_Initialization_Box.f90 | 1 - .../User_Mod/Vof_Interface_Box.f90 | 1 - .../Dam_Break_3d/User_Mod/Vof_Quick_Sort.f90 | 26 +++- .../User_Mod/Check_Inside_Box.f90 | 83 ++++++++++- .../User_Mod/Initialize_Variables.f90 | 6 +- .../User_Mod/Vof_Initialization_Box.f90 | 131 +++++++++++++++++- .../User_Mod/Vof_Interface_Box.f90 | 102 +++++++++++++- .../Vof/Stefan/User_Mod/Check_Inside_Box.f90 | 83 ++++++++++- .../Stefan/User_Mod/Initialize_Variables.f90 | 6 +- .../User_Mod/Vof_Initialization_Box.f90 | 131 +++++++++++++++++- .../Vof/Stefan/User_Mod/Vof_Interface_Box.f90 | 102 +++++++++++++- Tests/Vof/User_Mod/Check_Inside_Box.f90 | 82 ----------- Tests/Vof/User_Mod/Vof_Area_Square_Circle.f90 | 47 ------- Tests/Vof/User_Mod/Vof_Divide_Cuboid.f90 | 78 ----------- Tests/Vof/User_Mod/Vof_Exact_Cylinder.f90 | 97 ------------- Tests/Vof/User_Mod/Vof_Initialization_Box.f90 | 130 ----------------- .../User_Mod/Vof_Initialization_Cylinder.f90 | 106 -------------- .../User_Mod/Vof_Initialization_Ellipsoid.f90 | 92 ------------ .../Vof/User_Mod/Vof_Initialization_Plane.f90 | 105 -------------- Tests/Vof/User_Mod/Vof_Interface_Box.f90 | 101 -------------- Tests/Vof/User_Mod/Vof_Interface_Cylinder.f90 | 109 --------------- .../Vof/User_Mod/Vof_Interface_Ellipsoid.f90 | 104 -------------- Tests/Vof/User_Mod/Vof_Interface_Plane.f90 | 102 -------------- Tests/Vof/User_Mod/Vof_Quick_Sort.f90 | 25 ---- Tests/Vof/User_Mod/readme | 1 - Tests/test_user_functions_compile.sh | 9 +- 38 files changed, 713 insertions(+), 1244 deletions(-) delete mode 120000 Tests/Vof/Dam_Break_3d/User_Mod/Check_Inside_Box.f90 delete mode 120000 Tests/Vof/Dam_Break_3d/User_Mod/Vof_Initialization_Box.f90 delete mode 120000 Tests/Vof/Dam_Break_3d/User_Mod/Vof_Interface_Box.f90 mode change 120000 => 100644 Tests/Vof/Dam_Break_3d/User_Mod/Vof_Quick_Sort.f90 mode change 120000 => 100644 Tests/Vof/Mencinger_And_Zun/User_Mod/Check_Inside_Box.f90 mode change 120000 => 100644 Tests/Vof/Mencinger_And_Zun/User_Mod/Vof_Initialization_Box.f90 mode change 120000 => 100644 Tests/Vof/Mencinger_And_Zun/User_Mod/Vof_Interface_Box.f90 mode change 120000 => 100644 Tests/Vof/Stefan/User_Mod/Check_Inside_Box.f90 mode change 120000 => 100644 Tests/Vof/Stefan/User_Mod/Vof_Initialization_Box.f90 mode change 120000 => 100644 Tests/Vof/Stefan/User_Mod/Vof_Interface_Box.f90 delete mode 100644 Tests/Vof/User_Mod/Check_Inside_Box.f90 delete mode 100644 Tests/Vof/User_Mod/Vof_Area_Square_Circle.f90 delete mode 100644 Tests/Vof/User_Mod/Vof_Divide_Cuboid.f90 delete mode 100644 Tests/Vof/User_Mod/Vof_Exact_Cylinder.f90 delete mode 100644 Tests/Vof/User_Mod/Vof_Initialization_Box.f90 delete mode 100644 Tests/Vof/User_Mod/Vof_Initialization_Cylinder.f90 delete mode 100644 Tests/Vof/User_Mod/Vof_Initialization_Ellipsoid.f90 delete mode 100644 Tests/Vof/User_Mod/Vof_Initialization_Plane.f90 delete mode 100644 Tests/Vof/User_Mod/Vof_Interface_Box.f90 delete mode 100644 Tests/Vof/User_Mod/Vof_Interface_Cylinder.f90 delete mode 100644 Tests/Vof/User_Mod/Vof_Interface_Ellipsoid.f90 delete mode 100644 Tests/Vof/User_Mod/Vof_Interface_Plane.f90 delete mode 100644 Tests/Vof/User_Mod/Vof_Quick_Sort.f90 delete mode 100644 Tests/Vof/User_Mod/readme diff --git a/Sources/Process/User_Mod.f90 b/Sources/Process/User_Mod.f90 index d46025ae4..07ba68b5f 100644 --- a/Sources/Process/User_Mod.f90 +++ b/Sources/Process/User_Mod.f90 @@ -1,3 +1,6 @@ +#include "../Shared/Assert.h90" +#include "../Shared/Browse.h90" + !==============================================================================! module User_Mod !------------------------------------------------------------------------------! @@ -11,36 +14,36 @@ module User_Mod implicit none !==============================================================================! - include "User_Mod/Types.f90" +# include "User_Mod/Types.f90" contains - include "User_Mod/Before_Exit.f90" - include "User_Mod/Beginning_Of_Compute_Energy.f90" - include "User_Mod/Beginning_Of_Compute_Momentum.f90" - include "User_Mod/Beginning_Of_Compute_Pressure.f90" - include "User_Mod/Beginning_Of_Compute_Scalar.f90" - include "User_Mod/Beginning_Of_Correct_Velocity.f90" - include "User_Mod/Beginning_Of_Iteration.f90" - include "User_Mod/Beginning_Of_Simulation.f90" - include "User_Mod/Beginning_Of_Time_Step.f90" - include "User_Mod/Bulk_Velocity.f90" - include "User_Mod/Calculate_Mean.f90" - include "User_Mod/End_Of_Compute_Energy.f90" - include "User_Mod/End_Of_Compute_Momentum.f90" - include "User_Mod/End_Of_Compute_Pressure.f90" - include "User_Mod/End_Of_Compute_Scalar.f90" - include "User_Mod/End_Of_Correct_Velocity.f90" - include "User_Mod/End_Of_Iteration.f90" - include "User_Mod/End_Of_Simulation.f90" - include "User_Mod/End_Of_Time_Step.f90" - include "User_Mod/Initialize_Variables.f90" - include "User_Mod/Insert_Particles.f90" - include "User_Mod/Interface_Exchange.f90" - include "User_Mod/Force.f90" - include "User_Mod/Save_Results.f90" - include "User_Mod/Save_Swarm.f90" - include "User_Mod/Source.f90" +# include "User_Mod/Before_Exit.f90" +# include "User_Mod/Beginning_Of_Compute_Energy.f90" +# include "User_Mod/Beginning_Of_Compute_Momentum.f90" +# include "User_Mod/Beginning_Of_Compute_Pressure.f90" +# include "User_Mod/Beginning_Of_Compute_Scalar.f90" +# include "User_Mod/Beginning_Of_Correct_Velocity.f90" +# include "User_Mod/Beginning_Of_Iteration.f90" +# include "User_Mod/Beginning_Of_Simulation.f90" +# include "User_Mod/Beginning_Of_Time_Step.f90" +# include "User_Mod/Bulk_Velocity.f90" +# include "User_Mod/Calculate_Mean.f90" +# include "User_Mod/End_Of_Compute_Energy.f90" +# include "User_Mod/End_Of_Compute_Momentum.f90" +# include "User_Mod/End_Of_Compute_Pressure.f90" +# include "User_Mod/End_Of_Compute_Scalar.f90" +# include "User_Mod/End_Of_Correct_Velocity.f90" +# include "User_Mod/End_Of_Iteration.f90" +# include "User_Mod/End_Of_Simulation.f90" +# include "User_Mod/End_Of_Time_Step.f90" +# include "User_Mod/Initialize_Variables.f90" +# include "User_Mod/Insert_Particles.f90" +# include "User_Mod/Interface_Exchange.f90" +# include "User_Mod/Force.f90" +# include "User_Mod/Save_Results.f90" +# include "User_Mod/Save_Swarm.f90" +# include "User_Mod/Source.f90" end module diff --git a/Tests/Laminar/Flat_Plate/User_Mod/Save_Results.f90 b/Tests/Laminar/Flat_Plate/User_Mod/Save_Results.f90 index b80b4fc7a..d16f916bf 100644 --- a/Tests/Laminar/Flat_Plate/User_Mod/Save_Results.f90 +++ b/Tests/Laminar/Flat_Plate/User_Mod/Save_Results.f90 @@ -1,5 +1,5 @@ -include '../User_Mod/Plain_Profiles.f90' -include '../User_Mod/Plain_Nu.f90' +#include "Plain_Profiles.f90" +#include "Plain_Nu.f90" !==============================================================================! subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) diff --git a/Tests/Laminar/Membrane/2_Domains/User_Mod/Beginning_Of_Iteration.f90 b/Tests/Laminar/Membrane/2_Domains/User_Mod/Beginning_Of_Iteration.f90 index d63d07684..a7ca560d2 100644 --- a/Tests/Laminar/Membrane/2_Domains/User_Mod/Beginning_Of_Iteration.f90 +++ b/Tests/Laminar/Membrane/2_Domains/User_Mod/Beginning_Of_Iteration.f90 @@ -1,4 +1,4 @@ -include '../User_Mod/T_Sat.f90' +#include "T_Sat.f90" !==============================================================================! subroutine User_Mod_Beginning_Of_Iteration(Flow, Turb, Vof, Swarm, n, time) diff --git a/Tests/Laminar/Membrane/2_Domains/User_Mod/Initialize_Variables.f90 b/Tests/Laminar/Membrane/2_Domains/User_Mod/Initialize_Variables.f90 index 851d59c8e..dcad51af5 100644 --- a/Tests/Laminar/Membrane/2_Domains/User_Mod/Initialize_Variables.f90 +++ b/Tests/Laminar/Membrane/2_Domains/User_Mod/Initialize_Variables.f90 @@ -1,4 +1,4 @@ -!include '../User_Mod/Pv_Sat.f90' +!#include "Pv_Sat.f90" !==============================================================================! subroutine User_Mod_Initialize_Variables(Flow, Turb, Vof, Swarm, Sol) diff --git a/Tests/Laminar/Membrane/2_Domains/User_Mod/Interface_Exchange.f90 b/Tests/Laminar/Membrane/2_Domains/User_Mod/Interface_Exchange.f90 index 4d7c2cc64..a2b9a3124 100644 --- a/Tests/Laminar/Membrane/2_Domains/User_Mod/Interface_Exchange.f90 +++ b/Tests/Laminar/Membrane/2_Domains/User_Mod/Interface_Exchange.f90 @@ -1,6 +1,6 @@ -include '../User_Mod/Pv_Sat_Salt.f90' -include '../User_Mod/Jump_Cond.f90' -include '../User_Mod/Brent_For_Jump_Cond.f90' +#include "Pv_Sat_Salt.f90" +#include "Jump_Cond.f90" +#include "Brent_For_Jump_Cond.f90" !==============================================================================! subroutine User_Mod_Interface_Exchange(inter, Flow, Turb, Vof, Swarm, n_dom) diff --git a/Tests/Laminar/Membrane/2_Domains/User_Mod/Jump_Cond.f90 b/Tests/Laminar/Membrane/2_Domains/User_Mod/Jump_Cond.f90 index db479c88e..7bdc116a3 100644 --- a/Tests/Laminar/Membrane/2_Domains/User_Mod/Jump_Cond.f90 +++ b/Tests/Laminar/Membrane/2_Domains/User_Mod/Jump_Cond.f90 @@ -1,4 +1,4 @@ -!include '../User_Mod/Pv_Sat.f90' +!#include "Pv_Sat.f90" !==============================================================================! subroutine Jump_Cond(t_int, res, lhs_lin, lhs_fun, rhs) diff --git a/Tests/Laminar/Membrane/2_Domains/User_Mod/Pv_Sat_Salt.f90 b/Tests/Laminar/Membrane/2_Domains/User_Mod/Pv_Sat_Salt.f90 index 453855673..ef2dd15f6 100644 --- a/Tests/Laminar/Membrane/2_Domains/User_Mod/Pv_Sat_Salt.f90 +++ b/Tests/Laminar/Membrane/2_Domains/User_Mod/Pv_Sat_Salt.f90 @@ -1,4 +1,4 @@ -include '../User_Mod/Pv_Sat.f90' +#include "Pv_Sat.f90" !==============================================================================! subroutine Pv_Sat_Salt(t, m_h2o, m_salt, sc1, p_v_h2o) diff --git a/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Results.f90 b/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Results.f90 index 4c6b74b04..b1158a997 100644 --- a/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Results.f90 +++ b/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Results.f90 @@ -1,5 +1,5 @@ -include '../User_Mod/Save_Impinging_Jet_Nu.f90' -include '../User_Mod/Save_Impinging_Jet_Profiles.f90' +#include "Save_Impinging_Jet_Nu.f90" +#include "Save_Impinging_Jet_Profiles.f90" !==============================================================================! subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) diff --git a/Tests/Rans/Backstep_Re_28000/User_Mod/Save_Results.f90 b/Tests/Rans/Backstep_Re_28000/User_Mod/Save_Results.f90 index 71ca0c756..baf703ddb 100644 --- a/Tests/Rans/Backstep_Re_28000/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Backstep_Re_28000/User_Mod/Save_Results.f90 @@ -1,5 +1,5 @@ -include '../User_Mod/Backstep_Profiles.f90' -include '../User_Mod/Backstep_Cf_St.f90' +#include "Backstep_Profiles.f90" +#include "Backstep_Cf_St.f90" !==============================================================================! subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) diff --git a/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Results.f90 b/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Results.f90 index a02ccebf2..542b02473 100644 --- a/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Results.f90 @@ -1,5 +1,5 @@ -include '../User_Mod/Impinging_Jet_Nu.f90' -include '../User_Mod/Impinging_Jet_Profiles.f90' +#include "Impinging_Jet_Nu.f90" +#include "Impinging_Jet_Profiles.f90" !==============================================================================! subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) diff --git a/Tests/Vof/Dam_Break_3d/User_Mod/Check_Inside_Box.f90 b/Tests/Vof/Dam_Break_3d/User_Mod/Check_Inside_Box.f90 deleted file mode 120000 index 83b594885..000000000 --- a/Tests/Vof/Dam_Break_3d/User_Mod/Check_Inside_Box.f90 +++ /dev/null @@ -1 +0,0 @@ -../../User_Mod/Check_Inside_Box.f90 \ No newline at end of file diff --git a/Tests/Vof/Dam_Break_3d/User_Mod/Initialize_Variables.f90 b/Tests/Vof/Dam_Break_3d/User_Mod/Initialize_Variables.f90 index cea67d4f9..e9fbf04da 100644 --- a/Tests/Vof/Dam_Break_3d/User_Mod/Initialize_Variables.f90 +++ b/Tests/Vof/Dam_Break_3d/User_Mod/Initialize_Variables.f90 @@ -1,9 +1,6 @@ -include '../User_Mod/Vof_Initialization_Box.f90' -include '../User_Mod/Vof_Interface_Box.f90' -include '../User_Mod/Check_Inside_Box.f90' -include '../User_Mod/Vof_Quick_Sort.f90' -include '../User_Mod/Intersection_Line_Face.f90' -include '../User_Mod/Interpolate_From_Nodes.f90' +#include "Vof_Quick_Sort.f90" +#include "Intersection_Line_Face.f90" +#include "Interpolate_From_Nodes.f90" !==============================================================================! subroutine User_Mod_Initialize_Variables(Flow, Turb, Vof, Swarm, Sol) diff --git a/Tests/Vof/Dam_Break_3d/User_Mod/Vof_Initialization_Box.f90 b/Tests/Vof/Dam_Break_3d/User_Mod/Vof_Initialization_Box.f90 deleted file mode 120000 index 62b82db5c..000000000 --- a/Tests/Vof/Dam_Break_3d/User_Mod/Vof_Initialization_Box.f90 +++ /dev/null @@ -1 +0,0 @@ -../../User_Mod/Vof_Initialization_Box.f90 \ No newline at end of file diff --git a/Tests/Vof/Dam_Break_3d/User_Mod/Vof_Interface_Box.f90 b/Tests/Vof/Dam_Break_3d/User_Mod/Vof_Interface_Box.f90 deleted file mode 120000 index b52a7b3dc..000000000 --- a/Tests/Vof/Dam_Break_3d/User_Mod/Vof_Interface_Box.f90 +++ /dev/null @@ -1 +0,0 @@ -../../User_Mod/Vof_Interface_Box.f90 \ No newline at end of file diff --git a/Tests/Vof/Dam_Break_3d/User_Mod/Vof_Quick_Sort.f90 b/Tests/Vof/Dam_Break_3d/User_Mod/Vof_Quick_Sort.f90 deleted file mode 120000 index d875714a9..000000000 --- a/Tests/Vof/Dam_Break_3d/User_Mod/Vof_Quick_Sort.f90 +++ /dev/null @@ -1 +0,0 @@ -../../User_Mod/Vof_Quick_Sort.f90 \ No newline at end of file diff --git a/Tests/Vof/Dam_Break_3d/User_Mod/Vof_Quick_Sort.f90 b/Tests/Vof/Dam_Break_3d/User_Mod/Vof_Quick_Sort.f90 new file mode 100644 index 000000000..2804711aa --- /dev/null +++ b/Tests/Vof/Dam_Break_3d/User_Mod/Vof_Quick_Sort.f90 @@ -0,0 +1,25 @@ +recursive subroutine Vof_Quick_Sort(a, coords, dir, first, last) + implicit none + real :: coords(:,:), x, t(3) + integer :: a(:), first, last, ti, dir + integer :: i, j + + x = coords( (first+last) / 2, dir ) + i = first + j = last + do + do while (coords(i, dir) < x) + i=i+1 + end do + do while (x < coords(j, dir)) + j=j-1 + end do + if (i >= j) exit + ti = a(i); a(i) = a(j); a(j) = ti + t = coords(i,:); coords(i,:) = coords(j,:); coords(j,:) = t + i=i+1 + j=j-1 + end do + if (first < i-1) call Vof_Quick_Sort(a, coords, dir, first, i-1) + if (j+1 < last) call Vof_Quick_Sort(a, coords, dir, j+1, last) +end subroutine diff --git a/Tests/Vof/Mencinger_And_Zun/User_Mod/Check_Inside_Box.f90 b/Tests/Vof/Mencinger_And_Zun/User_Mod/Check_Inside_Box.f90 deleted file mode 120000 index 83b594885..000000000 --- a/Tests/Vof/Mencinger_And_Zun/User_Mod/Check_Inside_Box.f90 +++ /dev/null @@ -1 +0,0 @@ -../../User_Mod/Check_Inside_Box.f90 \ No newline at end of file diff --git a/Tests/Vof/Mencinger_And_Zun/User_Mod/Check_Inside_Box.f90 b/Tests/Vof/Mencinger_And_Zun/User_Mod/Check_Inside_Box.f90 new file mode 100644 index 000000000..ae72f9c06 --- /dev/null +++ b/Tests/Vof/Mencinger_And_Zun/User_Mod/Check_Inside_Box.f90 @@ -0,0 +1,82 @@ +!==============================================================================! + integer function Check_Inside_Box(Vof, p, dd, n_xyz, c) +!------------------------------------------------------------------------------! +! Determine if node of cell c lies inside box. Alteratively, if c is not ! +! given it can be used to determine if any given point p is inside the box ! +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + type(Vof_Type), target :: Vof + real, allocatable :: p(:,:) + real :: dd(6) + real :: n_xyz(6,3) + integer, optional :: c +!-----------------------------------[Locals]-----------------------------------! + type(Grid_Type), pointer :: Grid + integer :: i_fac,n + integer :: infac_box(6) + integer, allocatable :: innod_box(:) + integer :: sum_inside + real :: res_dummy, dist, norm +!==============================================================================! + + ! First take aliasesd + Grid => Vof % pnt_grid + + ! loop in cell faces: + Check_Inside_Box = 0 + + if (present(c)) then + + allocate(innod_box(Grid % cells_n_nodes(c))) + + innod_box = 0 + + ! for every node: + do n = 1, Grid % cells_n_nodes(c) + infac_box = 0 + do i_fac = 1, 6 + res_dummy = n_xyz(i_fac,1) * Grid % xn(Grid % cells_n(n,c)) & + + n_xyz(i_fac,2) * Grid % yn(Grid % cells_n(n,c)) & + + n_xyz(i_fac,3) * Grid % zn(Grid % cells_n(n,c)) + norm = norm2(n_xyz(i_fac,1:3)) + dist = dot_product(n_xyz(i_fac,1:3) & + / norm, (/( Grid % xn(Grid % cells_n(n,c)) & + - p(i_fac,1) ), & + ( Grid % yn(Grid % cells_n(n,c)) & + - p(i_fac,2) ), & + ( Grid % zn(Grid % cells_n(n,c)) & + - p(i_fac,3) )/) ) + if (res_dummy <= dd(i_fac)) then + infac_box(i_fac) = 1 + end if + end do + if (sum(infac_box) == 6) then + innod_box(n) = 1 + end if + end do + + sum_inside = sum(innod_box) + if (sum_inside == Grid % cells_n_nodes(c)) then + Check_Inside_Box = 2 + else if (sum_inside < Grid % cells_n_nodes(c) .and. & + sum_inside > 0) then + Check_Inside_Box = 1 + end if + else + infac_box = 0 + do i_fac =1, 6 + res_dummy = n_xyz(i_fac,1) * p(1,1) & + + n_xyz(i_fac,2) * p(1,2) & + + n_xyz(i_fac,3) * p(1,3) + if (res_dummy <= dd(i_fac)) then + infac_box(i_fac) = 1 + end if + end do + + if (sum(infac_box) == 6) then + Check_Inside_Box = 1 + end if + end if + + end function diff --git a/Tests/Vof/Mencinger_And_Zun/User_Mod/Initialize_Variables.f90 b/Tests/Vof/Mencinger_And_Zun/User_Mod/Initialize_Variables.f90 index cd022160f..180b06f44 100644 --- a/Tests/Vof/Mencinger_And_Zun/User_Mod/Initialize_Variables.f90 +++ b/Tests/Vof/Mencinger_And_Zun/User_Mod/Initialize_Variables.f90 @@ -1,6 +1,6 @@ -include '../User_Mod/Check_Inside_Box.f90' -include '../User_Mod/Vof_Initialization_Box.f90' -include '../User_Mod/Vof_Interface_Box.f90' +#include "Check_Inside_Box.f90" +#include "Vof_Initialization_Box.f90" +#include "Vof_Interface_Box.f90" !==============================================================================! subroutine User_Mod_Initialize_Variables(Flow, Turb, Vof, Swarm, Sol) diff --git a/Tests/Vof/Mencinger_And_Zun/User_Mod/Vof_Initialization_Box.f90 b/Tests/Vof/Mencinger_And_Zun/User_Mod/Vof_Initialization_Box.f90 deleted file mode 120000 index 62b82db5c..000000000 --- a/Tests/Vof/Mencinger_And_Zun/User_Mod/Vof_Initialization_Box.f90 +++ /dev/null @@ -1 +0,0 @@ -../../User_Mod/Vof_Initialization_Box.f90 \ No newline at end of file diff --git a/Tests/Vof/Mencinger_And_Zun/User_Mod/Vof_Initialization_Box.f90 b/Tests/Vof/Mencinger_And_Zun/User_Mod/Vof_Initialization_Box.f90 new file mode 100644 index 000000000..2a5a8b1fb --- /dev/null +++ b/Tests/Vof/Mencinger_And_Zun/User_Mod/Vof_Initialization_Box.f90 @@ -0,0 +1,130 @@ +!==============================================================================! + subroutine Vof_Initialization_Box(Vof) +!------------------------------------------------------------------------------! +! Initialize as vof = 1 all cells inside a rectangular box defined by eight ! +! points, sorted as shown in the schematic below. It should work for any ! +! orientation of the box and possibly, it can be generalized to any convex ! +! polyedral ! +!------------------------------------------------------------------------------! +! ! +! 8-----------7 ! +! /| /| ! +! 5-----------6 | ! +! | | | | ! +! | | | | ! +! | | | | ! +! | 4 - - - - | 3 ! +! |/ |/ ! +! 1-----------2 ! +! ! +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + type(Vof_Type), target :: Vof +!-----------------------------------[Locals]-----------------------------------! + type(Grid_Type), pointer :: Grid + real :: p_xyz(8,3) + real, allocatable :: p(:,:) + integer :: c, n, i, fu + integer :: ee, n_boxes, n_p, np_count, i_fac, seeds(1024) + integer :: trios(6,3) + real :: n_xyz(6,3), v1aux(3), v2aux(3) + real :: res_dummy + real :: dd(6) + character(20) :: p_name_aux + real, contiguous, pointer :: prelim_vof(:) + integer, contiguous, pointer :: inside_c(:) +!==============================================================================! + + call Work % Connect_Real_Cell(prelim_vof) + call Work % Connect_Int_Cell (inside_c) + + ! First take aliases + Grid => Vof % pnt_grid + + prelim_vof = 0.0 + + ! Initialize random seed + p_name_aux = 'obstacle' + call random_seed(size=n) + seeds = (/(i, i=1,n)/) + call random_seed(put=seeds(1:n)) + + allocate(p(6,3)) + + ! Initialize sorting for normals: + trios(1,:) = (/1, 4, 2/) + trios(2,:) = (/6, 7, 8/) + trios(3,:) = (/3, 7, 6/) + trios(4,:) = (/5, 8, 4/) + trios(5,:) = (/1, 2, 6/) + trios(6,:) = (/3, 4, 8/) + + ! Open file to read Plane parameters: + call File % Open_For_Reading_Ascii('box_parameters.ini', fu) + + call File % Read_Line(fu) + read(line % tokens(1), *) n_boxes + + np_count = 1 + + do ee = 1, n_boxes + + do n_p = 1, 8 + call File % Read_Line(fu) + read(line % tokens(1), *) p_xyz(n_p, 1) + read(line % tokens(2), *) p_xyz(n_p, 2) + read(line % tokens(3), *) p_xyz(n_p, 3) + end do + + ! Define Planes of the box + do i_fac = 1, 6 + + v1aux(:) = p_xyz(trios(i_fac,2),:) - p_xyz(trios(i_fac,1),:) + v2aux(:) = p_xyz(trios(i_fac,3),:) - p_xyz(trios(i_fac,1),:) + + n_xyz(i_fac,1) = v1aux(2) * v2aux(3) - v1aux(3) * v2aux(2) + n_xyz(i_fac,2) = - (v1aux(1) * v2aux(3) - v1aux(3) * v2aux(1)) + n_xyz(i_fac,3) = v1aux(1) * v2aux(2) - v1aux(2) * v2aux(1) + + dd(i_fac) = n_xyz(i_fac,1) * p_xyz(trios(i_fac,1),1) & + + n_xyz(i_fac,2) * p_xyz(trios(i_fac,1),2) & + + n_xyz(i_fac,3) * p_xyz(trios(i_fac,1),3) + + p(i_fac,:) = p_xyz(trios(i_fac,1), :) + end do + + do c = 1, Grid % n_cells + inside_c(c) = Check_Inside_Box(Vof, p, dd, n_xyz, c = c) + end do + + ! Simply interpolate linearly + do c = 1, Grid % n_cells + if (inside_c(c) == 1) then + !prelim_vof(c) = 1.0 - (min_max_crit_2(c) - dd) & + ! / (min_max_crit_2(c)-min_max_crit_1(c)) + call Vof_Interface_Box(Vof, & + c, & + n_xyz, & + dd, & + prelim_vof(c)) + prelim_vof(c) = 0.001 + + else if (inside_c(c) == 2) then + prelim_vof(c) = 1.0 + end if + end do + + ! Precision + do c = 1, Grid % n_cells + Vof % fun % n(c) = max(prelim_vof(c),Vof % fun % n(c)) + end do + + end do + + close(fu) + + call Work % Disconnect_Real_Cell(prelim_vof) + call Work % Disconnect_Int_Cell (inside_c) + + end subroutine diff --git a/Tests/Vof/Mencinger_And_Zun/User_Mod/Vof_Interface_Box.f90 b/Tests/Vof/Mencinger_And_Zun/User_Mod/Vof_Interface_Box.f90 deleted file mode 120000 index b52a7b3dc..000000000 --- a/Tests/Vof/Mencinger_And_Zun/User_Mod/Vof_Interface_Box.f90 +++ /dev/null @@ -1 +0,0 @@ -../../User_Mod/Vof_Interface_Box.f90 \ No newline at end of file diff --git a/Tests/Vof/Mencinger_And_Zun/User_Mod/Vof_Interface_Box.f90 b/Tests/Vof/Mencinger_And_Zun/User_Mod/Vof_Interface_Box.f90 new file mode 100644 index 000000000..08ec2694e --- /dev/null +++ b/Tests/Vof/Mencinger_And_Zun/User_Mod/Vof_Interface_Box.f90 @@ -0,0 +1,101 @@ +!==============================================================================! + subroutine Vof_Interface_Box(Vof, & + c, & + n_xyz, & + dd, & + vof_int) +!------------------------------------------------------------------------------! +! Computes volume fraction of cell at interface ! +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + type(Vof_Type), target :: Vof + integer, intent(in) :: c + real :: n_xyz(6,3) + real :: dd(6) + real :: vof_int +!------------------------------[Local parameters]------------------------------! + integer, parameter :: N = 10000 +!-----------------------------------[Locals]-----------------------------------! + type(Grid_Type), pointer :: Grid + logical :: l_cel + integer :: nod, n_int, n_tot, fu + integer :: ee, n_cylinders, i_vari, n_vari + real :: r_num, res_func + real :: xmin, xmax, ymin, ymax, zmin, zmax + real, allocatable :: p(:,:) + real :: vof_0, vof_tol1, vof_tol2 + real :: avg_x, avg_y, avg_z + real :: var_comb, var_comb_0, dist_cent + real :: mean_x, mean_y, mean_z + real :: points(N,3) +!==============================================================================! + + ! First take aliasesd + Grid => Vof % pnt_grid + + ! Initialize variables + var_comb = HUGE + var_comb_0 = 0.0 + vof_tol1 = MICRO + vof_tol2 = MILI + dist_cent = Grid % vol(c) ** ONE_THIRD + vof_int = HUGE + + n_tot = 0 + n_int = 0 + allocate(p(1,3)) + + ! Find bounding box: + xmin = HUGE; ymin = HUGE; zmin = HUGE; + xmax = -HUGE; ymax = -HUGE; zmax = -HUGE; + + do nod = 1, Grid % cells_n_nodes(c) + xmin = min(xmin, Grid % xn(Grid % cells_n(nod,c))) + ymin = min(ymin, Grid % yn(Grid % cells_n(nod,c))) + zmin = min(zmin, Grid % zn(Grid % cells_n(nod,c))) + xmax = max(xmax, Grid % xn(Grid % cells_n(nod,c))) + ymax = max(ymax, Grid % yn(Grid % cells_n(nod,c))) + zmax = max(zmax, Grid % zn(Grid % cells_n(nod,c))) + end do + + l_cel = .false. + + do while ( (n_tot < N) .and. (abs(var_comb - var_comb_0) > vof_tol1 .or. & + (var_comb / dist_cent) > vof_tol2) ) + + l_cel = .false. + + ! Check if p is inside cell + do while (l_cel .eqv. .false.) + call random_number(r_num) + p(1,1) = xmin + (xmax-xmin) * r_num + call random_number(r_num) + p(1,2) = ymin+ (ymax-ymin) * r_num + call random_number(r_num) + p(1,3) = zmin+ (zmax-zmin) * r_num + l_cel = Grid % Is_Point_In_Cell(c, p(1,1), p(1,2), p(1,3)) + end do + n_tot = n_tot + 1 + + points(n_tot,:) = p(1,:) + + ! Check if p is inside function: + if(Check_Inside_Box(Vof, p, dd, n_xyz) == 1) then + n_int = n_int + 1 + end if + + ! Compute maximum difference c/r center: + if(mod(n_tot, 500) == 0 .and. n_tot > 0) then + var_comb_0 = var_comb + vof_int = real(n_int) / real(n_tot) + mean_x = sum(points(1: n_tot,1)) / real(n_tot) + mean_y = sum(points(1: n_tot,2)) / real(n_tot) + mean_z = sum(points(1: n_tot,3)) / real(n_tot) + var_comb = abs(mean_x-Grid % xc(c)) & + + abs(mean_y-Grid % yc(c)) & + + abs(mean_z-Grid % zc(c)) + end if + end do + + end subroutine diff --git a/Tests/Vof/Stefan/User_Mod/Check_Inside_Box.f90 b/Tests/Vof/Stefan/User_Mod/Check_Inside_Box.f90 deleted file mode 120000 index 83b594885..000000000 --- a/Tests/Vof/Stefan/User_Mod/Check_Inside_Box.f90 +++ /dev/null @@ -1 +0,0 @@ -../../User_Mod/Check_Inside_Box.f90 \ No newline at end of file diff --git a/Tests/Vof/Stefan/User_Mod/Check_Inside_Box.f90 b/Tests/Vof/Stefan/User_Mod/Check_Inside_Box.f90 new file mode 100644 index 000000000..ae72f9c06 --- /dev/null +++ b/Tests/Vof/Stefan/User_Mod/Check_Inside_Box.f90 @@ -0,0 +1,82 @@ +!==============================================================================! + integer function Check_Inside_Box(Vof, p, dd, n_xyz, c) +!------------------------------------------------------------------------------! +! Determine if node of cell c lies inside box. Alteratively, if c is not ! +! given it can be used to determine if any given point p is inside the box ! +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + type(Vof_Type), target :: Vof + real, allocatable :: p(:,:) + real :: dd(6) + real :: n_xyz(6,3) + integer, optional :: c +!-----------------------------------[Locals]-----------------------------------! + type(Grid_Type), pointer :: Grid + integer :: i_fac,n + integer :: infac_box(6) + integer, allocatable :: innod_box(:) + integer :: sum_inside + real :: res_dummy, dist, norm +!==============================================================================! + + ! First take aliasesd + Grid => Vof % pnt_grid + + ! loop in cell faces: + Check_Inside_Box = 0 + + if (present(c)) then + + allocate(innod_box(Grid % cells_n_nodes(c))) + + innod_box = 0 + + ! for every node: + do n = 1, Grid % cells_n_nodes(c) + infac_box = 0 + do i_fac = 1, 6 + res_dummy = n_xyz(i_fac,1) * Grid % xn(Grid % cells_n(n,c)) & + + n_xyz(i_fac,2) * Grid % yn(Grid % cells_n(n,c)) & + + n_xyz(i_fac,3) * Grid % zn(Grid % cells_n(n,c)) + norm = norm2(n_xyz(i_fac,1:3)) + dist = dot_product(n_xyz(i_fac,1:3) & + / norm, (/( Grid % xn(Grid % cells_n(n,c)) & + - p(i_fac,1) ), & + ( Grid % yn(Grid % cells_n(n,c)) & + - p(i_fac,2) ), & + ( Grid % zn(Grid % cells_n(n,c)) & + - p(i_fac,3) )/) ) + if (res_dummy <= dd(i_fac)) then + infac_box(i_fac) = 1 + end if + end do + if (sum(infac_box) == 6) then + innod_box(n) = 1 + end if + end do + + sum_inside = sum(innod_box) + if (sum_inside == Grid % cells_n_nodes(c)) then + Check_Inside_Box = 2 + else if (sum_inside < Grid % cells_n_nodes(c) .and. & + sum_inside > 0) then + Check_Inside_Box = 1 + end if + else + infac_box = 0 + do i_fac =1, 6 + res_dummy = n_xyz(i_fac,1) * p(1,1) & + + n_xyz(i_fac,2) * p(1,2) & + + n_xyz(i_fac,3) * p(1,3) + if (res_dummy <= dd(i_fac)) then + infac_box(i_fac) = 1 + end if + end do + + if (sum(infac_box) == 6) then + Check_Inside_Box = 1 + end if + end if + + end function diff --git a/Tests/Vof/Stefan/User_Mod/Initialize_Variables.f90 b/Tests/Vof/Stefan/User_Mod/Initialize_Variables.f90 index d3ce976e9..3ead8febc 100644 --- a/Tests/Vof/Stefan/User_Mod/Initialize_Variables.f90 +++ b/Tests/Vof/Stefan/User_Mod/Initialize_Variables.f90 @@ -1,6 +1,6 @@ -include '../User_Mod/Check_Inside_Box.f90' -include '../User_Mod/Vof_Initialization_Box.f90' -include '../User_Mod/Vof_Interface_Box.f90' +#include "Vof_Initialization_Box.f90" +#include "Vof_Interface_Box.f90" +#include "Check_Inside_Box.f90" !==============================================================================! subroutine User_Mod_Initialize_Variables(Flow, Turb, Vof, Swarm, Sol) diff --git a/Tests/Vof/Stefan/User_Mod/Vof_Initialization_Box.f90 b/Tests/Vof/Stefan/User_Mod/Vof_Initialization_Box.f90 deleted file mode 120000 index 62b82db5c..000000000 --- a/Tests/Vof/Stefan/User_Mod/Vof_Initialization_Box.f90 +++ /dev/null @@ -1 +0,0 @@ -../../User_Mod/Vof_Initialization_Box.f90 \ No newline at end of file diff --git a/Tests/Vof/Stefan/User_Mod/Vof_Initialization_Box.f90 b/Tests/Vof/Stefan/User_Mod/Vof_Initialization_Box.f90 new file mode 100644 index 000000000..2a5a8b1fb --- /dev/null +++ b/Tests/Vof/Stefan/User_Mod/Vof_Initialization_Box.f90 @@ -0,0 +1,130 @@ +!==============================================================================! + subroutine Vof_Initialization_Box(Vof) +!------------------------------------------------------------------------------! +! Initialize as vof = 1 all cells inside a rectangular box defined by eight ! +! points, sorted as shown in the schematic below. It should work for any ! +! orientation of the box and possibly, it can be generalized to any convex ! +! polyedral ! +!------------------------------------------------------------------------------! +! ! +! 8-----------7 ! +! /| /| ! +! 5-----------6 | ! +! | | | | ! +! | | | | ! +! | | | | ! +! | 4 - - - - | 3 ! +! |/ |/ ! +! 1-----------2 ! +! ! +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + type(Vof_Type), target :: Vof +!-----------------------------------[Locals]-----------------------------------! + type(Grid_Type), pointer :: Grid + real :: p_xyz(8,3) + real, allocatable :: p(:,:) + integer :: c, n, i, fu + integer :: ee, n_boxes, n_p, np_count, i_fac, seeds(1024) + integer :: trios(6,3) + real :: n_xyz(6,3), v1aux(3), v2aux(3) + real :: res_dummy + real :: dd(6) + character(20) :: p_name_aux + real, contiguous, pointer :: prelim_vof(:) + integer, contiguous, pointer :: inside_c(:) +!==============================================================================! + + call Work % Connect_Real_Cell(prelim_vof) + call Work % Connect_Int_Cell (inside_c) + + ! First take aliases + Grid => Vof % pnt_grid + + prelim_vof = 0.0 + + ! Initialize random seed + p_name_aux = 'obstacle' + call random_seed(size=n) + seeds = (/(i, i=1,n)/) + call random_seed(put=seeds(1:n)) + + allocate(p(6,3)) + + ! Initialize sorting for normals: + trios(1,:) = (/1, 4, 2/) + trios(2,:) = (/6, 7, 8/) + trios(3,:) = (/3, 7, 6/) + trios(4,:) = (/5, 8, 4/) + trios(5,:) = (/1, 2, 6/) + trios(6,:) = (/3, 4, 8/) + + ! Open file to read Plane parameters: + call File % Open_For_Reading_Ascii('box_parameters.ini', fu) + + call File % Read_Line(fu) + read(line % tokens(1), *) n_boxes + + np_count = 1 + + do ee = 1, n_boxes + + do n_p = 1, 8 + call File % Read_Line(fu) + read(line % tokens(1), *) p_xyz(n_p, 1) + read(line % tokens(2), *) p_xyz(n_p, 2) + read(line % tokens(3), *) p_xyz(n_p, 3) + end do + + ! Define Planes of the box + do i_fac = 1, 6 + + v1aux(:) = p_xyz(trios(i_fac,2),:) - p_xyz(trios(i_fac,1),:) + v2aux(:) = p_xyz(trios(i_fac,3),:) - p_xyz(trios(i_fac,1),:) + + n_xyz(i_fac,1) = v1aux(2) * v2aux(3) - v1aux(3) * v2aux(2) + n_xyz(i_fac,2) = - (v1aux(1) * v2aux(3) - v1aux(3) * v2aux(1)) + n_xyz(i_fac,3) = v1aux(1) * v2aux(2) - v1aux(2) * v2aux(1) + + dd(i_fac) = n_xyz(i_fac,1) * p_xyz(trios(i_fac,1),1) & + + n_xyz(i_fac,2) * p_xyz(trios(i_fac,1),2) & + + n_xyz(i_fac,3) * p_xyz(trios(i_fac,1),3) + + p(i_fac,:) = p_xyz(trios(i_fac,1), :) + end do + + do c = 1, Grid % n_cells + inside_c(c) = Check_Inside_Box(Vof, p, dd, n_xyz, c = c) + end do + + ! Simply interpolate linearly + do c = 1, Grid % n_cells + if (inside_c(c) == 1) then + !prelim_vof(c) = 1.0 - (min_max_crit_2(c) - dd) & + ! / (min_max_crit_2(c)-min_max_crit_1(c)) + call Vof_Interface_Box(Vof, & + c, & + n_xyz, & + dd, & + prelim_vof(c)) + prelim_vof(c) = 0.001 + + else if (inside_c(c) == 2) then + prelim_vof(c) = 1.0 + end if + end do + + ! Precision + do c = 1, Grid % n_cells + Vof % fun % n(c) = max(prelim_vof(c),Vof % fun % n(c)) + end do + + end do + + close(fu) + + call Work % Disconnect_Real_Cell(prelim_vof) + call Work % Disconnect_Int_Cell (inside_c) + + end subroutine diff --git a/Tests/Vof/Stefan/User_Mod/Vof_Interface_Box.f90 b/Tests/Vof/Stefan/User_Mod/Vof_Interface_Box.f90 deleted file mode 120000 index b52a7b3dc..000000000 --- a/Tests/Vof/Stefan/User_Mod/Vof_Interface_Box.f90 +++ /dev/null @@ -1 +0,0 @@ -../../User_Mod/Vof_Interface_Box.f90 \ No newline at end of file diff --git a/Tests/Vof/Stefan/User_Mod/Vof_Interface_Box.f90 b/Tests/Vof/Stefan/User_Mod/Vof_Interface_Box.f90 new file mode 100644 index 000000000..08ec2694e --- /dev/null +++ b/Tests/Vof/Stefan/User_Mod/Vof_Interface_Box.f90 @@ -0,0 +1,101 @@ +!==============================================================================! + subroutine Vof_Interface_Box(Vof, & + c, & + n_xyz, & + dd, & + vof_int) +!------------------------------------------------------------------------------! +! Computes volume fraction of cell at interface ! +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + type(Vof_Type), target :: Vof + integer, intent(in) :: c + real :: n_xyz(6,3) + real :: dd(6) + real :: vof_int +!------------------------------[Local parameters]------------------------------! + integer, parameter :: N = 10000 +!-----------------------------------[Locals]-----------------------------------! + type(Grid_Type), pointer :: Grid + logical :: l_cel + integer :: nod, n_int, n_tot, fu + integer :: ee, n_cylinders, i_vari, n_vari + real :: r_num, res_func + real :: xmin, xmax, ymin, ymax, zmin, zmax + real, allocatable :: p(:,:) + real :: vof_0, vof_tol1, vof_tol2 + real :: avg_x, avg_y, avg_z + real :: var_comb, var_comb_0, dist_cent + real :: mean_x, mean_y, mean_z + real :: points(N,3) +!==============================================================================! + + ! First take aliasesd + Grid => Vof % pnt_grid + + ! Initialize variables + var_comb = HUGE + var_comb_0 = 0.0 + vof_tol1 = MICRO + vof_tol2 = MILI + dist_cent = Grid % vol(c) ** ONE_THIRD + vof_int = HUGE + + n_tot = 0 + n_int = 0 + allocate(p(1,3)) + + ! Find bounding box: + xmin = HUGE; ymin = HUGE; zmin = HUGE; + xmax = -HUGE; ymax = -HUGE; zmax = -HUGE; + + do nod = 1, Grid % cells_n_nodes(c) + xmin = min(xmin, Grid % xn(Grid % cells_n(nod,c))) + ymin = min(ymin, Grid % yn(Grid % cells_n(nod,c))) + zmin = min(zmin, Grid % zn(Grid % cells_n(nod,c))) + xmax = max(xmax, Grid % xn(Grid % cells_n(nod,c))) + ymax = max(ymax, Grid % yn(Grid % cells_n(nod,c))) + zmax = max(zmax, Grid % zn(Grid % cells_n(nod,c))) + end do + + l_cel = .false. + + do while ( (n_tot < N) .and. (abs(var_comb - var_comb_0) > vof_tol1 .or. & + (var_comb / dist_cent) > vof_tol2) ) + + l_cel = .false. + + ! Check if p is inside cell + do while (l_cel .eqv. .false.) + call random_number(r_num) + p(1,1) = xmin + (xmax-xmin) * r_num + call random_number(r_num) + p(1,2) = ymin+ (ymax-ymin) * r_num + call random_number(r_num) + p(1,3) = zmin+ (zmax-zmin) * r_num + l_cel = Grid % Is_Point_In_Cell(c, p(1,1), p(1,2), p(1,3)) + end do + n_tot = n_tot + 1 + + points(n_tot,:) = p(1,:) + + ! Check if p is inside function: + if(Check_Inside_Box(Vof, p, dd, n_xyz) == 1) then + n_int = n_int + 1 + end if + + ! Compute maximum difference c/r center: + if(mod(n_tot, 500) == 0 .and. n_tot > 0) then + var_comb_0 = var_comb + vof_int = real(n_int) / real(n_tot) + mean_x = sum(points(1: n_tot,1)) / real(n_tot) + mean_y = sum(points(1: n_tot,2)) / real(n_tot) + mean_z = sum(points(1: n_tot,3)) / real(n_tot) + var_comb = abs(mean_x-Grid % xc(c)) & + + abs(mean_y-Grid % yc(c)) & + + abs(mean_z-Grid % zc(c)) + end if + end do + + end subroutine diff --git a/Tests/Vof/User_Mod/Check_Inside_Box.f90 b/Tests/Vof/User_Mod/Check_Inside_Box.f90 deleted file mode 100644 index ae72f9c06..000000000 --- a/Tests/Vof/User_Mod/Check_Inside_Box.f90 +++ /dev/null @@ -1,82 +0,0 @@ -!==============================================================================! - integer function Check_Inside_Box(Vof, p, dd, n_xyz, c) -!------------------------------------------------------------------------------! -! Determine if node of cell c lies inside box. Alteratively, if c is not ! -! given it can be used to determine if any given point p is inside the box ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - type(Vof_Type), target :: Vof - real, allocatable :: p(:,:) - real :: dd(6) - real :: n_xyz(6,3) - integer, optional :: c -!-----------------------------------[Locals]-----------------------------------! - type(Grid_Type), pointer :: Grid - integer :: i_fac,n - integer :: infac_box(6) - integer, allocatable :: innod_box(:) - integer :: sum_inside - real :: res_dummy, dist, norm -!==============================================================================! - - ! First take aliasesd - Grid => Vof % pnt_grid - - ! loop in cell faces: - Check_Inside_Box = 0 - - if (present(c)) then - - allocate(innod_box(Grid % cells_n_nodes(c))) - - innod_box = 0 - - ! for every node: - do n = 1, Grid % cells_n_nodes(c) - infac_box = 0 - do i_fac = 1, 6 - res_dummy = n_xyz(i_fac,1) * Grid % xn(Grid % cells_n(n,c)) & - + n_xyz(i_fac,2) * Grid % yn(Grid % cells_n(n,c)) & - + n_xyz(i_fac,3) * Grid % zn(Grid % cells_n(n,c)) - norm = norm2(n_xyz(i_fac,1:3)) - dist = dot_product(n_xyz(i_fac,1:3) & - / norm, (/( Grid % xn(Grid % cells_n(n,c)) & - - p(i_fac,1) ), & - ( Grid % yn(Grid % cells_n(n,c)) & - - p(i_fac,2) ), & - ( Grid % zn(Grid % cells_n(n,c)) & - - p(i_fac,3) )/) ) - if (res_dummy <= dd(i_fac)) then - infac_box(i_fac) = 1 - end if - end do - if (sum(infac_box) == 6) then - innod_box(n) = 1 - end if - end do - - sum_inside = sum(innod_box) - if (sum_inside == Grid % cells_n_nodes(c)) then - Check_Inside_Box = 2 - else if (sum_inside < Grid % cells_n_nodes(c) .and. & - sum_inside > 0) then - Check_Inside_Box = 1 - end if - else - infac_box = 0 - do i_fac =1, 6 - res_dummy = n_xyz(i_fac,1) * p(1,1) & - + n_xyz(i_fac,2) * p(1,2) & - + n_xyz(i_fac,3) * p(1,3) - if (res_dummy <= dd(i_fac)) then - infac_box(i_fac) = 1 - end if - end do - - if (sum(infac_box) == 6) then - Check_Inside_Box = 1 - end if - end if - - end function diff --git a/Tests/Vof/User_Mod/Vof_Area_Square_Circle.f90 b/Tests/Vof/User_Mod/Vof_Area_Square_Circle.f90 deleted file mode 100644 index af61676e1..000000000 --- a/Tests/Vof/User_Mod/Vof_Area_Square_Circle.f90 +++ /dev/null @@ -1,47 +0,0 @@ -!==============================================================================! - subroutine Vof_Area_Square_Circle(xint0, xint1, cx, cy, r, h, area) -!------------------------------------------------------------------------------! -! Computes intersection area between square and circl ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - real :: xint0, xint1, cx, cy, r, h, area -!-----------------------------------[Locals]-----------------------------------! - real :: x1, x2, xmin, xmax, tmin, tmax, xaux - real :: integ1, integ2, epsloc -!==============================================================================! - - epsloc = epsilon(epsloc) - - if (xint0 > xint1) then - xaux = xint1 - xint1 = xint0 - xint0 = xaux - end if - - if (h > r) then - area = 0.0 - else - x1 = cx - sqrt(r ** 2 - h ** 2) - x2 = cx + sqrt(r ** 2 - h ** 2) - - xmin = max(xint0, x1) - xmax = min(xint1, x2) - - if (xmin > xmax) then - area = 0.0 - else - tmin = r ** 2 - (cx - xmin) ** 2 + epsloc - tmax = r ** 2 - (cx - xmax) ** 2 + epsloc - - integ1 = -0.5 * (cx - xmax) * sqrt(tmax) & - +0.5 * r ** 2 * atan( (xmax - cx) * sqrt(tmax) / tmax) - h * xmax - - integ2 = -0.5 * (cx - xmin) * sqrt(tmin) & - +0.5 * r ** 2 * atan( (xmin - cx) * sqrt(tmin) / tmin) - h * xmin - - area = integ1 - integ2 - end if - end if - - end subroutine diff --git a/Tests/Vof/User_Mod/Vof_Divide_Cuboid.f90 b/Tests/Vof/User_Mod/Vof_Divide_Cuboid.f90 deleted file mode 100644 index c66d52278..000000000 --- a/Tests/Vof/User_Mod/Vof_Divide_Cuboid.f90 +++ /dev/null @@ -1,78 +0,0 @@ -!==============================================================================! - subroutine Vof_Divide_Cuboid(Vof, c) -!------------------------------------------------------------------------------! -! Divides cuboid recursively to make an accurate initialization ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - type(Vof_Type), target :: Vof - integer :: c -!-----------------------------------[Locals]-----------------------------------! - type(Grid_Type), pointer :: Grid - integer :: n, fu, n_node_vol, s - integer :: ee, n_cylinders, iterat - integer :: alloc_nod, alloc_fac - integer :: i_nod, i_fac - integer :: level_r - real :: radius, height - real :: p1_x, p1_y, p1_z - real :: p2_x, p2_y, p2_z - real :: res_dummy - real :: seed_node(3) - real, allocatable :: nod_x(:),nod_y(:),nod_z(:) - integer, allocatable :: faces_nod(:,:) - real, contiguous, pointer :: prelim_vof(:),min_max_crit_1(:),min_max_crit_2(:) -!==============================================================================! - - call Work % Connect_Real_Cell(prelim_vof, min_max_crit_1, min_max_crit_2) - - ! First take aliasesd - Grid => Vof % pnt_grid - n_nod_vol = 8 - alloc_nod = 0 - alloc_fac = 0 - - level_r = 1 - do iterat = 0, level_r - alloc_nod = alloc_nod + n_nod_vol * 8 ** iterat - end do - - do iterat = 0, level_r - alloc_fac = alloc_fac + 6 * 8 ** iterat - end do - - allocate(nod_x(alloc_nod), nod_y(alloc_nod), nod_z(alloc_nod)) - nod_x = 0.0; nod_y = 0.0; nod_z = 0.0 - allocate(faces_nod(alloc_fac,4)) - - !list nodes first cuboid: - i_nod = 1 - do n = 1, Grid % cells_n_nodes(c) - nod_x(inod) = Grid % xn(Grid % cells_n(n,c)) - nod_y(inod) = Grid % yn(Grid % cells_n(n,c)) - nod_z(inod) = Grid % zn(Grid % cells_n(n,c)) - i_nod = i_nod + 1 - end do - - !list of nodes on faces: - i_fac = 1 - do iterat = 1, Grid % cells_n_faces(c) - s = Grid % cells_f(iterat, c) - do n = 1, Grid % faces_n_nodes(s) - faces_nod(i_fac,n) = Grid % faces_n(n,s) - i_fac = i_fac + 1 - end do - end do - - - ! find center (which is also nod on the slicing plane) - seed_node = 0.0; - do n = i_nod, 1, -1 - seed_node(1) = seed_node(1) + nod_x(n) / 8.0 - seed_node(2) = seed_node(2) + nod_y(n) / 8.0 - seed_node(3) = seed_node(3) + nod_z(n) / 8.0 - end do - - call Work % Disconnect_Real_Cell(prelim_vof, min_max_crit_1, min_max_crit_2) - - end subroutine diff --git a/Tests/Vof/User_Mod/Vof_Exact_Cylinder.f90 b/Tests/Vof/User_Mod/Vof_Exact_Cylinder.f90 deleted file mode 100644 index 63cdc9931..000000000 --- a/Tests/Vof/User_Mod/Vof_Exact_Cylinder.f90 +++ /dev/null @@ -1,97 +0,0 @@ -!==============================================================================! - subroutine Vof_Exact_Cylinder(Vof, & - c, & - p1_x, p1_y, p1_z, & - p2_x, p2_y, p2_z, & - radius, height, & - min_max_c1, min_max_c2, & - vof_int) -!------------------------------------------------------------------------------! -! Computes volume fraction of cell at interface ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - type(Vof_Type), target :: Vof - integer :: c - real :: p1_x, p1_y, p1_z - real :: p2_x, p2_y, p2_z - real :: radius, height - real :: vof_int - real :: min_max_c1, min_max_c2 -!-----------------------------------[Locals]-----------------------------------! - type(Grid_Type), pointer :: Grid - integer :: nod, n_int, n_tot, n_tot_int, fu - real :: xmin, xmax, ymin, ymax, zmin, zmax - real :: zminprim, zmaxprim - real :: area1, area2, area3, thick_y, h - real :: dist -!==============================================================================! - - ! First take aliasesd - Grid => Vof % pnt_grid - - ! find bounding box: - xmin = HUGE; ymin = HUGE; zmin = HUGE; - xmax = -HUGE; ymax = -HUGE; zmax = -HUGE; - - do nod = 1, abs(Grid % cells_n_nodes(c)) - xmin = min(xmin, Grid % xn(Grid % cells_n(nod,c))) - ymin = min(ymin, Grid % yn(Grid % cells_n(nod,c))) - zmin = min(zmin, Grid % zn(Grid % cells_n(nod,c))) - xmax = max(xmax, Grid % xn(Grid % cells_n(nod,c))) - ymax = max(ymax, Grid % yn(Grid % cells_n(nod,c))) - zmax = max(zmax, Grid % zn(Grid % cells_n(nod,c))) - end do - - thick_y = ymax-ymin - - ! Area with open top - h = zmin - p1_z - - if (h >= 0.0) then ! Cell is above cylinder center, no problem - call Vof_Area_Square_Circle(xmin, xmax, p1_x, p1_z, radius, h, area1) - - h = zmax - p1_z - - call Vof_Area_Square_Circle(xmin, xmax, p1_x, p1_z, radius, h, area2) - - vof_int = ( area1 - area2 ) / ((zmax - zmin) * (xmax - xmin)) - - if (min_max_c2 <= 1.0) then - vof_int = 1.0 - end if - - else - if (zmax > p1_z) then ! Cell intersects cylinder center in z - h = 0.0 - call Vof_Area_Square_Circle(xmin, xmax, p1_x, p1_z, radius, h, area1) - - h = zmax - p1_z - - call Vof_Area_Square_Circle(xmin, xmax, p1_x, p1_z, radius, h, area2) - - h = p1_z - zmin - call Vof_Area_Square_Circle(xmin, xmax, p1_x, p1_z, radius, h, area3) - - vof_int = ( 2.0 * area1 - area2 - area3)/ ((zmax - zmin) * (xmax - xmin)) - - else ! Cell below cylinder center in z - zminprim = 2.0 * p1_z - zmax - zmaxprim = zminprim + zmax- zmin - zmin = zminprim - zmax = zmaxprim - - h = zmin - p1_z - - call Vof_Area_Square_Circle(xmin, xmax, p1_x, p1_z, radius, h, area1) - - h = zmax - p1_z - - call Vof_Area_Square_Circle(xmin, xmax, p1_x, p1_z, radius, h, area2) - - vof_int = ( area1 - area2 ) / ((zmax - zmin) * (xmax - xmin)) - - end if - end if - - end subroutine diff --git a/Tests/Vof/User_Mod/Vof_Initialization_Box.f90 b/Tests/Vof/User_Mod/Vof_Initialization_Box.f90 deleted file mode 100644 index 2a5a8b1fb..000000000 --- a/Tests/Vof/User_Mod/Vof_Initialization_Box.f90 +++ /dev/null @@ -1,130 +0,0 @@ -!==============================================================================! - subroutine Vof_Initialization_Box(Vof) -!------------------------------------------------------------------------------! -! Initialize as vof = 1 all cells inside a rectangular box defined by eight ! -! points, sorted as shown in the schematic below. It should work for any ! -! orientation of the box and possibly, it can be generalized to any convex ! -! polyedral ! -!------------------------------------------------------------------------------! -! ! -! 8-----------7 ! -! /| /| ! -! 5-----------6 | ! -! | | | | ! -! | | | | ! -! | | | | ! -! | 4 - - - - | 3 ! -! |/ |/ ! -! 1-----------2 ! -! ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - type(Vof_Type), target :: Vof -!-----------------------------------[Locals]-----------------------------------! - type(Grid_Type), pointer :: Grid - real :: p_xyz(8,3) - real, allocatable :: p(:,:) - integer :: c, n, i, fu - integer :: ee, n_boxes, n_p, np_count, i_fac, seeds(1024) - integer :: trios(6,3) - real :: n_xyz(6,3), v1aux(3), v2aux(3) - real :: res_dummy - real :: dd(6) - character(20) :: p_name_aux - real, contiguous, pointer :: prelim_vof(:) - integer, contiguous, pointer :: inside_c(:) -!==============================================================================! - - call Work % Connect_Real_Cell(prelim_vof) - call Work % Connect_Int_Cell (inside_c) - - ! First take aliases - Grid => Vof % pnt_grid - - prelim_vof = 0.0 - - ! Initialize random seed - p_name_aux = 'obstacle' - call random_seed(size=n) - seeds = (/(i, i=1,n)/) - call random_seed(put=seeds(1:n)) - - allocate(p(6,3)) - - ! Initialize sorting for normals: - trios(1,:) = (/1, 4, 2/) - trios(2,:) = (/6, 7, 8/) - trios(3,:) = (/3, 7, 6/) - trios(4,:) = (/5, 8, 4/) - trios(5,:) = (/1, 2, 6/) - trios(6,:) = (/3, 4, 8/) - - ! Open file to read Plane parameters: - call File % Open_For_Reading_Ascii('box_parameters.ini', fu) - - call File % Read_Line(fu) - read(line % tokens(1), *) n_boxes - - np_count = 1 - - do ee = 1, n_boxes - - do n_p = 1, 8 - call File % Read_Line(fu) - read(line % tokens(1), *) p_xyz(n_p, 1) - read(line % tokens(2), *) p_xyz(n_p, 2) - read(line % tokens(3), *) p_xyz(n_p, 3) - end do - - ! Define Planes of the box - do i_fac = 1, 6 - - v1aux(:) = p_xyz(trios(i_fac,2),:) - p_xyz(trios(i_fac,1),:) - v2aux(:) = p_xyz(trios(i_fac,3),:) - p_xyz(trios(i_fac,1),:) - - n_xyz(i_fac,1) = v1aux(2) * v2aux(3) - v1aux(3) * v2aux(2) - n_xyz(i_fac,2) = - (v1aux(1) * v2aux(3) - v1aux(3) * v2aux(1)) - n_xyz(i_fac,3) = v1aux(1) * v2aux(2) - v1aux(2) * v2aux(1) - - dd(i_fac) = n_xyz(i_fac,1) * p_xyz(trios(i_fac,1),1) & - + n_xyz(i_fac,2) * p_xyz(trios(i_fac,1),2) & - + n_xyz(i_fac,3) * p_xyz(trios(i_fac,1),3) - - p(i_fac,:) = p_xyz(trios(i_fac,1), :) - end do - - do c = 1, Grid % n_cells - inside_c(c) = Check_Inside_Box(Vof, p, dd, n_xyz, c = c) - end do - - ! Simply interpolate linearly - do c = 1, Grid % n_cells - if (inside_c(c) == 1) then - !prelim_vof(c) = 1.0 - (min_max_crit_2(c) - dd) & - ! / (min_max_crit_2(c)-min_max_crit_1(c)) - call Vof_Interface_Box(Vof, & - c, & - n_xyz, & - dd, & - prelim_vof(c)) - prelim_vof(c) = 0.001 - - else if (inside_c(c) == 2) then - prelim_vof(c) = 1.0 - end if - end do - - ! Precision - do c = 1, Grid % n_cells - Vof % fun % n(c) = max(prelim_vof(c),Vof % fun % n(c)) - end do - - end do - - close(fu) - - call Work % Disconnect_Real_Cell(prelim_vof) - call Work % Disconnect_Int_Cell (inside_c) - - end subroutine diff --git a/Tests/Vof/User_Mod/Vof_Initialization_Cylinder.f90 b/Tests/Vof/User_Mod/Vof_Initialization_Cylinder.f90 deleted file mode 100644 index 0a34a3727..000000000 --- a/Tests/Vof/User_Mod/Vof_Initialization_Cylinder.f90 +++ /dev/null @@ -1,106 +0,0 @@ -!==============================================================================! - subroutine Vof_Initialization_Cylinder(Vof) -!------------------------------------------------------------------------------! -! Initialize dependent variables. (It is a bit of a mess still) ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - type(Vof_Type), target :: Vof -!-----------------------------------[Locals]-----------------------------------! - type(Grid_Type), pointer :: Grid - integer :: c, n, fu - integer :: ee, n_cylinders - real :: radius, height - real :: p1_x, p1_y, p1_z - real :: p2_x, p2_y, p2_z - real :: res_dummy, minnody, maxnody - real, contiguous, pointer :: prelim_vof(:),min_max_crit_1(:),min_max_crit_2(:) -!==============================================================================! - - call Work % Connect_Real_Cell(prelim_vof, min_max_crit_1, min_max_crit_2) - - ! First take aliasesd - Grid => Vof % pnt_grid - - prelim_vof = 0.0 - - ! call Vof_Init_Random_Seed(problem_name) - - ! Open file to read cylinder parameters: - call File % Open_For_Reading_Ascii('cylinder_parameters.ini', fu) - - call File % Read_Line(fu) - read(line % tokens(1), *) n_cylinders - - do ee = 1, n_cylinders - - ! Taking extrema - min_max_crit_1(:) = HUGE - min_max_crit_2(:) = -HUGE - - call File % Read_Line(fu) - read(line % tokens(1), *) radius - - call File % Read_Line(fu) - read(line % tokens(1), *) p1_x - read(line % tokens(2), *) p1_y - read(line % tokens(3), *) p1_z - - call File % Read_Line(fu) - read(line % tokens(1), *) p2_x - read(line % tokens(2), *) p2_y - read(line % tokens(3), *) p2_z - - height = sqrt((p1_x-p2_x)**2+(p1_y-p2_y)**2+(p1_z-p2_z)**2) - - do c = 1, Grid % n_cells - - ! For every node - do n = 1, Grid % cells_n_nodes(c) - - res_dummy = ( & - ( (p2_y-p1_y)*(p1_z-Grid % zn(Grid % cells_n(n,c))) & - -(p1_y-Grid % yn(Grid % cells_n(n,c)))*(p2_z-p1_z))**2 & - +( (p2_x-p1_x)*(p1_z-Grid % zn(Grid % cells_n(n,c))) & - -(p1_x-Grid % xn(Grid % cells_n(n,c)))*(p2_z-p1_z))**2 & - +( (p2_x-p1_x)*(p1_y-Grid % yn(Grid % cells_n(n,c))) & - -(p1_x-Grid % xn(Grid % cells_n(n,c)))*(p2_y-p1_y))**2 ) & - / (radius*height) ** 2 - - min_max_crit_1(c)= min(res_dummy, min_max_crit_1(c)) - min_max_crit_2(c)= max(res_dummy, min_max_crit_2(c)) - end do - end do - - ! Interpolate from exact cylinder - do c = 1, Grid % n_cells - call Vof_Exact_Cylinder(Vof, & - c, & - p1_x, p1_y, p1_z, & - p2_x, p2_y, p2_z, & - radius, height, & - min_max_crit_1(c), min_max_crit_2(c), & - prelim_vof(c)) - end do - ! Simply interpolate linearly - ! do c = 1, Grid % n_cells - ! if (min_max_crit_1(c) < 1.0 .and. min_max_crit_2(c) > 1.0) then - ! prelim_vof(c) = (1.0 - min_max_crit_1(c)) & - ! / (min_max_crit_2(c)-min_max_crit_1(c)) - ! else if (min_max_crit_2(c) <= 1.0) then - ! prelim_vof(c) = 1.0 - ! end if - ! end do - - ! Precision - do c = 1, Grid % n_cells - Vof % fun % n(c) = max(prelim_vof(c),Vof % fun % n(c)) - end do - - end do - - close(fu) - - call Work % Disconnect_Real_Cell(prelim_vof, min_max_crit_1, min_max_crit_2) - - end subroutine diff --git a/Tests/Vof/User_Mod/Vof_Initialization_Ellipsoid.f90 b/Tests/Vof/User_Mod/Vof_Initialization_Ellipsoid.f90 deleted file mode 100644 index c98820aa2..000000000 --- a/Tests/Vof/User_Mod/Vof_Initialization_Ellipsoid.f90 +++ /dev/null @@ -1,92 +0,0 @@ -!==============================================================================! - subroutine Vof_Initialization_Ellipsoid(Vof) -!------------------------------------------------------------------------------! -! Initialize dependent variables. (It is a bit of a mess still) ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - type(Vof_Type), target :: Vof -!-----------------------------------[Locals]-----------------------------------! - type(Grid_Type), pointer :: Grid - integer :: c, n, fu, i_nod - integer :: ee, n_ellipses - real :: radius_1, radius_2, radius_3 - real :: cent_x, cent_y, cent_z, dist_norm - real, contiguous, pointer :: prelim_vof(:), min_dist(:), max_dist(:) - real, contiguous, pointer :: dist_node(:) -!==============================================================================! - - call Work % Connect_Real_Cell(prelim_vof, min_dist, max_dist) - call Work % Connect_Real_Node(dist_node) - - ! First take aliases - Grid => Vof % pnt_grid - - ! Open file to read Ellipsoid parameters: - call File % Open_For_Reading_Ascii('ellipsoid_parameters.ini', fu) - - call File % Read_Line(fu) - read(line % tokens(1), *) n_ellipses - - do ee = 1, n_ellipses - - ! Initialize working arrays - prelim_vof(:) = 0.0 - - call File % Read_Line(fu) - read(line % tokens(1), *) radius_1 - read(line % tokens(2), *) radius_2 - read(line % tokens(3), *) radius_3 - - call File % Read_Line(fu) - read(line % tokens(1), *) cent_x - read(line % tokens(2), *) cent_y - read(line % tokens(3), *) cent_z - - ! Normalized distance from ellipsoid center in nodes - dist_node (:) = 0.0 - do n = 1, Grid % n_nodes - dist_node(n) = sqrt( ((Grid % xn(n) - cent_x) / radius_1)**2 & - + ((Grid % yn(n) - cent_y) / radius_2)**2 & - + ((Grid % zn(n) - cent_z) / radius_3)**2) - end do - - ! Minimum and maximum normalized distance in cells - min_dist(:) = +HUGE - max_dist(:) = -HUGE - do c = 1, Grid % n_cells - do i_nod = 1, abs(Grid % cells_n_nodes(c)) - n = Grid % cells_n(i_nod, c) - - min_dist(c)= min(dist_node(n), min_dist(c)) - max_dist(c)= max(dist_node(n), max_dist(c)) - end do - end do - - ! Simply interpolate linearly - do c = 1, Grid % n_cells - - ! Since surface is at 1.0 this checks if cell crosses the surface - if (min_dist(c) < 1.0 .and. max_dist(c) > 1.0) then - prelim_vof(c) = (1.0 - min_dist(c)) & - / (max_dist(c)-min_dist(c)) - - else if (max_dist(c) <= 1.0) then - prelim_vof(c) = 1.0 - end if - - end do - - ! Precision (what on earth?) - do c = 1, Grid % n_cells - Vof % fun % n(c) = max(prelim_vof(c), Vof % fun % n(c)) - end do - - end do - - close(fu) - - call Work % Disconnect_Real_Cell(prelim_vof, min_dist, max_dist) - call Work % Disconnect_Real_Node(dist_node) - - end subroutine diff --git a/Tests/Vof/User_Mod/Vof_Initialization_Plane.f90 b/Tests/Vof/User_Mod/Vof_Initialization_Plane.f90 deleted file mode 100644 index 1d84ff1a6..000000000 --- a/Tests/Vof/User_Mod/Vof_Initialization_Plane.f90 +++ /dev/null @@ -1,105 +0,0 @@ -!==============================================================================! - subroutine Vof_Initialization_Plane(Vof) -!------------------------------------------------------------------------------! -! Initialize as vof = 1 all cells beneath the plane given by 3 points ! -! sorted anticlockwise to the direction of the plane normal ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - type(Vof_Type), target :: Vof -!-----------------------------------[Locals]-----------------------------------! - type(Grid_Type), pointer :: Grid - real, allocatable :: p_xyz(:,:) - integer :: c, n, fu - integer :: ee, n_planes - real :: n_xyz(3), v1aux(3), v2aux(3) - real :: res_dummy - real :: dd - real, contiguous, pointer :: prelim_vof(:),min_max_crit_1(:),min_max_crit_2(:) -!==============================================================================! - - call Work % Connect_Real_Cell(prelim_vof, min_max_crit_1, min_max_crit_2) - - ! First take aliases - Grid => Vof % pnt_grid - - prelim_vof = 0.0 - - ! Open file to read Plane parameters: - call File % Open_For_Reading_Ascii('plane_parameters.ini', fu) - - call File % Read_Line(fu) - read(line % tokens(1), *) n_planes - - if (allocated(p_xyz)) deallocate(p_xyz) - allocate(p_xyz(n_planes*3,3)) - - do ee = 1, n_planes - - ! Taking extrema - min_max_crit_1(:) = HUGE - min_max_crit_2(:) = -HUGE - - ! Read point 1 - call File % Read_Line(fu) - read(line % tokens(1), *) p_xyz(1, 1) - read(line % tokens(2), *) p_xyz(1, 2) - read(line % tokens(3), *) p_xyz(1, 3) - - ! Read point 2 - call File % Read_Line(fu) - read(line % tokens(1), *) p_xyz(2, 1) - read(line % tokens(2), *) p_xyz(2, 2) - read(line % tokens(3), *) p_xyz(2, 3) - - ! Read point 3 - call File % Read_Line(fu) - read(line % tokens(1), *) p_xyz(3, 1) - read(line % tokens(2), *) p_xyz(3, 2) - read(line % tokens(3), *) p_xyz(3, 3) - - v1aux(:) = p_xyz(2,:) - p_xyz(1,:) - v2aux(:) = p_xyz(3,:) - p_xyz(1,:) - - n_xyz(1) = v1aux(2) * v2aux(3) - v1aux(3) * v2aux(2) - n_xyz(2) = - (v1aux(1) * v2aux(3) - v1aux(3) * v2aux(1)) - n_xyz(3) = v1aux(1) * v2aux(2) - v1aux(2) * v2aux(1) - - dd = n_xyz(1) * p_xyz(1,1) + n_xyz(2) * p_xyz(1,2) + n_xyz(3) * p_xyz(1,3) - - do c = 1, Grid % n_cells - - ! For every node: - do n = 1, Grid % cells_n_nodes(c) - - res_dummy = n_xyz(1) * Grid % xn(Grid % cells_n(n,c)) & - + n_xyz(2) * Grid % yn(Grid % cells_n(n,c)) & - + n_xyz(3) * Grid % zn(Grid % cells_n(n,c)) - - min_max_crit_1(c)= min(res_dummy, min_max_crit_1(c)) - min_max_crit_2(c)= max(res_dummy, min_max_crit_2(c)) - end do - end do - - ! Simply interpolate linearly - do c = 1, Grid % n_cells - if (min_max_crit_1(c) < dd .and. min_max_crit_2(c) > dd) then - prelim_vof(c) = 1.0 - (min_max_crit_2(c) - dd) & - / (min_max_crit_2(c)-min_max_crit_1(c)) - else if (min_max_crit_2(c) <= dd) then - prelim_vof(c) = 1.0 - end if - end do - - ! Precision - do c = 1, Grid % n_cells - Vof % fun % n(c) = max(prelim_vof(c),Vof % fun % n(c)) - end do - - end do - - close(fu) - - call Work % Disconnect_Real_Cell(prelim_vof, min_max_crit_1, min_max_crit_2) - - end subroutine diff --git a/Tests/Vof/User_Mod/Vof_Interface_Box.f90 b/Tests/Vof/User_Mod/Vof_Interface_Box.f90 deleted file mode 100644 index 08ec2694e..000000000 --- a/Tests/Vof/User_Mod/Vof_Interface_Box.f90 +++ /dev/null @@ -1,101 +0,0 @@ -!==============================================================================! - subroutine Vof_Interface_Box(Vof, & - c, & - n_xyz, & - dd, & - vof_int) -!------------------------------------------------------------------------------! -! Computes volume fraction of cell at interface ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - type(Vof_Type), target :: Vof - integer, intent(in) :: c - real :: n_xyz(6,3) - real :: dd(6) - real :: vof_int -!------------------------------[Local parameters]------------------------------! - integer, parameter :: N = 10000 -!-----------------------------------[Locals]-----------------------------------! - type(Grid_Type), pointer :: Grid - logical :: l_cel - integer :: nod, n_int, n_tot, fu - integer :: ee, n_cylinders, i_vari, n_vari - real :: r_num, res_func - real :: xmin, xmax, ymin, ymax, zmin, zmax - real, allocatable :: p(:,:) - real :: vof_0, vof_tol1, vof_tol2 - real :: avg_x, avg_y, avg_z - real :: var_comb, var_comb_0, dist_cent - real :: mean_x, mean_y, mean_z - real :: points(N,3) -!==============================================================================! - - ! First take aliasesd - Grid => Vof % pnt_grid - - ! Initialize variables - var_comb = HUGE - var_comb_0 = 0.0 - vof_tol1 = MICRO - vof_tol2 = MILI - dist_cent = Grid % vol(c) ** ONE_THIRD - vof_int = HUGE - - n_tot = 0 - n_int = 0 - allocate(p(1,3)) - - ! Find bounding box: - xmin = HUGE; ymin = HUGE; zmin = HUGE; - xmax = -HUGE; ymax = -HUGE; zmax = -HUGE; - - do nod = 1, Grid % cells_n_nodes(c) - xmin = min(xmin, Grid % xn(Grid % cells_n(nod,c))) - ymin = min(ymin, Grid % yn(Grid % cells_n(nod,c))) - zmin = min(zmin, Grid % zn(Grid % cells_n(nod,c))) - xmax = max(xmax, Grid % xn(Grid % cells_n(nod,c))) - ymax = max(ymax, Grid % yn(Grid % cells_n(nod,c))) - zmax = max(zmax, Grid % zn(Grid % cells_n(nod,c))) - end do - - l_cel = .false. - - do while ( (n_tot < N) .and. (abs(var_comb - var_comb_0) > vof_tol1 .or. & - (var_comb / dist_cent) > vof_tol2) ) - - l_cel = .false. - - ! Check if p is inside cell - do while (l_cel .eqv. .false.) - call random_number(r_num) - p(1,1) = xmin + (xmax-xmin) * r_num - call random_number(r_num) - p(1,2) = ymin+ (ymax-ymin) * r_num - call random_number(r_num) - p(1,3) = zmin+ (zmax-zmin) * r_num - l_cel = Grid % Is_Point_In_Cell(c, p(1,1), p(1,2), p(1,3)) - end do - n_tot = n_tot + 1 - - points(n_tot,:) = p(1,:) - - ! Check if p is inside function: - if(Check_Inside_Box(Vof, p, dd, n_xyz) == 1) then - n_int = n_int + 1 - end if - - ! Compute maximum difference c/r center: - if(mod(n_tot, 500) == 0 .and. n_tot > 0) then - var_comb_0 = var_comb - vof_int = real(n_int) / real(n_tot) - mean_x = sum(points(1: n_tot,1)) / real(n_tot) - mean_y = sum(points(1: n_tot,2)) / real(n_tot) - mean_z = sum(points(1: n_tot,3)) / real(n_tot) - var_comb = abs(mean_x-Grid % xc(c)) & - + abs(mean_y-Grid % yc(c)) & - + abs(mean_z-Grid % zc(c)) - end if - end do - - end subroutine diff --git a/Tests/Vof/User_Mod/Vof_Interface_Cylinder.f90 b/Tests/Vof/User_Mod/Vof_Interface_Cylinder.f90 deleted file mode 100644 index 74a6e3959..000000000 --- a/Tests/Vof/User_Mod/Vof_Interface_Cylinder.f90 +++ /dev/null @@ -1,109 +0,0 @@ -!==============================================================================! - subroutine Vof_Interface_Cylinder(Vof, & - c, & - p1_x, p1_y, p1_z, & - p2_x, p2_y, p2_z, & - radius, height, & - vof_int) -!------------------------------------------------------------------------------! -! Computes volume fraction of cell at interface ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - type(Vof_Type), target :: Vof - integer, intent(in) :: c - real :: p1_x, p1_y, p1_z - real :: p2_x, p2_y, p2_z - real :: radius, height - real :: vof_int -!------------------------------[Local parameters]------------------------------! - integer, parameter :: N = 10000 -!-----------------------------------[Locals]-----------------------------------! - type(Grid_Type), pointer :: Grid - logical :: l_cel - integer :: nod, n_int, n_tot, n_tot_int, fu - integer :: ee, n_cylinders, i_vari, j_vari, n_vari - real :: r_num, res_func - real :: xmin, xmax, ymin, ymax, zmin, zmax - real :: p(3) - real :: vof_0, vof_tol1, vof_tol2 - real :: avg_x, avg_y, avg_z - real :: var_comb, var_comb_0, dist_cent - real :: mean_x, mean_y, mean_z - real :: points(N,3) -!==============================================================================! - - ! First take aliasesd - Grid => Vof % pnt_grid - - ! Initialize variables - var_comb = HUGE - var_comb_0 = 0.0 - vof_tol1 = MICRO - vof_tol2 = MILI - dist_cent = Grid % vol(c) ** ONE_THIRD - vof_int = HUGE - - n_tot = 0 - n_int = 0 - - ! find bounding box: - xmin = HUGE; ymin = HUGE; zmin = HUGE; - xmax = -HUGE; ymax = -HUGE; zmax = -HUGE; - - do nod = 1, Grid % cells_n_nodes(c) - xmin = min(xmin, Grid % xn(Grid % cells_n(nod,c))) - ymin = min(ymin, Grid % yn(Grid % cells_n(nod,c))) - zmin = min(zmin, Grid % zn(Grid % cells_n(nod,c))) - xmax = max(xmax, Grid % xn(Grid % cells_n(nod,c))) - ymax = max(ymax, Grid % yn(Grid % cells_n(nod,c))) - zmax = max(zmax, Grid % zn(Grid % cells_n(nod,c))) - end do - - l_cel = .false. - - do while ( (n_tot < N) .and. (abs(var_comb - var_comb_0) > vof_tol1 .or. & - (var_comb / dist_cent) > vof_tol2) ) - - l_cel = .false. - - ! check if p is inside cell - do while (l_cel .eqv. .false.) - call random_number(r_num) - p(1) = xmin + (xmax-xmin) * r_num - call random_number(r_num) - p(2) = ymin+ (ymax-ymin) * r_num - call random_number(r_num) - p(3) = zmin+ (zmax-zmin) * r_num - l_cel = Grid % Is_Point_In_Cell(c, p(1), p(2), p(3)) - end do - n_tot = n_tot + 1 - - points(n_tot,:) = p(:) - - ! Check if p is inside function: - res_func = ( ( (p2_y-p1_y)*(p1_z-p(3)) & - -(p1_y-p(2))*(p2_z-p1_z))**2 & - +( (p2_x-p1_x)*(p1_z-p(3)) & - -(p1_x-p(1))*(p2_z-p1_z))**2 & - +( (p2_x-p1_x)*(p1_y-p(2)) & - -(p1_x-p(1))*(p2_y-p1_y))**2 ) & - / (radius*height) ** 2 - if (res_func <= 1.0) then - n_int = n_int + 1 - end if - - ! Compute maximum difference c/r center: - if (mod(n_tot,500) == 0 .and. n_tot > 0) then - var_comb_0 = var_comb - vof_int = real(n_int) / real(n_tot) - mean_x = sum(points(1: n_tot,1)) / real(n_tot) - mean_y = sum(points(1: n_tot,2)) / real(n_tot) - mean_z = sum(points(1: n_tot,3)) / real(n_tot) - var_comb = abs(mean_x-Grid % xc(c)) & - + abs(mean_y-Grid % yc(c)) & - + abs(mean_z-Grid % zc(c)) - end if - end do - - end subroutine diff --git a/Tests/Vof/User_Mod/Vof_Interface_Ellipsoid.f90 b/Tests/Vof/User_Mod/Vof_Interface_Ellipsoid.f90 deleted file mode 100644 index 41c58afc2..000000000 --- a/Tests/Vof/User_Mod/Vof_Interface_Ellipsoid.f90 +++ /dev/null @@ -1,104 +0,0 @@ -!==============================================================================! - subroutine Vof_Interface_Ellipsoid(Vof, & - c, & - cent_x, cent_y, cent_z, & - radius_1, radius_2, radius_3, & - vof_int) -!------------------------------------------------------------------------------! -! Computes volume fraction of cell at interface ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - type(Vof_Type), target :: Vof - integer, intent(in) :: c - real :: cent_x, cent_y, cent_z - real :: radius_1, radius_2, radius_3 - real :: vof_int -!------------------------------[Local parameters]------------------------------! - integer, parameter :: N = 10000 -!-----------------------------------[Locals]-----------------------------------! - type(Grid_Type), pointer :: Grid - logical :: l_cel - integer :: nod, n_int, n_tot, fu - integer :: ee, n_cylinders, i_vari, n_vari - real :: r_num, res_func - real :: xmin, xmax, ymin, ymax, zmin, zmax - real :: p(3) - real :: vof_0, vof_tol1, vof_tol2 - real :: avg_x, avg_y, avg_z - real :: var_comb, var_comb_0, dist_cent - real :: mean_x, mean_y, mean_z - real :: points(N,3) -!==============================================================================! - - ! First take aliases - Grid => Vof % pnt_grid - - ! Initialize variables - var_comb = HUGE - var_comb_0 = 0.0 - vof_tol1 = MICRO - vof_tol2 = MILI - dist_cent = Grid % vol(c) ** ONE_THIRD - vof_int = HUGE - - n_tot = 0 - n_int = 0 - - ! Find bounding box: - xmin = HUGE; ymin = HUGE; zmin = HUGE; - xmax = -HUGE; ymax = -HUGE; zmax = -HUGE; - - do nod = 1, abs(Grid % cells_n_nodes(c)) - xmin = min(xmin, Grid % xn(Grid % cells_n(nod,c))) - ymin = min(ymin, Grid % yn(Grid % cells_n(nod,c))) - zmin = min(zmin, Grid % zn(Grid % cells_n(nod,c))) - xmax = max(xmax, Grid % xn(Grid % cells_n(nod,c))) - ymax = max(ymax, Grid % yn(Grid % cells_n(nod,c))) - zmax = max(zmax, Grid % zn(Grid % cells_n(nod,c))) - end do - - l_cel = .false. - - do while ( (n_tot < N) .and. (abs(var_comb - var_comb_0) > vof_tol1 .or. & - (var_comb / dist_cent) > vof_tol2) ) - - l_cel = .false. - - ! Check if p is inside cell - do while (l_cel .eqv. .false.) - call random_number(r_num) - p(1) = xmin + (xmax-xmin) * r_num - call random_number(r_num) - p(2) = ymin+ (ymax-ymin) * r_num - call random_number(r_num) - p(3) = zmin+ (zmax-zmin) * r_num - l_cel = Grid % Is_Point_In_Cell(c, p(1), p(2), p(3)) - end do - n_tot = n_tot + 1 - - points(n_tot,:) = p(:) - - ! Check if p is inside function: - res_func = sqrt( ((p(1)-cent_x)/radius_1)**2 & - + ((p(2)-cent_y)/radius_2)**2 & - + ((p(3)-cent_z)/radius_3)**2 ) - - if (res_func <= 1.0) then - n_int = n_int + 1 - end if - - ! Compute maximum difference c/r center: - if (mod(n_tot,500) == 0 .and. n_tot > 0) then - var_comb_0 = var_comb - vof_int = real(n_int) / real(n_tot) - mean_x = sum(points(1: n_tot,1)) / real(n_tot) - mean_y = sum(points(1: n_tot,2)) / real(n_tot) - mean_z = sum(points(1: n_tot,3)) / real(n_tot) - var_comb = abs(mean_x-Grid % xc(c)) & - + abs(mean_y-Grid % yc(c)) & - + abs(mean_z-Grid % zc(c)) - end if - end do - - end subroutine diff --git a/Tests/Vof/User_Mod/Vof_Interface_Plane.f90 b/Tests/Vof/User_Mod/Vof_Interface_Plane.f90 deleted file mode 100644 index cca4f3d2a..000000000 --- a/Tests/Vof/User_Mod/Vof_Interface_Plane.f90 +++ /dev/null @@ -1,102 +0,0 @@ -!==============================================================================! - subroutine Vof_Interface_Plane(Vof, & - c, & - n_xyz, & - dd, & - vof_int) -!------------------------------------------------------------------------------! -! Computes volume fraction of cell at interface ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - type(Vof_Type), target :: Vof - integer, intent(in) :: c - real :: n_xyz(3) - real :: dd - real :: vof_int -!------------------------------[Local parameters]------------------------------! - integer, parameter :: N = 10000 -!-----------------------------------[Locals]-----------------------------------! - type(Grid_Type), pointer :: Grid - logical :: l_cel - integer :: nod, n_int, n_tot, fu - integer :: ee, n_cylinders, i_vari, n_vari - real :: r_num, res_func - real :: xmin, xmax, ymin, ymax, zmin, zmax - real :: p(3) - real :: vof_0, vof_tol1, vof_tol2 - real :: avg_x, avg_y, avg_z - real :: var_comb, var_comb_0, dist_cent - real :: mean_x, mean_y, mean_z - real :: points(N,3) -!==============================================================================! - - ! First take aliases - Grid => Vof % pnt_grid - - ! Initialize variables - var_comb = HUGE - var_comb_0 = 0.0 - vof_tol1 = MICRO - vof_tol2 = MILI - dist_cent = Grid % vol(c) ** ONE_THIRD - vof_int = HUGE - - n_tot = 0 - n_int = 0 - - ! Find bounding box - xmin = HUGE; ymin = HUGE; zmin = HUGE; - xmax = -HUGE; ymax = -HUGE; zmax = -HUGE; - - do nod = 1, Grid % cells_n_nodes(c) - xmin = min(xmin, Grid % xn(Grid % cells_n(nod,c))) - ymin = min(ymin, Grid % yn(Grid % cells_n(nod,c))) - zmin = min(zmin, Grid % zn(Grid % cells_n(nod,c))) - xmax = max(xmax, Grid % xn(Grid % cells_n(nod,c))) - ymax = max(ymax, Grid % yn(Grid % cells_n(nod,c))) - zmax = max(zmax, Grid % zn(Grid % cells_n(nod,c))) - end do - - l_cel = .false. - - do while ( (n_tot < N) .and. (abs(var_comb - var_comb_0) > vof_tol1 .or. & - (var_comb / dist_cent) > vof_tol2) ) - - l_cel = .false. - - ! Check if p is inside cell - do while (l_cel .eqv. .false.) - call random_number(r_num) - p(1) = xmin + (xmax-xmin) * r_num - call random_number(r_num) - p(2) = ymin + (ymax-ymin) * r_num - call random_number(r_num) - p(3) = zmin + (zmax-zmin) * r_num - l_cel = Grid % Is_Point_In_Cell(c, p(1), p(2), p(3)) - end do - n_tot = n_tot + 1 - - points(n_tot, :) = p(:) - - ! Check if p is inside function: - res_func = n_xyz(1) * p(1) + n_xyz(2) * p(2) + n_xyz(3) * p(3) - - if (res_func <= dd) then - n_int = n_int + 1 - end if - - ! Compute maximum difference c/r center: - if (mod(n_tot,500) == 0 .and. n_tot > 0) then - var_comb_0 = var_comb - vof_int = real(n_int) / real(n_tot) - mean_x = sum(points(1: n_tot,1)) / real(n_tot) - mean_y = sum(points(1: n_tot,2)) / real(n_tot) - mean_z = sum(points(1: n_tot,3)) / real(n_tot) - var_comb = abs(mean_x-Grid % xc(c)) & - + abs(mean_y-Grid % yc(c)) & - + abs(mean_z-Grid % zc(c)) - end if - end do - - end subroutine diff --git a/Tests/Vof/User_Mod/Vof_Quick_Sort.f90 b/Tests/Vof/User_Mod/Vof_Quick_Sort.f90 deleted file mode 100644 index 2804711aa..000000000 --- a/Tests/Vof/User_Mod/Vof_Quick_Sort.f90 +++ /dev/null @@ -1,25 +0,0 @@ -recursive subroutine Vof_Quick_Sort(a, coords, dir, first, last) - implicit none - real :: coords(:,:), x, t(3) - integer :: a(:), first, last, ti, dir - integer :: i, j - - x = coords( (first+last) / 2, dir ) - i = first - j = last - do - do while (coords(i, dir) < x) - i=i+1 - end do - do while (x < coords(j, dir)) - j=j-1 - end do - if (i >= j) exit - ti = a(i); a(i) = a(j); a(j) = ti - t = coords(i,:); coords(i,:) = coords(j,:); coords(j,:) = t - i=i+1 - j=j-1 - end do - if (first < i-1) call Vof_Quick_Sort(a, coords, dir, first, i-1) - if (j+1 < last) call Vof_Quick_Sort(a, coords, dir, j+1, last) -end subroutine diff --git a/Tests/Vof/User_Mod/readme b/Tests/Vof/User_Mod/readme deleted file mode 100644 index fbeaa1773..000000000 --- a/Tests/Vof/User_Mod/readme +++ /dev/null @@ -1 +0,0 @@ -Common (shared) user sources for VOF are here. diff --git a/Tests/test_user_functions_compile.sh b/Tests/test_user_functions_compile.sh index fa7d8f11e..53c247893 100755 --- a/Tests/test_user_functions_compile.sh +++ b/Tests/test_user_functions_compile.sh @@ -4,6 +4,9 @@ echo "#!/bin/bash" > worker.sh echo "" >> worker.sh echo "cd ../Sources/Process" >> worker.sh +echo "" >> worker.sh +echo "old_directory=$PWD" >> worker.sh +echo "" >> worker.sh # Find all directories with user function and append commands # for their compilation to the beginning of the test script @@ -12,11 +15,15 @@ find . -name "User_Mod" \ | sed 's/\/User_Mod/\nif \[ -f ..\/..\/Binaries\/Process \]; then echo "SUCCESS"; else echo "FAILURE"; fi/g' \ >> worker.sh -echo "make clean" >> worker.sh +echo "make clean" >> worker.sh +echo "" >> worker.sh +echo "cd $old_directory" >> worker.sh # Make the test script executable chmod 755 worker.sh source ./worker.sh > test_user_functions_compile.$(date +%y-%m-%d-%T).log +cd $old_directory + /bin/rm worker.sh From 49a2cdba5ddb087258f65f4f315f212cf237fc7e Mon Sep 17 00:00:00 2001 From: Niceno Date: Fri, 24 Feb 2023 09:19:50 +0100 Subject: [PATCH 018/223] GOOD: Got rid of the ghost "-1" marks. On branch bojan_fixed_cell_ranges modified: Divide/Divide_Mod/Save_Subdomains.f90 --- Sources/Divide/Divide_Mod/Save_Subdomains.f90 | 45 +++++++++++-------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/Sources/Divide/Divide_Mod/Save_Subdomains.f90 b/Sources/Divide/Divide_Mod/Save_Subdomains.f90 index 35d541daa..3bdd639dd 100644 --- a/Sources/Divide/Divide_Mod/Save_Subdomains.f90 +++ b/Sources/Divide/Divide_Mod/Save_Subdomains.f90 @@ -20,6 +20,8 @@ subroutine Save_Subdomains(Divide, Grid, n_buff_layers) class(Divide_Type) :: Divide type(Grid_Type) :: Grid integer, intent(in) :: n_buff_layers ! number of buffer layers, keep it here +!------------------------------[Local parameters]------------------------------! + integer, parameter :: MARK = -1 !-----------------------------------[Locals]-----------------------------------! integer :: c, n, s, c1, c2, sub, subo, i_nod integer :: ss, sr, nn, reg, bc_indx !exp:, lev @@ -59,7 +61,7 @@ subroutine Save_Subdomains(Divide, Grid, n_buff_layers) Grid % old_c(nc_sub) = c do i_nod = 1, abs(Grid % cells_n_nodes(c)) - Grid % new_n(Grid % cells_n(i_nod,c)) = -1 + Grid % new_n(Grid % cells_n(i_nod,c)) = MARK end do end if end do @@ -79,8 +81,8 @@ subroutine Save_Subdomains(Divide, Grid, n_buff_layers) Grid % Comm % cell_proc(c1) .eq. subo) then nn = Grid % faces_n_nodes(s) ss = Grid % faces_s(s) - Grid % new_n(Grid % faces_n(1:nn, s )) = -1 - Grid % new_n(Grid % faces_n(1:nn, ss)) = -1 + Grid % new_n(Grid % faces_n(1:nn, s )) = MARK + Grid % new_n(Grid % faces_n(1:nn, ss)) = MARK end if end if end do @@ -96,8 +98,8 @@ subroutine Save_Subdomains(Divide, Grid, n_buff_layers) do c = 1, Grid % n_cells if(Grid % Comm % cell_proc(c) .eq. subo) then n = abs(Grid % cells_n_nodes(c)) - if( any(Grid % new_n(Grid % cells_n(1:n, c)) .eq. -1) ) then - Grid % new_c(c) = -1 + if( any(Grid % new_n(Grid % cells_n(1:n, c)) .eq. MARK) ) then + Grid % new_c(c) = MARK end if end if end do @@ -107,9 +109,9 @@ subroutine Save_Subdomains(Divide, Grid, n_buff_layers) !exp: !exp: ! Mark nodes on this level ... !exp: do c = 1, Grid % n_cells -!exp: if(Grid % new_c(c) .eq. -1) then +!exp: if(Grid % new_c(c) .eq. MARK) then !exp: do i_nod = 1, abs(Grid % cells_n_nodes(c)) -!exp: Grid % new_n(Grid % cells_n(i_nod,c)) = -1 +!exp: Grid % new_n(Grid % cells_n(i_nod,c)) = MARK !exp: end do !exp: end if !exp: end do @@ -118,8 +120,8 @@ subroutine Save_Subdomains(Divide, Grid, n_buff_layers) !exp: do c = 1, Grid % n_cells !exp: if(Grid % Comm % cell_proc(c) .eq. subo) then !exp: n = abs(Grid % cells_n_nodes(c)) -!exp: if( any(Grid % new_n(Grid % cells_n(1:n, c)) .eq. -1) ) then -!exp: Grid % new_c(c) = -1 +!exp: if( any(Grid % new_n(Grid % cells_n(1:n, c)) .eq. MARK) ) then +!exp: Grid % new_c(c) = MARK !exp: end if !exp: end if !exp: end do @@ -128,7 +130,7 @@ subroutine Save_Subdomains(Divide, Grid, n_buff_layers) ! Renumber cells in buffer "subo" do c = 1, Grid % n_cells if(Grid % Comm % cell_proc(c) .eq. subo .and. & - Grid % new_c(c) .eq. -1) then + Grid % new_c(c) .eq. MARK) then nc_sub = nc_sub + 1 ! increase the number of cells in sub. Grid % new_c(c) = nc_sub ! assign new (local) cell number Grid % old_c(nc_sub) = c @@ -272,6 +274,11 @@ subroutine Save_Subdomains(Divide, Grid, n_buff_layers) ! ... but the face hasn't, do it now! if(Grid % new_f(s) .eq. 0) then + + ! Neither of the cells should be in this sub, they are in buffers + Assert(Grid % Comm % cell_proc(c1) .ne. sub) + Assert(Grid % Comm % cell_proc(c2) .ne. sub) + nf_sub = nf_sub + 1 Grid % new_f(s) = nf_sub Grid % old_f(nf_sub) = s @@ -313,24 +320,24 @@ subroutine Save_Subdomains(Divide, Grid, n_buff_layers) !-------------------------------------! Grid % new_n(1:Grid % n_nodes) = 0 - !-------------------------------------------------! - ! Mark nodes in cells for renumbering with -1 ! - !-------------------------------------------------! + !---------------------------------------------------! + ! Mark nodes in cells for renumbering with MARK ! + !---------------------------------------------------! do c = -Grid % n_bnd_cells, Grid % n_cells if(Grid % new_c(c) > 0) then do i_nod = 1, abs(Grid % cells_n_nodes(c)) - Grid % new_n(Grid % cells_n(i_nod,c)) = -1 + Grid % new_n(Grid % cells_n(i_nod,c)) = MARK end do end if end do - !-------------------------------------------------! - ! Mark nodes in faces for renumbering with -1 ! - !-------------------------------------------------! + !---------------------------------------------------! + ! Mark nodes in faces for renumbering with MARK ! + !---------------------------------------------------! do s = 1, Grid % n_faces + Grid % n_shadows if(Grid % new_f(s) > 0) then do i_nod = 1, Grid % faces_n_nodes(s) - Grid % new_n(Grid % faces_n(i_nod,s)) = -1 + Grid % new_n(Grid % faces_n(i_nod,s)) = MARK end do end if end do @@ -339,7 +346,7 @@ subroutine Save_Subdomains(Divide, Grid, n_buff_layers) ! Renumber marked nodes ! !---------------------------! do n = 1, Grid % n_nodes - if(Grid % new_n(n) .eq. -1) then + if(Grid % new_n(n) .eq. MARK) then nn_sub = nn_sub + 1 Grid % new_n(n) = nn_sub end if From 5226bffd85217780d81e3e3fb051cc94105a66dc Mon Sep 17 00:00:00 2001 From: Niceno Date: Fri, 24 Feb 2023 09:21:24 +0100 Subject: [PATCH 019/223] Got rid of all of them density contraptions here On branch bojan_fixed_cell_ranges modified: Process/Field_Mod/Utilities/Calculate_Fluxes.f90 --- .../Field_Mod/Utilities/Calculate_Fluxes.f90 | 55 +++++-------------- 1 file changed, 14 insertions(+), 41 deletions(-) diff --git a/Sources/Process/Field_Mod/Utilities/Calculate_Fluxes.f90 b/Sources/Process/Field_Mod/Utilities/Calculate_Fluxes.f90 index 3e74f942d..5aff9cd04 100644 --- a/Sources/Process/Field_Mod/Utilities/Calculate_Fluxes.f90 +++ b/Sources/Process/Field_Mod/Utilities/Calculate_Fluxes.f90 @@ -1,7 +1,7 @@ !==============================================================================! subroutine Calculate_Fluxes(Flow, v_flux) !------------------------------------------------------------------------------! -! Calculate mass fluxes through whole domain. ! +! Calculate volume fluxes through whole domain. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -12,9 +12,6 @@ subroutine Calculate_Fluxes(Flow, v_flux) type(Bulk_Type), pointer :: bulk integer :: c1, c2, s real :: xc1, yc1, zc1, xc2, yc2, zc2, wgt - real :: dens_f - real :: dens_are_x, dens_are_y, dens_are_z ! [kg/m] - real :: dens_avg_x, dens_avg_y, dens_avg_z ! [kg/m^3] !==============================================================================! ! Take some aliases @@ -25,23 +22,13 @@ subroutine Calculate_Fluxes(Flow, v_flux) bulk % flux_y = 0.0 bulk % flux_z = 0.0 - dens_are_x = 0.0 - dens_are_y = 0.0 - dens_are_z = 0.0 - - !-------------------------------------------------------------------------! - ! Summ up mass fluxes [kg/s] over all faces at monitoring plane ! - ! (Resulting mass flux will be for the whole domain, still in [kg/s]) ! - ! In addition, sum up face densities time faca areas [kg/m] ! - !-------------------------------------------------------------------------! + !---------------------------------------------------------------------------! + ! Summ up volume mass fluxes [m^3/s] over all faces at monitoring plane ! + !---------------------------------------------------------------------------! do s = 1, Grid % n_faces c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) - ! Density at the face - dens_f = Flow % density(c1) * Grid % fw(s) & - + Flow % density(c2) * (1.0 - Grid % fw(s)) - if(Grid % Comm % cell_proc(c1) .eq. this_proc) then xc1 = Grid % xc(c1) @@ -54,62 +41,48 @@ subroutine Calculate_Fluxes(Flow, v_flux) ! If the flux is across a buffer face, it is summed up twice. ! The variable "wgt" is here to take care of that. wgt = 1.0 - if(c2 > Grid % n_cells - Grid % Comm % n_buff_cells) wgt = 0.5 + if(Grid % Comm % cell_proc(c2) .ne. this_proc) wgt = 0.5 !-------! ! X ! !-------! if((xc1 <= bulk % xp).and.(xc2 > bulk % xp)) then - bulk % flux_x = bulk % flux_x + wgt * v_flux(s) * dens_f - dens_are_x = dens_are_x + wgt * dens_f * abs(Grid % sx(s)) + bulk % flux_x = bulk % flux_x + wgt * v_flux(s) end if if((xc2 < bulk % xp).and.(xc1 >= bulk % xp)) then - bulk % flux_x = bulk % flux_x - wgt * v_flux(s) * dens_f - dens_are_x = dens_are_x + wgt * dens_f * abs(Grid % sx(s)) + bulk % flux_x = bulk % flux_x - wgt * v_flux(s) end if !-------! ! Y ! !-------! if((yc1 <= bulk % yp).and.(yc2 > bulk % yp)) then - bulk % flux_y = bulk % flux_y + wgt * v_flux(s) * dens_f - dens_are_y = dens_are_y + wgt * dens_f * abs(Grid % sy(s)) + bulk % flux_y = bulk % flux_y + wgt * v_flux(s) end if if((yc2 < bulk % yp).and.(yc1 >= bulk % yp)) then - bulk % flux_y = bulk % flux_y - wgt * v_flux(s) * dens_f - dens_are_y = dens_are_y + wgt * dens_f * abs(Grid % sy(s)) + bulk % flux_y = bulk % flux_y - wgt * v_flux(s) end if !-------! ! Z ! !-------! if((zc1 <= bulk % zp).and.(zc2 > bulk % zp)) then - bulk % flux_z = bulk % flux_z + wgt * v_flux(s) * dens_f - dens_are_z = dens_are_z + wgt * dens_f * abs(Grid % sz(s)) + bulk % flux_z = bulk % flux_z + wgt * v_flux(s) end if if((zc2 < bulk % zp).and.(zc1 >= bulk % zp)) then - bulk % flux_z = bulk % flux_z - wgt * v_flux(s) * dens_f - dens_are_z = dens_are_z + wgt * dens_f * abs(Grid % sz(s)) + bulk % flux_z = bulk % flux_z - wgt * v_flux(s) end if end if end do - ! Calculate average densities in three characterstic planes - call Comm_Mod_Global_Sum_Real(dens_are_x) - call Comm_Mod_Global_Sum_Real(dens_are_y) - call Comm_Mod_Global_Sum_Real(dens_are_z) - dens_avg_x = dens_are_x / (bulk % area_x + NANO) - dens_avg_y = dens_are_y / (bulk % area_y + NANO) - dens_avg_z = dens_are_z / (bulk % area_z + NANO) - call Comm_Mod_Global_Sum_Real(bulk % flux_x) call Comm_Mod_Global_Sum_Real(bulk % flux_y) call Comm_Mod_Global_Sum_Real(bulk % flux_z) ! Bulk velocities. Units: [kg/s] / [kg/m^3] / [m^2] = [m/s] - bulk % u = bulk % flux_x / (dens_avg_x * bulk % area_x + TINY) - bulk % v = bulk % flux_y / (dens_avg_y * bulk % area_y + TINY) - bulk % w = bulk % flux_z / (dens_avg_z * bulk % area_z + TINY) + bulk % u = bulk % flux_x / (bulk % area_x + TINY) + bulk % v = bulk % flux_y / (bulk % area_y + TINY) + bulk % w = bulk % flux_z / (bulk % area_z + TINY) end subroutine From 09105278b76ab3ae9592772af4799398ffb3518b Mon Sep 17 00:00:00 2001 From: Niceno Date: Fri, 24 Feb 2023 10:15:27 +0100 Subject: [PATCH 020/223] Started using browsing macros in Vof_Mod. This implementation was tested heavily agains the Dam_Break_2d case. What I also learned, something a bit disturbing, that Intel does have a tendency to change results slighlt when code is refactored, although the sequence of operations stays the same. I lost almost a week in testing trying to find the cause of differences for new implementations. With GNU Fortran, there are no such issues. On branch bojan_fixed_cell_ranges modified: Vof_Mod.f90 modified: Vof_Mod/Core/Compute_Vof.f90 modified: Vof_Mod/Core/Correct_Beta.f90 modified: Vof_Mod/Core/Discretize.f90 modified: Vof_Mod/Core/Max_Courant_Number.f90 modified: Vof_Mod/Core/Predict_Beta.f90 --- Sources/Process/Vof_Mod.f90 | 1 + Sources/Process/Vof_Mod/Core/Compute_Vof.f90 | 102 ++++---- Sources/Process/Vof_Mod/Core/Correct_Beta.f90 | 78 +++--- Sources/Process/Vof_Mod/Core/Discretize.f90 | 113 +++++---- .../Vof_Mod/Core/Max_Courant_Number.f90 | 48 ++-- Sources/Process/Vof_Mod/Core/Predict_Beta.f90 | 238 +++++++++--------- 6 files changed, 298 insertions(+), 282 deletions(-) diff --git a/Sources/Process/Vof_Mod.f90 b/Sources/Process/Vof_Mod.f90 index cf692b4a1..9a9dce3a4 100644 --- a/Sources/Process/Vof_Mod.f90 +++ b/Sources/Process/Vof_Mod.f90 @@ -1,4 +1,5 @@ #include "../Shared/Assert.h90" +#include "../Shared/Browse.h90" !==============================================================================! module Vof_Mod diff --git a/Sources/Process/Vof_Mod/Core/Compute_Vof.f90 b/Sources/Process/Vof_Mod/Core/Compute_Vof.f90 index 0aef69e91..65cd7e921 100644 --- a/Sources/Process/Vof_Mod/Core/Compute_Vof.f90 +++ b/Sources/Process/Vof_Mod/Core/Compute_Vof.f90 @@ -21,7 +21,7 @@ subroutine Compute_Vof(Vof, Sol, dt, curr_dt) real, contiguous, pointer :: c_d(:) real :: courant_max integer :: i_sub, n_sub, wrong_vf, n_wrong_vf0, n_wrong_vf1 - integer :: s, c, c1, c2, fu, corr + integer :: s, c, c1, c2, fu, corr, reg !==============================================================================! call Profiler % Start('Compute_Vof (without solvers)') @@ -82,12 +82,12 @@ subroutine Compute_Vof(Vof, Sol, dt, curr_dt) !-----------------------------! ! Correct Volume Fraction ! !-----------------------------! - do c = 1, Grid % n_cells + do c = Cells_In_Domain() fun % n(c) = max(min(fun % n(c),1.0),0.0) end do else if(fun % adv_scheme .eq. CICSAM .or. & - fun % adv_scheme .eq. STACS) then + fun % adv_scheme .eq. STACS) then do i_sub = 1, n_sub @@ -99,15 +99,16 @@ subroutine Compute_Vof(Vof, Sol, dt, curr_dt) !---------------------------! ! Impose zero gradient at boundaries - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0) then - if(Grid % Bnd_Cond_Type(c2) .ne. INFLOW) then + do reg = Boundary_Regions() + if(Grid % region % type(reg) .ne. INFLOW) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + fun % n(c2) = fun % n(c1) - end if - end if - end do + end do ! faces + end if ! inflow + end do ! region ! Old volume fraction: fun % o(:) = fun % n(:) @@ -127,22 +128,23 @@ subroutine Compute_Vof(Vof, Sol, dt, curr_dt) ! Solve System call Vof % Solve_System(Sol, b) - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0) then - if(Grid % Bnd_Cond_Type(c2) .ne. INFLOW) then + do reg = Boundary_Regions() + if(Grid % region % type(reg) .ne. INFLOW) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + fun % n(c2) = fun % n(c1) - end if - end if - end do + end do ! faces + end if ! inflow + end do ! region n_wrong_vf0 = 0 n_wrong_vf1 = 0 wrong_vf = 0 ! Determine if 0 <= fun <= 1.0 - do c = 1, Grid % n_cells + do c = Cells_In_Domain() if(fun % n(c) < -fun % tol) then n_wrong_vf0 = n_wrong_vf0 + 1 end if @@ -176,27 +178,26 @@ subroutine Compute_Vof(Vof, Sol, dt, curr_dt) !------------------------! ! Correct boundaries ! !------------------------! - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) + do reg = Boundary_Regions() + if(Grid % region % type(reg) .ne. INFLOW) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) - if(c2 < 0) then - if(Grid % Bnd_Cond_Type( c2) .ne. INFLOW) then if(fun % n(c2) < FEMTO) then fun % n(c2) = 0.0 end if if(fun % n(c2) - 1.0 >= FEMTO) then fun % n(c2) = 1.0 end if - end if - end if - - end do + end do ! faces + end if ! inflow + end do ! region !--------------------------------------! ! Correct Interior Volume Fraction ! !--------------------------------------! - do c = 1, Grid % n_cells + do c = Cells_In_Domain() if(fun % n(c) < FEMTO) then fun % n(c) = 0.0 end if @@ -218,35 +219,30 @@ subroutine Compute_Vof(Vof, Sol, dt, curr_dt) if(fun % adv_scheme .eq. UPWIND) then ! At boundaries - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0) then - if(Grid % Bnd_Cond_Type(c2) .ne. INFLOW) then + do reg = Boundary_Regions() + if(Grid % region % type(reg) .ne. INFLOW) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + fun % n(c2) = fun % n(c1) - end if - end if - end do + end do ! faces + end if ! inflow + end do ! region else if(fun % adv_scheme .eq. CICSAM .or. fun % adv_scheme .eq. STACS) then ! At boundaries - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0) then - if(Grid % Bnd_Cond_Type(c2) .eq. OUTFLOW) then - fun % n(c2) = fun % n(c1) - else if(Grid % Bnd_Cond_Type(c2) .eq. PRESSURE) then - fun % n(c2) = fun % n(c1) - else if(Grid % Bnd_Cond_Type(c2) .eq. CONVECT) then - fun % n(c2) = fun % n(c1) - else if(Grid % Bnd_Cond_Type(c2) .eq. INFLOW) then - else + do reg = Boundary_Regions() + if(Grid % region % type(reg) .ne. INFLOW) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + fun % n(c2) = fun % n(c1) - end if - end if - end do + end do ! faces + end if ! inflow + end do ! region end if diff --git a/Sources/Process/Vof_Mod/Core/Correct_Beta.f90 b/Sources/Process/Vof_Mod/Core/Correct_Beta.f90 index 2c569a35e..db3f61fd9 100644 --- a/Sources/Process/Vof_Mod/Core/Correct_Beta.f90 +++ b/Sources/Process/Vof_Mod/Core/Correct_Beta.f90 @@ -26,62 +26,58 @@ subroutine Correct_Beta(Vof) c_d => Vof % c_d ! Interior faces - do s = 1, Grid % n_faces + do s = Faces_In_Domain() c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) - if(c2 > 0) then + if(abs(v_flux % n(s)) > FEMTO) then - if(abs(v_flux % n(s)) > FEMTO) then - - if(v_flux % n(s) > 0.0) then - donor = c1 - accept = c2 - else - donor = c2 - accept = c1 - end if + if(v_flux % n(s) > 0.0) then + donor = c1 + accept = c2 + else + donor = c2 + accept = c1 + end if - !--------------------! - ! Correct beta_f ! - !--------------------! - bcorr = 0.0 - delta_alfa = 0.5 * (fun % n(accept) + fun % o(accept) & - - (fun % n(donor) + fun % o(donor))) + !--------------------! + ! Correct beta_f ! + !--------------------! + bcorr = 0.0 + delta_alfa = 0.5 * (fun % n(accept) + fun % o(accept) & + - (fun % n(donor) + fun % o(donor))) - cf = c_d(donor) + cf = c_d(donor) - if(fun % n(donor) < 0.0) then - e_minus = max(-fun % n(donor), 0.0) - ! Donor value < 0.0 Ex: sd = -0.1 -> e_minus = +0.1 - if(e_minus > FEMTO .and. cf > FEMTO) then - if(delta_alfa > e_minus) then - bcorr = e_minus * (2.0 + cf - 2.0 * cf * beta_f(s)) & - / (2.0 * cf * (delta_alfa - e_minus)) - bcorr = min(bcorr, beta_f(s)) - end if + if(fun % n(donor) < 0.0) then + e_minus = max(-fun % n(donor), 0.0) + ! Donor value < 0.0 Ex: sd = -0.1 -> e_minus = +0.1 + if(e_minus > FEMTO .and. cf > FEMTO) then + if(delta_alfa > e_minus) then + bcorr = e_minus * (2.0 + cf - 2.0 * cf * beta_f(s)) & + / (2.0 * cf * (delta_alfa - e_minus)) + bcorr = min(bcorr, beta_f(s)) end if end if + end if - if(fun % n(donor) > 1.0) then - e_plus = max(fun % n(donor) - 1.0, 0.0) - ! Donor value > 1.0 Ex: sd = 1.1 -> e_plus = +0.1 - if(e_plus > FEMTO .and. cf > FEMTO) then - if(delta_alfa < - e_plus) then - bcorr = e_plus * (2.0 + cf - 2.0 * cf * beta_f(s)) & - / (2.0 * cf * (-delta_alfa - e_plus)) - bcorr = min(bcorr, beta_f(s)) - end if + if(fun % n(donor) > 1.0) then + e_plus = max(fun % n(donor) - 1.0, 0.0) + ! Donor value > 1.0 Ex: sd = 1.1 -> e_plus = +0.1 + if(e_plus > FEMTO .and. cf > FEMTO) then + if(delta_alfa < - e_plus) then + bcorr = e_plus * (2.0 + cf - 2.0 * cf * beta_f(s)) & + / (2.0 * cf * (-delta_alfa - e_plus)) + bcorr = min(bcorr, beta_f(s)) end if - end if - beta_f(s) = beta_f(s) - bcorr - beta_f(s) = max(beta_f(s), 0.0) - end if - end if ! c2 > 0 + beta_f(s) = beta_f(s) - bcorr + beta_f(s) = max(beta_f(s), 0.0) + + end if end do diff --git a/Sources/Process/Vof_Mod/Core/Discretize.f90 b/Sources/Process/Vof_Mod/Core/Discretize.f90 index 2befc2f6c..678e4ca02 100644 --- a/Sources/Process/Vof_Mod/Core/Discretize.f90 +++ b/Sources/Process/Vof_Mod/Core/Discretize.f90 @@ -16,7 +16,7 @@ subroutine Discretize(Vof, A, b, dt) type(Var_Type), pointer :: fun type(Front_Type), pointer :: Front real, contiguous, pointer :: beta_f(:) - integer :: c, c1, c2, s + integer :: c, c1, c2, s, reg real :: upwd1, upwd2, upwd3, a0 !==============================================================================! @@ -32,87 +32,94 @@ subroutine Discretize(Vof, A, b, dt) b = 0.0 A % val = 0.0 - !-------------------------! - ! Matrix Coefficients ! - !-------------------------! + !------------------------------------! + ! Matrix coefficients for UPWIND ! + !------------------------------------! if(fun % adv_scheme .eq. UPWIND) then ! At boundaries - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) + do reg = Boundary_Regions() + if( Grid % region % type(reg) .eq. OUTFLOW & + .or. Grid % region % type(reg) .eq. CONVECT & + .or. Grid % region % type(reg) .eq. PRESSURE) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) - if(c2 < 0) then - if(Grid % Bnd_Cond_Type(c2) .eq. INFLOW) then - b(c1) = b(c1) - v_flux % n(s) * fun % n(c2) - else if(Grid % Bnd_Cond_Type(c2) .eq. OUTFLOW) then A % val(A % dia(c1)) = A % val(A % dia(c1)) + v_flux % n(s) - end if - end if + end do + else if(Grid % region % type(reg) .eq. INFLOW) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) - end do + b(c1) = b(c1) - v_flux % n(s) * fun % n(c2) + end do + end if ! outflow or inflow + end do ! regions ! Interior faces - do s = 1, Grid % n_faces + do s = Faces_In_Domain() c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) - if(c2 > 0) then - - upwd1 = 0.5 * max( v_flux % n(s), 0.0) - upwd2 = 0.5 * max(-v_flux % n(s), 0.0) - A % val(A % dia(c1)) = A % val(A % dia(c1)) + upwd1 - A % val(A % dia(c2)) = A % val(A % dia(c2)) + upwd2 + upwd1 = 0.5 * max( v_flux % n(s), 0.0) + upwd2 = 0.5 * max(-v_flux % n(s), 0.0) - A % val(A % pos(1,s)) = - upwd2 - A % val(A % pos(2,s)) = - upwd1 + A % val(A % dia(c1)) = A % val(A % dia(c1)) + upwd1 + A % val(A % dia(c2)) = A % val(A % dia(c2)) + upwd2 - b(c1) = b(c1) - ( upwd1 * fun % o(c1) - upwd2 * fun % o(c2) ) - b(c2) = b(c2) - ( upwd2 * fun % o(c2) - upwd1 * fun % o(c1) ) + A % val(A % pos(1,s)) = - upwd2 + A % val(A % pos(2,s)) = - upwd1 - end if + b(c1) = b(c1) - ( upwd1 * fun % o(c1) - upwd2 * fun % o(c2) ) + b(c2) = b(c2) - ( upwd2 * fun % o(c2) - upwd1 * fun % o(c1) ) end do + !----------------------------------------------! + ! Matrix coefficients for CICSAM and STACS ! + !----------------------------------------------! else if(fun % adv_scheme .eq. CICSAM .or. & fun % adv_scheme .eq. STACS) then ! At boundaries - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0) then + do reg = Boundary_Regions() + if( Grid % region % type(reg) .eq. OUTFLOW & + .or. Grid % region % type(reg) .eq. CONVECT & + .or. Grid % region % type(reg) .eq. PRESSURE) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) - if(Grid % Bnd_Cond_Type(c2) .eq. OUTFLOW) then A % val(A % dia(c1)) = A % val(A % dia(c1)) + v_flux % n(s) - else - b(c1) = b(c1) - v_flux % n(s) * fun % n(c2) - end if + end do + else + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) - end if - end do + b(c1) = b(c1) - v_flux % n(s) * fun % n(c2) + end do + end if ! outflow or inflow + end do ! regions ! Interior faces - do s = 1, Grid % n_faces + do s = Faces_In_Domain() c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) - if(c2 > 0) then - - upwd1 = (0.5 - beta_f(s)) * max(-v_flux % n(s), 0.0) & - - 0.5 * beta_f(s) * v_flux % n(s) - upwd2 = (0.5 - beta_f(s)) * max(+v_flux % n(s), 0.0) & - + 0.5 * beta_f(s) * v_flux % n(s) - upwd3 = 0.5 * v_flux % n(s) - A % val(A % dia(c1)) = A % val(A % dia(c1)) + upwd1 + upwd3 - A % val(A % dia(c2)) = A % val(A % dia(c2)) + upwd2 - upwd3 + upwd1 = (0.5 - beta_f(s)) * max(-v_flux % n(s), 0.0) & + - 0.5 * beta_f(s) * v_flux % n(s) + upwd2 = (0.5 - beta_f(s)) * max(+v_flux % n(s), 0.0) & + + 0.5 * beta_f(s) * v_flux % n(s) + upwd3 = 0.5 * v_flux % n(s) - A % val(A % pos(1,s)) = - upwd1 - A % val(A % pos(2,s)) = - upwd2 + A % val(A % dia(c1)) = A % val(A % dia(c1)) + upwd1 + upwd3 + A % val(A % dia(c2)) = A % val(A % dia(c2)) + upwd2 - upwd3 - b(c1) = b(c1) - (upwd1 + upwd3) * fun % o(c1) + upwd1 * fun % o(c2) - b(c2) = b(c2) - (upwd2 - upwd3) * fun % o(c2) + upwd2 * fun % o(c1) + A % val(A % pos(1,s)) = - upwd1 + A % val(A % pos(2,s)) = - upwd2 - end if + b(c1) = b(c1) - (upwd1 + upwd3) * fun % o(c1) + upwd1 * fun % o(c2) + b(c2) = b(c2) - (upwd2 - upwd3) * fun % o(c2) + upwd2 * fun % o(c1) end do end if @@ -124,7 +131,7 @@ subroutine Discretize(Vof, A, b, dt) ! Two time levels; linear interpolation if(fun % td_scheme .eq. LINEAR) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain() a0 = Grid % vol(c) / dt A % val(A % dia(c)) = A % val(A % dia(c)) + a0 b(c) = b(c) + a0 * fun % o(c) @@ -133,7 +140,7 @@ subroutine Discretize(Vof, A, b, dt) ! Three time levels; parabolic interpolation if(fun % td_scheme .eq. PARABOLIC) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain() a0 = Grid % vol(c) / dt A % val(A % dia(c)) = A % val(A % dia(c)) + 1.5 * a0 b(c) = b(c) + 2.0 * a0 * fun % o(c) - 0.5 * a0 * fun % oo(c) diff --git a/Sources/Process/Vof_Mod/Core/Max_Courant_Number.f90 b/Sources/Process/Vof_Mod/Core/Max_Courant_Number.f90 index 09cd4d983..6aec1fe4a 100644 --- a/Sources/Process/Vof_Mod/Core/Max_Courant_Number.f90 +++ b/Sources/Process/Vof_Mod/Core/Max_Courant_Number.f90 @@ -18,7 +18,7 @@ subroutine Max_Courant_Number(Vof, dt, interf, courant_max) type(Var_Type), pointer :: fun type(Face_Type), pointer :: v_flux real, contiguous, pointer :: c_d(:) - integer :: c, c1, c2, s + integer :: c, c1, c2, s, reg real :: fun_dist !==============================================================================! @@ -36,26 +36,41 @@ subroutine Max_Courant_Number(Vof, dt, interf, courant_max) if(interf == 1) then - do s = 1, Grid % n_faces + ! Interior faces + do s = Faces_In_Domain() c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) + ! For c1 fun_dist = min(max(fun % n(c1), 0.0), 1.0) fun_dist = (1.0 - fun_dist) ** 2 * fun_dist ** 2 * 16.0 c_d(c1) = c_d(c1) + fun_dist & * max(-v_flux % n(s) * dt / Grid % vol(c1), 0.0) - if(c2 > 0) then - fun_dist = min(max(fun % n(c2), 0.0), 1.0) + ! For c2 + fun_dist = min(max(fun % n(c2), 0.0), 1.0) - fun_dist = (1.0 - fun_dist) ** 2 * fun_dist ** 2 * 16.0 + fun_dist = (1.0 - fun_dist) ** 2 * fun_dist ** 2 * 16.0 - c_d(c2) = c_d(c2) + fun_dist & - * max( v_flux % n(s) * dt / Grid % vol(c2), 0.0) - end if + c_d(c2) = c_d(c2) + fun_dist & + * max( v_flux % n(s) * dt / Grid % vol(c2), 0.0) end do + ! Boundary faces + do reg = Boundary_Regions() + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + + ! For c1 + fun_dist = min(max(fun % n(c1), 0.0), 1.0) + fun_dist = (1.0 - fun_dist) ** 2 * fun_dist ** 2 * 16.0 + + c_d(c1) = c_d(c1) + fun_dist & + * max(-v_flux % n(s) * dt / Grid % vol(c1), 0.0) + end do ! faces + end do ! regions + ! if(Vof % phase_Change) then ! do c = 1, Grid % n_cells ! fun_dist = min(max(fun % n(c1), 0.0),1.0) @@ -74,18 +89,23 @@ subroutine Max_Courant_Number(Vof, dt, interf, courant_max) else ! interf = 0 - ! At boundaries - do s = 1, Grid % n_faces + ! Interior faces + do s = Faces_In_Domain() c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) c_d(c1) = c_d(c1) + max(-v_flux % n(s) * dt / Grid % vol(c1), 0.0) - - if(c2 > 0) then - c_d(c2) = c_d(c2) + max( v_flux % n(s) * dt / Grid % vol(c2), 0.0) - end if + c_d(c2) = c_d(c2) + max( v_flux % n(s) * dt / Grid % vol(c2), 0.0) end do + ! Boundary faces + do reg = Boundary_Regions() + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c_d(c1) = c_d(c1) + max(-v_flux % n(s) * dt / Grid % vol(c1), 0.0) + end do ! faces + end do ! regions + ! if(Vof % phase_Change) then ! do c = 1, Grid % n_cells ! c_d(c) = c_d(c) + Vof % flux_rate(c) / Flow % density_f(s) * dt diff --git a/Sources/Process/Vof_Mod/Core/Predict_Beta.f90 b/Sources/Process/Vof_Mod/Core/Predict_Beta.f90 index 39e4e6521..fac781409 100644 --- a/Sources/Process/Vof_Mod/Core/Predict_Beta.f90 +++ b/Sources/Process/Vof_Mod/Core/Predict_Beta.f90 @@ -38,169 +38,165 @@ subroutine Predict_Beta(Vof) ! Compute beta_f ! !--------------------! - do s = 1, Grid % n_faces + do s = Faces_In_Domain() c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) - if(c2 > 0) then - - beta_f(s) = 0.0 - if(abs(v_flux % n(s)) > FEMTO) then - - if(v_flux % n(s) > 0.0) then - donor = c1 - accept = c2 - signo = 1.0 - else - donor = c2 - accept = c1 - signo = - 1.0 - end if + beta_f(s) = 0.0 + if(abs(v_flux % n(s)) > FEMTO) then + + if(v_flux % n(s) > 0.0) then + donor = c1 + accept = c2 + signo = 1.0 + else + donor = c2 + accept = c1 + signo = - 1.0 + end if - alfa_d = fun % n(donor) - alfa_a = fun % n(accept) + alfa_d = fun % n(donor) + alfa_a = fun % n(accept) - dotprod = signo * ( fun % x(donor) * Grid % dx(s) & - + fun % y(donor) * Grid % dy(s) & - + fun % z(donor) * Grid % dz(s)) + dotprod = signo * ( fun % x(donor) * Grid % dx(s) & + + fun % y(donor) * Grid % dy(s) & + + fun % z(donor) * Grid % dz(s)) - alfa_u = min(max(alfa_a - 2.0 * dotprod, 0.0), 1.0) ! old way + alfa_u = min(max(alfa_a - 2.0 * dotprod, 0.0), 1.0) ! old way -! call Multiphase_Mod_Vof_Find_Upstream_Phi(fun, & -! fun % x, & -! fun % y, & -! fun % z, & -! s, donor, accept, alfa_u) - ! Face is inside the domain - if(abs(alfa_u - alfa_a) > FEMTO) then +! call Multiphase_Mod_Vof_Find_Upstream_Phi(fun, & +! fun % x, & +! fun % y, & +! fun % z, & +! s, donor, accept, alfa_u) + ! Face is inside the domain + if(abs(alfa_u - alfa_a) > FEMTO) then - alfa_d_til = (alfa_d - alfa_u) / (alfa_a - alfa_u) + alfa_d_til = (alfa_d - alfa_u) / (alfa_a - alfa_u) - cod = min(1.0, c_d(donor)) + cod = min(1.0, c_d(donor)) - ! Compute alfa_cbc - if(alfa_d_til >= 0.0 .and. alfa_d_til <= 1.0) then - alfa_cbc = min(1.0, alfa_d_til / max(cod, FEMTO)) - else - alfa_cbc = alfa_d_til - end if + ! Compute alfa_cbc + if(alfa_d_til >= 0.0 .and. alfa_d_til <= 1.0) then + alfa_cbc = min(1.0, alfa_d_til / max(cod, FEMTO)) + else + alfa_cbc = alfa_d_til + end if - ! Compute alfa_uq - if(alfa_d_til >= 0.0 .and. alfa_d_til <= 1.0) then - alfa_uq = min(cod & - * alfa_d_til + (1.0 - cod) & - * (6.0 * alfa_d_til + 3.0) & - / 8.0, alfa_cbc) - else - alfa_uq = alfa_d_til - end if + ! Compute alfa_uq + if(alfa_d_til >= 0.0 .and. alfa_d_til <= 1.0) then + alfa_uq = min(cod & + * alfa_d_til + (1.0 - cod) & + * (6.0 * alfa_d_til + 3.0) & + / 8.0, alfa_cbc) + else + alfa_uq = alfa_d_til + end if - ! Compute angle: - prodmag = sqrt( fun % x(donor) ** 2 & - + fun % y(donor) ** 2 & - + fun % z(donor) ** 2) & - * Grid % d(s) + ! Compute angle: + prodmag = sqrt( fun % x(donor) ** 2 & + + fun % y(donor) ** 2 & + + fun % z(donor) ** 2) & + * Grid % d(s) - if(prodmag > FEMTO) then - ang = dotprod / prodmag - else - ang = 1.0 / FEMTO - end if + if(prodmag > FEMTO) then + ang = dotprod / prodmag + else + ang = 1.0 / FEMTO + end if - gamma_f = min(ang ** 2, 1.0) + gamma_f = min(ang ** 2, 1.0) - alfa_f_til = gamma_f * alfa_cbc + (1.0 - gamma_f) * alfa_uq + alfa_f_til = gamma_f * alfa_cbc + (1.0 - gamma_f) * alfa_uq - if(abs(1.0 - alfa_d_til) > FEMTO) then + if(abs(1.0 - alfa_d_til) > FEMTO) then - beta_f(s) = min(max((alfa_f_til - alfa_d_til) & - / (1.0 - alfa_d_til) + beta_c(s), 0.0), 1.0) + beta_f(s) = min(max((alfa_f_til - alfa_d_til) & + / (1.0 - alfa_d_til) + beta_c(s), 0.0), 1.0) - end if end if end if - end if ! c2 > 0 - end do ! do s = 1, ... + end if ! abs(v_flux % n(s)) > FEMTO + end do ! faces else if(fun % adv_scheme .eq. STACS) then - do s = 1, Grid % n_faces + do s = Faces_In_Domain() c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) - if(c2 > 0) then + beta_f(s) = 0.0 + if(abs(v_flux % n(s)) > FEMTO) then + + if(v_flux % n(s) > 0.0) then + donor = c1 + accept = c2 + signo = 1.0 + else + donor = c2 + accept = c1 + signo = - 1.0 + end if - beta_f(s) = 0.0 - if(abs(v_flux % n(s)) > FEMTO) then + alfa_d = fun % n(donor) + alfa_a = fun % n(accept) - if(v_flux % n(s) > 0.0) then - donor = c1 - accept = c2 - signo = 1.0 - else - donor = c2 - accept = c1 - signo = - 1.0 - end if + dotprod = signo * ( fun % x(donor) * Grid % dx(s) & + + fun % y(donor) * Grid % dy(s) & + + fun % z(donor) * Grid % dz(s)) - alfa_d = fun % n(donor) - alfa_a = fun % n(accept) + ! Face is inside the domain + alfa_u = min(max(alfa_a - 2.0 * dotprod, 0.0), 1.0) - dotprod = signo * ( fun % x(donor) * Grid % dx(s) & - + fun % y(donor) * Grid % dy(s) & - + fun % z(donor) * Grid % dz(s)) + if(abs(alfa_u - alfa_a) > FEMTO) then - ! Face is inside the domain - alfa_u = min(max(alfa_a - 2.0 * dotprod, 0.0), 1.0) + alfa_d_til = (alfa_d - alfa_u) / (alfa_a - alfa_u) - if(abs(alfa_u - alfa_a) > FEMTO) then + ! Compute alfa_SUBERBEE + if(alfa_d_til > 0.0 .and. alfa_d_til < 1.0) then + alfa_superbee = 1.0 + else + alfa_superbee = alfa_d_til + end if - alfa_d_til = (alfa_d - alfa_u) / (alfa_a - alfa_u) + if(alfa_d_til > 0.0 .and. alfa_d_til <= 0.5) then + alfa_stoic = 0.5 + 0.5 * alfa_d_til + else if(alfa_d_til > 0.5 .and. alfa_d_til <= 5.0 / 6.0) then + alfa_stoic = 3.0 / 8.0 + 3.0 / 4.0 * alfa_d_til + else if(alfa_d_til > 5.0 / 6.0 .and. alfa_d_til <= 1.0) then + alfa_stoic = 1.0 + else + alfa_stoic = alfa_d_til + end if - ! Compute alfa_SUBERBEE - if(alfa_d_til > 0.0 .and. alfa_d_til < 1.0) then - alfa_superbee = 1.0 - else - alfa_superbee = alfa_d_til - end if + ! Compute angle: + prodmag = sqrt( fun % x(donor) ** 2 & + + fun % y(donor) ** 2 & + + fun % z(donor) ** 2) & + * Grid % d(s) - if(alfa_d_til > 0.0 .and. alfa_d_til <= 0.5) then - alfa_stoic = 0.5 + 0.5 * alfa_d_til - else if(alfa_d_til > 0.5 .and. alfa_d_til <= 5.0 / 6.0) then - alfa_stoic = 3.0 / 8.0 + 3.0 / 4.0 * alfa_d_til - else if(alfa_d_til > 5.0 / 6.0 .and. alfa_d_til <= 1.0) then - alfa_stoic = 1.0 - else - alfa_stoic = alfa_d_til - end if + if(prodmag > FEMTO) then + ang = dotprod / prodmag + else + ang = 1.0 / FEMTO + end if - ! Compute angle: - prodmag = sqrt( fun % x(donor) ** 2 & - + fun % y(donor) ** 2 & - + fun % z(donor) ** 2) & - * Grid % d(s) + gamma_f = min(ang ** 4, 1.0) - if(prodmag > FEMTO) then - ang = dotprod / prodmag - else - ang = 1.0 / FEMTO - end if + alfa_f_til = gamma_f * alfa_superbee + (1.0 - gamma_f) * alfa_stoic - gamma_f = min(ang ** 4, 1.0) + if(abs(1.0 - alfa_d_til) > FEMTO) then - alfa_f_til = gamma_f * alfa_superbee + (1.0 - gamma_f) * alfa_stoic + beta_f(s) = min(max((alfa_f_til - alfa_d_til) & + / (1.0 - alfa_d_til) + beta_c(s), 0.0), 1.0) - if(abs(1.0 - alfa_d_til) > FEMTO) then + end if - beta_f(s) = min(max((alfa_f_til - alfa_d_til) & - / (1.0 - alfa_d_til) + beta_c(s), 0.0), 1.0) + end if - end if + end if ! abs(v_flux % n(s)) > FEMTO + end do ! faces - end if - end if - end if ! c2 > 0 - end do ! do s = 1, ... - end if + end if ! STACS end subroutine From bac4e41fb91149ee73163d26274f3a069f551343 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 25 Feb 2023 11:42:13 +0100 Subject: [PATCH 021/223] IMPORTANT FIX to bounary cell ranges. When browsing for starts and ends, is is better to take a HUGE_INT than the number of boundary cells. Namelly, the number of boundary cells could be zero :-S On branch bojan_fixed_cell_ranges modified: Shared/Grid_Mod/Regions_Ranges.f90 --- Sources/Shared/Grid_Mod/Regions_Ranges.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/Shared/Grid_Mod/Regions_Ranges.f90 b/Sources/Shared/Grid_Mod/Regions_Ranges.f90 index f7b747d38..a6f277a81 100644 --- a/Sources/Shared/Grid_Mod/Regions_Ranges.f90 +++ b/Sources/Shared/Grid_Mod/Regions_Ranges.f90 @@ -8,7 +8,7 @@ subroutine Regions_Ranges(Grid) !---------------------------------[Arguments]----------------------------------! class(Grid_Type) :: Grid !------------------------------[Local parameters]------------------------------! - logical, parameter :: DEBUG = .false. + logical, parameter :: DEBUG = .true. !-----------------------------------[Locals]-----------------------------------! integer :: c, c1, c2, reg, s, siz !==============================================================================! @@ -25,7 +25,7 @@ subroutine Regions_Ranges(Grid) ! Set non-realizable ranges Grid % region % f_cell(:) = -1 - Grid % region % l_cell(:) = -Grid % n_bnd_cells + Grid % region % l_cell(:) = -HUGE_INT ! Browse forward and backward to find first and last cell for each range do c = -Grid % n_bnd_cells, -1 From 96e5d756b9413ba339d1d0d7abcb74bd6e23d02e Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 25 Feb 2023 11:43:39 +0100 Subject: [PATCH 022/223] VERY GOOD: Assert adapted for parallel runs On branch bojan_fixed_cell_ranges modified: Shared/Assert_Mod/Handle_Assert.f90 --- Sources/Shared/Assert_Mod/Handle_Assert.f90 | 36 +++++++++++++++------ 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/Sources/Shared/Assert_Mod/Handle_Assert.f90 b/Sources/Shared/Assert_Mod/Handle_Assert.f90 index c89404156..cf3d225e7 100644 --- a/Sources/Shared/Assert_Mod/Handle_Assert.f90 +++ b/Sources/Shared/Assert_Mod/Handle_Assert.f90 @@ -8,17 +8,35 @@ subroutine Handle_Assert(fail, text, file, line) character(*) :: file integer :: line !-----------------------------------[Locals]-----------------------------------! - character(16) :: numb + character(16) :: numb, proc !==============================================================================! - if(fail) then - write(numb, '(i16)') line - print '(7a)', ' Assert(', text, & - ') failed in file ', file, & - ' at line ', trim(adjustl(numb)), & - '.' - call Comm_Mod_End - stop + ! Sequential run + if(n_proc < 2) then + if(fail) then + write(numb, '(i16)') line + print '(7a)', ' Assert(', text, & + ') failed in file ', file, & + ' at line ', trim(adjustl(numb)), & + '.' + call Comm_Mod_End + stop + end if + + ! Parallel run + else + if(fail) then + write(numb, '(i16)') line + write(proc, '(i16)') this_proc + print '(9a)', ' Assert(', text, & + ') failed in file ', file, & + ' at line ', trim(adjustl(numb)), & + ' in processor ', trim(adjustl(proc)), & + '.' + call Comm_Mod_End + stop + end if + end if end subroutine From cebe8b9d395de5f0b5c758f1f9cf82572a4818c9 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 25 Feb 2023 11:44:23 +0100 Subject: [PATCH 023/223] Former HUGE_INT became EULER, and HUGE_INT is 2^30 With Euler's number being the HUGE int we are on the limit of representable integers in 32 bit precision. Any careless addition or sutraction, can yield the number change its sign. On branch bojan_fixed_cell_ranges modified: Shared/Const_Mod.f90 --- Sources/Shared/Const_Mod.f90 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Sources/Shared/Const_Mod.f90 b/Sources/Shared/Const_Mod.f90 index 704917676..387c0b703 100644 --- a/Sources/Shared/Const_Mod.f90 +++ b/Sources/Shared/Const_Mod.f90 @@ -54,7 +54,10 @@ module Const_Mod real, parameter :: HUGE = PETA real, parameter :: TINY = FEMTO - integer, parameter :: HUGE_INT = 2147483647 + integer, parameter :: HUGE_INT = 1073741824 ! this is 2 ** 30 + + ! Euler's prime number (also the largest integer in 32 bit precision) + integer, parameter :: EULER = 2147483647 ! 2 ** 31 - 1 ! Archimedes’ constant real, parameter :: PI = 3.14159265359 From 895f089f345c0a9720bd4ce8cbcb892ce3201634 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 26 Feb 2023 21:11:04 +0100 Subject: [PATCH 024/223] Domain_Mod became a class. This is clearly not very important, but is kind of neat. On branch bojan_fixed_cell_ranges modified: Generate/Domain_Mod.f90 modified: Generate/Domain_Mod/Allocate_Blocks.f90 modified: Generate/Domain_Mod/Allocate_Lines.f90 modified: Generate/Domain_Mod/Allocate_Points.f90 modified: Generate/Domain_Mod/Allocate_Ranges.f90 modified: Generate/Domain_Mod/Calculate_Node_Coordinates.f90 modified: Generate/Domain_Mod/Connect_Blocks.f90 modified: Generate/Domain_Mod/Connect_Periodicity.f90 modified: Generate/Domain_Mod/Distribute_Nodes.f90 modified: Generate/Domain_Mod/Distribute_Ranges.f90 modified: Generate/Domain_Mod/Find_Line.f90 modified: Generate/Domain_Mod/Find_Surface.f90 modified: Generate/Domain_Mod/Is_Line_In_Block.f90 modified: Generate/Domain_Mod/Laplace.f90 modified: Generate/Main_Gen.f90 --- Sources/Generate/Domain_Mod.f90 | 15 ++ .../Generate/Domain_Mod/Allocate_Blocks.f90 | 10 +- .../Generate/Domain_Mod/Allocate_Lines.f90 | 10 +- .../Generate/Domain_Mod/Allocate_Points.f90 | 10 +- .../Generate/Domain_Mod/Allocate_Ranges.f90 | 10 +- .../Domain_Mod/Calculate_Node_Coordinates.f90 | 251 +++++++++--------- .../Generate/Domain_Mod/Connect_Blocks.f90 | 148 +++++------ .../Domain_Mod/Connect_Periodicity.f90 | 220 +++++++-------- .../Generate/Domain_Mod/Distribute_Nodes.f90 | 12 +- .../Generate/Domain_Mod/Distribute_Ranges.f90 | 50 ++-- Sources/Generate/Domain_Mod/Find_Line.f90 | 16 +- Sources/Generate/Domain_Mod/Find_Surface.f90 | 14 +- .../Generate/Domain_Mod/Is_Line_In_Block.f90 | 14 +- Sources/Generate/Domain_Mod/Laplace.f90 | 30 +-- Sources/Generate/Main_Gen.f90 | 12 +- 15 files changed, 418 insertions(+), 404 deletions(-) diff --git a/Sources/Generate/Domain_Mod.f90 b/Sources/Generate/Domain_Mod.f90 index 595160dcf..9e23ac58e 100644 --- a/Sources/Generate/Domain_Mod.f90 +++ b/Sources/Generate/Domain_Mod.f90 @@ -29,6 +29,21 @@ module Domain_Mod type(Line_Type), allocatable :: lines(:) type(Range_Type), allocatable :: ranges(:) + contains + procedure :: Allocate_Points + procedure :: Allocate_Blocks + procedure :: Allocate_Lines + procedure :: Allocate_Ranges + procedure :: Calculate_Node_Coordinates + procedure :: Connect_Blocks + procedure :: Connect_Periodicity + procedure :: Distribute_Nodes + procedure :: Distribute_Ranges + procedure :: Find_Line + procedure :: Find_Surface + procedure :: Is_Line_In_Block + procedure :: Laplace + end type !---------------------------! diff --git a/Sources/Generate/Domain_Mod/Allocate_Blocks.f90 b/Sources/Generate/Domain_Mod/Allocate_Blocks.f90 index 62cd886f6..f4bfd047d 100644 --- a/Sources/Generate/Domain_Mod/Allocate_Blocks.f90 +++ b/Sources/Generate/Domain_Mod/Allocate_Blocks.f90 @@ -1,13 +1,13 @@ !==============================================================================! - subroutine Domain_Mod_Allocate_Blocks(dom, n) + subroutine Allocate_Blocks(Dom, n) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Domain_Type) :: dom - integer :: n + class(Domain_Type) :: Dom + integer, intent(in) :: n !==============================================================================! - dom % n_blocks = n - allocate(dom % blocks(n)) + Dom % n_blocks = n + allocate(Dom % blocks(n)) end subroutine diff --git a/Sources/Generate/Domain_Mod/Allocate_Lines.f90 b/Sources/Generate/Domain_Mod/Allocate_Lines.f90 index 3c9226a42..f01dec268 100644 --- a/Sources/Generate/Domain_Mod/Allocate_Lines.f90 +++ b/Sources/Generate/Domain_Mod/Allocate_Lines.f90 @@ -1,13 +1,13 @@ !==============================================================================! - subroutine Domain_Mod_Allocate_Lines(dom, n) + subroutine Allocate_Lines(Dom, n) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Domain_Type) :: dom - integer :: n + class(Domain_Type) :: Dom + integer, intent(in) :: n !==============================================================================! - dom % n_lines = n - allocate(dom % lines(n)) + Dom % n_lines = n + allocate(Dom % lines(n)) end subroutine diff --git a/Sources/Generate/Domain_Mod/Allocate_Points.f90 b/Sources/Generate/Domain_Mod/Allocate_Points.f90 index d35a4e5e0..fd5f38108 100644 --- a/Sources/Generate/Domain_Mod/Allocate_Points.f90 +++ b/Sources/Generate/Domain_Mod/Allocate_Points.f90 @@ -1,13 +1,13 @@ !==============================================================================! - subroutine Domain_Mod_Allocate_Points(dom, n) + subroutine Allocate_Points(Dom, n) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Domain_Type) :: dom - integer :: n + class(Domain_Type) :: Dom + integer, intent(in) :: n !==============================================================================! - dom % n_points = n - allocate(dom % points(n)) + Dom % n_points = n + allocate(Dom % points(n)) end subroutine diff --git a/Sources/Generate/Domain_Mod/Allocate_Ranges.f90 b/Sources/Generate/Domain_Mod/Allocate_Ranges.f90 index 5bb36f5d9..a26a143d9 100644 --- a/Sources/Generate/Domain_Mod/Allocate_Ranges.f90 +++ b/Sources/Generate/Domain_Mod/Allocate_Ranges.f90 @@ -1,13 +1,13 @@ !==============================================================================! - subroutine Domain_Mod_Allocate_Ranges(dom, n) + subroutine Allocate_Ranges(Dom, n) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Domain_Type) :: dom - integer :: n + class(Domain_Type) :: Dom + integer, intent(in) :: n !==============================================================================! - dom % n_ranges = n - allocate(dom % ranges(n)) + Dom % n_ranges = n + allocate(Dom % ranges(n)) end subroutine diff --git a/Sources/Generate/Domain_Mod/Calculate_Node_Coordinates.f90 b/Sources/Generate/Domain_Mod/Calculate_Node_Coordinates.f90 index 213afa9b6..7f6cbb55e 100644 --- a/Sources/Generate/Domain_Mod/Calculate_Node_Coordinates.f90 +++ b/Sources/Generate/Domain_Mod/Calculate_Node_Coordinates.f90 @@ -1,12 +1,12 @@ !==============================================================================! - subroutine Domain_Mod_Calculate_Node_Coordinates(dom, Grid) + subroutine Calculate_Node_Coordinates(Dom, Grid) !------------------------------------------------------------------------------! ! Calculate node coordinates inside the domain, block by block. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Domain_Type) :: dom - type(Grid_Type) :: Grid + class(Domain_Type) :: Dom + type(Grid_Type) :: Grid !-----------------------------------[Locals]-----------------------------------! integer :: fc, b, bl, i, j, k, n, c, ig integer :: l, l1, l2 @@ -28,79 +28,78 @@ subroutine Domain_Mod_Calculate_Node_Coordinates(dom, Grid) Grid % n_nodes = 0 ! initialize n.o.n. Grid % n_cells = 0 ! initialize n.o.v. - do b = 1, size(dom % blocks) + do b = 1, size(Dom % blocks) print '(a38,i7)', '# Generating block: ', b - ni=dom % blocks(b) % resolutions(1) - nj=dom % blocks(b) % resolutions(2) - nk=dom % blocks(b) % resolutions(3) + ni = Dom % blocks(b) % resolutions(1) + nj = Dom % blocks(b) % resolutions(2) + nk = Dom % blocks(b) % resolutions(3) ! ( 1 ) n = Grid % n_nodes + ( 1-1)*ni*nj + ( 1-1)*ni + 1 - Grid % xn(n) = dom % points(dom % blocks(b) % corners(1)) % x - Grid % yn(n) = dom % points(dom % blocks(b) % corners(1)) % y - Grid % zn(n) = dom % points(dom % blocks(b) % corners(1)) % z + Grid % xn(n) = Dom % points(Dom % blocks(b) % corners(1)) % x + Grid % yn(n) = Dom % points(Dom % blocks(b) % corners(1)) % y + Grid % zn(n) = Dom % points(Dom % blocks(b) % corners(1)) % z ! ( 2 ) n = Grid % n_nodes + ( 1-1)*ni*nj + ( 1-1)*ni + ni - Grid % xn(n) = dom % points(dom % blocks(b) % corners(2)) % x - Grid % yn(n) = dom % points(dom % blocks(b) % corners(2)) % y - Grid % zn(n) = dom % points(dom % blocks(b) % corners(2)) % z + Grid % xn(n) = Dom % points(Dom % blocks(b) % corners(2)) % x + Grid % yn(n) = Dom % points(Dom % blocks(b) % corners(2)) % y + Grid % zn(n) = Dom % points(Dom % blocks(b) % corners(2)) % z ! ( 3 ) n = Grid % n_nodes + ( 1-1)*ni*nj + (nj-1)*ni + 1 - Grid % xn(n) = dom % points(dom % blocks(b) % corners(3)) % x - Grid % yn(n) = dom % points(dom % blocks(b) % corners(3)) % y - Grid % zn(n) = dom % points(dom % blocks(b) % corners(3)) % z + Grid % xn(n) = Dom % points(Dom % blocks(b) % corners(3)) % x + Grid % yn(n) = Dom % points(Dom % blocks(b) % corners(3)) % y + Grid % zn(n) = Dom % points(Dom % blocks(b) % corners(3)) % z ! ( 4 ) n = Grid % n_nodes + ( 1-1)*ni*nj + (nj-1)*ni + ni - Grid % xn(n) = dom % points(dom % blocks(b) % corners(4)) % x - Grid % yn(n) = dom % points(dom % blocks(b) % corners(4)) % y - Grid % zn(n) = dom % points(dom % blocks(b) % corners(4)) % z + Grid % xn(n) = Dom % points(Dom % blocks(b) % corners(4)) % x + Grid % yn(n) = Dom % points(Dom % blocks(b) % corners(4)) % y + Grid % zn(n) = Dom % points(Dom % blocks(b) % corners(4)) % z ! ( 5 ) ! n = Grid % n_nodes + (nk-1)*ni*nj + ( 1-1)*ni + 1 - Grid % xn(n) = dom % points(dom % blocks(b) % corners(5)) % x - Grid % yn(n) = dom % points(dom % blocks(b) % corners(5)) % y - Grid % zn(n) = dom % points(dom % blocks(b) % corners(5)) % z + Grid % xn(n) = Dom % points(Dom % blocks(b) % corners(5)) % x + Grid % yn(n) = Dom % points(Dom % blocks(b) % corners(5)) % y + Grid % zn(n) = Dom % points(Dom % blocks(b) % corners(5)) % z ! ( 6 ) ! n = Grid % n_nodes + (nk-1)*ni*nj + ( 1-1)*ni + ni - Grid % xn(n) = dom % points(dom % blocks(b) % corners(6)) % x - Grid % yn(n) = dom % points(dom % blocks(b) % corners(6)) % y - Grid % zn(n) = dom % points(dom % blocks(b) % corners(6)) % z + Grid % xn(n) = Dom % points(Dom % blocks(b) % corners(6)) % x + Grid % yn(n) = Dom % points(Dom % blocks(b) % corners(6)) % y + Grid % zn(n) = Dom % points(Dom % blocks(b) % corners(6)) % z ! ( 7 ) ! n = Grid % n_nodes + (nk-1)*ni*nj + (nj-1)*ni + 1 - Grid % xn(n) = dom % points(dom % blocks(b) % corners(7)) % x - Grid % yn(n) = dom % points(dom % blocks(b) % corners(7)) % y - Grid % zn(n) = dom % points(dom % blocks(b) % corners(7)) % z + Grid % xn(n) = Dom % points(Dom % blocks(b) % corners(7)) % x + Grid % yn(n) = Dom % points(Dom % blocks(b) % corners(7)) % y + Grid % zn(n) = Dom % points(Dom % blocks(b) % corners(7)) % z ! ( 8 ) ! n = Grid % n_nodes + (nk-1)*ni*nj + (nj-1)*ni + ni - Grid % xn(n) = dom % points(dom % blocks(b) % corners(8)) % x - Grid % yn(n) = dom % points(dom % blocks(b) % corners(8)) % y - Grid % zn(n) = dom % points(dom % blocks(b) % corners(8)) % z + Grid % xn(n) = Dom % points(Dom % blocks(b) % corners(8)) % x + Grid % yn(n) = Dom % points(Dom % blocks(b) % corners(8)) % y + Grid % zn(n) = Dom % points(Dom % blocks(b) % corners(8)) % z !------------------------------! - ! First on the dom % lines ! + ! First on the Dom % lines ! ! defined point by point ! !------------------------------! - do l=1, size(dom % lines) + do l=1, size(Dom % lines) - bl = Domain_Mod_Is_Line_in_Block(dom, & - dom % lines(l) % points(1), & - dom % lines(l) % points(2), & - b) + bl = Dom % Is_Line_in_Block(Dom % lines(l) % points(1), & + Dom % lines(l) % points(2), & + b) if(bl .eq. b) then do n = 1, 8 - if( dom % lines(l) % points(1) & - .eq. dom % blocks(b) % corners(n) ) l1=n - if( dom % lines(l) % points(2) & - .eq. dom % blocks(b) % corners(n) ) l2=n + if( Dom % lines(l) % points(1) & + .eq. Dom % blocks(b) % corners(n) ) l1=n + if( Dom % lines(l) % points(2) & + .eq. Dom % blocks(b) % corners(n) ) l2=n end do ! Line is defined in the +i direction @@ -112,29 +111,29 @@ subroutine Domain_Mod_Calculate_Node_Coordinates(dom, Grid) if( (l1 .eq. 1).or.(l1 .eq. 5) ) then trans(2,1) =1 else - trans(2,1) =dom % blocks(b) % resolutions(2) + trans(2,1) =Dom % blocks(b) % resolutions(2) end if if( (l1 .eq. 1).or.(l1 .eq. 3) ) then trans(3,1) =1 else - trans(3,1) =dom % blocks(b) % resolutions(3) + trans(3,1) =Dom % blocks(b) % resolutions(3) end if ! Line is defined in the -i direction else if( (l2-l1) .eq. -1 ) then - trans(1,1) =dom % blocks(b) % resolutions(1)+1 ! ni from block + 1 + trans(1,1) =Dom % blocks(b) % resolutions(1)+1 ! ni from block + 1 trans(1,2) =-1 trans(2,2) = 0 trans(3,2) = 0 if( (l1 .eq. 2).or.(l1 .eq. 6) ) then trans(2,1) =1 else - trans(2,1) =dom % blocks(b) % resolutions(2) + trans(2,1) =Dom % blocks(b) % resolutions(2) end if if( (l1 .eq. 2).or.(l1 .eq. 4) ) then trans(3,1) =1 else - trans(3,1) =dom % blocks(b) % resolutions(3) + trans(3,1) =Dom % blocks(b) % resolutions(3) end if ! Line is defined in the +j direction @@ -146,29 +145,29 @@ subroutine Domain_Mod_Calculate_Node_Coordinates(dom, Grid) if( (l1 .eq. 1).or.(l1 .eq. 5) ) then trans(1,1) =1 else - trans(1,1) =dom % blocks(b) % resolutions(1) + trans(1,1) =Dom % blocks(b) % resolutions(1) end if if( (l1 .eq. 1).or.(l1 .eq. 2) ) then trans(3,1) =1 else - trans(3,1) =dom % blocks(b) % resolutions(3) + trans(3,1) =Dom % blocks(b) % resolutions(3) end if ! Line is defined in the -j direction else if( (l2-l1) .eq. -2 ) then - trans(2,1) =dom % blocks(b) % resolutions(2)+1 ! nj from block + 1 + trans(2,1) =Dom % blocks(b) % resolutions(2)+1 ! nj from block + 1 trans(2,2) =-1 trans(1,2) = 0 trans(3,2) = 0 if( (l1 .eq. 3).or.(l1 .eq. 7) ) then trans(1,1) =1 else - trans(1,1) =dom % blocks(b) % resolutions(1) + trans(1,1) =Dom % blocks(b) % resolutions(1) end if if( (l1 .eq. 3).or.(l1 .eq. 4) ) then trans(3,1) =1 else - trans(3,1) =dom % blocks(b) % resolutions(3) + trans(3,1) =Dom % blocks(b) % resolutions(3) end if ! Line is defined in the +k direction @@ -180,47 +179,47 @@ subroutine Domain_Mod_Calculate_Node_Coordinates(dom, Grid) if( (l1 .eq. 1).or.(l1 .eq. 3) ) then trans(1,1) =1 else - trans(1,1) =dom % blocks(b) % resolutions(1) + trans(1,1) =Dom % blocks(b) % resolutions(1) end if if( (l1 .eq. 1).or.(l1 .eq. 2) ) then trans(2,1) =1 else - trans(2,1) =dom % blocks(b) % resolutions(2) + trans(2,1) =Dom % blocks(b) % resolutions(2) end if ! Line is defined in the -k direction else if( (l2-l1) .eq. -4 ) then - trans(3,1) =dom % blocks(b) % resolutions(3) + 1 ! nk from block + 1 + trans(3,1) =Dom % blocks(b) % resolutions(3) + 1 ! nk from block + 1 trans(3,2) =-1 trans(1,2) = 0 trans(2,2) = 0 if( (l1 .eq. 5).or.(l1 .eq. 7) ) then trans(1,1) =1 else - trans(1,1) =dom % blocks(b) % resolutions(1) + trans(1,1) =Dom % blocks(b) % resolutions(1) end if if( (l1 .eq. 5).or.(l1 .eq. 6) ) then trans(2,1) =1 else - trans(2,1) =dom % blocks(b) % resolutions(2) + trans(2,1) =Dom % blocks(b) % resolutions(2) end if end if ! l1-l2 ! Line is defined point by point - if( Math % Approx_Real( dom % lines(l) % weight, 0.0) ) then + if( Math % Approx_Real( Dom % lines(l) % weight, 0.0) ) then print *, '# Line: ', l print *, '# l1= ', l1 print *, '# l2= ', l2 - do ig=1,dom % lines(l) % resolution + do ig=1,Dom % lines(l) % resolution i=trans(1,1)+trans(1,2)*ig j=trans(2,1)+trans(2,2)*ig k=trans(3,1)+trans(3,2)*ig n = Grid % n_nodes + (k-1)*ni*nj + (j-1)*ni + i - Grid % xn(n) = dom % lines(l) % x(ig) - Grid % yn(n) = dom % lines(l) % y(ig) - Grid % zn(n) = dom % lines(l) % z(ig) + Grid % xn(n) = Dom % lines(l) % x(ig) + Grid % yn(n) = Dom % lines(l) % y(ig) + Grid % zn(n) = Dom % lines(l) % z(ig) end do ! Line is defined with a weight factor @@ -228,39 +227,39 @@ subroutine Domain_Mod_Calculate_Node_Coordinates(dom, Grid) is=trans(1,1)+trans(1,2) js=trans(2,1)+trans(2,2) ks=trans(3,1)+trans(3,2) - ie=trans(1,1)+trans(1,2)*dom % lines(l) % resolution - je=trans(2,1)+trans(2,2)*dom % lines(l) % resolution - ke=trans(3,1)+trans(3,2)*dom % lines(l) % resolution - call Domain_Mod_Distribute_Nodes(dom, Grid, & - b, dom % lines(l) % weight, & + ie=trans(1,1)+trans(1,2)*Dom % lines(l) % resolution + je=trans(2,1)+trans(2,2)*Dom % lines(l) % resolution + ke=trans(3,1)+trans(3,2)*Dom % lines(l) % resolution + call Dom % Distribute_Nodes(Grid, & + b, Dom % lines(l) % weight, & is, js, ks, ie, je, ke) end if end if ! if the block contains - end do ! for the dom % lines + end do ! for the Dom % lines !-----------! ! Lines ! !-----------! do k=1,nk,nk-1 do j=1,nj,nj-1 - call Domain_Mod_Distribute_Nodes(dom, Grid, & - b, dom % blocks(b) % weights(1), 1,j,k,ni,j,k) + call Dom % Distribute_Nodes(Grid, & + b, Dom % blocks(b) % weights(1), 1,j,k,ni,j,k) end do end do do k=1,nk,nk-1 do i=1,ni,ni-1 - call Domain_Mod_Distribute_Nodes(dom, Grid, & - b, dom % blocks(b) % weights(2), i,1,k,i,nj,k) + call Dom % Distribute_Nodes(Grid, & + b, Dom % blocks(b) % weights(2), i,1,k,i,nj,k) end do end do do j=1,nj,nj-1 do i=1,ni,ni-1 - call Domain_Mod_Distribute_Nodes(dom, Grid, & - b, dom % blocks(b) % weights(3), i,j,1,i,j,nk) + call Dom % Distribute_Nodes(Grid, & + b, Dom % blocks(b) % weights(3), i,j,1,i,j,nk) end do end do @@ -268,23 +267,23 @@ subroutine Domain_Mod_Calculate_Node_Coordinates(dom, Grid) ! Surfaces... ! ! ! ! I think this is the propper way to calculate surfaces: ! - ! it spans the dom % lines in the direction of higher weigh ! + ! it spans the Dom % lines in the direction of higher weigh ! !---------------------------------------------------------------! ! I (k=1) fc = 1 ! face index k = 1 if( .not. Math % Approx_Real( & - dom % blocks(b) % face_weights(fc,1),1.0 ) ) then + Dom % blocks(b) % face_weights(fc,1),1.0 ) ) then do j=1,nj - call Domain_Mod_Distribute_Nodes(dom, Grid, & - b, dom % blocks(b) % face_weights(fc,1), & + call Dom % Distribute_Nodes(Grid, & + b, Dom % blocks(b) % face_weights(fc,1), & 1,j,k,ni,j,k) end do - else ! dom % lines in the j direction + else ! Dom % lines in the j direction do i=1,ni - call Domain_Mod_Distribute_Nodes(dom, Grid, & - b, dom % blocks(b) % face_weights(fc,2), & + call Dom % Distribute_Nodes(Grid, & + b, Dom % blocks(b) % face_weights(fc,2), & i,1,k,i,nj,k) end do end if @@ -293,16 +292,16 @@ subroutine Domain_Mod_Calculate_Node_Coordinates(dom, Grid) fc = 6 ! face index k = nk if( .not. Math % Approx_Real( & - dom % blocks(b) % face_weights(fc,1),1.0 ) ) then + Dom % blocks(b) % face_weights(fc,1),1.0 ) ) then do j=1,nj - call Domain_Mod_Distribute_Nodes(dom, Grid, & - b, dom % blocks(b) % face_weights(fc,1), & + call Dom % Distribute_Nodes(Grid, & + b, Dom % blocks(b) % face_weights(fc,1), & 1,j,k,ni,j,k) end do - else ! dom % lines in the j direction + else ! Dom % lines in the j direction do i=1,ni - call Domain_Mod_Distribute_Nodes(dom, Grid, & - b, dom % blocks(b) % face_weights(fc,2), & + call Dom % Distribute_Nodes(Grid, & + b, Dom % blocks(b) % face_weights(fc,2), & i,1,k,i,nj,k) end do end if @@ -311,16 +310,16 @@ subroutine Domain_Mod_Calculate_Node_Coordinates(dom, Grid) fc = 5 ! face index i = 1 if( .not. Math % Approx_Real( & - dom % blocks(b) % face_weights(fc,3),1.0 ) ) then + Dom % blocks(b) % face_weights(fc,3),1.0 ) ) then do j=1,nj - call Domain_Mod_Distribute_Nodes(dom, Grid, & - b, dom % blocks(b) % face_weights(fc,3), & + call Dom % Distribute_Nodes(Grid, & + b, Dom % blocks(b) % face_weights(fc,3), & i,j,1,i,j,nk) end do - else ! dom % lines in the j direction + else ! Dom % lines in the j direction do k=1,nk - call Domain_Mod_Distribute_Nodes(dom, Grid, & - b, dom % blocks(b) % face_weights(fc,2), & + call Dom % Distribute_Nodes(Grid, & + b, Dom % blocks(b) % face_weights(fc,2), & i,1,k,i,nj,k) end do end if @@ -329,16 +328,16 @@ subroutine Domain_Mod_Calculate_Node_Coordinates(dom, Grid) fc = 3 ! face index i = ni if( .not. Math % Approx_Real( & - dom % blocks(b) % face_weights(fc,3),1.0 ) ) then + Dom % blocks(b) % face_weights(fc,3),1.0 ) ) then do j=1,nj - call Domain_Mod_Distribute_Nodes(dom, Grid, & - b, dom % blocks(b) % face_weights(fc,3), & + call Dom % Distribute_Nodes(Grid, & + b, Dom % blocks(b) % face_weights(fc,3), & i,j,1,i,j,nk) end do - else ! dom % lines in the j direction + else ! Dom % lines in the j direction do k=1,nk - call Domain_Mod_Distribute_Nodes(dom, Grid, & - b, dom % blocks(b) % face_weights(fc,2), & + call Dom % Distribute_Nodes(Grid, & + b, Dom % blocks(b) % face_weights(fc,2), & i,1,k,i,nj,k) end do end if @@ -347,16 +346,16 @@ subroutine Domain_Mod_Calculate_Node_Coordinates(dom, Grid) fc = 2 ! face index j = 1 if( .not. Math % Approx_Real( & - dom % blocks(b) % face_weights(fc,3),1.0 ) ) then + Dom % blocks(b) % face_weights(fc,3),1.0 ) ) then do i=1,ni - call Domain_Mod_Distribute_Nodes(dom, Grid, & - b, dom % blocks(b) % face_weights(fc,3), & + call Dom % Distribute_Nodes(Grid, & + b, Dom % blocks(b) % face_weights(fc,3), & i,j,1,i,j,nk) end do - else ! dom % lines in the i direction + else ! Dom % lines in the i direction do k=1,nk - call Domain_Mod_Distribute_Nodes(dom, Grid, & - b, dom % blocks(b) % face_weights(fc,1), & + call Dom % Distribute_Nodes(Grid, & + b, Dom % blocks(b) % face_weights(fc,1), & 1,j,k,ni,j,k) end do end if @@ -365,16 +364,16 @@ subroutine Domain_Mod_Calculate_Node_Coordinates(dom, Grid) fc = 4 ! face index j = nj if( .not. Math % Approx_Real( & - dom % blocks(b) % face_weights(fc,3),1.0 ) ) then + Dom % blocks(b) % face_weights(fc,3),1.0 ) ) then do i=1,ni - call Domain_Mod_Distribute_Nodes(dom, Grid, & - b, dom % blocks(b) % face_weights(fc,3), & + call Dom % Distribute_Nodes(Grid, & + b, Dom % blocks(b) % face_weights(fc,3), & i,j,1,i,j,nk) end do - else ! dom % lines in the i direction + else ! Dom % lines in the i direction do k=1,nk - call Domain_Mod_Distribute_Nodes(dom, Grid, & - b, dom % blocks(b) % face_weights(fc,1), & + call Dom % Distribute_Nodes(Grid, & + b, Dom % blocks(b) % face_weights(fc,1), & 1,j,k,ni,j,k) end do end if @@ -383,27 +382,27 @@ subroutine Domain_Mod_Calculate_Node_Coordinates(dom, Grid) ! Volumes ! !-------------! if( .not. Math % Approx_Real( & - dom % blocks(b) % weights(3), 1.0 ) ) then + Dom % blocks(b) % weights(3), 1.0 ) ) then do i=1,ni do j=1,nj - call Domain_Mod_Distribute_Nodes(dom, Grid, & - b, dom % blocks(b) % weights(3), i,j,1,i,j,nk) + call Dom % Distribute_Nodes(Grid, & + b, Dom % blocks(b) % weights(3), i,j,1,i,j,nk) end do end do else if( .not. Math % Approx_Real( & - dom % blocks(b) % weights(1), 1.0 ) ) then + Dom % blocks(b) % weights(1), 1.0 ) ) then do k=1,nk do j=1,nj - call Domain_Mod_Distribute_Nodes(dom, Grid, & - b, dom % blocks(b) % weights(1), 1,j,k,ni,j,k) + call Dom % Distribute_Nodes(Grid, & + b, Dom % blocks(b) % weights(1), 1,j,k,ni,j,k) end do end do else if( .not. Math % Approx_Real( & - dom % blocks(b) % weights(2), 1.0 ) ) then + Dom % blocks(b) % weights(2), 1.0 ) ) then do k=1,nk do i=1,ni - call Domain_Mod_Distribute_Nodes(dom, Grid, & - b, dom % blocks(b) % weights(2), i,1,k,i,nj,k) + call Dom % Distribute_Nodes(Grid, & + b, Dom % blocks(b) % weights(2), i,1,k,i,nj,k) end do end do else @@ -412,10 +411,10 @@ subroutine Domain_Mod_Calculate_Node_Coordinates(dom, Grid) do j=1,nj do k=1,nk n = Grid % n_nodes+(k-1)*ni*nj + (j-1)*ni + i - call Domain_Mod_Laplace(dom, Grid, b, i, j, k, & - ONE_THIRD, ONE_THIRD, ONE_THIRD, & - ONE_THIRD, ONE_THIRD, ONE_THIRD, & - ONE_THIRD, ONE_THIRD, ONE_THIRD) + call Dom % Laplace(Grid, b, i, j, k, & + ONE_THIRD, ONE_THIRD, ONE_THIRD, & + ONE_THIRD, ONE_THIRD, ONE_THIRD, & + ONE_THIRD, ONE_THIRD, ONE_THIRD) end do end do end do @@ -468,11 +467,11 @@ subroutine Domain_Mod_Calculate_Node_Coordinates(dom, Grid) end do ! Old number of nodes and cells - dom % blocks(b) % n_nodes = Grid % n_nodes - dom % blocks(b) % n_cells = Grid % n_cells + Dom % blocks(b) % n_nodes = Grid % n_nodes + Dom % blocks(b) % n_cells = Grid % n_cells Grid % n_nodes = Grid % n_nodes + ni*nj*nk Grid % n_cells = Grid % n_cells + ci*cj*ck - end do ! through dom % blocks + end do ! through Dom % blocks end subroutine diff --git a/Sources/Generate/Domain_Mod/Connect_Blocks.f90 b/Sources/Generate/Domain_Mod/Connect_Blocks.f90 index 5eae3c224..0aebcfdda 100644 --- a/Sources/Generate/Domain_Mod/Connect_Blocks.f90 +++ b/Sources/Generate/Domain_Mod/Connect_Blocks.f90 @@ -1,12 +1,12 @@ !==============================================================================! - subroutine Domain_Mod_Connect_Blocks(dom, Grid) + subroutine Connect_Blocks(Dom, Grid) !------------------------------------------------------------------------------! ! Solve the cell connectivity after block by block grid generation ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Domain_Type) :: dom - type(Grid_Type) :: Grid + class(Domain_Type) :: Dom + type(Grid_Type) :: Grid !-----------------------------------[Locals]-----------------------------------! integer :: i, j, n ! counters integer :: b1, b2 ! block 1 and 2 @@ -14,11 +14,11 @@ subroutine Domain_Mod_Connect_Blocks(dom, Grid) integer :: n11,n12,n13,n14,n21,n22,n23,n24 ! global node numbers integer :: l11,l12,l13,l14,l21,l22,l23,l24 ! local node numbers integer :: g1, g2, g3, g4 ! generic points - integer :: i1, j1, i2, j2, k1, k2 ! directions in dom % blocks + integer :: i1, j1, i2, j2, k1, k2 ! directions in Dom % blocks integer :: ig, jg, nig, njg ! generic plane - integer :: ci1, cj1, ck1, ci2, cj2, ck2 ! resolution of dom % blocks + integer :: ci1, cj1, ck1, ci2, cj2, ck2 ! resolution of Dom % blocks integer :: c1, c2 ! cells from block 1, 2 - integer :: ni1, nj1, nk1, ni2, nj2, nk2 ! resolution of dom % blocks + integer :: ni1, nj1, nk1, ni2, nj2, nk2 ! resolution of Dom % blocks integer :: n1, n2 ! from block 1, 2 integer :: trans1(3,3), trans2(3,3) integer :: del ! number of deleted nodes @@ -29,8 +29,8 @@ subroutine Domain_Mod_Connect_Blocks(dom, Grid) Grid % new_n(n) = n end do - ! If number of dom % blocks is equal to one, there is nothing to do - if(size(dom % blocks) .eq. 1) return + ! If number of Dom % blocks is equal to one, there is nothing to do + if(size(Dom % blocks) .eq. 1) return ! Initialize the number of deleted nodes del=0 @@ -40,7 +40,7 @@ subroutine Domain_Mod_Connect_Blocks(dom, Grid) !-----------------------------------------------------! ! Search through all block and all of their faces ! !-----------------------------------------------------! - do b2 = 2, size(dom % blocks) + do b2 = 2, size(Dom % blocks) do b1 = 1, b2-1 do f2 = 1, 6 ! faces of the second block do f1 = 1, 6 ! faces of the first block @@ -53,14 +53,14 @@ subroutine Domain_Mod_Connect_Blocks(dom, Grid) end do end do - n11 = dom % blocks(b1) % faces(f1, 1) - n12 = dom % blocks(b1) % faces(f1, 2) - n13 = dom % blocks(b1) % faces(f1, 3) - n14 = dom % blocks(b1) % faces(f1, 4) - n21 = dom % blocks(b2) % faces(f2, 1) - n22 = dom % blocks(b2) % faces(f2, 2) - n23 = dom % blocks(b2) % faces(f2, 3) - n24 = dom % blocks(b2) % faces(f2, 4) + n11 = Dom % blocks(b1) % faces(f1, 1) + n12 = Dom % blocks(b1) % faces(f1, 2) + n13 = Dom % blocks(b1) % faces(f1, 3) + n14 = Dom % blocks(b1) % faces(f1, 4) + n21 = Dom % blocks(b2) % faces(f2, 1) + n22 = Dom % blocks(b2) % faces(f2, 2) + n23 = Dom % blocks(b2) % faces(f2, 3) + n24 = Dom % blocks(b2) % faces(f2, 4) ! Check if they are connected if( ((n11 .eq. n21).and.(n13 .eq. n23)) .or. & @@ -76,108 +76,108 @@ subroutine Domain_Mod_Connect_Blocks(dom, Grid) ! Find local nodes (1-8) from blocks 1 and 2 on generic surface do n = 1, 8 - if(dom % blocks(b1) % corners(n) .eq. g1) l11=n - if(dom % blocks(b2) % corners(n) .eq. g1) l21=n - if(dom % blocks(b1) % corners(n) .eq. g2) l12=n - if(dom % blocks(b2) % corners(n) .eq. g2) l22=n - if(dom % blocks(b1) % corners(n) .eq. g3) l13=n - if(dom % blocks(b2) % corners(n) .eq. g3) l23=n - if(dom % blocks(b1) % corners(n) .eq. g4) l14=n - if(dom % blocks(b2) % corners(n) .eq. g4) l24=n + if(Dom % blocks(b1) % corners(n) .eq. g1) l11=n + if(Dom % blocks(b2) % corners(n) .eq. g1) l21=n + if(Dom % blocks(b1) % corners(n) .eq. g2) l12=n + if(Dom % blocks(b2) % corners(n) .eq. g2) l22=n + if(Dom % blocks(b1) % corners(n) .eq. g3) l13=n + if(Dom % blocks(b2) % corners(n) .eq. g3) l23=n + if(Dom % blocks(b1) % corners(n) .eq. g4) l14=n + if(Dom % blocks(b2) % corners(n) .eq. g4) l24=n end do ! Direction ig, block 1 if((l14-l11) .eq. +1) then - nig = dom % blocks(b1) % resolutions(1) ! ni from block 1 + nig = Dom % blocks(b1) % resolutions(1) ! ni from block 1 trans1(1,2)=+1 elseif((l14-l11) .eq. +2) then - nig = dom % blocks(b1) % resolutions(2) ! nj from block 1 + nig = Dom % blocks(b1) % resolutions(2) ! nj from block 1 trans1(2,2)=+1 elseif((l14-l11) .eq. +4) then - nig = dom % blocks(b1) % resolutions(3) ! nk from block 1 + nig = Dom % blocks(b1) % resolutions(3) ! nk from block 1 trans1(3,2)=+1 elseif((l14-l11) .eq. -1) then - nig = dom % blocks(b1) % resolutions(1) ! ni from block 1 + nig = Dom % blocks(b1) % resolutions(1) ! ni from block 1 trans1(1,1)=nig trans1(1,2)=-1 elseif((l14-l11) .eq. -2) then - nig = dom % blocks(b1) % resolutions(2) ! nj from block 1 + nig = Dom % blocks(b1) % resolutions(2) ! nj from block 1 trans1(2,1)=nig trans1(2,2)=-1 elseif((l14-l11) .eq. -4) then - nig = dom % blocks(b1) % resolutions(3) ! nk from block 1 + nig = Dom % blocks(b1) % resolutions(3) ! nk from block 1 trans1(3,1)=nig trans1(3,2)=-1 end if ! Direction jg, block 1 if((l12-l11) .eq. +1) then - njg = dom % blocks(b1) % resolutions(1) ! ni from block 1 + njg = Dom % blocks(b1) % resolutions(1) ! ni from block 1 trans1(1,3)=+1 elseif((l12-l11) .eq. +2) then - njg = dom % blocks(b1) % resolutions(2) ! nj from block 1 + njg = Dom % blocks(b1) % resolutions(2) ! nj from block 1 trans1(2,3)=+1 elseif((l12-l11) .eq. +4) then - njg = dom % blocks(b1) % resolutions(3) ! nk from block 1 + njg = Dom % blocks(b1) % resolutions(3) ! nk from block 1 trans1(3,3)=+1 elseif((l12-l11) .eq. -1) then - njg = dom % blocks(b1) % resolutions(1) ! ni from block 1 + njg = Dom % blocks(b1) % resolutions(1) ! ni from block 1 trans1(1,1)=njg trans1(1,3)=-1 elseif((l12-l11) .eq. -2) then - njg = dom % blocks(b1) % resolutions(2) ! nj from block 1 + njg = Dom % blocks(b1) % resolutions(2) ! nj from block 1 trans1(2,1)=njg trans1(2,3)=-1 elseif((l12-l11) .eq. -4) then - njg = dom % blocks(b1) % resolutions(3) ! nk from block 1 + njg = Dom % blocks(b1) % resolutions(3) ! nk from block 1 trans1(3,1)=njg trans1(3,3)=-1 end if ! Direction ig, block 2 if((l24-l21) .eq. +1) then - nig = dom % blocks(b2) % resolutions(1) ! ni from block 2 + nig = Dom % blocks(b2) % resolutions(1) ! ni from block 2 trans2(1,2)=+1 elseif((l24-l21) .eq. +2) then - nig = dom % blocks(b2) % resolutions(2) ! nj from block 2 + nig = Dom % blocks(b2) % resolutions(2) ! nj from block 2 trans2(2,2)=+1 elseif((l24-l21) .eq. +4) then - nig = dom % blocks(b2) % resolutions(3) ! nk from block 2 + nig = Dom % blocks(b2) % resolutions(3) ! nk from block 2 trans2(3,2)=+1 elseif((l24-l21) .eq. -1) then - nig = dom % blocks(b2) % resolutions(1) ! ni from block 2 + nig = Dom % blocks(b2) % resolutions(1) ! ni from block 2 trans2(1,1)=nig trans2(1,2)=-1 elseif((l24-l21) .eq. -2) then - nig = dom % blocks(b2) % resolutions(2) ! nj from block 2 + nig = Dom % blocks(b2) % resolutions(2) ! nj from block 2 trans2(2,1)=nig trans2(2,2)=-1 elseif((l24-l21) .eq. -4) then - nig = dom % blocks(b2) % resolutions(3) ! nk from block 2 + nig = Dom % blocks(b2) % resolutions(3) ! nk from block 2 trans2(3,1)=nig trans2(3,2)=-1 end if ! Direction jg, block 2 if((l22-l21) .eq. +1) then - njg = dom % blocks(b2) % resolutions(1) ! ni from block 2 + njg = Dom % blocks(b2) % resolutions(1) ! ni from block 2 trans2(1,3)=+1 elseif((l22-l21) .eq. +2) then - njg = dom % blocks(b2) % resolutions(2) ! nj from block 2 + njg = Dom % blocks(b2) % resolutions(2) ! nj from block 2 trans2(2,3)=+1 elseif((l22-l21) .eq. +4) then - njg = dom % blocks(b2) % resolutions(3) ! nk from block 2 + njg = Dom % blocks(b2) % resolutions(3) ! nk from block 2 trans2(3,3)=+1 elseif((l22-l21) .eq. -1) then - njg = dom % blocks(b2) % resolutions(1) ! ni from block 2 + njg = Dom % blocks(b2) % resolutions(1) ! ni from block 2 trans2(1,1)=njg trans2(1,3)=-1 elseif((l22-l21) .eq. -2) then - njg = dom % blocks(b2) % resolutions(2) ! nj from block 2 + njg = Dom % blocks(b2) % resolutions(2) ! nj from block 2 trans2(2,1)=njg trans2(2,3)=-1 elseif((l22-l21) .eq. -4) then - njg = dom % blocks(b2) % resolutions(3) ! nk from block 2 + njg = Dom % blocks(b2) % resolutions(3) ! nk from block 2 trans2(3,1)=njg trans2(3,3)=-1 end if @@ -185,36 +185,36 @@ subroutine Domain_Mod_Connect_Blocks(dom, Grid) ! Set the constant directions if(f1 .eq. 1) trans1(3,1)=1 if(f1 .eq. 2) trans1(2,1)=1 - if(f1 .eq. 3) trans1(1,1)=dom % blocks(b1) % resolutions(1)-1 - if(f1 .eq. 4) trans1(2,1)=dom % blocks(b1) % resolutions(2)-1 + if(f1 .eq. 3) trans1(1,1)=Dom % blocks(b1) % resolutions(1)-1 + if(f1 .eq. 4) trans1(2,1)=Dom % blocks(b1) % resolutions(2)-1 if(f1 .eq. 5) trans1(1,1)=1 - if(f1 .eq. 6) trans1(3,1)=dom % blocks(b1) % resolutions(3)-1 + if(f1 .eq. 6) trans1(3,1)=Dom % blocks(b1) % resolutions(3)-1 if(f2 .eq. 1) trans2(3,1)=1 if(f2 .eq. 2) trans2(2,1)=1 - if(f2 .eq. 3) trans2(1,1)=dom % blocks(b2) % resolutions(1)-1 - if(f2 .eq. 4) trans2(2,1)=dom % blocks(b2) % resolutions(2)-1 + if(f2 .eq. 3) trans2(1,1)=Dom % blocks(b2) % resolutions(1)-1 + if(f2 .eq. 4) trans2(2,1)=Dom % blocks(b2) % resolutions(2)-1 if(f2 .eq. 5) trans2(1,1)=1 - if(f2 .eq. 6) trans2(3,1)=dom % blocks(b2) % resolutions(3)-1 + if(f2 .eq. 6) trans2(3,1)=Dom % blocks(b2) % resolutions(3)-1 - ! Finally conect the two dom % blocks + ! Finally conect the two Dom % blocks do jg=1,njg-1 ! through cells only do ig=1,nig-1 ! through cells only - ci1=dom % blocks(b1) % resolutions(1)-1 - cj1=dom % blocks(b1) % resolutions(2)-1 - ck1=dom % blocks(b1) % resolutions(3)-1 - ci2=dom % blocks(b2) % resolutions(1)-1 - cj2=dom % blocks(b2) % resolutions(2)-1 - ck2=dom % blocks(b2) % resolutions(3)-1 + ci1=Dom % blocks(b1) % resolutions(1)-1 + cj1=Dom % blocks(b1) % resolutions(2)-1 + ck1=Dom % blocks(b1) % resolutions(3)-1 + ci2=Dom % blocks(b2) % resolutions(1)-1 + cj2=Dom % blocks(b2) % resolutions(2)-1 + ck2=Dom % blocks(b2) % resolutions(3)-1 i1 = trans1(1,1) + trans1(1,2)*ig + trans1(1,3)*jg j1 = trans1(2,1) + trans1(2,2)*ig + trans1(2,3)*jg k1 = trans1(3,1) + trans1(3,2)*ig + trans1(3,3)*jg i2 = trans2(1,1) + trans2(1,2)*ig + trans2(1,3)*jg j2 = trans2(2,1) + trans2(2,2)*ig + trans2(2,3)*jg k2 = trans2(3,1) + trans2(3,2)*ig + trans2(3,3)*jg - c1 = dom % blocks(b1) % n_cells & + c1 = Dom % blocks(b1) % n_cells & + (k1-1)*ci1*cj1 + (j1-1)*ci1 + i1 - c2 = dom % blocks(b2) % n_cells & + c2 = Dom % blocks(b2) % n_cells & + (k2-1)*ci2*cj2 + (j2-1)*ci2 + i2 Grid % cells_c(f1,c1) = c2 Grid % cells_c(f2,c2) = c1 @@ -232,21 +232,21 @@ subroutine Domain_Mod_Connect_Blocks(dom, Grid) ! Conect the nodes do jg=1,njg ! through nodes do ig=1,nig ! through nodes - ni1=dom % blocks(b1) % resolutions(1) - nj1=dom % blocks(b1) % resolutions(2) - nk1=dom % blocks(b1) % resolutions(3) - ni2=dom % blocks(b2) % resolutions(1) - nj2=dom % blocks(b2) % resolutions(2) - nk2=dom % blocks(b2) % resolutions(3) + ni1=Dom % blocks(b1) % resolutions(1) + nj1=Dom % blocks(b1) % resolutions(2) + nk1=Dom % blocks(b1) % resolutions(3) + ni2=Dom % blocks(b2) % resolutions(1) + nj2=Dom % blocks(b2) % resolutions(2) + nk2=Dom % blocks(b2) % resolutions(3) i1 = trans1(1,1) + trans1(1,2)*ig + trans1(1,3)*jg j1 = trans1(2,1) + trans1(2,2)*ig + trans1(2,3)*jg k1 = trans1(3,1) + trans1(3,2)*ig + trans1(3,3)*jg i2 = trans2(1,1) + trans2(1,2)*ig + trans2(1,3)*jg j2 = trans2(2,1) + trans2(2,2)*ig + trans2(2,3)*jg k2 = trans2(3,1) + trans2(3,2)*ig + trans2(3,3)*jg - n1 = dom % blocks(b1) % n_nodes & + n1 = Dom % blocks(b1) % n_nodes & + (k1-1)*ni1*nj1 + (j1-1)*ni1 + i1 - n2 = dom % blocks(b2) % n_nodes & + n2 = Dom % blocks(b2) % n_nodes & + (k2-1)*ni2*nj2 + (j2-1)*ni2 + i2 Grid % new_n(n2) = Grid % new_n(n1) end do @@ -259,8 +259,8 @@ subroutine Domain_Mod_Connect_Blocks(dom, Grid) end do ! b1 ! Update node numbers - do n = dom % blocks(b2) % n_nodes + 1, & - dom % blocks(b2) % n_nodes + ni2*nj2*nk2 + do n = Dom % blocks(b2) % n_nodes + 1, & + Dom % blocks(b2) % n_nodes + ni2*nj2*nk2 if(Grid % new_n(n) .ne. n) del = del + 1 if(Grid % new_n(n) .eq. n) Grid % new_n(n) = Grid % new_n(n) - del end do diff --git a/Sources/Generate/Domain_Mod/Connect_Periodicity.f90 b/Sources/Generate/Domain_Mod/Connect_Periodicity.f90 index e1e0a26c8..e7448dd7d 100644 --- a/Sources/Generate/Domain_Mod/Connect_Periodicity.f90 +++ b/Sources/Generate/Domain_Mod/Connect_Periodicity.f90 @@ -1,12 +1,12 @@ !==============================================================================! - subroutine Domain_Mod_Connect_Periodicity(dom, Grid) + subroutine Connect_Periodicity(Dom, Grid) !------------------------------------------------------------------------------! ! Solve the cell connectivity for periodic boundary conditions. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Domain_Type) :: dom - type(Grid_Type) :: Grid + class(Domain_Type) :: Dom + type(Grid_Type) :: Grid !-----------------------------------[Locals]-----------------------------------! integer :: i, j, n, p ! counters integer :: b1, b2 ! block 1 and 2 @@ -14,17 +14,17 @@ subroutine Domain_Mod_Connect_Periodicity(dom, Grid) integer :: n11,n12,n13,n14,n21,n22,n23,n24 ! global node numbers integer :: p11,p12,p13,p14,p21,p22,p23,p24 ! global node numbers integer :: l11,l12,l13,l14,l21,l22,l23,l24 ! local node numbers - integer :: i1, j1, i2, j2, k1, k2 ! directions in dom % blocks - integer :: ig, jg, nig, njg ! generic plane - integer :: ci1, cj1, ck1, ci2, cj2, ck2 ! resolution of dom % blocks + integer :: i1, j1, i2, j2, k1, k2 ! directions in Dom % blocks + integer :: ig, jg, nig, njg ! generic plane + integer :: ci1, cj1, ck1, ci2, cj2, ck2 ! resolution of Dom % blocks integer :: c1, c2 ! cells from block 1, 2 - integer :: ni1, nj1, nk1, ni2, nj2, nk2 ! resolution of dom % blocks + integer :: ni1, nj1, nk1, ni2, nj2, nk2 ! resolution of Dom % blocks integer :: n1, n2 ! from block 1, 2 integer :: n3, i3, new integer :: trans1(3,3), trans2(3,3) !==============================================================================! - ! Initialise twin_n. + ! Initialise twin_n do n = 1, Grid % max_n_nodes twin_n(n,0) = 0 end do @@ -32,13 +32,13 @@ subroutine Domain_Mod_Connect_Periodicity(dom, Grid) !-----------------------------------------------------! ! Search through all block and all of their faces ! !-----------------------------------------------------! - do p = 1, n_periodic_cond - do b2 = 1, size(dom % blocks) - do b1 = 1, size(dom % blocks) + do p = 1, n_periodic_cond + do b2 = 1, size(Dom % blocks) + do b1 = 1, size(Dom % blocks) do f2 = 1, 6 ! faces of the second block do f1 = 1, 6 ! faces of the first block - ! Initialize the transformation matrixes + ! Initialize the transformation matrixes do i=1,3 do j=1,3 trans1(i,j)=0 @@ -46,141 +46,141 @@ subroutine Domain_Mod_Connect_Periodicity(dom, Grid) end do end do - n11 = dom % blocks(b1) % faces(f1, 1) - n12 = dom % blocks(b1) % faces(f1, 2) - n13 = dom % blocks(b1) % faces(f1, 3) - n14 = dom % blocks(b1) % faces(f1, 4) - n21 = dom % blocks(b2) % faces(f2, 1) - n22 = dom % blocks(b2) % faces(f2, 2) - n23 = dom % blocks(b2) % faces(f2, 3) - n24 = dom % blocks(b2) % faces(f2, 4) + n11 = Dom % blocks(b1) % faces(f1, 1) + n12 = Dom % blocks(b1) % faces(f1, 2) + n13 = Dom % blocks(b1) % faces(f1, 3) + n14 = Dom % blocks(b1) % faces(f1, 4) + n21 = Dom % blocks(b2) % faces(f2, 1) + n22 = Dom % blocks(b2) % faces(f2, 2) + n23 = Dom % blocks(b2) % faces(f2, 3) + n24 = Dom % blocks(b2) % faces(f2, 4) p11=periodic_cond(p, 1) p12=periodic_cond(p, 2) p13=periodic_cond(p, 3) - p14=periodic_cond(p, 4) + p14=periodic_cond(p, 4) p21=periodic_cond(p, 5) p22=periodic_cond(p, 6) p23=periodic_cond(p, 7) p24=periodic_cond(p, 8) - ! Check if they are connected - if( ( ((n11 .eq. p11).and.(n13 .eq. p13)) .or. & - ((n11 .eq. p14).and.(n13 .eq. p12)) .or. & - ((n11 .eq. p13).and.(n13 .eq. p11)) .or. & - ((n11 .eq. p12).and.(n13 .eq. p14)) ) & - .and. & - ( ((n21 .eq. p21).and.(n23 .eq. p23)) .or. & - ((n21 .eq. p24).and.(n23 .eq. p22)) .or. & - ((n21 .eq. p23).and.(n23 .eq. p21)) .or. & - ((n21 .eq. p22).and.(n23 .eq. p24)) ) ) then + ! Check if they are connected + if( ( ((n11 .eq. p11).and.(n13 .eq. p13)) .or. & + ((n11 .eq. p14).and.(n13 .eq. p12)) .or. & + ((n11 .eq. p13).and.(n13 .eq. p11)) .or. & + ((n11 .eq. p12).and.(n13 .eq. p14)) ) & + .and. & + ( ((n21 .eq. p21).and.(n23 .eq. p23)) .or. & + ((n21 .eq. p24).and.(n23 .eq. p22)) .or. & + ((n21 .eq. p23).and.(n23 .eq. p21)) .or. & + ((n21 .eq. p22).and.(n23 .eq. p24)) ) ) then ! Find local nodes (1-8) from blocks 1 and 2 on generic surface do n=1,8 - if(dom % blocks(b1) % corners(n) .eq. p11) l11=n - if(dom % blocks(b1) % corners(n) .eq. p12) l12=n - if(dom % blocks(b1) % corners(n) .eq. p13) l13=n - if(dom % blocks(b1) % corners(n) .eq. p14) l14=n - if(dom % blocks(b2) % corners(n) .eq. p21) l21=n - if(dom % blocks(b2) % corners(n) .eq. p22) l22=n - if(dom % blocks(b2) % corners(n) .eq. p23) l23=n - if(dom % blocks(b2) % corners(n) .eq. p24) l24=n + if(Dom % blocks(b1) % corners(n) .eq. p11) l11=n + if(Dom % blocks(b1) % corners(n) .eq. p12) l12=n + if(Dom % blocks(b1) % corners(n) .eq. p13) l13=n + if(Dom % blocks(b1) % corners(n) .eq. p14) l14=n + if(Dom % blocks(b2) % corners(n) .eq. p21) l21=n + if(Dom % blocks(b2) % corners(n) .eq. p22) l22=n + if(Dom % blocks(b2) % corners(n) .eq. p23) l23=n + if(Dom % blocks(b2) % corners(n) .eq. p24) l24=n end do print '(a31,2i7)', '# Periodicity between blocks: ', b1, b2 ! Direction ig, block 1 if((l14-l11) .eq. +1) then - nig = dom % blocks(b1) % resolutions(1) ! ni from block 1 + nig = Dom % blocks(b1) % resolutions(1) ! ni from block 1 trans1(1,2)=+1 elseif((l14-l11) .eq. +2) then - nig = dom % blocks(b1) % resolutions(2) ! nj from block 1 + nig = Dom % blocks(b1) % resolutions(2) ! nj from block 1 trans1(2,2)=+1 - elseif((l14-l11) .eq. +4) then - nig = dom % blocks(b1) % resolutions(3) ! nk from block 1 + elseif((l14-l11) .eq. +4) then + nig = Dom % blocks(b1) % resolutions(3) ! nk from block 1 trans1(3,2)=+1 - elseif((l14-l11) .eq. -1) then - nig = dom % blocks(b1) % resolutions(1) ! ni from block 1 + elseif((l14-l11) .eq. -1) then + nig = Dom % blocks(b1) % resolutions(1) ! ni from block 1 trans1(1,1)=nig trans1(1,2)=-1 - elseif((l14-l11) .eq. -2) then - nig = dom % blocks(b1) % resolutions(2) ! nj from block 1 + elseif((l14-l11) .eq. -2) then + nig = Dom % blocks(b1) % resolutions(2) ! nj from block 1 trans1(2,1)=nig trans1(2,2)=-1 - elseif((l14-l11) .eq. -4) then - nig = dom % blocks(b1) % resolutions(3) ! nk from block 1 + elseif((l14-l11) .eq. -4) then + nig = Dom % blocks(b1) % resolutions(3) ! nk from block 1 trans1(3,1)=nig trans1(3,2)=-1 end if - ! Direction jg, block 1 - if((l12-l11) .eq. +1) then - njg = dom % blocks(b1) % resolutions(1) ! ni from block 1 + ! Direction jg, block 1 + if((l12-l11) .eq. +1) then + njg = Dom % blocks(b1) % resolutions(1) ! ni from block 1 trans1(1,3)=+1 elseif((l12-l11) .eq. +2) then - njg = dom % blocks(b1) % resolutions(2) ! nj from block 1 + njg = Dom % blocks(b1) % resolutions(2) ! nj from block 1 trans1(2,3)=+1 elseif((l12-l11) .eq. +4) then - njg = dom % blocks(b1) % resolutions(3) ! nk from block 1 + njg = Dom % blocks(b1) % resolutions(3) ! nk from block 1 trans1(3,3)=+1 elseif((l12-l11) .eq. -1) then - njg = dom % blocks(b1) % resolutions(1) ! ni from block 1 + njg = Dom % blocks(b1) % resolutions(1) ! ni from block 1 trans1(1,1)=njg trans1(1,3)=-1 elseif((l12-l11) .eq. -2) then - njg = dom % blocks(b1) % resolutions(2) ! nj from block 1 + njg = Dom % blocks(b1) % resolutions(2) ! nj from block 1 trans1(2,1)=njg trans1(2,3)=-1 elseif((l12-l11) .eq. -4) then - njg = dom % blocks(b1) % resolutions(3) ! nk from block 1 + njg = Dom % blocks(b1) % resolutions(3) ! nk from block 1 trans1(3,1)=njg trans1(3,3)=-1 end if ! Direction ig, block 2 if((l24-l21) .eq. +1) then - nig = dom % blocks(b2) % resolutions(1) ! ni from block 2 + nig = Dom % blocks(b2) % resolutions(1) ! ni from block 2 trans2(1,2)=+1 elseif((l24-l21) .eq. +2) then - nig = dom % blocks(b2) % resolutions(2) ! nj from block 2 + nig = Dom % blocks(b2) % resolutions(2) ! nj from block 2 trans2(2,2)=+1 - elseif((l24-l21) .eq. +4) then - nig = dom % blocks(b2) % resolutions(3) ! nk from block 2 + elseif((l24-l21) .eq. +4) then + nig = Dom % blocks(b2) % resolutions(3) ! nk from block 2 trans2(3,2)=+1 - elseif((l24-l21) .eq. -1) then - nig = dom % blocks(b2) % resolutions(1) ! ni from block 2 + elseif((l24-l21) .eq. -1) then + nig = Dom % blocks(b2) % resolutions(1) ! ni from block 2 trans2(1,1)=nig trans2(1,2)=-1 - elseif((l24-l21) .eq. -2) then - nig = dom % blocks(b2) % resolutions(2) ! nj from block 2 + elseif((l24-l21) .eq. -2) then + nig = Dom % blocks(b2) % resolutions(2) ! nj from block 2 trans2(2,1)=nig trans2(2,2)=-1 - elseif((l24-l21) .eq. -4) then - nig = dom % blocks(b2) % resolutions(3) ! nk from block 2 + elseif((l24-l21) .eq. -4) then + nig = Dom % blocks(b2) % resolutions(3) ! nk from block 2 trans2(3,1)=nig trans2(3,2)=-1 end if - ! Direction jg, block 2 - if((l22-l21) .eq. +1) then - njg = dom % blocks(b2) % resolutions(1) ! ni from block 2 + ! Direction jg, block 2 + if((l22-l21) .eq. +1) then + njg = Dom % blocks(b2) % resolutions(1) ! ni from block 2 trans2(1,3)=+1 elseif((l22-l21) .eq. +2) then - njg = dom % blocks(b2) % resolutions(2) ! nj from block 2 + njg = Dom % blocks(b2) % resolutions(2) ! nj from block 2 trans2(2,3)=+1 elseif((l22-l21) .eq. +4) then - njg = dom % blocks(b2) % resolutions(3) ! nk from block 2 + njg = Dom % blocks(b2) % resolutions(3) ! nk from block 2 trans2(3,3)=+1 elseif((l22-l21) .eq. -1) then - njg = dom % blocks(b2) % resolutions(1) ! ni from block 2 + njg = Dom % blocks(b2) % resolutions(1) ! ni from block 2 trans2(1,1)=njg trans2(1,3)=-1 elseif((l22-l21) .eq. -2) then - njg = dom % blocks(b2) % resolutions(2) ! nj from block 2 + njg = Dom % blocks(b2) % resolutions(2) ! nj from block 2 trans2(2,1)=njg trans2(2,3)=-1 elseif((l22-l21) .eq. -4) then - njg = dom % blocks(b2) % resolutions(3) ! nk from block 2 + njg = Dom % blocks(b2) % resolutions(3) ! nk from block 2 trans2(3,1)=njg trans2(3,3)=-1 end if @@ -188,36 +188,36 @@ subroutine Domain_Mod_Connect_Periodicity(dom, Grid) ! Set the constant directions if(f1 .eq. 1) trans1(3,1)=1 if(f1 .eq. 2) trans1(2,1)=1 - if(f1 .eq. 3) trans1(1,1)=dom % blocks(b1) % resolutions(1)-1 - if(f1 .eq. 4) trans1(2,1)=dom % blocks(b1) % resolutions(2)-1 + if(f1 .eq. 3) trans1(1,1)=Dom % blocks(b1) % resolutions(1)-1 + if(f1 .eq. 4) trans1(2,1)=Dom % blocks(b1) % resolutions(2)-1 if(f1 .eq. 5) trans1(1,1)=1 - if(f1 .eq. 6) trans1(3,1)=dom % blocks(b1) % resolutions(3)-1 + if(f1 .eq. 6) trans1(3,1)=Dom % blocks(b1) % resolutions(3)-1 if(f2 .eq. 1) trans2(3,1)=1 if(f2 .eq. 2) trans2(2,1)=1 - if(f2 .eq. 3) trans2(1,1)=dom % blocks(b2) % resolutions(1)-1 - if(f2 .eq. 4) trans2(2,1)=dom % blocks(b2) % resolutions(2)-1 + if(f2 .eq. 3) trans2(1,1)=Dom % blocks(b2) % resolutions(1)-1 + if(f2 .eq. 4) trans2(2,1)=Dom % blocks(b2) % resolutions(2)-1 if(f2 .eq. 5) trans2(1,1)=1 - if(f2 .eq. 6) trans2(3,1)=dom % blocks(b2) % resolutions(3)-1 + if(f2 .eq. 6) trans2(3,1)=Dom % blocks(b2) % resolutions(3)-1 ! Finally conect the two periodic boundaries do jg=1,njg-1 ! through cells only do ig=1,nig-1 ! through cells only - ci1=dom % blocks(b1) % resolutions(1)-1 - cj1=dom % blocks(b1) % resolutions(2)-1 - ck1=dom % blocks(b1) % resolutions(3)-1 - ci2=dom % blocks(b2) % resolutions(1)-1 - cj2=dom % blocks(b2) % resolutions(2)-1 - ck2=dom % blocks(b2) % resolutions(3)-1 + ci1=Dom % blocks(b1) % resolutions(1)-1 + cj1=Dom % blocks(b1) % resolutions(2)-1 + ck1=Dom % blocks(b1) % resolutions(3)-1 + ci2=Dom % blocks(b2) % resolutions(1)-1 + cj2=Dom % blocks(b2) % resolutions(2)-1 + ck2=Dom % blocks(b2) % resolutions(3)-1 i1 = trans1(1,1)+trans1(1,2)*ig+trans1(1,3)*jg j1 = trans1(2,1)+trans1(2,2)*ig+trans1(2,3)*jg - k1 = trans1(3,1)+trans1(3,2)*ig+trans1(3,3)*jg + k1 = trans1(3,1)+trans1(3,2)*ig+trans1(3,3)*jg i2 = trans2(1,1)+trans2(1,2)*ig+trans2(1,3)*jg j2 = trans2(2,1)+trans2(2,2)*ig+trans2(2,3)*jg k2 = trans2(3,1)+trans2(3,2)*ig+trans2(3,3)*jg - c1 = dom % blocks(b1) % n_cells & + c1 = Dom % blocks(b1) % n_cells & + (k1-1)*ci1*cj1 + (j1-1)*ci1 + i1 - c2 = dom % blocks(b2) % n_cells & + c2 = Dom % blocks(b2) % n_cells & + (k2-1)*ci2*cj2 + (j2-1)*ci2 + i2 Grid % cells_c(f1,c1) = c2 Grid % cells_c(f2,c2) = c1 @@ -230,26 +230,26 @@ subroutine Domain_Mod_Connect_Periodicity(dom, Grid) if(trans1(3,1) > 1) trans1(3,1)=trans1(3,1)+1 if(trans2(1,1) > 1) trans2(1,1)=trans2(1,1)+1 if(trans2(2,1) > 1) trans2(2,1)=trans2(2,1)+1 - if(trans2(3,1) > 1) trans2(3,1)=trans2(3,1)+1 + if(trans2(3,1) > 1) trans2(3,1)=trans2(3,1)+1 - ! Conect the nodes - do jg=1,njg ! through nodes + ! Conect the nodes + do jg=1,njg ! through nodes do ig=1,nig ! through nodes - ni1=dom % blocks(b1) % resolutions(1) - nj1=dom % blocks(b1) % resolutions(2) - nk1=dom % blocks(b1) % resolutions(3) - ni2=dom % blocks(b2) % resolutions(1) - nj2=dom % blocks(b2) % resolutions(2) - nk2=dom % blocks(b2) % resolutions(3) + ni1=Dom % blocks(b1) % resolutions(1) + nj1=Dom % blocks(b1) % resolutions(2) + nk1=Dom % blocks(b1) % resolutions(3) + ni2=Dom % blocks(b2) % resolutions(1) + nj2=Dom % blocks(b2) % resolutions(2) + nk2=Dom % blocks(b2) % resolutions(3) i1 = trans1(1,1) + trans1(1,2)*ig + trans1(1,3)*jg j1 = trans1(2,1) + trans1(2,2)*ig + trans1(2,3)*jg k1 = trans1(3,1) + trans1(3,2)*ig + trans1(3,3)*jg i2 = trans2(1,1) + trans2(1,2)*ig + trans2(1,3)*jg j2 = trans2(2,1) + trans2(2,2)*ig + trans2(2,3)*jg k2 = trans2(3,1) + trans2(3,2)*ig + trans2(3,3)*jg - n1 = dom % blocks(b1) % n_nodes & + n1 = Dom % blocks(b1) % n_nodes & + (k1-1)*ni1*nj1 + (j1-1)*ni1 + i1 - n2 = dom % blocks(b2) % n_nodes & + n2 = Dom % blocks(b2) % n_nodes & + (k2-1)*ni2*nj2 + (j2-1)*ni2 + i2 n1 = Grid % new_n(n1) n2 = Grid % new_n(n2) @@ -265,34 +265,34 @@ subroutine Domain_Mod_Connect_Periodicity(dom, Grid) twin_n(n2,0)=twin_n(n2,0)+1 twin_n(n2,twin_n(n2,0))=n1 -1 end do ! jg +1 end do ! jg end do ! ig - end if ! are they connected ? + end if ! are they connected ? end do ! f1 end do ! f2 end do ! b1 - end do ! b2 + end do ! b2 end do ! p periods !---------------------! - ! Twin of my twin ! + ! Twin of my twin ! ! is also my twin ! !---------------------! do n1=1,Grid % n_nodes do i1=1,twin_n(n1,0) - n2=twin_n(n1,i1) + n2=twin_n(n1,i1) do i2=1,twin_n(n2,0) n3=twin_n(n2,i2) ! twins from n2 new=n3 - do i3=1,twin_n(n1,0) - if( (twin_n(n1,i3) .eq. n3) .or. (n3 .eq. n1) ) new=0 + do i3=1,twin_n(n1,0) + if( (twin_n(n1,i3) .eq. n3) .or. (n3 .eq. n1) ) new=0 end do - if(new .eq. n3) then + if(new .eq. n3) then twin_n(n1,0)=twin_n(n1,0)+1 twin_n(n1,twin_n(n1,0))=n3 - end if + end if end do end do end do diff --git a/Sources/Generate/Domain_Mod/Distribute_Nodes.f90 b/Sources/Generate/Domain_Mod/Distribute_Nodes.f90 index 7eb5fef0a..e4867de8d 100644 --- a/Sources/Generate/Domain_Mod/Distribute_Nodes.f90 +++ b/Sources/Generate/Domain_Mod/Distribute_Nodes.f90 @@ -1,12 +1,12 @@ !==============================================================================! - subroutine Domain_Mod_Distribute_Nodes(dom, Grid, b, w, & - is, js, ks, ie, je, ke) + subroutine Distribute_Nodes(Dom, Grid, b, w, & + is, js, ks, ie, je, ke) !------------------------------------------------------------------------------! ! Places the nodes on the line defined with local block position ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Domain_Type) :: dom + class(Domain_Type) :: Dom type(Grid_Type) :: Grid integer, intent(in) :: b, is, js, ks, ie, je, ke real, intent(in) :: w @@ -17,9 +17,9 @@ subroutine Domain_Mod_Distribute_Nodes(dom, Grid, b, w, & real :: x0, y0, z0, delx, dely, delz, t, dt, ddt, pr, xi !==============================================================================! - ni = dom % blocks(b) % resolutions(1) - nj = dom % blocks(b) % resolutions(2) - nk = dom % blocks(b) % resolutions(3) + ni = Dom % blocks(b) % resolutions(1) + nj = Dom % blocks(b) % resolutions(2) + nk = Dom % blocks(b) % resolutions(3) x0 = Grid % xn(Grid % n_nodes+(ks-1)*ni*nj+(js-1)*ni+is) y0 = Grid % yn(Grid % n_nodes+(ks-1)*ni*nj+(js-1)*ni+is) diff --git a/Sources/Generate/Domain_Mod/Distribute_Ranges.f90 b/Sources/Generate/Domain_Mod/Distribute_Ranges.f90 index b5c792544..f70107aa0 100644 --- a/Sources/Generate/Domain_Mod/Distribute_Ranges.f90 +++ b/Sources/Generate/Domain_Mod/Distribute_Ranges.f90 @@ -1,12 +1,12 @@ !==============================================================================! - subroutine Domain_Mod_Distribute_Ranges(dom, Grid) + subroutine Distribute_Ranges(Dom, Grid) !------------------------------------------------------------------------------! ! Distribute ranges (defined in .dom file) to boundary conditions ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Domain_Type) :: dom - type(Grid_Type) :: Grid + class(Domain_Type) :: Dom + type(Grid_Type) :: Grid !-----------------------------------[Locals]-----------------------------------! integer :: b, i, j, k, n, c, r integer :: n_bnd ! number of boundary conditions @@ -20,21 +20,21 @@ subroutine Domain_Mod_Distribute_Ranges(dom, Grid) ! and materials information ! !-----------------------------------------! - ! This is too much memory but that's OK + ! This is too much memory but that's OK ! (+1 is to store the default values) - allocate(Grid % region % name(dom % n_ranges + 1)) + call Grid % Allocate_Regions(Dom % n_ranges) ! Initialize number of boundary conditions n_bnd = 0 - do n = 1, dom % n_ranges + do n = 1, Dom % n_ranges - b = dom % ranges(n) % block + b = Dom % ranges(n) % block ! Block resolution - ci = dom % blocks(b) % resolutions(1)-1 - cj = dom % blocks(b) % resolutions(2)-1 - ck = dom % blocks(b) % resolutions(3)-1 + ci = Dom % blocks(b) % resolutions(1)-1 + cj = Dom % blocks(b) % resolutions(2)-1 + ck = Dom % blocks(b) % resolutions(3)-1 ! Default values is = 1 @@ -45,34 +45,34 @@ subroutine Domain_Mod_Distribute_Ranges(dom, Grid) ke = ck ! Boundary conditions prescribed with mnemonics - if(dom % ranges(n) % face .eq. 'IMIN') then + if(Dom % ranges(n) % face .eq. 'IMIN') then ie = 1 face = 5 - else if(dom % ranges(n) % face .eq. 'IMAX') then + else if(Dom % ranges(n) % face .eq. 'IMAX') then is = ci face = 3 - else if(dom % ranges(n) % face .eq. 'JMIN') then + else if(Dom % ranges(n) % face .eq. 'JMIN') then je = 1 face = 2 - else if(dom % ranges(n) % face .eq. 'JMAX') then + else if(Dom % ranges(n) % face .eq. 'JMAX') then js = cj face = 4 - else if(dom % ranges(n) % face .eq. 'KMIN') then + else if(Dom % ranges(n) % face .eq. 'KMIN') then ke = 1 face = 1 - else if(dom % ranges(n) % face .eq. 'KMAX') then + else if(Dom % ranges(n) % face .eq. 'KMAX') then ks = ck face = 6 ! Boundary conditions prescribed explicitly ! (error prone and difficult, but might be usefull) else - is = dom % ranges(n) % is - js = dom % ranges(n) % js - ks = dom % ranges(n) % ks - ie = dom % ranges(n) % ie - je = dom % ranges(n) % je - ke = dom % ranges(n) % ke + is = Dom % ranges(n) % is + js = Dom % ranges(n) % js + ks = Dom % ranges(n) % ks + ie = Dom % ranges(n) % ie + je = Dom % ranges(n) % je + ke = Dom % ranges(n) % ke face = 0 if( (is .eq. ie).and.(is .eq. 1) ) face = 5 if( (is .eq. ie).and.(is .eq. ci) ) face = 3 @@ -88,17 +88,17 @@ subroutine Domain_Mod_Distribute_Ranges(dom, Grid) found = .false. do r=1,n_bnd if( Grid % region % name(r) .eq. & - dom % ranges(n) % name ) found = .true. + Dom % ranges(n) % name ) found = .true. end do if( .not. found) then n_bnd = n_bnd + 1 - Grid % region % name(n_bnd) = dom % ranges(n) % name + Grid % region % name(n_bnd) = Dom % ranges(n) % name end if do i=is,ie do j=js,je do k=ks,ke - c = dom % blocks(b) % n_cells + (k-1)*ci*cj + (j-1)*ci + i + c = Dom % blocks(b) % n_cells + (k-1)*ci*cj + (j-1)*ci + i Grid % cells_c(face,c) = -n_bnd end do end do diff --git a/Sources/Generate/Domain_Mod/Find_Line.f90 b/Sources/Generate/Domain_Mod/Find_Line.f90 index 9fc11e083..c955a6caf 100644 --- a/Sources/Generate/Domain_Mod/Find_Line.f90 +++ b/Sources/Generate/Domain_Mod/Find_Line.f90 @@ -1,25 +1,25 @@ !==============================================================================! - subroutine Domain_Mod_Find_Line(dom, n1, n2, res) + subroutine Find_Line(Dom, n1, n2, res) !------------------------------------------------------------------------------! ! Searches for a smallest block where the line defined by n1-n2 is. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Domain_Type) :: dom + class(Domain_Type) :: Dom integer, intent(in) :: n1, n2 integer, intent(out) :: res !-----------------------------------[Locals]-----------------------------------! integer :: b, l1, l2 !==============================================================================! - do b = 1, size(dom % blocks) + do b = 1, size(Dom % blocks) do l1 = 1, 8 do l2 = 1, 8 - if( (dom % blocks(b) % corners(l1) .eq. n1) .and. & - (dom % blocks(b) % corners(l2) .eq. n2) ) then - if( iabs(l2-l1) .eq. 1 ) res = dom % blocks(b) % resolutions(1) - if( iabs(l2-l1) .eq. 2 ) res = dom % blocks(b) % resolutions(2) - if( iabs(l2-l1) .eq. 4 ) res = dom % blocks(b) % resolutions(3) + if( (Dom % blocks(b) % corners(l1) .eq. n1) .and. & + (Dom % blocks(b) % corners(l2) .eq. n2) ) then + if( iabs(l2-l1) .eq. 1 ) res = Dom % blocks(b) % resolutions(1) + if( iabs(l2-l1) .eq. 2 ) res = Dom % blocks(b) % resolutions(2) + if( iabs(l2-l1) .eq. 4 ) res = Dom % blocks(b) % resolutions(3) goto 1 end if end do diff --git a/Sources/Generate/Domain_Mod/Find_Surface.f90 b/Sources/Generate/Domain_Mod/Find_Surface.f90 index 1de22116a..f5d380ecb 100644 --- a/Sources/Generate/Domain_Mod/Find_Surface.f90 +++ b/Sources/Generate/Domain_Mod/Find_Surface.f90 @@ -1,23 +1,23 @@ !==============================================================================! - subroutine Domain_Mod_Find_Surface(dom, n1, n2, n3, n4, block, face) + subroutine Find_Surface(Dom, n1, n2, n3, n4, block, face) !------------------------------------------------------------------------------! ! Searches for a block where the surface defined by n1, n2, n3, n4 is. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Domain_Type) :: dom + class(Domain_Type) :: Dom integer, intent(in) :: n1, n2, n3, n4 integer, intent(out) :: block, face !-----------------------------------[Locals]-----------------------------------! integer :: b, fc, p1, p2, p3, p4 !==============================================================================! - do b = 1, size(dom % blocks) + do b = 1, size(Dom % blocks) do fc = 1, 6 - p1=dom % blocks(b) % faces(fc, 1) - p2=dom % blocks(b) % faces(fc, 2) - p3=dom % blocks(b) % faces(fc, 3) - p4=dom % blocks(b) % faces(fc, 4) + p1 = Dom % blocks(b) % faces(fc, 1) + p2 = Dom % blocks(b) % faces(fc, 2) + p3 = Dom % blocks(b) % faces(fc, 3) + p4 = Dom % blocks(b) % faces(fc, 4) if( ((p1 .eq. n1).and.(p3 .eq. n3)) .or. & ((p1 .eq. n4).and.(p3 .eq. n2)) .or. & ((p1 .eq. n3).and.(p3 .eq. n1)) .or. & diff --git a/Sources/Generate/Domain_Mod/Is_Line_In_Block.f90 b/Sources/Generate/Domain_Mod/Is_Line_In_Block.f90 index b1f9b5b35..d9205f657 100644 --- a/Sources/Generate/Domain_Mod/Is_Line_In_Block.f90 +++ b/Sources/Generate/Domain_Mod/Is_Line_In_Block.f90 @@ -1,29 +1,29 @@ !==============================================================================! - integer function Domain_Mod_Is_Line_In_Block(dom, n1, n2, b) + integer function Is_Line_In_Block(Dom, n1, n2, b) !------------------------------------------------------------------------------! ! Checks if the line defined n1 and n2 is inside the block b. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Domain_Type) :: dom - integer :: b, n1, n2 + class(Domain_Type) :: Dom + integer, intent(in) :: b, n1, n2 !-----------------------------------[Locals]-----------------------------------! integer :: l1, l2 !==============================================================================! do l1=1,8 do l2=1,8 - if( (dom % blocks(b) % corners(l1) .eq. n1) .and. & - (dom % blocks(b) % corners(l2) .eq. n2) ) then + if( (Dom % blocks(b) % corners(l1) .eq. n1) .and. & + (Dom % blocks(b) % corners(l2) .eq. n2) ) then goto 1 end if end do end do - Domain_Mod_Is_Line_In_Block = 0 + Is_Line_In_Block = 0 return -1 Domain_Mod_Is_Line_In_Block = b +1 Is_Line_In_Block = b return end function diff --git a/Sources/Generate/Domain_Mod/Laplace.f90 b/Sources/Generate/Domain_Mod/Laplace.f90 index 3f532665a..251dc87a0 100644 --- a/Sources/Generate/Domain_Mod/Laplace.f90 +++ b/Sources/Generate/Domain_Mod/Laplace.f90 @@ -1,32 +1,32 @@ !==============================================================================! - subroutine Domain_Mod_Laplace(dom, Grid, b,i,j,k, wx16, wx24, wx35, & - wy16, wy24, wy35, & - wz16, wz24, wz35) + subroutine Laplace(Dom, Grid, b,i,j,k, wx16, wx24, wx35, & + wy16, wy24, wy35, & + wz16, wz24, wz35) !------------------------------------------------------------------------------! ! Places the nodes inside the block using Laplace-like function ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Domain_Type) :: dom - type(Grid_Type) :: Grid - integer :: b, i, j, k - real :: wx16, wx24, wx35, wy16, wy24, wy35, wz16, wz24, wz35 + class(Domain_Type) :: Dom + type(Grid_Type) :: Grid + integer, intent(in) :: b, i, j, k + real, intent(in) :: wx16, wx24, wx35, wy16, wy24, wy35, wz16, wz24, wz35 !-----------------------------------[Locals]-----------------------------------! real :: xt(8), yt(8), zt(8) integer :: ni, nj, nk, n, n1, n2, n3, n4, n5, n6 - real :: xf1, yf1, zf1, xf2, yf2, zf2, xf3, yf3, zf3 + real :: xf1, yf1, zf1, xf2, yf2, zf2, xf3, yf3, zf3 real :: xf4, yf4, zf4, xf5, yf5, zf5, xf6, yf6, zf6 !==============================================================================! - ni = dom % blocks(b) % resolutions(1) - nj = dom % blocks(b) % resolutions(2) - nk = dom % blocks(b) % resolutions(3) + ni = Dom % blocks(b) % resolutions(1) + nj = Dom % blocks(b) % resolutions(2) + nk = Dom % blocks(b) % resolutions(3) do n=1,8 - xt(n) = dom % points( dom % blocks(b) % corners(n) ) % x - yt(n) = dom % points( dom % blocks(b) % corners(n) ) % y - zt(n) = dom % points( dom % blocks(b) % corners(n) ) % z - end do + xt(n) = Dom % points( Dom % blocks(b) % corners(n) ) % x + yt(n) = Dom % points( Dom % blocks(b) % corners(n) ) % y + zt(n) = Dom % points( Dom % blocks(b) % corners(n) ) % z + end do n = Grid % n_nodes + (k-1)*ni*nj + (j-1)*ni + i diff --git a/Sources/Generate/Main_Gen.f90 b/Sources/Generate/Main_Gen.f90 index c4f4bcb6c..432bc28db 100644 --- a/Sources/Generate/Main_Gen.f90 +++ b/Sources/Generate/Main_Gen.f90 @@ -15,7 +15,7 @@ program Generate_Prog include '../Shared/Probe_2d.h90' end interface !-----------------------------------[Locals]-----------------------------------! - type(Domain_Type) :: dom ! domain to be used + type(Domain_Type) :: Dom ! domain to be used type(Grid_Type) :: Grid ! Grid which will be generated type(Smooths_Type) :: smooths ! smoothing regions type(Refines_Type) :: refines ! refinement regions and levels @@ -31,15 +31,15 @@ program Generate_Prog !-------------------------! ! Read the input file ! !-------------------------! - call Generate % Load_Dom(dom, smooths, refines, Grid) + call Generate % Load_Dom(Dom, smooths, refines, Grid) !-----------------------! ! Handle the domain ! !-----------------------! - call Domain_Mod_Calculate_Node_Coordinates(dom, Grid) - call Domain_Mod_Distribute_Ranges (dom, Grid) - call Domain_Mod_Connect_Blocks (dom, Grid) - call Domain_Mod_Connect_Periodicity (dom, Grid) + call Dom % Calculate_Node_Coordinates(Grid) + call Dom % Distribute_Ranges (Grid) + call Dom % Connect_Blocks (Grid) + call Dom % Connect_Periodicity (Grid) !--------------------------------! ! From this point on, domain ! From 516947fd9055d4c859e4ae1af3561de924c57bce Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 26 Feb 2023 21:13:34 +0100 Subject: [PATCH 025/223] Added intention to input arguments. On branch bojan_fixed_cell_ranges modified: Shared/Grid_Mod/Allocate_Cells.f90 modified: Shared/Grid_Mod/Allocate_Nodes.f90 --- Sources/Shared/Grid_Mod/Allocate_Cells.f90 | 6 +++--- Sources/Shared/Grid_Mod/Allocate_Nodes.f90 | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Sources/Shared/Grid_Mod/Allocate_Cells.f90 b/Sources/Shared/Grid_Mod/Allocate_Cells.f90 index 3026ca569..586afbd48 100644 --- a/Sources/Shared/Grid_Mod/Allocate_Cells.f90 +++ b/Sources/Shared/Grid_Mod/Allocate_Cells.f90 @@ -3,9 +3,9 @@ subroutine Allocate_Cells(Grid, nc, nb) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Grid_Type) :: Grid - integer :: nc ! number of cells inside - integer :: nb ! number of cells on the bounday + class(Grid_Type) :: Grid + integer, intent(in) :: nc ! number of cells inside + integer, intent(in) :: nb ! number of cells on the bounday !-----------------------------------[Locals]-----------------------------------! integer :: c !==============================================================================! diff --git a/Sources/Shared/Grid_Mod/Allocate_Nodes.f90 b/Sources/Shared/Grid_Mod/Allocate_Nodes.f90 index 8b1530b24..bb85c4fea 100644 --- a/Sources/Shared/Grid_Mod/Allocate_Nodes.f90 +++ b/Sources/Shared/Grid_Mod/Allocate_Nodes.f90 @@ -3,8 +3,8 @@ subroutine Allocate_Nodes(Grid, nn) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Grid_Type) :: Grid - integer :: nn + class(Grid_Type) :: Grid + integer, intent(in) :: nn !-----------------------------------[Locals]-----------------------------------! integer :: n !==============================================================================! From 95aad328063b80abb39394a9dad933e5104e3b3e Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 26 Feb 2023 21:18:03 +0100 Subject: [PATCH 026/223] Ranges are allocated centrally, from one function On branch bojan_fixed_cell_ranges modified: Convert/Convert_Mod/Load_Fluent.f90 modified: Convert/Convert_Mod/Load_Gambit.f90 modified: Convert/Convert_Mod/Load_Gmsh.f90 modified: Generate/Generate_Mod/Load_Dom.f90 new file: Shared/Grid_Mod/Allocate_Regions.f90 modified: Shared/Grid_Mod.f90 modified: Shared/Grid_Mod/Load_Cfn.f90 modified: Shared/Grid_Mod/Regions_Ranges.f90 modified: Shared/Grid_Mod/Sort_Faces_Smart.f90 modified: Shared/Region_Mod.f90 --- Sources/Convert/Convert_Mod/Load_Fluent.f90 | 6 +- Sources/Convert/Convert_Mod/Load_Gambit.f90 | 3 +- Sources/Convert/Convert_Mod/Load_Gmsh.f90 | 4 +- Sources/Generate/Generate_Mod/Load_Dom.f90 | 180 +++++++++---------- Sources/Shared/Grid_Mod.f90 | 2 + Sources/Shared/Grid_Mod/Allocate_Regions.f90 | 66 +++++++ Sources/Shared/Grid_Mod/Load_Cfn.f90 | 23 +-- Sources/Shared/Grid_Mod/Regions_Ranges.f90 | 39 ++-- Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 | 8 +- Sources/Shared/Region_Mod.f90 | 20 ++- 10 files changed, 206 insertions(+), 145 deletions(-) create mode 100644 Sources/Shared/Grid_Mod/Allocate_Regions.f90 diff --git a/Sources/Convert/Convert_Mod/Load_Fluent.f90 b/Sources/Convert/Convert_Mod/Load_Fluent.f90 index a63a4b757..137781c57 100644 --- a/Sources/Convert/Convert_Mod/Load_Fluent.f90 +++ b/Sources/Convert/Convert_Mod/Load_Fluent.f90 @@ -252,10 +252,8 @@ subroutine Load_Fluent(Convert, Grid, file_name) print '(a34,i9)', ' # Boundary cells from face data: ', n_bnd_cells print '(a34,i9)', ' # Boundary condition sections: ', n_bnd_reg - Grid % n_bnd_cells = n_bnd_cells - Grid % n_bnd_regions = n_bnd_reg - Grid % n_regions = Grid % n_bnd_regions + 1 ! this is inside region - allocate(Grid % region % name(Grid % n_regions)) + Grid % n_bnd_cells = n_bnd_cells + call Grid % Allocate_Regions(n_bnd_reg) !--------------------------------------------! ! ! diff --git a/Sources/Convert/Convert_Mod/Load_Gambit.f90 b/Sources/Convert/Convert_Mod/Load_Gambit.f90 index 8ea0c4033..c36a1ac6b 100644 --- a/Sources/Convert/Convert_Mod/Load_Gambit.f90 +++ b/Sources/Convert/Convert_Mod/Load_Gambit.f90 @@ -161,8 +161,7 @@ subroutine Load_Gambit(Convert, Grid, file_name) !-------------------------! ! Boundary conditions ! !-------------------------! - Grid % n_bnd_regions = n_bnd_sect - allocate(Grid % region % name(n_bnd_sect)) + call Grid % Allocate_Regions(n_bnd_sect) do j = 1, n_bnd_sect call File % Read_Line(fu) ! BOUNDARY CONDITIONS diff --git a/Sources/Convert/Convert_Mod/Load_Gmsh.f90 b/Sources/Convert/Convert_Mod/Load_Gmsh.f90 index adaece2bd..4cf2f996a 100644 --- a/Sources/Convert/Convert_Mod/Load_Gmsh.f90 +++ b/Sources/Convert/Convert_Mod/Load_Gmsh.f90 @@ -514,9 +514,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) ! Copy boundary condition info ! ! ! !----------------------------------! - Grid % n_bnd_regions = n_bnd_sect - Grid % n_regions = Grid % n_bnd_regions + 1 ! this is inside region - allocate(Grid % region % name(Grid % n_regions)) + call Grid % Allocate_Regions(n_bnd_sect) do i = 1, n_bnd_sect Grid % region % name(i) = phys_names(i) diff --git a/Sources/Generate/Generate_Mod/Load_Dom.f90 b/Sources/Generate/Generate_Mod/Load_Dom.f90 index f677bb13f..b78d60862 100644 --- a/Sources/Generate/Generate_Mod/Load_Dom.f90 +++ b/Sources/Generate/Generate_Mod/Load_Dom.f90 @@ -1,12 +1,12 @@ !==============================================================================! - subroutine Load_Dom(Generate, dom, smr, ref, Grid) + subroutine Load_Dom(Generate, Dom, smr, ref, Grid) !------------------------------------------------------------------------------! ! Reads: .dom file ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! class(Generate_Type) :: Generate - type(Domain_Type) :: dom + type(Domain_Type) :: Dom type(Smooths_Type) :: smr type(Refines_Type) :: ref type(Grid_Type) :: Grid @@ -86,88 +86,88 @@ subroutine Load_Dom(Generate, dom, smr, ref, Grid) ! Corners ! !-------------! call File % Read_Line(fu) - read(Line % tokens(1), *) dom % n_points ! number of points + read(Line % tokens(1), *) Dom % n_points ! number of points - call Domain_Mod_Allocate_Points(dom, dom % n_points) + call Dom % Allocate_Points(Dom % n_points) - do i = 1, dom % n_points + do i = 1, Dom % n_points call File % Read_Line(fu) - read(Line % tokens(2),*) dom % points(i) % x - read(Line % tokens(3),*) dom % points(i) % y - read(Line % tokens(4),*) dom % points(i) % z + read(Line % tokens(2),*) Dom % points(i) % x + read(Line % tokens(3),*) Dom % points(i) % y + read(Line % tokens(4),*) Dom % points(i) % z end do !------------! ! Blocks ! !------------! call File % Read_Line(fu) - read(Line % tokens(1), *) dom % n_blocks ! number of blocks + read(Line % tokens(1), *) Dom % n_blocks ! number of blocks - call Domain_Mod_Allocate_Blocks(dom, dom % n_blocks) + call Dom % Allocate_Blocks(Dom % n_blocks) ! Initialize weights - do b=1, dom % n_blocks - dom % blocks(b) % weights = 1.0 - dom % blocks(b) % face_weights = 1.0 + do b=1, Dom % n_blocks + Dom % blocks(b) % weights = 1.0 + Dom % blocks(b) % face_weights = 1.0 end do - do b = 1, dom % n_blocks - dom % blocks(b) % corners(0)=1 ! suppose it is properly oriented + do b = 1, Dom % n_blocks + Dom % blocks(b) % corners(0)=1 ! suppose it is properly oriented call File % Read_Line(fu) - read(Line % tokens(2),*) dom % blocks(b) % resolutions(1) - read(Line % tokens(3),*) dom % blocks(b) % resolutions(2) - read(Line % tokens(4),*) dom % blocks(b) % resolutions(3) + read(Line % tokens(2),*) Dom % blocks(b) % resolutions(1) + read(Line % tokens(3),*) Dom % blocks(b) % resolutions(2) + read(Line % tokens(4),*) Dom % blocks(b) % resolutions(3) call File % Read_Line(fu) read(Line % whole, *) & ! block weights - dom % blocks(b) % weights(1), & - dom % blocks(b) % weights(2), & - dom % blocks(b) % weights(3) + Dom % blocks(b) % weights(1), & + Dom % blocks(b) % weights(2), & + Dom % blocks(b) % weights(3) call File % Read_Line(fu) read(Line % whole, *) & - dom % blocks(b) % corners(1), dom % blocks(b) % corners(2), & - dom % blocks(b) % corners(3), dom % blocks(b) % corners(4), & - dom % blocks(b) % corners(5), dom % blocks(b) % corners(6), & - dom % blocks(b) % corners(7), dom % blocks(b) % corners(8) + Dom % blocks(b) % corners(1), Dom % blocks(b) % corners(2), & + Dom % blocks(b) % corners(3), Dom % blocks(b) % corners(4), & + Dom % blocks(b) % corners(5), Dom % blocks(b) % corners(6), & + Dom % blocks(b) % corners(7), Dom % blocks(b) % corners(8) !---------------------------! ! Check if the block is ! ! properly oriented ! !---------------------------! do n=1,8 - xt(n) = dom % points(dom % blocks(b) % corners(n)) % x - yt(n) = dom % points(dom % blocks(b) % corners(n)) % y - zt(n) = dom % points(dom % blocks(b) % corners(n)) % z + xt(n) = Dom % points(Dom % blocks(b) % corners(n)) % x + yt(n) = Dom % points(Dom % blocks(b) % corners(n)) % y + zt(n) = Dom % points(Dom % blocks(b) % corners(n)) % z end do if(Math % Tet_Volume( xt(2),yt(2),zt(2), xt(5),yt(5),zt(5), & xt(3),yt(3),zt(3), xt(1),yt(1),zt(1) ) < 0) then - dom % blocks(b) % corners(0)=-1 ! It's nor properly oriented - call Swap_Int(dom % blocks(b) % corners(2), & - dom % blocks(b) % corners(3)) - call Swap_Int(dom % blocks(b) % corners(6), & - dom % blocks(b) % corners(7)) - call Swap_Real(dom % blocks(b) % weights(1), & - dom % blocks(b) % weights(2)) - dom % blocks(b) % weights(1) = 1.0 / dom % blocks(b) % weights(1) - dom % blocks(b) % weights(2) = 1.0 / dom % blocks(b) % weights(2) - call Swap_Int(dom % blocks(b) % resolutions(1), & - dom % blocks(b) % resolutions(2)) + Dom % blocks(b) % corners(0)=-1 ! It's nor properly oriented + call Swap_Int(Dom % blocks(b) % corners(2), & + Dom % blocks(b) % corners(3)) + call Swap_Int(Dom % blocks(b) % corners(6), & + Dom % blocks(b) % corners(7)) + call Swap_Real(Dom % blocks(b) % weights(1), & + Dom % blocks(b) % weights(2)) + Dom % blocks(b) % weights(1) = 1.0 / Dom % blocks(b) % weights(1) + Dom % blocks(b) % weights(2) = 1.0 / Dom % blocks(b) % weights(2) + call Swap_Int(Dom % blocks(b) % resolutions(1), & + Dom % blocks(b) % resolutions(2)) print *, 'Warning: Block ',b,' was not properly oriented' end if - end do ! through dom % blocks + end do ! through Dom % blocks !-----------------------------! ! Set the corners of each ! ! face of the block ! !-----------------------------! - do b = 1, dom % n_blocks + do b = 1, Dom % n_blocks do i_fac = 1, 6 do n = 1, 4 - dom % blocks(b) % faces(i_fac, n) = & - dom % blocks(b) % corners(fn(i_fac,n)) + Dom % blocks(b) % faces(i_fac, n) = & + Dom % blocks(b) % corners(fn(i_fac,n)) end do end do end do @@ -179,40 +179,39 @@ subroutine Load_Dom(Generate, dom, smr, ref, Grid) ! or with just a weighting factor. ! !----------------------------------------------! call File % Read_Line(fu) - read(Line % tokens(1), *) dom % n_lines ! number of defined dom % lines + read(Line % tokens(1), *) Dom % n_lines ! number of defined Dom % lines - call Domain_Mod_Allocate_Lines(dom, dom % n_lines) + call Dom % Allocate_Lines(Dom % n_lines) - do l=1, dom % n_lines + do l=1, Dom % n_lines call File % Read_Line(fu) read(Line % tokens(1),*) npnt - read(Line % tokens(2),*) dom % lines(l) % points(1) - read(Line % tokens(3),*) dom % lines(l) % points(2) + read(Line % tokens(2),*) Dom % lines(l) % points(1) + read(Line % tokens(3),*) Dom % lines(l) % points(2) - call Domain_Mod_Find_Line(dom, & - dom % lines(l) % points(1), & - dom % lines(l) % points(2), & - dom % lines(l) % resolution) + call Dom % Find_Line(Dom % lines(l) % points(1), & + Dom % lines(l) % points(2), & + Dom % lines(l) % resolution) ! Does this need a more elegant solution? - allocate(dom % lines(l) % x( dom % lines(l) % resolution )) - allocate(dom % lines(l) % y( dom % lines(l) % resolution )) - allocate(dom % lines(l) % z( dom % lines(l) % resolution )) + allocate(Dom % lines(l) % x( Dom % lines(l) % resolution )) + allocate(Dom % lines(l) % y( Dom % lines(l) % resolution )) + allocate(Dom % lines(l) % z( Dom % lines(l) % resolution )) ! Point by point if(npnt > 0) then - do n=1,dom % lines(l) % resolution + do n=1,Dom % lines(l) % resolution call File % Read_Line(fu) - read(Line % tokens(2),*) dom % lines(l) % x(n) - read(Line % tokens(3),*) dom % lines(l) % y(n) - read(Line % tokens(4),*) dom % lines(l) % z(n) + read(Line % tokens(2),*) Dom % lines(l) % x(n) + read(Line % tokens(3),*) Dom % lines(l) % y(n) + read(Line % tokens(4),*) Dom % lines(l) % z(n) end do ! Weight factor else call File % Read_Line(fu) - read(Line % tokens(1), *) dom % lines(l) % weight + read(Line % tokens(1), *) Dom % lines(l) % weight end if end do @@ -220,11 +219,11 @@ subroutine Load_Dom(Generate, dom, smr, ref, Grid) !----------------------------------------! ! Copy block weights to face weights ! !----------------------------------------! - do b = 1, dom % n_blocks + do b = 1, Dom % n_blocks do i_fac = 1,6 ! face of the block - dom % blocks(b) % face_weights(i_fac, 1) = dom % blocks(b) % weights(1) - dom % blocks(b) % face_weights(i_fac, 2) = dom % blocks(b) % weights(2) - dom % blocks(b) % face_weights(i_fac, 3) = dom % blocks(b) % weights(3) + Dom % blocks(b) % face_weights(i_fac, 1) = Dom % blocks(b) % weights(1) + Dom % blocks(b) % face_weights(i_fac, 2) = Dom % blocks(b) % weights(2) + Dom % blocks(b) % face_weights(i_fac, 3) = Dom % blocks(b) % weights(3) end do end do @@ -237,14 +236,14 @@ subroutine Load_Dom(Generate, dom, smr, ref, Grid) do s = 1, nsurf call File % Read_Line(fu) read(Line % whole,*) dum, n1, n2, n3, n4 - call Domain_Mod_Find_Surface(dom, n1, n2, n3, n4, b, i_fac) + call Dom % Find_Surface(n1, n2, n3, n4, b, i_fac) print *, '# block: ', b, ' surf: ', i_fac n = (b-1)*6 + i_fac ! surface number call File % Read_Line(fu) - read(Line % whole, *) dom % blocks(b) % face_weights(i_fac,1), & - dom % blocks(b) % face_weights(i_fac,2), & - dom % blocks(b) % face_weights(i_fac,2) + read(Line % whole, *) Dom % blocks(b) % face_weights(i_fac,1), & + Dom % blocks(b) % face_weights(i_fac,2), & + Dom % blocks(b) % face_weights(i_fac,2) end do !---------------------------------------! @@ -254,10 +253,10 @@ subroutine Load_Dom(Generate, dom, smr, ref, Grid) ! Nodes & faces n_nodes_check = 0 n_faces_check = 0 - do b = 1, dom % n_blocks - ni = dom % blocks(b) % resolutions(1) - nj = dom % blocks(b) % resolutions(2) - nk = dom % blocks(b) % resolutions(3) + do b = 1, Dom % n_blocks + ni = Dom % blocks(b) % resolutions(1) + nj = Dom % blocks(b) % resolutions(2) + nk = Dom % blocks(b) % resolutions(3) n_nodes_check=n_nodes_check + ni*nj*nk n_faces_check=n_faces_check + ni*nj*nk + 2*( (ni*nj)+(nj*nk)+(ni*nk) ) end do @@ -290,38 +289,37 @@ subroutine Load_Dom(Generate, dom, smr, ref, Grid) ! Boundary conditions and materials ! !---------------------------------------! call File % Read_Line(fu) - read(Line % tokens(1), *) dom % n_ranges ! number of ranges (can be bnd. + read(Line % tokens(1), *) Dom % n_ranges ! number of ranges (can be bnd. ! conditions or materials) + call Dom % Allocate_Ranges(Dom % n_ranges) - call Domain_Mod_Allocate_Ranges(dom, dom % n_ranges) - - do n = 1, dom % n_ranges - dom % ranges(n) % face='' + do n = 1, Dom % n_ranges + Dom % ranges(n) % face='' call File % Read_Line(fu) if(Line % n_tokens .eq. 7) then read(Line % whole,*) dum, & - dom % ranges(n) % is, & - dom % ranges(n) % js, & - dom % ranges(n) % ks, & - dom % ranges(n) % ie, & - dom % ranges(n) % je, & - dom % ranges(n) % ke + Dom % ranges(n) % is, & + Dom % ranges(n) % js, & + Dom % ranges(n) % ks, & + Dom % ranges(n) % ie, & + Dom % ranges(n) % je, & + Dom % ranges(n) % ke else if(Line % n_tokens .eq. 2) then read(Line % tokens(1),*) dum read(Line % tokens(2),'(A4)') & - dom % ranges(n) % face - call String % To_Upper_Case(dom % ranges(n) % face) + Dom % ranges(n) % face + call String % To_Upper_Case(Dom % ranges(n) % face) end if call File % Read_Line(fu) - read(Line % tokens(1), *) dom % ranges(n) % block - read(Line % tokens(2), *) dom % ranges(n) % name - call String % To_Upper_Case(dom % ranges(n) % name) + read(Line % tokens(1), *) Dom % ranges(n) % block + read(Line % tokens(2), *) Dom % ranges(n) % name + call String % To_Upper_Case(Dom % ranges(n) % name) - ! if( dom % blocks(b_cond(n,7)) % points(0) .eq. -1 ) then - ! call Swap_Int( dom % ranges(n) % is,dom % ranges(n) % js ) - ! call Swap_Int( dom % ranges(n) % ie,dom % ranges(n) % je ) + ! if( Dom % blocks(b_cond(n,7)) % points(0) .eq. -1 ) then + ! call Swap_Int( Dom % ranges(n) % is,Dom % ranges(n) % js ) + ! call Swap_Int( Dom % ranges(n) % ie,Dom % ranges(n) % je ) ! end if end do diff --git a/Sources/Shared/Grid_Mod.f90 b/Sources/Shared/Grid_Mod.f90 index b2dac6471..3eec09a8b 100644 --- a/Sources/Shared/Grid_Mod.f90 +++ b/Sources/Shared/Grid_Mod.f90 @@ -183,6 +183,7 @@ module Grid_Mod procedure :: Allocate_Cells procedure :: Allocate_Faces procedure :: Allocate_Nodes + procedure :: Allocate_Regions procedure :: Bnd_Cond_Name procedure :: Bnd_Cond_Type procedure :: Bounding_Box @@ -237,6 +238,7 @@ module Grid_Mod # include "Grid_Mod/Allocate_Cells.f90" # include "Grid_Mod/Allocate_Faces.f90" # include "Grid_Mod/Allocate_Nodes.f90" +# include "Grid_Mod/Allocate_Regions.f90" # include "Grid_Mod/Bnd_Cond_Name.f90" # include "Grid_Mod/Bnd_Cond_Type.f90" # include "Grid_Mod/Bounding_Box.f90" diff --git a/Sources/Shared/Grid_Mod/Allocate_Regions.f90 b/Sources/Shared/Grid_Mod/Allocate_Regions.f90 new file mode 100644 index 000000000..4d7802625 --- /dev/null +++ b/Sources/Shared/Grid_Mod/Allocate_Regions.f90 @@ -0,0 +1,66 @@ +!==============================================================================! + subroutine Allocate_Regions(Grid, nbr) +!------------------------------------------------------------------------------! +! Regions. There are some boundary regions for boundary conditions. These ! +! are specified by a user in one file or another, depending if you are in ! +! Generate, Convert or others. They are stored in Grid % n_bnd_regions. ! +! ! +! In addition to those, there is an extra region for internal cells or ! +! faces. It is stored in Grid % n_regions, and Grid % n_regions is equal ! +! to Grid % n_bnd_regions + 1. ! +! ! +! In addition, there are also buffer cells in Process, which would be ! +! stored in Grid % n_regions + 1 or Grid % n_bnd_regions + 2. ! +! ! +! On top of them all, there are three regions reserved for periodic x, y ! +! and z directions, used for copy boundaries and they are stored in ! +! Grid % n_regions + 2, Grid % n_regions + 3 and Grid % n_regions + 4. ! +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Grid_Type) :: Grid + integer, intent(in) :: nbr ! number of boundary regions +!-----------------------------------[Locals]-----------------------------------! + integer :: n +!==============================================================================! + + ! Store the number of boundary regions for the grid + Grid % n_bnd_regions = nbr + + ! Number of regions, at least the "visible" ones ... + ! ... is bigger by one, by the "internal" regaion + Grid % n_regions = Grid % n_bnd_regions + 1 + + Grid % per_x_reg = Grid % n_bnd_regions + 3 ! for periodic_x region + Grid % per_y_reg = Grid % n_bnd_regions + 4 ! for periodic_y region + Grid % per_z_reg = Grid % n_bnd_regions + 5 ! for periodic_z region + + ! Allocate memory for regions' names + allocate(Grid % region % name(Grid % n_regions+5)) + Grid % region % name(1:Grid % n_bnd_regions) = 'UNDEFINED' + Grid % region % name (Grid % n_bnd_regions + 1) = 'INSIDE' + Grid % region % name (Grid % n_bnd_regions + 2) = 'BUFFER' + Grid % region % name (Grid % n_bnd_regions + 3) = 'PERIODIC_X' + Grid % region % name (Grid % n_bnd_regions + 4) = 'PERIODIC_Y' + Grid % region % name (Grid % n_bnd_regions + 5) = 'PERIODIC_Z' + + ! Allocate memory for regions' types + allocate(Grid % region % type(Grid % n_regions+5)) + Grid % region % type(1:Grid % n_bnd_regions) = UNDEFINED + Grid % region % type (Grid % n_bnd_regions + 1) = INSIDE + Grid % region % type (Grid % n_bnd_regions + 2) = BUFFER + Grid % region % type (Grid % n_bnd_regions + 3) = PERIODIC_X + Grid % region % type (Grid % n_bnd_regions + 4) = PERIODIC_Y + Grid % region % type (Grid % n_bnd_regions + 5) = PERIODIC_Z + + ! Memory for cell and face ranges + allocate(Grid % region % f_cell(Grid % n_regions+5)) + allocate(Grid % region % l_cell(Grid % n_regions+5)) + allocate(Grid % region % f_face(Grid % n_regions+5)) + allocate(Grid % region % l_face(Grid % n_regions+5)) + Grid % region % f_cell(:) = -1 + Grid % region % l_cell(:) = -HUGE_INT + Grid % region % f_face(:) = 0 + Grid % region % l_face(:) = -1 + + end subroutine diff --git a/Sources/Shared/Grid_Mod/Load_Cfn.f90 b/Sources/Shared/Grid_Mod/Load_Cfn.f90 index c3a2abdec..4867b5db8 100644 --- a/Sources/Shared/Grid_Mod/Load_Cfn.f90 +++ b/Sources/Shared/Grid_Mod/Load_Cfn.f90 @@ -64,18 +64,10 @@ subroutine Load_Cfn(Grid, this_proc, domain) read(fu) Grid % polyhedral ! Allocate memory =--> carefull, there is no checking! - call Grid % Allocate_Nodes(Grid % n_nodes) - call Grid % Allocate_Cells(Grid % n_cells, Grid % n_bnd_cells) - call Grid % Allocate_Faces(Grid % n_faces, Grid % n_shadows) - - ! Boundary conditions' keys - ! (Go from zero for faces which are not at the boundary) - Grid % n_regions = Grid % n_bnd_regions + 1 ! this is inside region - Grid % per_x_reg = Grid % n_bnd_regions + 2 ! for periodic_x region - Grid % per_y_reg = Grid % n_bnd_regions + 3 ! for periodic_x region - Grid % per_z_reg = Grid % n_bnd_regions + 4 ! for periodic_x region - allocate(Grid % region % name(Grid % n_regions + 3)) - allocate(Grid % region % type(Grid % n_regions + 3)) + call Grid % Allocate_Nodes (Grid % n_nodes) + call Grid % Allocate_Cells (Grid % n_cells, Grid % n_bnd_cells) + call Grid % Allocate_Faces (Grid % n_faces, Grid % n_shadows) + call Grid % Allocate_Regions(Grid % n_bnd_regions) !-----------------! ! Domain name ! @@ -89,13 +81,6 @@ subroutine Load_Cfn(Grid, this_proc, domain) read(fu) Grid % region % name(n) end do - ! The last three are reserved for perodicity - ! and used for inlet copy boundary condition. Don't delete these thinking - ! they are useless. They are assigned in Calculate_Face_Geometry - Grid % region % name(Grid % per_x_reg) = 'PERIODIC_X' - Grid % region % name(Grid % per_y_reg) = 'PERIODIC_Y' - Grid % region % name(Grid % per_z_reg) = 'PERIODIC_Z' - !--------------------------! ! Nodes global numbers ! !--------------------------! diff --git a/Sources/Shared/Grid_Mod/Regions_Ranges.f90 b/Sources/Shared/Grid_Mod/Regions_Ranges.f90 index a6f277a81..27e8679f6 100644 --- a/Sources/Shared/Grid_Mod/Regions_Ranges.f90 +++ b/Sources/Shared/Grid_Mod/Regions_Ranges.f90 @@ -13,12 +13,6 @@ subroutine Regions_Ranges(Grid) integer :: c, c1, c2, reg, s, siz !==============================================================================! - Grid % n_regions = Grid % n_bnd_regions + 1 ! this is for inside - - ! Allocate memory - allocate(Grid % region % f_cell(Grid % n_regions)) - allocate(Grid % region % l_cell(Grid % n_regions)) - !-------------------! ! Cells' ranges ! !-------------------! @@ -61,14 +55,30 @@ subroutine Regions_Ranges(Grid) end if end do + ! Buffer cells + reg = Grid % n_regions + 1 + Grid % region % f_cell(reg) = Grid % n_cells + 1 + Grid % region % l_cell(reg) = 1 + do c = 1, Grid % n_cells + if(Grid % Comm % cell_proc(c) .ne. this_proc) then + if(c < Grid % region % f_cell(reg)) then + Grid % region % f_cell(reg) = c + end if + if(c > Grid % region % l_cell(reg)) then + Grid % region % l_cell(reg) = c + end if + end if + end do + if(DEBUG) then write(1000+this_proc, '(a)') ' # Cell ranges' - do reg = Boundary_And_Inside_Regions() + do reg = All_Regions() siz = Grid % region % l_cell(reg) - Grid % region % f_cell(reg) + 1 - write(1000+this_proc,'(a,i3,i15,i15,i15,a)') ' # Region: ', reg, & + write(1000+this_proc,'(a,i3,i15,i15,i15,a,a)') ' # Region: ', reg, & Grid % region % f_cell(reg), & Grid % region % l_cell(reg), & - max(siz, 0) + max(siz, 0), ' ', & + trim(Grid % region % name(reg)) end do end if @@ -76,10 +86,6 @@ subroutine Regions_Ranges(Grid) ! Faces' ranges ! !-------------------! - ! Allocate memory - allocate(Grid % region % f_face(Grid % n_regions)) - allocate(Grid % region % l_face(Grid % n_regions)) - ! Set non-realizable ranges Grid % region % f_face(:) = 0 Grid % region % l_face(:) = -1 @@ -128,12 +134,13 @@ subroutine Regions_Ranges(Grid) if(DEBUG) then write(2000+this_proc, '(a)') ' # Face ranges' - do reg = Boundary_And_Inside_Regions() + do reg = All_Regions() siz = Grid % region % l_face(reg) - Grid % region % f_face(reg) + 1 - write(2000+this_proc,'(a,i3,i15,i15,i15,a)') ' # Region: ', reg, & + write(2000+this_proc,'(a,i3,i15,i15,i15,a,a)') ' # Region: ', reg, & Grid % region % f_face(reg), & Grid % region % l_face(reg), & - max(siz, 0) + max(siz, 0), ' ', & + trim(Grid % region % name(reg)) end do end if diff --git a/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 b/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 index 664e52f90..d4633ffb8 100644 --- a/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 +++ b/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 @@ -12,7 +12,7 @@ subroutine Sort_Faces_Smart(Grid) !---------------------------------[Arguments]----------------------------------! class(Grid_Type) :: Grid !------------------------------[Local parameters]------------------------------! - logical, parameter :: DEBUG = .false. + logical, parameter :: DEBUG = .true. !-----------------------------------[Locals]-----------------------------------! integer :: s, m, n, c, c1, c2, n_bc, reg integer :: max_diff_1, max_diff_2, c1_s1, c2_s1, c1_s2, c2_s2 @@ -167,16 +167,18 @@ subroutine Sort_Faces_Smart(Grid) call Regions_Ranges(Grid) if(DEBUG) then + print '(a)', 's, c1, c2, Grid % region % at_cell(c2)' do s = 1, Grid % n_faces c1 = Grid % faces_c(1, s) c2 = Grid % faces_c(2, s) if(c2 < 0) then - print '(4i6)', s, c1, c2, Grid % region % at_cell(c2) + print '(4i12)', s, c1, c2, Grid % region % at_cell(c2) end if end do do reg = Boundary_Regions() - print '(2i6)', Cells_In_Region(reg) + print '(a)', 'Cells_In_Region(reg)' + print '(2i12)', Cells_In_Region(reg) end do end if diff --git a/Sources/Shared/Region_Mod.f90 b/Sources/Shared/Region_Mod.f90 index 9f1847fb4..d74fb022e 100644 --- a/Sources/Shared/Region_Mod.f90 +++ b/Sources/Shared/Region_Mod.f90 @@ -12,13 +12,19 @@ module Region_Mod !---------------------------------------------------------! ! Constants for identification of boundary conditions ! !---------------------------------------------------------! - integer, parameter :: INFLOW = 10007 - integer, parameter :: WALL = 10009 - integer, parameter :: OUTFLOW = 10037 - integer, parameter :: SYMMETRY = 10039 - integer, parameter :: CONVECT = 10061 - integer, parameter :: WALLFL = 10067 - integer, parameter :: PRESSURE = 10069 + integer, parameter :: INFLOW = 10007 + integer, parameter :: WALL = 10009 + integer, parameter :: OUTFLOW = 10037 + integer, parameter :: SYMMETRY = 10039 + integer, parameter :: CONVECT = 10061 + integer, parameter :: WALLFL = 10067 + integer, parameter :: PRESSURE = 10069 + integer, parameter :: INSIDE = 10079 + integer, parameter :: BUFFER = 10091 + integer, parameter :: PERIODIC_X = 10093 + integer, parameter :: PERIODIC_Y = 10099 + integer, parameter :: PERIODIC_Z = 10103 + integer, parameter :: UNDEFINED = 10111 !-----------------! ! Region type ! From 8ad92e9dd28429967002bb84aa48779176f34ae7 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 26 Feb 2023 21:19:25 +0100 Subject: [PATCH 027/223] IMPORTANT: Fixed the bug with browsing cells. A special function which also takes into account buffer cells was needed to browse through cell values in old and older than old time steps. On branch bojan_fixed_cell_ranges modified: Process/Process_Mod/Compute_Momentum.f90 modified: Shared/Browse.h90 --- .../Process/Process_Mod/Compute_Momentum.f90 | 2 +- Sources/Shared/Browse.h90 | 27 ++++++++++++------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/Sources/Process/Process_Mod/Compute_Momentum.f90 b/Sources/Process/Process_Mod/Compute_Momentum.f90 index d97f96b04..58533525d 100644 --- a/Sources/Process/Process_Mod/Compute_Momentum.f90 +++ b/Sources/Process/Process_Mod/Compute_Momentum.f90 @@ -175,7 +175,7 @@ subroutine Compute_Momentum(Process, Flow, Turb, Vof, Por, Sol, curr_dt, ini) ! Old values (o) and older than old (oo) if(.not. Flow % inside_piso_loop) then if(ini .eq. 1) then - do c = Cells_In_Domain() + do c = Cells_In_Domain_And_Buffers() ui % oo(c) = ui % o(c) ui % o (c) = ui % n(c) end do diff --git a/Sources/Shared/Browse.h90 b/Sources/Shared/Browse.h90 index 9e7ce2f7b..aa864591d 100644 --- a/Sources/Shared/Browse.h90 +++ b/Sources/Shared/Browse.h90 @@ -2,24 +2,31 @@ ! Definition of potentially usefull macros in T-Flows. ! !------------------------------------------------------------------------------! -# define Boundary_Regions() \ +# define Boundary_Regions() \ 1, Grid % n_bnd_regions -# define Boundary_And_Inside_Regions() \ +# define Boundary_And_Inside_Regions() \ 1, Grid % n_regions -# define Faces_In_Region(reg) \ - Grid % region % f_face(reg), \ +# define All_Regions() \ + 1, Grid % n_bnd_regions + 5 + +# define Faces_In_Region(reg) \ + Grid % region % f_face(reg), \ Grid % region % l_face(reg) -# define Faces_In_Domain() \ - Grid % region % f_face(Grid % n_regions), \ +# define Faces_In_Domain() \ + Grid % region % f_face(Grid % n_regions), \ Grid % region % l_face(Grid % n_regions) -# define Cells_In_Region(reg) \ - Grid % region % f_cell(reg), \ +# define Cells_In_Region(reg) \ + Grid % region % f_cell(reg), \ Grid % region % l_cell(reg) -# define Cells_In_Domain() \ - Grid % region % f_cell(Grid % n_regions), \ +# define Cells_In_Domain() \ + Grid % region % f_cell(Grid % n_regions), \ Grid % region % l_cell(Grid % n_regions) + +# define Cells_In_Domain_And_Buffers() \ + Grid % region % f_cell(Grid % n_regions), \ + Grid % region % l_cell(Grid % n_regions + 1) From c86d29bbaa67c2225f0500fd7fdece2b98db5151 Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 27 Feb 2023 05:27:12 +0100 Subject: [PATCH 028/223] Corrected an error in the script for Generate On branch bojan_fixed_cell_ranges modified: Vof/Rising_Bubble/generate.scr --- Tests/Vof/Rising_Bubble/generate.scr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Vof/Rising_Bubble/generate.scr b/Tests/Vof/Rising_Bubble/generate.scr index afb80b3b2..a4a8c8e8f 100644 --- a/Tests/Vof/Rising_Bubble/generate.scr +++ b/Tests/Vof/Rising_Bubble/generate.scr @@ -1,5 +1,5 @@ cavity -0 +skip skip skip From 5804a9445b884d767c562143ac6745689402ba82 Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 27 Feb 2023 05:28:15 +0100 Subject: [PATCH 029/223] Uses macro to integrate force. On branch bojan_fixed_cell_ranges modified: Rans/Channel_Re_Tau_590/Rsm/User_Mod/Source.f90 --- Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Source.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Source.f90 b/Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Source.f90 index f8fdf165f..c5b8d5988 100644 --- a/Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Source.f90 +++ b/Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Source.f90 @@ -38,7 +38,7 @@ subroutine User_Mod_Source(Flow, phi, a, b) ! Set source for temperature ! !-------------------------------! if( phi % name .eq. 'T' ) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain() b(c) = b(c) - u % n(c) / bulk % u & * Flow % heat / bulk % area_x & * Grid % vol(c) / Grid % per_x From cceebae22a39e5a758a538286f73b95532002c2d Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 27 Feb 2023 05:40:50 +0100 Subject: [PATCH 030/223] Corrected a little missalignement in output On branch bojan_fixed_cell_ranges modified: Generate_Mod/Load_Dom.f90 --- Sources/Generate/Generate_Mod/Load_Dom.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Generate/Generate_Mod/Load_Dom.f90 b/Sources/Generate/Generate_Mod/Load_Dom.f90 index b78d60862..17d90e414 100644 --- a/Sources/Generate/Generate_Mod/Load_Dom.f90 +++ b/Sources/Generate/Generate_Mod/Load_Dom.f90 @@ -393,7 +393,7 @@ subroutine Load_Dom(Generate, Dom, smr, ref, Grid) call File % Read_Line(fu) read(Line % tokens(1), *) smr % n_smooths ! number of smoothing ranges - print '(a38,i7)', '# Number of (non)smoothing ranges: ', smr % n_smooths + print '(a38,i7)', '# Number of (non)smoothing ranges: ', smr % n_smooths call Smooths_Mod_Allocate_Smooths(smr, smr % n_smooths) From db187742de5ace70b362404fc8fd986316e7deff Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 27 Feb 2023 06:35:57 +0100 Subject: [PATCH 031/223] Renamed two functions in Grid_Mod Namely: Shared/Grid_Mod/Regions_Ranges.f90 -> Shared/Grid_Mod/Determine_Regions_Ranges.f90 and: Shared/Grid_Mod/Form_Maps.f90 -> Shared/Grid_Mod/Form_Maps_For_Backup.f90 This makes their functionality easier to understand. In addition, another variable is passed from makefiles, called T_FLOWS_PROGRAM, which can range from 1 to 4, depending if Generate (1), Divide (2), Convert (3) or Process (4) are compiled. On branch bojan_fixed_cell_ranges modified: Convert/makefile modified: Divide/makefile modified: Generate/makefile modified: Process/Main_Pro.f90 modified: Process/makefile modified: Shared/Grid_Mod.f90 renamed: Shared/Grid_Mod/Regions_Ranges.f90 -> Shared/Grid_Mod/Determine_Regions_Ranges.f90 renamed: Shared/Grid_Mod/Form_Maps.f90 -> Shared/Grid_Mod/Form_Maps_For_Backup.f90 modified: Shared/Grid_Mod/Load_Cfn.f90 modified: Shared/Grid_Mod/Sort_Faces_Smart.f90 new file: Shared/Program_Name.h90 --- Sources/Convert/makefile | 8 +++++++- Sources/Divide/makefile | 8 +++++++- Sources/Generate/makefile | 8 +++++++- Sources/Process/Main_Pro.f90 | 2 +- Sources/Process/makefile | 7 +++++++ Sources/Shared/Grid_Mod.f90 | 9 +++++---- ...ions_Ranges.f90 => Determine_Regions_Ranges.f90} | 8 ++++---- .../{Form_Maps.f90 => Form_Maps_For_Backup.f90} | 2 +- Sources/Shared/Grid_Mod/Load_Cfn.f90 | 2 +- Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 | 4 ++-- Sources/Shared/Program_Name.h90 | 13 +++++++++++++ 11 files changed, 55 insertions(+), 16 deletions(-) rename Sources/Shared/Grid_Mod/{Regions_Ranges.f90 => Determine_Regions_Ranges.f90} (95%) rename Sources/Shared/Grid_Mod/{Form_Maps.f90 => Form_Maps_For_Backup.f90} (99%) create mode 100644 Sources/Shared/Program_Name.h90 diff --git a/Sources/Convert/makefile b/Sources/Convert/makefile index fb457897f..452971840 100644 --- a/Sources/Convert/makefile +++ b/Sources/Convert/makefile @@ -29,9 +29,15 @@ PROGRAM_FILE = $(DIR_BINARY)/$(PROGRAM_NAME) # Initialize variables to pass on to preprocessor with # variable T_FLOWS_COMPILATION which, if set to one, # means unit is compiled from T-Flow -# It later adds T_FLOWS_MPI and T_FLOWS_PETSC #---------------------------------------------------------- PASS_ON = -DT_FLOWS_COMPILATION=1 + +#---------------------------------------------------------- +# It soon adds T_FLOWS_PROGRAM and T_FLOWS_ASSERT and +# later on it adds also T_FLOWS_MPI and T_FLOWS_PETSC +#---------------------------------------------------------- +PASS_ON += -DT_FLOWS_PROGRAM=3 + ifeq ($(ASSERT), yes) PASS_ON += -DT_FLOWS_ASSERT=1 else diff --git a/Sources/Divide/makefile b/Sources/Divide/makefile index 13766e5d1..4dba10f99 100644 --- a/Sources/Divide/makefile +++ b/Sources/Divide/makefile @@ -29,9 +29,15 @@ PROGRAM_FILE = $(DIR_BINARY)/$(PROGRAM_NAME) # Initialize variables to pass on to preprocessor with # variable T_FLOWS_COMPILATION which, if set to one, # means unit is compiled from T-Flow -# It later adds T_FLOWS_MPI and T_FLOWS_PETSC #---------------------------------------------------------- PASS_ON = -DT_FLOWS_COMPILATION=1 + +#---------------------------------------------------------- +# It soon adds T_FLOWS_PROGRAM and T_FLOWS_ASSERT and +# later on it adds also T_FLOWS_MPI and T_FLOWS_PETSC +#---------------------------------------------------------- +PASS_ON += -DT_FLOWS_PROGRAM=2 + ifeq ($(ASSERT), yes) PASS_ON += -DT_FLOWS_ASSERT=1 else diff --git a/Sources/Generate/makefile b/Sources/Generate/makefile index 3be2283c9..610dea35e 100644 --- a/Sources/Generate/makefile +++ b/Sources/Generate/makefile @@ -29,9 +29,15 @@ PROGRAM_FILE = $(DIR_BINARY)/$(PROGRAM_NAME) # Initialize variables to pass on to preprocessor with # variable T_FLOWS_COMPILATION which, if set to one, # means unit is compiled from T-Flow -# It later adds T_FLOWS_MPI and T_FLOWS_PETSC #---------------------------------------------------------- PASS_ON = -DT_FLOWS_COMPILATION=1 + +#---------------------------------------------------------- +# It soon adds T_FLOWS_PROGRAM and T_FLOWS_ASSERT and +# later on it adds also T_FLOWS_MPI and T_FLOWS_PETSC +#---------------------------------------------------------- +PASS_ON += -DT_FLOWS_PROGRAM=1 + ifeq ($(ASSERT), yes) PASS_ON += -DT_FLOWS_ASSERT=1 else diff --git a/Sources/Process/Main_Pro.f90 b/Sources/Process/Main_Pro.f90 index 286789592..afc7e755c 100644 --- a/Sources/Process/Main_Pro.f90 +++ b/Sources/Process/Main_Pro.f90 @@ -89,7 +89,7 @@ program Process_Prog ! Find communication patterns call Grid(d) % Form_Cells_Comm() - call Grid(d) % Form_Maps() + call Grid(d) % Form_Maps_For_Backup() end do ! Out of domain loop - go back to root diff --git a/Sources/Process/makefile b/Sources/Process/makefile index 04f5b88fe..7eb2563a2 100644 --- a/Sources/Process/makefile +++ b/Sources/Process/makefile @@ -36,6 +36,13 @@ PROGRAM_FILE = $(DIR_BINARY)/$(PROGRAM_NAME) # It later adds T_FLOWS_MPI and T_FLOWS_PETSC #---------------------------------------------------------- PASS_ON = -DT_FLOWS_COMPILATION=1 + +#---------------------------------------------------------- +# It soon adds T_FLOWS_PROGRAM and T_FLOWS_ASSERT and +# later on it adds also T_FLOWS_MPI and T_FLOWS_PETSC +#---------------------------------------------------------- +PASS_ON += -DT_FLOWS_PROGRAM=4 + ifeq ($(ASSERT), yes) PASS_ON += -DT_FLOWS_ASSERT=1 else diff --git a/Sources/Shared/Grid_Mod.f90 b/Sources/Shared/Grid_Mod.f90 index 3eec09a8b..9add449fb 100644 --- a/Sources/Shared/Grid_Mod.f90 +++ b/Sources/Shared/Grid_Mod.f90 @@ -1,5 +1,6 @@ #include "../Shared/Assert.h90" #include "../Shared/Browse.h90" +#include "../Shared/Program_Name.h90" !==============================================================================! module Grid_Mod @@ -201,6 +202,7 @@ module Grid_Mod procedure :: Check_Cells_Closure procedure :: Correct_Face_Surfaces procedure :: Decompose + procedure :: Determine_Regions_Ranges procedure :: Exchange_Cells_Int procedure :: Exchange_Cells_Log procedure :: Exchange_Cells_Real @@ -209,7 +211,7 @@ module Grid_Mod procedure :: Find_Cells_Faces procedure :: Find_Nodes_Cells procedure :: Form_Cells_Comm - procedure :: Form_Maps + procedure :: Form_Maps_For_Backup procedure :: Initialize_New_Numbers procedure :: Is_Face_In_Cell procedure :: Is_Point_In_Cell @@ -218,7 +220,6 @@ module Grid_Mod procedure :: Merge_Duplicate_Nodes procedure :: Print_Regions_List procedure :: Print_Grid_Statistics - procedure :: Regions_Ranges procedure :: Save_Cfn procedure :: Save_Dim procedure :: Save_Debug_Vtu @@ -257,6 +258,7 @@ module Grid_Mod # include "Grid_Mod/Correct_Face_Surfaces.f90" # include "Grid_Mod/Check_Cells_Closure.f90" # include "Grid_Mod/Decompose.f90" +# include "Grid_Mod/Determine_Regions_Ranges.f90" # include "Grid_Mod/Exchange_Cells_Int.f90" # include "Grid_Mod/Exchange_Cells_Log.f90" # include "Grid_Mod/Exchange_Cells_Real.f90" @@ -264,7 +266,7 @@ module Grid_Mod # include "Grid_Mod/Find_Cells_Faces.f90" # include "Grid_Mod/Find_Nodes_Cells.f90" # include "Grid_Mod/Form_Cells_Comm.f90" -# include "Grid_Mod/Form_Maps.f90" +# include "Grid_Mod/Form_Maps_For_Backup.f90" # include "Grid_Mod/Initialize_New_Numbers.f90" # include "Grid_Mod/Is_Face_In_Cell.f90" # include "Grid_Mod/Is_Point_In_Cell.f90" @@ -273,7 +275,6 @@ module Grid_Mod # include "Grid_Mod/Merge_Duplicate_Nodes.f90" # include "Grid_Mod/Print_Regions_List.f90" # include "Grid_Mod/Print_Grid_Statistics.f90" -# include "Grid_Mod/Regions_Ranges.f90" # include "Grid_Mod/Save_Cfn.f90" # include "Grid_Mod/Save_Dim.f90" # include "Grid_Mod/Save_Debug_Vtu.f90" diff --git a/Sources/Shared/Grid_Mod/Regions_Ranges.f90 b/Sources/Shared/Grid_Mod/Determine_Regions_Ranges.f90 similarity index 95% rename from Sources/Shared/Grid_Mod/Regions_Ranges.f90 rename to Sources/Shared/Grid_Mod/Determine_Regions_Ranges.f90 index 27e8679f6..5708b223a 100644 --- a/Sources/Shared/Grid_Mod/Regions_Ranges.f90 +++ b/Sources/Shared/Grid_Mod/Determine_Regions_Ranges.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Regions_Ranges(Grid) + subroutine Determine_Regions_Ranges(Grid) !------------------------------------------------------------------------------! ! Allocates memory and finds the range (first and last boundary cell) ! ! for each of the boundary condition region. ! @@ -8,7 +8,7 @@ subroutine Regions_Ranges(Grid) !---------------------------------[Arguments]----------------------------------! class(Grid_Type) :: Grid !------------------------------[Local parameters]------------------------------! - logical, parameter :: DEBUG = .true. + logical, parameter :: DEBUG = .false. !-----------------------------------[Locals]-----------------------------------! integer :: c, c1, c2, reg, s, siz !==============================================================================! @@ -71,7 +71,7 @@ subroutine Regions_Ranges(Grid) end do if(DEBUG) then - write(1000+this_proc, '(a)') ' # Cell ranges' + write(1000+this_proc, '(a,a)') ' # Cell ranges from ', Program_Name do reg = All_Regions() siz = Grid % region % l_cell(reg) - Grid % region % f_cell(reg) + 1 write(1000+this_proc,'(a,i3,i15,i15,i15,a,a)') ' # Region: ', reg, & @@ -133,7 +133,7 @@ subroutine Regions_Ranges(Grid) end do if(DEBUG) then - write(2000+this_proc, '(a)') ' # Face ranges' + write(2000+this_proc, '(a,a)') ' # Face ranges from ', Program_Name do reg = All_Regions() siz = Grid % region % l_face(reg) - Grid % region % f_face(reg) + 1 write(2000+this_proc,'(a,i3,i15,i15,i15,a,a)') ' # Region: ', reg, & diff --git a/Sources/Shared/Grid_Mod/Form_Maps.f90 b/Sources/Shared/Grid_Mod/Form_Maps_For_Backup.f90 similarity index 99% rename from Sources/Shared/Grid_Mod/Form_Maps.f90 rename to Sources/Shared/Grid_Mod/Form_Maps_For_Backup.f90 index 7204f6e1b..bea551102 100644 --- a/Sources/Shared/Grid_Mod/Form_Maps.f90 +++ b/Sources/Shared/Grid_Mod/Form_Maps_For_Backup.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Form_Maps(Grid) + subroutine Form_Maps_For_Backup(Grid) !------------------------------------------------------------------------------! ! Forms maps for parallel backup ! !------------------------------------------------------------------------------! diff --git a/Sources/Shared/Grid_Mod/Load_Cfn.f90 b/Sources/Shared/Grid_Mod/Load_Cfn.f90 index 4867b5db8..69cc494f4 100644 --- a/Sources/Shared/Grid_Mod/Load_Cfn.f90 +++ b/Sources/Shared/Grid_Mod/Load_Cfn.f90 @@ -264,7 +264,7 @@ subroutine Load_Cfn(Grid, this_proc, domain) allocate (Grid % region % at_cell(-Grid % n_bnd_cells-1:Grid % n_faces)) read(fu) (Grid % region % at_cell(c), c = -Grid % n_bnd_cells, -1) - call Grid % Regions_Ranges() + call Grid % Determine_Regions_Ranges() close(fu) diff --git a/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 b/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 index d4633ffb8..cbcc96d7f 100644 --- a/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 +++ b/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 @@ -12,7 +12,7 @@ subroutine Sort_Faces_Smart(Grid) !---------------------------------[Arguments]----------------------------------! class(Grid_Type) :: Grid !------------------------------[Local parameters]------------------------------! - logical, parameter :: DEBUG = .true. + logical, parameter :: DEBUG = .false. !-----------------------------------[Locals]-----------------------------------! integer :: s, m, n, c, c1, c2, n_bc, reg integer :: max_diff_1, max_diff_2, c1_s1, c2_s1, c1_s2, c2_s2 @@ -164,7 +164,7 @@ subroutine Sort_Faces_Smart(Grid) end do ! Find boundary reg ranges - call Regions_Ranges(Grid) + call Grid % Determine_Regions_Ranges() if(DEBUG) then print '(a)', 's, c1, c2, Grid % region % at_cell(c2)' diff --git a/Sources/Shared/Program_Name.h90 b/Sources/Shared/Program_Name.h90 new file mode 100644 index 000000000..703d318d2 --- /dev/null +++ b/Sources/Shared/Program_Name.h90 @@ -0,0 +1,13 @@ +!==============================================================================! +! Definition of program name in T-Flows +!------------------------------------------------------------------------------! + +# if T_FLOWS_PROGRAM == 1 +# define Program_Name "Generate" +# elif T_FLOWS_PROGRAM == 2 +# define Program_Name "Divide" +# elif T_FLOWS_PROGRAM == 3 +# define Program_Name "Convert" +# else +# define Program_Name "Process" +# endif From 7a8500d8734af663f05d49eaad59797134c44c52 Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 27 Feb 2023 07:34:49 +0100 Subject: [PATCH 032/223] IMPORTANT: Fixed allocation issue with Dual meshes On branch bojan_fixed_cell_ranges modified: Convert/Convert_Mod/Create_Dual.f90 --- Sources/Convert/Convert_Mod/Create_Dual.f90 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Sources/Convert/Convert_Mod/Create_Dual.f90 b/Sources/Convert/Convert_Mod/Create_Dual.f90 index 664a65471..d7c00ff75 100644 --- a/Sources/Convert/Convert_Mod/Create_Dual.f90 +++ b/Sources/Convert/Convert_Mod/Create_Dual.f90 @@ -191,8 +191,7 @@ subroutine Create_Dual(Convert, Prim, Dual) ! numbers and names ! ! ! !-------------------------! - Dual % n_bnd_regions = Prim % n_bnd_regions - allocate(Dual % region % name(Dual % n_bnd_regions)) + call Dual % Allocate_Regions(Prim % n_bnd_regions) do bc = 1, Prim % n_bnd_regions Dual % region % name(bc) = Prim % region % name(bc) call String % To_Upper_Case(Dual % region % name(bc)) From ec835b20a3fb5bcb18e0d3b0e6f8de684dcf3e71 Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 28 Feb 2023 12:19:01 +0100 Subject: [PATCH 033/223] Further use of browsing macros. This commit gave exactly the same results (and residuals) as the previous commit (7a8500d8734af663f05d49eaad59797134c44c52) On branch bojan_fixed_cell_ranges modified: Process/Field_Mod/Gradients/Grad_Least_Pressure.f90 modified: Process/Field_Mod/Interpolations/Interpolate_To_Faces_Harmonic.f90 modified: Process/Field_Mod/Interpolations/Interpolate_To_Faces_Linear.f90 modified: Process/Field_Mod/Utilities/Buoyancy_Forces.f90 modified: Process/Process_Mod/Balance_Volume.f90 modified: Process/Results_Mod.f90 modified: Process/Results_Mod/Save_Results.f90 modified: Process/Vof_Mod/Curvature/Curvature_Csf.f90 modified: Process/Vof_Mod/Curvature/Smooth_Curvature.f90 modified: Process/Vof_Mod/Curvature/Smooth_Scalar.f90 --- .../Gradients/Grad_Least_Pressure.f90 | 19 ++-- .../Interpolate_To_Faces_Harmonic.f90 | 26 ++--- .../Interpolate_To_Faces_Linear.f90 | 69 ++++++------- .../Field_Mod/Utilities/Buoyancy_Forces.f90 | 2 +- .../Process/Process_Mod/Balance_Volume.f90 | 23 +++-- Sources/Process/Results_Mod.f90 | 3 + Sources/Process/Results_Mod/Save_Results.f90 | 57 ++++++----- .../Vof_Mod/Curvature/Curvature_Csf.f90 | 67 +++++++------ .../Vof_Mod/Curvature/Smooth_Curvature.f90 | 98 +++++++++---------- .../Vof_Mod/Curvature/Smooth_Scalar.f90 | 55 ++++++----- 10 files changed, 214 insertions(+), 205 deletions(-) diff --git a/Sources/Process/Field_Mod/Gradients/Grad_Least_Pressure.f90 b/Sources/Process/Field_Mod/Gradients/Grad_Least_Pressure.f90 index 96c21f13c..f56a95b49 100644 --- a/Sources/Process/Field_Mod/Gradients/Grad_Least_Pressure.f90 +++ b/Sources/Process/Field_Mod/Gradients/Grad_Least_Pressure.f90 @@ -9,7 +9,7 @@ subroutine Grad_Least_Pressure(Flow, p) type(Var_Type) :: p !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid - integer :: s, c1, c2, iter + integer :: s, c1, c2, iter, reg !==============================================================================! ! Take aliases @@ -21,17 +21,18 @@ subroutine Grad_Least_Pressure(Flow, p) do iter = 1, Flow % least_miter ! Extrapolation to boundaries - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0) then - if(Grid % Bnd_Cond_Type(c2) .ne. PRESSURE) then + do reg = Boundary_Regions() + if(Grid % region % type(reg) .ne. PRESSURE) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + p % n(c2) = p % n(c1) + p % x(c1) * Grid % dx(s) & + p % y(c1) * Grid % dy(s) & + p % z(c1) * Grid % dz(s) - end if - end if - end do + end do ! faces + end if ! boundary not pressure + end do ! regions ! Compute individual gradients without refreshing buffers call Flow % Grad_Component_No_Refresh(p % n, 1, p % x) ! dp/dx diff --git a/Sources/Process/Field_Mod/Interpolations/Interpolate_To_Faces_Harmonic.f90 b/Sources/Process/Field_Mod/Interpolations/Interpolate_To_Faces_Harmonic.f90 index 4fee9c71b..64ead6137 100644 --- a/Sources/Process/Field_Mod/Interpolations/Interpolate_To_Faces_Harmonic.f90 +++ b/Sources/Process/Field_Mod/Interpolations/Interpolate_To_Faces_Harmonic.f90 @@ -12,7 +12,7 @@ subroutine Interpolate_To_Faces_Harmonic(Flow, phi_f, phi_c) Flow % pnt_grid % n_cells) !----------------------------------[Locals]------------------------------------! type(Grid_Type), pointer :: Grid - integer :: s, c1, c2 + integer :: s, c1, c2, reg !==============================================================================! ! Take alias @@ -20,18 +20,22 @@ subroutine Interpolate_To_Faces_Harmonic(Flow, phi_f, phi_c) ! Refresh buffers for gradient components was here, but it is not needed - ! Perform harmonic average on all faces - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1, s) - c2 = Grid % faces_c(2, s) - - if(c2 > 0) then - phi_f(s) = Math % Harmonic_Mean(phi_c(c1), phi_c(c2)) - else + ! Perform harmonic average for boundary faces + ! (Why doesn't it take care of boundary conditions? - check this!) + do reg = Boundary_Regions() + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) phi_f(s) = phi_c(c1) - end if + end do + end do + + ! Perform harmonic average for inside faces + do s = Faces_In_Domain() + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) - phi_f(s) = phi_f(s) + phi_f(s) = Math % Harmonic_Mean(phi_c(c1), phi_c(c2)) end do end subroutine diff --git a/Sources/Process/Field_Mod/Interpolations/Interpolate_To_Faces_Linear.f90 b/Sources/Process/Field_Mod/Interpolations/Interpolate_To_Faces_Linear.f90 index 225d61567..422144dbe 100644 --- a/Sources/Process/Field_Mod/Interpolations/Interpolate_To_Faces_Linear.f90 +++ b/Sources/Process/Field_Mod/Interpolations/Interpolate_To_Faces_Linear.f90 @@ -23,7 +23,7 @@ subroutine Interpolate_To_Faces_Linear(Flow, phi_f, phi_c, & Flow % pnt_grid % n_cells) !----------------------------------[Locals]------------------------------------! type(Grid_Type), pointer :: Grid - integer :: s, c1, c2 + integer :: s, c1, c2, reg !==============================================================================! ! Take alias @@ -37,23 +37,24 @@ subroutine Interpolate_To_Faces_Linear(Flow, phi_f, phi_c, & !-------------------------------------------------------! ! Estimate values at faces from the values in cells ! - !------------------------------------------------------! - do s = 1, Grid % n_faces - - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - ! Inside - if(c2 > 0) then - phi_f(s) = Grid % f(s) * phi_c(c1) & - + (1.0 - Grid % f(s)) * phi_c(c2) + !-------------------------------------------------------! - ! On the boundary cells - else + ! Perform linear average for boundary faces + ! (Why doesn't it take care of boundary conditions? - check this!) + do reg = Boundary_Regions() + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) phi_f(s) = phi_c(c1) + end do + end do - end if + ! Perform linear average for inside faces + do s = Faces_In_Domain() + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + phi_f(s) = Grid % f(s) * phi_c(c1) + (1.0 - Grid % f(s)) * phi_c(c2) end do !-----------------------------------------------------! @@ -61,32 +62,32 @@ subroutine Interpolate_To_Faces_Linear(Flow, phi_f, phi_c, & !-----------------------------------------------------! if(present(phi_x)) then - do s = 1, Grid % n_faces - - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - ! Inside - if(c2 > 0) then - phi_f(s) = phi_f(s) & - + Grid % f(s) & - * ( phi_x(c1) * Grid % rx(s) & - + phi_y(c1) * Grid % ry(s) & - + phi_z(c1) * Grid % rz(s) ) & - + (1.0 - Grid % f(s)) & - * ( phi_x(c2) * Grid % rx(s) & - + phi_y(c2) * Grid % ry(s) & - + phi_z(c2) * Grid % rz(s) ) - ! On the boundary cells - else + do reg = Boundary_Regions() + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) phi_f(s) = phi_f(s) & + phi_x(c1) * (Grid % xf(s) - Grid % xc(c1)) & + phi_y(c1) * (Grid % yf(s) - Grid % yc(c1)) & + phi_z(c1) * (Grid % zf(s) - Grid % zc(c1)) - end if + end do ! faces + end do ! all boundary regions + + do s = Faces_In_Domain() + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + phi_f(s) = phi_f(s) & + + Grid % f(s) & + * ( phi_x(c1) * Grid % rx(s) & + + phi_y(c1) * Grid % ry(s) & + + phi_z(c1) * Grid % rz(s) ) & + + (1.0 - Grid % f(s)) & + * ( phi_x(c2) * Grid % rx(s) & + + phi_y(c2) * Grid % ry(s) & + + phi_z(c2) * Grid % rz(s) ) end do - end if + end if ! gradients are present end subroutine diff --git a/Sources/Process/Field_Mod/Utilities/Buoyancy_Forces.f90 b/Sources/Process/Field_Mod/Utilities/Buoyancy_Forces.f90 index ded1bd55d..4913ffe1c 100644 --- a/Sources/Process/Field_Mod/Utilities/Buoyancy_Forces.f90 +++ b/Sources/Process/Field_Mod/Utilities/Buoyancy_Forces.f90 @@ -131,7 +131,7 @@ subroutine Buoyancy_Forces(Flow, i) !---------------------------------------! ! Correct the units for body forces ! !---------------------------------------! - do c = 1, Grid % n_cells - Grid % Comm % n_buff_cells + do c = Cells_In_Domain() cell_fi(c) = cell_fi(c) / Grid % vol(c) end do diff --git a/Sources/Process/Process_Mod/Balance_Volume.f90 b/Sources/Process/Process_Mod/Balance_Volume.f90 index a223499fb..44b916e38 100644 --- a/Sources/Process/Process_Mod/Balance_Volume.f90 +++ b/Sources/Process/Process_Mod/Balance_Volume.f90 @@ -44,22 +44,21 @@ subroutine Balance_Volume(Process, Flow, Vof) ! (These might not obey the volume conservation) ! ! ! !--------------------------------------------------------! - do s = 1, Grid % n_faces - c2 = Grid % faces_c(2,s) - - ! Side is on the boundary - if(c2 < 0) then - - if(Grid % Bnd_Cond_Type(c2) .eq. SYMMETRY) then + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. SYMMETRY) then + do s = Faces_In_Region(reg) v_flux % n(s) = 0.0 - else + end do + else + do s = Faces_In_Region(reg) + c2 = Grid % faces_c(2,s) + v_flux % n(s) = ( u % n(c2) * Grid % sx(s) & + v % n(c2) * Grid % sy(s) & + w % n(c2) * Grid % sz(s) ) - end if - end if - - end do + end do ! faces + end if ! boundary condition type + end do ! regions !--------------------------------------! ! ! diff --git a/Sources/Process/Results_Mod.f90 b/Sources/Process/Results_Mod.f90 index e846a7030..be144f844 100644 --- a/Sources/Process/Results_Mod.f90 +++ b/Sources/Process/Results_Mod.f90 @@ -1,3 +1,6 @@ +#include "../Shared/Assert.h90" +#include "../Shared/Browse.h90" + !==============================================================================! module Results_Mod !------------------------------------------------------------------------------! diff --git a/Sources/Process/Results_Mod/Save_Results.f90 b/Sources/Process/Results_Mod/Save_Results.f90 index d69b6c5c0..4e46f15d9 100644 --- a/Sources/Process/Results_Mod/Save_Results.f90 +++ b/Sources/Process/Results_Mod/Save_Results.f90 @@ -19,7 +19,7 @@ subroutine Save_Results(Results, & type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: phi integer(SP) :: data_size - integer :: data_offset, cell_offset, i_fac + integer :: data_offset, cell_offset, i_fac, reg integer :: s, n, n_conns, n_polyg, sc, f8, f9, ua, run integer :: s1, s2, c1, c2, c_f, c_l real :: dist1, dist2 @@ -892,12 +892,13 @@ subroutine Save_Results(Results, & ! Copy internal values to boundary var_ins(:) = 0.0 - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0) then + do reg = Boundary_Regions() + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + var_ins(c2) = Turb % kin % n(c1) - end if + end do end do call Results % Save_Scalar_Real("T.K.E. Near Wall [m^2/s^2]", & @@ -907,12 +908,13 @@ subroutine Save_Results(Results, & ! Copy internal values to boundary var_ins(:) = 0.0 - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0) then + do reg = Boundary_Regions() + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + var_ins(c2) = Turb % y_plus(c1) - end if + end do end do call Results % Save_Scalar_Real("y+ Near Wall [1]", & @@ -924,12 +926,13 @@ subroutine Save_Results(Results, & phi => Flow % scalar(sc) ! Copy internal values to boundary var_ins(:) = 0.0 - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0) then + do reg = Boundary_Regions() + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + var_ins(c2) = phi % n(c1) - end if + end do end do call Results % Save_Scalar_Real("Scalar Near Wall", & @@ -939,12 +942,13 @@ subroutine Save_Results(Results, & ! Copy internal values to boundary var_ins(:) = 0.0 - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0) then + do reg = Boundary_Regions() + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + var_ins(c2) = phi_save(c1) ! Turb % scalar_mean(sc, c1) - end if + end do end do call Results % Save_Scalar_Real("Mean Scalar Near Wall", & @@ -954,12 +958,13 @@ subroutine Save_Results(Results, & ! Copy internal values to boundary var_ins(:) = 0.0 - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0) then + do reg = Boundary_Regions() + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + var_ins(c2) = phi % q(c2) ! Turb % scalar_mean(sc, c1) - end if + end do end do call Results % Save_Scalar_Real("Wall Scalar Flux", & diff --git a/Sources/Process/Vof_Mod/Curvature/Curvature_Csf.f90 b/Sources/Process/Vof_Mod/Curvature/Curvature_Csf.f90 index b091f452e..d82eb34b9 100644 --- a/Sources/Process/Vof_Mod/Curvature/Curvature_Csf.f90 +++ b/Sources/Process/Vof_Mod/Curvature/Curvature_Csf.f90 @@ -11,7 +11,7 @@ subroutine Curvature_Csf(Vof) type(Field_Type), pointer :: Flow type(Var_Type), pointer :: fun type(Var_Type), pointer :: smooth - integer :: c, c1, c2, s, nb, nc + integer :: c, c1, c2, s, nb, nc, reg real :: v1(3), v2(3), v3(3), v4(3) real :: norm_grad, dotprod real, contiguous, pointer :: div_x(:), div_y(:), div_z(:) @@ -32,7 +32,7 @@ subroutine Curvature_Csf(Vof) !-------------------------------! ! Normalize vector at cells ! !-------------------------------! - do c = 1, Grid % n_cells + do c = Cells_In_Domain() norm_grad = sqrt( smooth % x(c) ** 2 & + smooth % y(c) ** 2 & + smooth % z(c) ** 2) @@ -46,7 +46,6 @@ subroutine Curvature_Csf(Vof) Vof % nz(c) = 0.0 end if end do - call Grid % Exchange_Cells_Real(Vof % nx(-nb:nc)) call Grid % Exchange_Cells_Real(Vof % ny(-nb:nc)) call Grid % Exchange_Cells_Real(Vof % nz(-nb:nc)) @@ -54,13 +53,13 @@ subroutine Curvature_Csf(Vof) !---------------------------------------! ! Tangent vector to walls/symmetries ! !---------------------------------------! - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0) then - if(Grid % Bnd_Cond_Type(c2) .eq. WALL .or. & - Grid % Bnd_Cond_Type(c2) .eq. WALLFL .or. & - Grid % Bnd_Cond_Type(c2) .eq. SYMMETRY) then + do reg = Boundary_Regions() + if( Grid % region % type(reg) .eq. WALL & + .or. Grid % region % type(reg) .eq. WALLFL & + .or. Grid % region % type(reg) .eq. SYMMETRY) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) norm_grad = sqrt( Vof % nx(c1)**2 & + Vof % ny(c1)**2 & @@ -85,25 +84,29 @@ subroutine Curvature_Csf(Vof) Vof % nz(c2) = v4(3) / norm_grad end if end if - else + end do ! faces + else ! other boundaries + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + Vof % nx(c2) = Vof % nx(c1) Vof % ny(c2) = Vof % ny(c1) Vof % nz(c2) = Vof % nz(c1) - end if - - end if ! c2 < 0 - end do + end do ! faces + end if ! boundary condition + end do ! regions !----------------------------------------! ! Correct for contact angle at walls ! !----------------------------------------! - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) + do reg = Boundary_Regions() + if( Grid % region % type(reg) .eq. WALL & + .or. Grid % region % type(reg) .eq. WALLFL) then + do s = Faces_In_Region(reg) - if(c2 < 0) then - if(Grid % Bnd_Cond_Type(c2) .eq. WALL .or. & - Grid % Bnd_Cond_Type(c2) .eq. WALLFL) then + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) ! Accumulate values of faces norm_grad = sqrt( Vof % nx(c1)**2 & @@ -133,10 +136,9 @@ subroutine Curvature_Csf(Vof) Vof % nz(c2) = Vof % nz(c1) end if - end if ! if WALL - end if ! c2 < 0 - - end do + end do ! faces + end if ! regions are walls + end do ! regions call Grid % Exchange_Cells_Real(Vof % nx(-nb:nc)) call Grid % Exchange_Cells_Real(Vof % ny(-nb:nc)) @@ -151,12 +153,14 @@ subroutine Curvature_Csf(Vof) call Flow % Grad_Component(Vof % ny(-nb:nc), 2, div_y(-nb:nc)) call Flow % Grad_Component(Vof % nz(-nb:nc), 3, div_z(-nb:nc)) - do c = -nb, nc - Vof % curv(c) = Vof % curv(c) - div_x(c) - Vof % curv(c) = Vof % curv(c) - div_y(c) - Vof % curv(c) = Vof % curv(c) - div_z(c) + ! It might be an overkill to browse boundary cells here + do reg = Boundary_And_Inside_Regions() + do c = Cells_In_Region(reg) + Vof % curv(c) = Vof % curv(c) - div_x(c) + Vof % curv(c) = Vof % curv(c) - div_y(c) + Vof % curv(c) = Vof % curv(c) - div_z(c) + end do end do - call Grid % Exchange_Cells_Real(Vof % curv) ! call Grid % Save_Debug_Vtu('curv_sharp',scalar_cell=Vof % curv, & @@ -167,9 +171,10 @@ subroutine Curvature_Csf(Vof) ! call Grid% Save_Debug_Vtu('curv_smooth',scalar_cell=Vof % curv, & ! scalar_name='curv_smooth') - do c = 1, Grid % n_cells + do c = Cells_In_Domain() if(smooth % n(c) < 0.01 .or. smooth % n(c) > 0.99) Vof % curv(c) = 0.0 end do + call Grid % Exchange_Cells_Real(Vof % curv(-nb:nc)) call Work % Disconnect_Real_Cell(div_x, div_y, div_z) diff --git a/Sources/Process/Vof_Mod/Curvature/Smooth_Curvature.f90 b/Sources/Process/Vof_Mod/Curvature/Smooth_Curvature.f90 index 9928baabd..792c80219 100644 --- a/Sources/Process/Vof_Mod/Curvature/Smooth_Curvature.f90 +++ b/Sources/Process/Vof_Mod/Curvature/Smooth_Curvature.f90 @@ -49,50 +49,45 @@ subroutine Smooth_Curvature(Vof) gradk_y(-nb:nc) = 0.0 gradk_z(-nb:nc) = 0.0 - do s = 1, Grid % n_faces + do s = Faces_In_Domain() c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) - if(c2 > 0) then - fs = Grid % f(s) - curvf = fs * Vof % curv(c1) + (1.0 - fs) * Vof % curv(c2) - gradk_x(c1) = gradk_x(c1) + curvf * Grid % sx(s) / Grid % vol(c1) - gradk_y(c1) = gradk_y(c1) + curvf * Grid % sy(s) / Grid % vol(c1) - gradk_z(c1) = gradk_z(c1) + curvf * Grid % sz(s) / Grid % vol(c1) - gradk_x(c2) = gradk_x(c2) - curvf * Grid % sx(s) / Grid % vol(c2) - gradk_y(c2) = gradk_y(c2) - curvf * Grid % sy(s) / Grid % vol(c2) - gradk_z(c2) = gradk_z(c2) - curvf * Grid % sz(s) / Grid % vol(c2) - end if ! c2 > 0 - end do + fs = Grid % f(s) + curvf = fs * Vof % curv(c1) + (1.0 - fs) * Vof % curv(c2) + gradk_x(c1) = gradk_x(c1) + curvf * Grid % sx(s) / Grid % vol(c1) + gradk_y(c1) = gradk_y(c1) + curvf * Grid % sy(s) / Grid % vol(c1) + gradk_z(c1) = gradk_z(c1) + curvf * Grid % sz(s) / Grid % vol(c1) + gradk_x(c2) = gradk_x(c2) - curvf * Grid % sx(s) / Grid % vol(c2) + gradk_y(c2) = gradk_y(c2) - curvf * Grid % sy(s) / Grid % vol(c2) + gradk_z(c2) = gradk_z(c2) - curvf * Grid % sz(s) / Grid % vol(c2) + end do ! faces call Grid % Exchange_Cells_Real(gradk_x(-nb:nc)) call Grid % Exchange_Cells_Real(gradk_y(-nb:nc)) call Grid % Exchange_Cells_Real(gradk_z(-nb:nc)) ! Interior faces - do s = 1, Grid % n_faces + do s = Faces_In_Domain() c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) - if(c2 > 0) then - w_v1 = (1.0 - 2.0 * abs(0.5 - col % n(c1))) ** weight_s - w_v2 = (1.0 - 2.0 * abs(0.5 - col % n(c2))) ** weight_s - sum_k_weight(c1) = sum_k_weight(c1) + Vof % curv(c2) * w_v2 - sum_weight(c1) = sum_weight(c1) + w_v2 - - sum_k_weight(c2) = sum_k_weight(c2) + Vof % curv(c1) * w_v1 - sum_weight(c2) = sum_weight(c2) + w_v1 - end if - end do + w_v1 = (1.0 - 2.0 * abs(0.5 - col % n(c1))) ** weight_s + w_v2 = (1.0 - 2.0 * abs(0.5 - col % n(c2))) ** weight_s + sum_k_weight(c1) = sum_k_weight(c1) + Vof % curv(c2) * w_v2 + sum_weight(c1) = sum_weight(c1) + w_v2 + + sum_k_weight(c2) = sum_k_weight(c2) + Vof % curv(c1) * w_v1 + sum_weight(c2) = sum_weight(c2) + w_v1 + end do ! faces call Grid % Exchange_Cells_Real(sum_k_weight(-nb:nc)) call Grid % Exchange_Cells_Real(sum_weight (-nb:nc)) - do c = 1, Grid % n_cells + do c = Cells_In_Domain() w_v1 = (1.0 - 2.0 * abs(0.5 - col % n(c))) ** weight_s k_star(c) = (w_v1 * Vof % curv(c) + sum_k_weight(c)) & / (w_v1 + sum_weight(c) + FEMTO) end do - call Grid % Exchange_Cells_Real(k_star(-nb:nc)) !-------------------------------------------------------------------------! @@ -107,54 +102,49 @@ subroutine Smooth_Curvature(Vof) gradk_y(-nb:nc) = 0.0 gradk_z(-nb:nc) = 0.0 - do s = 1, Grid % n_faces + do s = Faces_In_Domain() c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) - if(c2 > 0) then - fs = Grid % f(s) - curvf = fs * k_star(c1) + (1.0 - fs) * k_star(c2) - gradk_x(c1) = gradk_x(c1) + curvf * Grid % sx(s) / Grid % vol(c1) - gradk_y(c1) = gradk_y(c1) + curvf * Grid % sy(s) / Grid % vol(c1) - gradk_z(c1) = gradk_z(c1) + curvf * Grid % sz(s) / Grid % vol(c1) - gradk_x(c2) = gradk_x(c2) - curvf * Grid % sx(s) / Grid % vol(c2) - gradk_y(c2) = gradk_y(c2) - curvf * Grid % sy(s) / Grid % vol(c2) - gradk_z(c2) = gradk_z(c2) - curvf * Grid % sz(s) / Grid % vol(c2) - end if ! c2 > 0 - end do + fs = Grid % f(s) + curvf = fs * k_star(c1) + (1.0 - fs) * k_star(c2) + gradk_x(c1) = gradk_x(c1) + curvf * Grid % sx(s) / Grid % vol(c1) + gradk_y(c1) = gradk_y(c1) + curvf * Grid % sy(s) / Grid % vol(c1) + gradk_z(c1) = gradk_z(c1) + curvf * Grid % sz(s) / Grid % vol(c1) + gradk_x(c2) = gradk_x(c2) - curvf * Grid % sx(s) / Grid % vol(c2) + gradk_y(c2) = gradk_y(c2) - curvf * Grid % sy(s) / Grid % vol(c2) + gradk_z(c2) = gradk_z(c2) - curvf * Grid % sz(s) / Grid % vol(c2) + end do call Grid % Exchange_Cells_Real(gradk_x(-nb:nc)) call Grid % Exchange_Cells_Real(gradk_y(-nb:nc)) call Grid % Exchange_Cells_Real(gradk_z(-nb:nc)) ! Interior faces - do s = 1, Grid % n_faces + do s = Faces_In_Domain() c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) - if(c2 > 0) then - w_v1 = (1.0 - 2.0 * abs(0.5 - col % n(c1))) ** weight_n - w_v2 = (1.0 - 2.0 * abs(0.5 - col % n(c2))) ** weight_n + w_v1 = (1.0 - 2.0 * abs(0.5 - col % n(c1))) ** weight_n + w_v2 = (1.0 - 2.0 * abs(0.5 - col % n(c2))) ** weight_n - w_m1 = abs(dot_product((/Vof % nx(c1), Vof % ny(c1), Vof % nz(c1)/), & - (/Grid % dx(s), Grid % dy(s), Grid % dz(s)/) & - / Grid % d(s))) ** weight_n + w_m1 = abs(dot_product((/Vof % nx(c1), Vof % ny(c1), Vof % nz(c1)/), & + (/Grid % dx(s), Grid % dy(s), Grid % dz(s)/) & + / Grid % d(s))) ** weight_n - w_m2 = abs(dot_product((/Vof % nx(c2), Vof % ny(c2), Vof % nz(c2)/), & - (/Grid % dx(s), Grid % dy(s), Grid % dz(s)/) & - / (-Grid % d(s)))) ** weight_n + w_m2 = abs(dot_product((/Vof % nx(c2), Vof % ny(c2), Vof % nz(c2)/), & + (/Grid % dx(s), Grid % dy(s), Grid % dz(s)/) & + / (-Grid % d(s)))) ** weight_n - sum_k_weight(c1) = sum_k_weight(c1) + k_star(c2) * w_v2 * w_m2 - sum_weight(c1) = sum_weight(c1) + w_v2 * w_m2 + sum_k_weight(c1) = sum_k_weight(c1) + k_star(c2) * w_v2 * w_m2 + sum_weight(c1) = sum_weight(c1) + w_v2 * w_m2 - sum_k_weight(c2) = sum_k_weight(c2) + k_star(c1) * w_v1 * w_m1 - sum_weight(c2) = sum_weight(c2) + w_v1 * w_m1 - end if ! c2 > 0 + sum_k_weight(c2) = sum_k_weight(c2) + k_star(c1) * w_v1 * w_m1 + sum_weight(c2) = sum_weight(c2) + w_v1 * w_m1 end do - call Grid % Exchange_Cells_Real(sum_k_weight(-nb:nc)) call Grid % Exchange_Cells_Real(sum_weight (-nb:nc)) - do c = 1, Grid % n_cells + do c = Cells_In_Domain() w_v1 = (1.0 - 2.0 * abs(0.5 - col % n(c))) ** weight_n Vof % curv(c) = (w_v1 * k_star(c) + sum_k_weight(c)) & / (w_v1 + sum_weight(c) + FEMTO) diff --git a/Sources/Process/Vof_Mod/Curvature/Smooth_Scalar.f90 b/Sources/Process/Vof_Mod/Curvature/Smooth_Scalar.f90 index e1d08bbb2..cb6d8643a 100644 --- a/Sources/Process/Vof_Mod/Curvature/Smooth_Scalar.f90 +++ b/Sources/Process/Vof_Mod/Curvature/Smooth_Scalar.f90 @@ -7,7 +7,7 @@ subroutine Smooth_Scalar(Vof, Grid, var, smooth_var, n_conv) !---------------------------------[Arguments]----------------------------------! class(Vof_Type), target :: Vof type(Grid_Type) :: Grid - integer :: n_conv, nb, nc + integer :: n_conv, nb, nc, reg real :: var(-Grid % n_bnd_cells: Grid % n_cells) real :: smooth_var(-Grid % n_bnd_cells & : Grid % n_cells) @@ -34,41 +34,41 @@ subroutine Smooth_Scalar(Vof, Grid, var, smooth_var, n_conv) !-------------------------------! ! Extrapolate to boundaries ! !-------------------------------! - - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0) smooth_var(c2) = smooth_var(c1) + do reg = Boundary_Regions() + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + smooth_var(c2) = smooth_var(c1) + end do end do ! At boundaries - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0) then + do reg = Boundary_Regions() + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + sum_vol_area(c1) = sum_vol_area(c1) + smooth_var(c1) * Grid % s(s) sum_area(c1) = sum_area(c1) + Grid % s(s) - end if + end do end do - do s = 1, Grid % n_faces + do s = Faces_In_Domain() c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) - if(c2 > 0) then - fs = Grid % f(s) - vol_face = fs * smooth_var(c1) + (1.0 - fs) * smooth_var(c2) - sum_vol_area(c1) = sum_vol_area(c1) + vol_face * Grid % s(s) - sum_vol_area(c2) = sum_vol_area(c2) + vol_face * Grid % s(s) - sum_area(c1) = sum_area(c1) + Grid % s(s) - sum_area(c2) = sum_area(c2) + Grid % s(s) - end if + fs = Grid % f(s) + vol_face = fs * smooth_var(c1) + (1.0-fs) * smooth_var(c2) + sum_vol_area(c1) = sum_vol_area(c1) + vol_face * Grid % s(s) + sum_vol_area(c2) = sum_vol_area(c2) + vol_face * Grid % s(s) + sum_area(c1) = sum_area(c1) + Grid % s(s) + sum_area(c2) = sum_area(c2) + Grid % s(s) end do call Grid % Exchange_Cells_Real(sum_vol_area(-nb:nc)) call Grid % Exchange_Cells_Real(sum_area (-nb:nc)) - do c = 1, Grid % n_cells + do c = Cells_In_Domain() smooth_var(c) = max(min(sum_vol_area(c) / sum_area(c), 1.0), 0.0) smooth_var(c) = sum_vol_area(c) / sum_area(c) end do @@ -77,13 +77,14 @@ subroutine Smooth_Scalar(Vof, Grid, var, smooth_var, n_conv) end do ! At boundaries - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0) smooth_var(c2) = smooth_var(c1) + do reg = Boundary_Regions() + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + smooth_var(c2) = smooth_var(c1) + end do end do - - call Grid % Exchange_Cells_Real(smooth_var) + call Grid % Exchange_Cells_Real(smooth_var(-nb:nc)) call Work % Disconnect_Real_Cell(sum_vol_area, sum_area) From 3b82daad96fe022f520659aeb9847343d7e7916a Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 28 Feb 2023 22:05:36 +0100 Subject: [PATCH 034/223] Fixed Convert for cases of purely tetrahedra grid On branch bojan_fixed_cell_ranges modified: Convert_Mod/Find_Faces.f90 --- Sources/Convert/Convert_Mod/Find_Faces.f90 | 38 +++++++++++++++++----- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/Sources/Convert/Convert_Mod/Find_Faces.f90 b/Sources/Convert/Convert_Mod/Find_Faces.f90 index 934b4bdff..0fa33508d 100644 --- a/Sources/Convert/Convert_Mod/Find_Faces.f90 +++ b/Sources/Convert/Convert_Mod/Find_Faces.f90 @@ -22,8 +22,8 @@ subroutine Find_Faces(Convert, Grid) type(Grid_Type) :: Grid !-----------------------------------[Locals]-----------------------------------! integer :: c, c1, c2, n1, n2, n3, f_nod(4) - integer :: n_match, i_fac, match_nodes(-1:8) - integer :: i1, i2, i_nod, cnt + integer :: n_match, i_fac, max_fac, match_nodes(-1:8) + integer :: i1, i2, i_nod, max_nod, cnt integer :: fn(6,4) integer, allocatable :: face_n1(:) integer, allocatable :: face_n2(:) @@ -44,6 +44,28 @@ subroutine Find_Faces(Convert, Grid) allocate(starts (Grid % n_cells*6)); starts (:) = 0 allocate(ends (Grid % n_cells*6)); ends (:) = 0 + !---------------------------------------------------! + ! Find max number of cells' faces for this grid ! + !---------------------------------------------------! + max_fac = 0 + do c = 1, Grid % n_cells + if(Grid % cells_n_nodes(c) .eq. 4) max_fac = max(max_fac, 4) + if(Grid % cells_n_nodes(c) .eq. 5) max_fac = max(max_fac, 5) + if(Grid % cells_n_nodes(c) .eq. 6) max_fac = max(max_fac, 5) + if(Grid % cells_n_nodes(c) .eq. 8) max_fac = max(max_fac, 6) + end do + + !---------------------------------------------------! + ! Find max number of faces' nodes for this grid ! + !---------------------------------------------------! + max_nod = 0 + do c = 1, Grid % n_cells + if(Grid % cells_n_nodes(c) .eq. 4) max_nod = max(max_nod, 3) + if(Grid % cells_n_nodes(c) .eq. 5) max_nod = max(max_nod, 4) + if(Grid % cells_n_nodes(c) .eq. 6) max_nod = max(max_nod, 4) + if(Grid % cells_n_nodes(c) .eq. 8) max_nod = max(max_nod, 4) + end do + !---------------------------------------------------! ! Fill the generic coordinates with some values ! !---------------------------------------------------! @@ -52,11 +74,11 @@ subroutine Find_Faces(Convert, Grid) if(Grid % cells_n_nodes(c) .eq. 5) fn = PYR if(Grid % cells_n_nodes(c) .eq. 6) fn = WED if(Grid % cells_n_nodes(c) .eq. 8) fn = HEX - do i_fac = 1, 6 + do i_fac = 1, max_fac if(Grid % cells_bnd_region(i_fac, c) .eq. 0) then ! Fetch face nodes (-1 becomes HUGE_INT and it will be the biggest) - do i_nod = 1, 4 + do i_nod = 1, max_nod f_nod(i_nod) = HUGE_INT if(fn(i_fac, i_nod) > 0) then f_nod(i_nod) = Grid % cells_n(fn(i_fac, i_nod), c) @@ -107,8 +129,8 @@ subroutine Find_Faces(Convert, Grid) ! Main loop to fill the faces_c structure ! ! ! !---------------------------------------------! - call Adjust_First_Dim(6, Grid % cells_c) ! i_fac goes to 6 - call Adjust_First_Dim(4, Grid % faces_n) ! i_nod goes to 4 + call Adjust_First_Dim(max_fac, Grid % cells_c) ! i_fac goes to max_fac + call Adjust_First_Dim(max_nod, Grid % faces_n) ! i_nod goes to max_nod do n3 = 1, cnt if(starts(n3) .ne. ends(n3)) then do i1=starts(n3),ends(n3) @@ -144,7 +166,7 @@ subroutine Find_Faces(Convert, Grid) if(Grid % cells_n_nodes(c1) .eq. 5) fn = PYR if(Grid % cells_n_nodes(c1) .eq. 6) fn = WED if(Grid % cells_n_nodes(c1) .eq. 8) fn = HEX - do i_fac = 1, 6 + do i_fac = 1, max_fac if(Grid % cells_c(i_fac, c1) .eq. 0 .and. & ! not set yet ( max( match_nodes(fn(i_fac, 1)),0 ) + & max( match_nodes(fn(i_fac, 2)),0 ) + & @@ -154,7 +176,7 @@ subroutine Find_Faces(Convert, Grid) Grid % faces_c(1,Grid % n_faces) = c1 Grid % faces_c(2,Grid % n_faces) = c2 Grid % faces_n_nodes(Grid % n_faces) = n_match - do i_nod = 1, 4 + do i_nod = 1, max_nod if(fn(i_fac, i_nod) > 0) then Grid % faces_n(i_nod,Grid % n_faces) = & Grid % cells_n(fn(i_fac, i_nod), c1) From b9341485058cefd56c72eb64bfa72167e8585fcf Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 1 Mar 2023 09:17:49 +0100 Subject: [PATCH 035/223] Fixed VOF initialization from STL Previosly, no care was taken of boundary values :-( On branch bojan_fixed_cell_ranges modified: Process/Vof_Mod/Core/Initialize_From_Stl.f90 modified: Shared/Browse.h90 modified: Shared/Grid_Mod/Determine_Regions_Ranges.f90 --- .../Vof_Mod/Core/Initialize_From_Stl.f90 | 43 ++++++++++++++----- Sources/Shared/Browse.h90 | 3 ++ .../Grid_Mod/Determine_Regions_Ranges.f90 | 4 +- 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/Sources/Process/Vof_Mod/Core/Initialize_From_Stl.f90 b/Sources/Process/Vof_Mod/Core/Initialize_From_Stl.f90 index ea0b8273f..b36b436db 100644 --- a/Sources/Process/Vof_Mod/Core/Initialize_From_Stl.f90 +++ b/Sources/Process/Vof_Mod/Core/Initialize_From_Stl.f90 @@ -20,8 +20,8 @@ subroutine Initialize_From_Stl(Vof) real, pointer, contiguous :: surf_dist(:), node_dist(:) integer, pointer, contiguous :: dis_nod_int(:), cut_cel(:), glo(:) integer, pointer, contiguous :: set_cel(:), set_old(:) - integer :: b, c, s, i_nod, j_nod, i, j, k1, k2, m - integer :: i_iso, i_ver, i_fac, fac, p + integer :: b, c, c1, c2, s, i_nod, j_nod, i, j, k1, k2, m + integer :: i_iso, i_ver, i_fac, fac, p, reg integer :: n_cut_facets, cut_facets(1024) real :: vol_1, vol_2, vol_3, vol_4, vol_5 real :: cell_vol, cel0_vol, cel1_vol, d, d1, d2 @@ -67,13 +67,13 @@ subroutine Initialize_From_Stl(Vof) if(this_proc < 2) then print '(a)', ' # Calculating distance from the STL interface' end if - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() surf_dist_pos(c) = 0.0 surf_dist_neg(c) = 0.0 node_dist(c) = -HUGE end do - do c = 1, Grid % n_cells + do c = Cells_In_Domain() if(this_proc < 2) then write(*,'(a2,f5.0,a14,a1)', advance='no') ' #', & (100.*real(c)/real(Grid % n_cells)), ' % complete...', achar(13) @@ -124,8 +124,12 @@ subroutine Initialize_From_Stl(Vof) Grid % xn(i), Grid % yn(i), Grid % zn(i))) end do end do + call Grid % Exchange_Cells_Real(node_dist) + call Grid % Exchange_Cells_Real(surf_dist) + call Grid % Exchange_Cells_Real(surf_dist_pos) + call Grid % Exchange_Cells_Real(surf_dist_neg) - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() node_dist(c) = sqrt(node_dist(c)) end do if(DEBUG) then @@ -155,7 +159,7 @@ subroutine Initialize_From_Stl(Vof) ! ! !----------------------------------------------------! if(this_proc < 2) print '(a)', ' # Searching for cells cut by the STL facets' - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() ! Fetch cell coordinates qc(1) = Grid % xc(c); qc(2) = Grid % yc(c); qc(3) = Grid % zc(c) @@ -318,7 +322,7 @@ subroutine Initialize_From_Stl(Vof) m = m + 1 flooding = .false. - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() if( set_cel(c) .eq. NO ) then flooding = .true. ! flooding is still going on @@ -369,7 +373,7 @@ subroutine Initialize_From_Stl(Vof) call Grid % Exchange_Cells_Real(vof_body(:,b)) ! Check if the cell has been set in another processor - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() if( set_cel(c) .eq. YES .and. set_old(c) .eq. NO ) then if(vof_body(c, b) < MICRO) then ! the cell was filled with zero do i_nod = 1, abs(Grid % cells_n_nodes(c)) @@ -607,13 +611,30 @@ subroutine Initialize_From_Stl(Vof) call Work % Disconnect_Real_Cell(node_dist) end do ! through boddies + call Grid % Exchange_Cells_Real(Vof % fun % n) + + !-----------------------------! + ! Set boundary values too ! + !-----------------------------! + do reg = Boundary_Regions() + if(Grid % region % type(reg) .ne. INFLOW) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + + Vof % fun % n(c2) = Vof % fun % n(c1) + end do ! faces + end if ! inflow + end do ! region !------------------------------------! ! Set the old time steps as well ! !------------------------------------! - do c = 1, Grid % n_cells - Vof % fun % o (c) = Vof % fun % n(c) - Vof % fun % oo(c) = Vof % fun % n(c) + do reg = Boundary_Inside_And_Buffer_Regions() + do c = Cells_In_Region(reg) + Vof % fun % o (c) = Vof % fun % n(c) + Vof % fun % oo(c) = Vof % fun % n(c) + end do end do if(DEBUG) then diff --git a/Sources/Shared/Browse.h90 b/Sources/Shared/Browse.h90 index aa864591d..bd68effb8 100644 --- a/Sources/Shared/Browse.h90 +++ b/Sources/Shared/Browse.h90 @@ -8,6 +8,9 @@ # define Boundary_And_Inside_Regions() \ 1, Grid % n_regions +# define Boundary_Inside_And_Buffer_Regions() \ + 1, Grid % n_regions + 1 + # define All_Regions() \ 1, Grid % n_bnd_regions + 5 diff --git a/Sources/Shared/Grid_Mod/Determine_Regions_Ranges.f90 b/Sources/Shared/Grid_Mod/Determine_Regions_Ranges.f90 index 5708b223a..de15665e0 100644 --- a/Sources/Shared/Grid_Mod/Determine_Regions_Ranges.f90 +++ b/Sources/Shared/Grid_Mod/Determine_Regions_Ranges.f90 @@ -56,9 +56,11 @@ subroutine Determine_Regions_Ranges(Grid) end do ! Buffer cells + ! Note: leave Grid % region % l_cell(reg) at Grid % n_cells since + ! it makes macro Cells_In_Domain_And_Buffers() work in sequential reg = Grid % n_regions + 1 Grid % region % f_cell(reg) = Grid % n_cells + 1 - Grid % region % l_cell(reg) = 1 + Grid % region % l_cell(reg) = Grid % n_cells do c = 1, Grid % n_cells if(Grid % Comm % cell_proc(c) .ne. this_proc) then if(c < Grid % region % f_cell(reg)) then From b85af33f010e2514212241ad23badd43de8e0846 Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 2 Mar 2023 13:02:58 +0100 Subject: [PATCH 036/223] Improved conversion from GMSH in terms of speed This was achieved by estimating the beginnings (positions) of each section in GMSH file and then positiong to them before reading. In the previous version, the file had to be rewinded are reread many times over. Also, added a conditional Intel compilation directive for ftell and fseek commands. The syntax for them is not the same for GNU and Intel Fortrans. On branch bojan_fixed_cell_ranges modified: Convert_Mod.f90 modified: Convert_Mod/Load_Fluent.f90 modified: Convert_Mod/Load_Gmsh.f90 --- Sources/Convert/Convert_Mod.f90 | 4 + Sources/Convert/Convert_Mod/Load_Fluent.f90 | 32 +++-- Sources/Convert/Convert_Mod/Load_Gmsh.f90 | 144 +++++++++++++------- 3 files changed, 116 insertions(+), 64 deletions(-) diff --git a/Sources/Convert/Convert_Mod.f90 b/Sources/Convert/Convert_Mod.f90 index 58e484529..86c4522d7 100644 --- a/Sources/Convert/Convert_Mod.f90 +++ b/Sources/Convert/Convert_Mod.f90 @@ -1,3 +1,4 @@ +#include "../Shared/Assert.h90" #include "../Shared/Browse.h90" !==============================================================================! @@ -5,6 +6,9 @@ module Convert_Mod !------------------------------------------------------------------------------! !----------------------------------[Modules]-----------------------------------! use Stl_Mod +# ifdef __INTEL_COMPILER + use Ifport ! Intel's module for fseek and ftell +# endif !------------------------------------------------------------------------------! ! Collection of functions used in the Convert program. In honesty, it was ! ! introduced to get rid of the Fortran header files with interfaces which, ! diff --git a/Sources/Convert/Convert_Mod/Load_Fluent.f90 b/Sources/Convert/Convert_Mod/Load_Fluent.f90 index 137781c57..374f60008 100644 --- a/Sources/Convert/Convert_Mod/Load_Fluent.f90 +++ b/Sources/Convert/Convert_Mod/Load_Fluent.f90 @@ -10,6 +10,18 @@ subroutine Load_Fluent(Convert, Grid, file_name) character(SL) :: file_name !----------------------------------[Calling]-----------------------------------! integer(DP) :: ftell +!------------------------------[Local parameters]------------------------------! + integer, parameter :: MIXED_ZONE = 0 + integer, parameter :: CELL_TRI = 1 + integer, parameter :: CELL_TETRA = 2 + integer, parameter :: CELL_QUAD = 3 + integer, parameter :: CELL_HEXA = 4 + integer, parameter :: CELL_PYRA = 5 + integer, parameter :: CELL_WEDGE = 6 + integer, parameter :: CELL_POLY = 7 + integer, parameter :: FACE_TRI = 3 + integer, parameter :: FACE_QUAD = 4 + integer, parameter :: FACE_POLY = 5 ! just a guess !-----------------------------------[Locals]-----------------------------------! character(SL) :: one_token character(1) :: one_char @@ -17,7 +29,7 @@ subroutine Load_Fluent(Convert, Grid, file_name) integer :: n_tri, n_quad, n_tet, n_hexa, n_pyra, n_wed, n_poly integer :: n_cells, n_bnd_cells, n_faces, n_nodes integer :: n_face_nodes, n_cells_zone - integer :: c, c1, c2, s, n, fu, i, l, pos, length + integer :: c, c1, c2, s, n, fu, i, l, pos, length, error integer :: i_cel, i_nod, j_nod, k_nod, l_nod, i_fac integer :: cell_type, zone_type integer :: cell_f, cell_l, side_f, side_l, node_f, node_l @@ -31,18 +43,6 @@ subroutine Load_Fluent(Convert, Grid, file_name) logical :: ascii ! is file in ascii format? integer, allocatable :: cell_visited_from(:), cell_types(:) character, allocatable :: very_long_line(:) -!------------------------------[Local parameters]------------------------------! - integer, parameter :: MIXED_ZONE = 0 - integer, parameter :: CELL_TRI = 1 - integer, parameter :: CELL_TETRA = 2 - integer, parameter :: CELL_QUAD = 3 - integer, parameter :: CELL_HEXA = 4 - integer, parameter :: CELL_PYRA = 5 - integer, parameter :: CELL_WEDGE = 6 - integer, parameter :: CELL_POLY = 7 - integer, parameter :: FACE_TRI = 3 - integer, parameter :: FACE_QUAD = 4 - integer, parameter :: FACE_POLY = 5 ! just a guess !==============================================================================! call Profiler % Start('Load_Fluent') @@ -433,7 +433,11 @@ subroutine Load_Fluent(Convert, Grid, file_name) ! Find out the Line length offset = ftell(fu) ! mark offset length = File % Line_Length(fu) ! read the Line - call fseek(fu, offset, 0) ! go back +# ifdef __INTEL_COMPILER + error = fseek(fu, offset, 0) +# else + call fseek(fu, offset, 0) +# endif ! Allocate helping arrays allocate(very_long_line(length)) ! allocate very long Line diff --git a/Sources/Convert/Convert_Mod/Load_Gmsh.f90 b/Sources/Convert/Convert_Mod/Load_Gmsh.f90 index 4cf2f996a..cdcd465ee 100644 --- a/Sources/Convert/Convert_Mod/Load_Gmsh.f90 +++ b/Sources/Convert/Convert_Mod/Load_Gmsh.f90 @@ -8,23 +8,29 @@ subroutine Load_Gmsh(Convert, Grid, file_name) class(Convert_Type) :: Convert type(Grid_Type) :: Grid character(SL) :: file_name +!------------------------------[Local parameters]------------------------------! + integer, parameter :: MSH_TRI = 2 + integer, parameter :: MSH_QUAD = 3 + integer, parameter :: MSH_TETRA = 4 + integer, parameter :: MSH_HEXA = 5 + integer, parameter :: MSH_WEDGE = 6 + integer, parameter :: MSH_PYRA = 7 !-----------------------------------[Locals]-----------------------------------! integer :: n_sect, n_elem, n_blocks, n_bnd_sect, n_grps - integer :: n_memb, n_tags, n_crvs, n_nods + integer :: n_memb, n_tags, n_crvs, n_nods, error integer :: i, j, k, c, dim, p_tag, s_tag, type, fu integer :: run, s_tag_max, n_e_0d, n_e_1d, n_e_2d, n_e_3d integer, allocatable :: n(:), new(:) integer, allocatable :: phys_tags(:), p_tag_corr(:), n_bnd_cells(:) character(SL), allocatable :: phys_names(:) logical :: ascii ! is file in ascii format? - logical :: the_end ! did it reach the end -!------------------------------[Local parameters]------------------------------! - integer, parameter :: MSH_TRI = 2 - integer, parameter :: MSH_QUAD = 3 - integer, parameter :: MSH_TETRA = 4 - integer, parameter :: MSH_HEXA = 5 - integer, parameter :: MSH_WEDGE = 6 - integer, parameter :: MSH_PYRA = 7 + integer :: pos + integer :: pos_meshformat = 12 + integer :: pos_physicalnames = -1 + integer :: pos_entities = -1 + integer :: pos_nodes = -1 + integer :: pos_elements = -1 + integer(1) :: byte(0:3) !==============================================================================! call Profiler % Start('Load_Gmsh') @@ -32,6 +38,48 @@ subroutine Load_Gmsh(Convert, Grid, file_name) ! Open the file in binary mode, because it just might be call File % Open_For_Reading_Binary(file_name, fu) + !-----------------------------------------------------------! + ! A very rudimentary way to find beginnings of sections ! + !-----------------------------------------------------------! + pos = 0 + do + read(fu, end=2) byte(0); pos = pos + 1 + if(char(byte(0)) .eq. '$') then + read(fu, end=2) byte(1); pos = pos + 1 + read(fu, end=2) byte(2); pos = pos + 1 + read(fu, end=2) byte(3); pos = pos + 1 + if(char(byte(1)) .eq. 'E' .and. & + char(byte(2)) .eq. 'n' .and. & + char(byte(3)) .eq. 'd') then + do i = 1, MAX_TOKENS*2 + read(fu, end=2) byte(0); pos = pos + 1 + if(byte(0) .eq. 10) exit + end do + Line % whole = '' + do i = 1, MAX_TOKENS*2 + read(fu, end=2) byte(0); pos = pos + 1 + if(byte(0) .eq. 10) exit + if(byte(0) .ne. 13) Line % whole(i:i) = char(byte(0)) + end do + if(Line % whole .eq. '$PhysicalNames') pos_physicalnames = pos + if(Line % whole .eq. '$Entities') pos_entities = pos + if(Line % whole .eq. '$Nodes') pos_nodes = pos + if(Line % whole .eq. '$Elements') pos_elements = pos + end if + end if + end do +2 continue + + ! Error trap + if(pos_physicalnames .eq. -1) then + call Message % Error(60, & + "This is bad. PhysicalNames don't seem to be defined in the " // & + ".msh file. Maybe you forgot to define boundary conditions " // & + "(called physical groups) in Gmsh?", & + file=__FILE__, line=__LINE__) + end if + print *, '# Broswed the file in binary format and read ', pos, ' bytes' + !----------------------------------------! ! Gmsh can't handle polyhedral grids ! !----------------------------------------! @@ -41,10 +89,8 @@ subroutine Load_Gmsh(Convert, Grid, file_name) ! Check format fo the file ! !------------------------------! rewind(fu) - do - call File % Read_Line(fu) - if(Line % tokens(1) .eq. '$MeshFormat') exit - end do + call File % Read_Line(fu) + Assert(Line % tokens(1) == '$MeshFormat') call File % Read_Line(fu) if(Line % tokens(1) .ne. '4.1') then call Message % Error(60, & @@ -56,7 +102,6 @@ subroutine Load_Gmsh(Convert, Grid, file_name) ! My guess is that second tokens says it is binary (1) or not (0) ascii = .true. if(Line % tokens(2) .eq. '1') ascii = .false. - ! Line which follows contains some crap, but who cares? !----------------------------------------------! ! ! @@ -73,19 +118,12 @@ subroutine Load_Gmsh(Convert, Grid, file_name) !-------------------------------------------------! n_blocks = 0 n_bnd_sect = 0 - the_end = .false. rewind(fu) - do - call File % Read_Line(fu, reached_end=the_end) - if(Line % tokens(1) .eq. '$PhysicalNames') exit - if(the_end) then - call Message % Error(60, & - "This is bad. PhysicalNames don't seem to be defined in the " // & - ".msh file. Maybe you forgot to define boundary conditions " // & - "(called physical groups) in Gmsh?", & - file=__FILE__, line=__LINE__) - end if - end do +# ifdef __INTEL_COMPILER + error = fseek(fu, pos_physicalnames, 0) +# else + call fseek(fu, pos_physicalnames, 0) +# endif call File % Read_Line(fu) read(Line % tokens(1), *) n_sect allocate(phys_names(n_sect)) @@ -109,10 +147,11 @@ subroutine Load_Gmsh(Convert, Grid, file_name) ! ! !--------------------------! rewind(fu) - do - call File % Read_Line(fu) - if(Line % tokens(1) .eq. '$Nodes') exit - end do +# ifdef __INTEL_COMPILER + error = fseek(fu, pos_nodes, 0) +# else + call fseek(fu, pos_nodes, 0) +# endif if(ascii) then call File % Read_Line(fu) read(Line % tokens(4), *) Grid % n_nodes ! 2 and 4 store number of nodes @@ -128,10 +167,11 @@ subroutine Load_Gmsh(Convert, Grid, file_name) ! ! !--------------------------------------! rewind(fu) - do - call File % Read_Line(fu) - if(Line % tokens(1) .eq. '$Elements') exit - end do +# ifdef __INTEL_COMPILER + error = fseek(fu, pos_elements, 0) +# else + call fseek(fu, pos_elements, 0) +# endif if(ascii) then call File % Read_Line(fu) read(Line % tokens(4), *) n_elem ! both 2 and 4 store number of elements @@ -151,10 +191,11 @@ subroutine Load_Gmsh(Convert, Grid, file_name) if(run .eq. 1) s_tag_max = 0 rewind(fu) - do - call File % Read_Line(fu) - if(Line % tokens(1) .eq. '$Entities') exit - end do +# ifdef __INTEL_COMPILER + error = fseek(fu, pos_entities, 0) +# else + call fseek(fu, pos_entities, 0) +# endif if(ascii) then call File % Read_Line(fu) read(Line % tokens(1), *) n_e_0d ! number of 0D entities (points) @@ -268,10 +309,11 @@ subroutine Load_Gmsh(Convert, Grid, file_name) Grid % n_bnd_cells = 0 Grid % n_cells = 0 rewind(fu) - do - call File % Read_Line(fu) - if(Line % tokens(1) .eq. '$Elements') exit - end do +# ifdef __INTEL_COMPILER + error = fseek(fu, pos_elements, 0) +# else + call fseek(fu, pos_elements, 0) +# endif !-------------------------------! ! Read the number of groups ! @@ -356,10 +398,11 @@ subroutine Load_Gmsh(Convert, Grid, file_name) n_bnd_cells(:) = 0 rewind(fu) - do - call File % Read_Line(fu) - if(Line % tokens(1) .eq. '$Elements') exit - end do +# ifdef __INTEL_COMPILER + error = fseek(fu, pos_elements, 0) +# else + call fseek(fu, pos_elements, 0) +# endif !-------------------------------! ! Read the number of groups ! @@ -447,10 +490,11 @@ subroutine Load_Gmsh(Convert, Grid, file_name) ! ! !--------------------------------! rewind(fu) - do - call File % Read_Line(fu) - if(Line % tokens(1) .eq. '$Nodes') exit - end do +# ifdef __INTEL_COMPILER + error = fseek(fu, pos_nodes, 0) +# else + call fseek(fu, pos_nodes, 0) +# endif !-------------------------------! ! Read the number of groups ! From f90701d8e9a08ef03a7dd440b0ec3eabe266bce0 Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 2 Mar 2023 21:46:12 +0100 Subject: [PATCH 037/223] Removed unused declaration and changed a comment On branch bojan_fixed_cell_ranges modified: Convert_Mod/Load_Fluent.f90 --- Sources/Convert/Convert_Mod/Load_Fluent.f90 | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Sources/Convert/Convert_Mod/Load_Fluent.f90 b/Sources/Convert/Convert_Mod/Load_Fluent.f90 index 374f60008..5bc78e49a 100644 --- a/Sources/Convert/Convert_Mod/Load_Fluent.f90 +++ b/Sources/Convert/Convert_Mod/Load_Fluent.f90 @@ -8,8 +8,6 @@ subroutine Load_Fluent(Convert, Grid, file_name) class(Convert_Type) :: Convert type(Grid_Type) :: Grid character(SL) :: file_name -!----------------------------------[Calling]-----------------------------------! - integer(DP) :: ftell !------------------------------[Local parameters]------------------------------! integer, parameter :: MIXED_ZONE = 0 integer, parameter :: CELL_TRI = 1 @@ -21,7 +19,7 @@ subroutine Load_Fluent(Convert, Grid, file_name) integer, parameter :: CELL_POLY = 7 integer, parameter :: FACE_TRI = 3 integer, parameter :: FACE_QUAD = 4 - integer, parameter :: FACE_POLY = 5 ! just a guess + integer, parameter :: FACE_POLY = 5 ! an educated guess, but seems good !-----------------------------------[Locals]-----------------------------------! character(SL) :: one_token character(1) :: one_char From 0a4434092f7a6e70195e646e98cf3061905be8a8 Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 2 Mar 2023 21:47:49 +0100 Subject: [PATCH 038/223] Further improvements of speed of conversion This was achieved by replacing "File % Read_Line" with as many simple and plain Fortran's "read" statements. The improvement was staggering. As an illustration. For a typical grid with 1M cells, the reading of GMSH files was reduced from 1 minute and 20 seconds to only 18 seconds. The former timing was measured for check in: 95aad328063b80abb39394a9dad933e5104e3b3e, not just for the previous check in. It would be useful to make similar changes to Load_Fluent.f90 On branch bojan_fixed_cell_ranges modified: Convert/Convert_Mod/Load_Gmsh.f90 --- Sources/Convert/Convert_Mod/Load_Gmsh.f90 | 55 +++++++++++++---------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/Sources/Convert/Convert_Mod/Load_Gmsh.f90 b/Sources/Convert/Convert_Mod/Load_Gmsh.f90 index cdcd465ee..0e287fe82 100644 --- a/Sources/Convert/Convert_Mod/Load_Gmsh.f90 +++ b/Sources/Convert/Convert_Mod/Load_Gmsh.f90 @@ -35,7 +35,11 @@ subroutine Load_Gmsh(Convert, Grid, file_name) call Profiler % Start('Load_Gmsh') - ! Open the file in binary mode, because it just might be + !-------------------------------------------------------! + ! ! + ! Open the file in binary mode for initial analyzis ! + ! ! + !-------------------------------------------------------! call File % Open_For_Reading_Binary(file_name, fu) !-----------------------------------------------------------! @@ -103,6 +107,17 @@ subroutine Load_Gmsh(Convert, Grid, file_name) ascii = .true. if(Line % tokens(2) .eq. '1') ascii = .false. + !------------------------------------------! + ! ! + ! Once you know the format of the file ! + ! close it and open again if ASCII ! + ! ! + !------------------------------------------! + if(ascii) then + close(fu) + call File % Open_For_Reading_Ascii(file_name, fu) + end if + !----------------------------------------------! ! ! ! ! @@ -153,7 +168,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) call fseek(fu, pos_nodes, 0) # endif if(ascii) then - call File % Read_Line(fu) + read(fu, *) (Line % tokens(k), k = 1, 4) read(Line % tokens(4), *) Grid % n_nodes ! 2 and 4 store number of nodes else call File % Read_Binary_Int8_Array(fu, 4) @@ -173,7 +188,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) call fseek(fu, pos_elements, 0) # endif if(ascii) then - call File % Read_Line(fu) + read(fu, *) (Line % tokens(k), k = 1, 4) read(Line % tokens(4), *) n_elem ! both 2 and 4 store number of elements else call File % Read_Binary_Int8_Array(fu, 4) @@ -197,7 +212,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) call fseek(fu, pos_entities, 0) # endif if(ascii) then - call File % Read_Line(fu) + read(fu, *) (Line % tokens(k), k = 1, 4) read(Line % tokens(1), *) n_e_0d ! number of 0D entities (points) read(Line % tokens(2), *) n_e_1d ! number of 1D entities (lines) read(Line % tokens(3), *) n_e_2d ! number of 2D entities (faces) @@ -215,7 +230,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) !--------------------------! if(ascii) then do i = 1, n_e_0d - call File % Read_Line(fu) + read(fu, *) Line % whole end do else do i = 1, n_e_0d @@ -233,7 +248,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) !--------------------------! if(ascii) then do i = 1, n_e_1d - call File % Read_Line(fu) + read(fu, *) Line % whole end do else do i = 1, n_e_1d @@ -319,8 +334,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) ! Read the number of groups ! !-------------------------------! if(ascii) then - call File % Read_Line(fu) - read(Line % tokens(1),*) n_grps + read(fu, *) n_grps else call File % Read_Binary_Int8_Array(fu, 4) n_grps = int8_array(1) @@ -333,7 +347,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) ! Read dim, s_tag, type and n_memb <--= this is what you actually need! if(ascii) then - call File % Read_Line(fu) + read(fu, *) (Line % tokens(k), k = 1, 4) read(Line % tokens(1), *) dim ! dimension of the element read(Line % tokens(2), *) s_tag ! element tag read(Line % tokens(3), *) type ! element type @@ -350,8 +364,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) ! Read cell number and cell's nodes <--= this is just to carry on do j = 1, n_memb if(ascii) then - call File % Read_Line(fu) - read(Line % tokens(1), *) c ! Gmsh cell number + read(fu, *) c else ! Element tag call File % Read_Binary_Int8_Array(fu, 1) @@ -408,8 +421,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) ! Read the number of groups ! !-------------------------------! if(ascii) then - call File % Read_Line(fu) - read(Line % tokens(1),*) n_grps + read(fu, *) n_grps else call File % Read_Binary_Int8_Array(fu, 4) n_grps = int8_array(1) @@ -422,7 +434,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) ! Read dim, s_tag, type and n_memb if(ascii) then - call File % Read_Line(fu) + read(fu, *) (Line % tokens(k), k = 1, 4) read(Line % tokens(1), *) dim ! dimension of the element read(Line % tokens(2), *) s_tag ! element tag read(Line % tokens(3), *) type ! element type @@ -447,7 +459,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) ! Read cell number and cell's nodes do j = 1, n_memb if(ascii) then - call File % Read_Line(fu) + read(fu, *) (Line % tokens(k), k = 1, 1 + n_nods) read(Line % tokens(1), *) c ! fetch Gmsh cell number c = new(c) ! use T-Flows numbering @@ -500,8 +512,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) ! Read the number of groups ! !-------------------------------! if(ascii) then - call File % Read_Line(fu) - read(Line % tokens(1),*) n_grps + read(fu, *) n_grps else call File % Read_Binary_Int8_Array(fu, 4) n_grps = int8_array(1) @@ -512,7 +523,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) !-------------------------------------------------------! do i = 1, n_grps if(ascii) then - call File % Read_Line(fu) + read(fu, *) (Line % tokens(k), k = 1, 4) read(Line % tokens(4),*) n_memb ! fetch number of members else call File % Read_Binary_Int4_Array(fu, 3) @@ -524,8 +535,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) ! Fetch all node numbers in the group if(ascii) then do j = 1, n_memb - call File % Read_Line(fu) - read(Line % tokens(1),*) n(j) + read(fu, *) n(j) end do else do j = 1, n_memb ! fetch all node numbers @@ -537,10 +547,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) ! Fetch all node coordinates in the group if(ascii) then do j = 1, n_memb - call File % Read_Line(fu) ! read node coordinates - read(Line % tokens(1),*) Grid % xn(n(j)) - read(Line % tokens(2),*) Grid % yn(n(j)) - read(Line % tokens(3),*) Grid % zn(n(j)) + read(fu, *) Grid % xn(n(j)), Grid % yn(n(j)), Grid % zn(n(j)) end do else do j = 1, n_memb From 9abcb008f3ae93bcac69ae0f06bb6e4b72c97e99 Mon Sep 17 00:00:00 2001 From: Niceno Date: Fri, 3 Mar 2023 08:48:58 +0100 Subject: [PATCH 039/223] Uses regions for Reynods stress models On branch bojan_fixed_cell_ranges modified: Process_Mod/Update_Boundary_Values.f90 --- .../Process_Mod/Update_Boundary_Values.f90 | 89 ++++++++++--------- 1 file changed, 49 insertions(+), 40 deletions(-) diff --git a/Sources/Process/Process_Mod/Update_Boundary_Values.f90 b/Sources/Process/Process_Mod/Update_Boundary_Values.f90 index 4aabb1be2..47387301d 100644 --- a/Sources/Process/Process_Mod/Update_Boundary_Values.f90 +++ b/Sources/Process/Process_Mod/Update_Boundary_Values.f90 @@ -121,31 +121,19 @@ subroutine Update_Boundary_Values(Process, Flow, Turb, Vof, update) !----------------! if(update .eq. 'TURBULENCE' .or. update .eq. 'ALL') then - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - ! On the boundary perform the extrapolation - if(c2 < 0) then + !----------------------------! + ! Reynolds stress models ! + !----------------------------! + if(Turb % model .eq. RSM_MANCEAU_HANJALIC .or. & + Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then + + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. WALL .or. & + Grid % region % type(reg) .eq. WALLFL) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) - - ! Spalart Allmaras - if(Turb % model .eq. SPALART_ALLMARAS .or. & - Turb % model .eq. DES_SPALART) then - if ( Grid % Bnd_Cond_Type(c2) .eq. OUTFLOW .or. & - Grid % Bnd_Cond_Type(c2) .eq. CONVECT .or. & - Grid % Bnd_Cond_Type(c2) .eq. PRESSURE .or. & - Grid % Bnd_Cond_Type(c2) .eq. SYMMETRY) then - vis % n(c2) = vis % n(c1) - end if - end if - - ! Reynolds stress models - if(Turb % model .eq. RSM_MANCEAU_HANJALIC .or. & - Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then - - if(Grid % Bnd_Cond_Type(c2) .eq. WALL .or. & - Grid % Bnd_Cond_Type(c2) .eq. WALLFL) then uu % n(c2) = 0.0 vv % n(c2) = 0.0 ww % n(c2) = 0.0 @@ -161,6 +149,43 @@ subroutine Update_Boundary_Values(Process, Flow, Turb, Vof, update) kin_vis, & 0.0) if(Turb % model .eq. RSM_MANCEAU_HANJALIC) f22 % n(c2) = 0.0 + end do ! faces + else if(Grid % region % type(reg).eq. OUTFLOW .or. & + Grid % region % type(reg).eq. PRESSURE) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + + uu % n(c2) = uu % n(c1) + vv % n(c2) = vv % n(c1) + ww % n(c2) = ww % n(c1) + uv % n(c2) = uv % n(c1) + uw % n(c2) = uw % n(c1) + vw % n(c2) = vw % n(c1) + kin % n(c2) = kin % n(c1) + eps % n(c2) = eps % n(c1) + if(Turb % model .eq. RSM_MANCEAU_HANJALIC) & + f22 % n(c2) = f22 % n(c1) + end do ! faces + end if ! boundary condition + end do ! regions + end if ! turbulence model + + do s = 1, Grid % n_faces + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + + ! On the boundary perform the extrapolation + if(c2 < 0) then + + ! Spalart Allmaras + if(Turb % model .eq. SPALART_ALLMARAS .or. & + Turb % model .eq. DES_SPALART) then + if ( Grid % Bnd_Cond_Type(c2) .eq. OUTFLOW .or. & + Grid % Bnd_Cond_Type(c2) .eq. CONVECT .or. & + Grid % Bnd_Cond_Type(c2) .eq. PRESSURE .or. & + Grid % Bnd_Cond_Type(c2) .eq. SYMMETRY) then + vis % n(c2) = vis % n(c1) end if end if @@ -194,22 +219,6 @@ subroutine Update_Boundary_Values(Process, Flow, Turb, Vof, update) end if end if - if(Turb % model .eq. RSM_MANCEAU_HANJALIC .or. & - Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then - if(Grid % Bnd_Cond_Type(c2) .eq. OUTFLOW .or. & - Grid % Bnd_Cond_Type(c2) .eq. PRESSURE) then - uu % n(c2) = uu % n(c1) - vv % n(c2) = vv % n(c1) - ww % n(c2) = ww % n(c1) - uv % n(c2) = uv % n(c1) - uw % n(c2) = uw % n(c1) - vw % n(c2) = vw % n(c1) - kin % n(c2) = kin % n(c1) - eps % n(c2) = eps % n(c1) - if(Turb % model .eq. RSM_MANCEAU_HANJALIC) & - f22 % n(c2) = f22 % n(c1) - end if - end if end if ! c2 < 0 end do From 9af8965b6cf038e28d48a45695cbc8502ae83909 Mon Sep 17 00:00:00 2001 From: Niceno Date: Fri, 3 Mar 2023 10:19:54 +0100 Subject: [PATCH 040/223] Uses regions for one, two and four equation models On branch bojan_fixed_cell_ranges modified: Process_Mod/Convective_Outflow.f90 modified: Process_Mod/Update_Boundary_Values.f90 --- .../Process_Mod/Convective_Outflow.f90 | 40 ++++++ .../Process_Mod/Update_Boundary_Values.f90 | 135 +++++++++++------- 2 files changed, 122 insertions(+), 53 deletions(-) diff --git a/Sources/Process/Process_Mod/Convective_Outflow.f90 b/Sources/Process/Process_Mod/Convective_Outflow.f90 index ddb321af0..aba7f6cde 100644 --- a/Sources/Process/Process_Mod/Convective_Outflow.f90 +++ b/Sources/Process/Process_Mod/Convective_Outflow.f90 @@ -223,6 +223,46 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) end if + !---------------------! + ! Spalart-Almaras ! + !---------------------! + if(Turb % model .eq. SPALART_ALLMARAS .or. & + Turb % model .eq. DES_SPALART) then + + if(curr_dt > BEGIN) then + + call Flow % Grad_Variable(vis) + + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. CONVECT) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + call Grid % Face_Normal(s, nx, ny, nz) + + phi_n = vis % x(c1) * nx + vis % y(c1) * ny + vis % z(c1) * nz + vis % n(c2) = vis % n(c2) - bulk_vel * phi_n * dt + end do ! face + end if ! boundary condition + end do ! region + + else ! curr_dt <= BEGIN + + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. CONVECT) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + + vis % n(c2) = vis % n(c1) + end do ! face + end if ! boundary condition + end do ! region + + end if ! curr_dt > BEGIN + + end if + !----------------------------! ! Reynolds stress models ! !----------------------------! diff --git a/Sources/Process/Process_Mod/Update_Boundary_Values.f90 b/Sources/Process/Process_Mod/Update_Boundary_Values.f90 index 47387301d..6225062e7 100644 --- a/Sources/Process/Process_Mod/Update_Boundary_Values.f90 +++ b/Sources/Process/Process_Mod/Update_Boundary_Values.f90 @@ -121,6 +121,81 @@ subroutine Update_Boundary_Values(Process, Flow, Turb, Vof, update) !----------------! if(update .eq. 'TURBULENCE' .or. update .eq. 'ALL') then + !----------------------! + ! K-epsilon-zeta-f ! + !----------------------! + if(Turb % model .eq. K_EPS_ZETA_F .or. & + Turb % model .eq. HYBRID_LES_RANS) then + + do reg = Boundary_Regions() + + ! Regions outflow, pressure or symmetry + if(Grid % region % type(reg) .eq. OUTFLOW .or. & + Grid % region % type(reg) .eq. PRESSURE .or. & + Grid % region % type(reg) .eq. SYMMETRY) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + + kin % n(c2) = kin % n(c1) + eps % n(c2) = eps % n(c1) + zeta % n(c2) = zeta % n(c1) + f22 % n(c2) = f22 % n(c1) + if(Flow % heat_transfer) then + t2 % n(c2) = t2 % n(c1) + end if + end do ! faces + end if ! boundary condition + end do ! regions + end if ! turbulence model + + !---------------! + ! K-epsilon ! + !---------------! + if(Turb % model .eq. K_EPS) then + + do reg = Boundary_Regions() + + ! Regions outflow, pressure or symmetry + if(Grid % region % type(reg) .eq. OUTFLOW .or. & + Grid % region % type(reg) .eq. PRESSURE .or. & + Grid % region % type(reg) .eq. SYMMETRY) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + + kin % n(c2) = kin % n(c1) + eps % n(c2) = eps % n(c1) + if(Flow % heat_transfer) then + t2 % n(c2) = t2 % n(c1) + end if + end do ! faces + end if ! boundary condition + end do ! regions + end if ! turbulence model + + !----------------------! + ! Spalart-Allmaras ! + !----------------------! + if(Turb % model .eq. SPALART_ALLMARAS .or. & + Turb % model .eq. DES_SPALART) then + + do reg = Boundary_Regions() + + ! Regions outflow, pressure or symmetry + if(Grid % region % type(reg) .eq. OUTFLOW .or. & + Grid % region % type(reg) .eq. PRESSURE .or. & + Grid % region % type(reg) .eq. SYMMETRY) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + + vis % n(c2) = vis % n(c1) + end do ! faces + end if ! boundary condition + end do ! regions + end if ! turbulence model + !----------------------------! ! Reynolds stress models ! !----------------------------! @@ -128,6 +203,8 @@ subroutine Update_Boundary_Values(Process, Flow, Turb, Vof, update) Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then do reg = Boundary_Regions() + + ! Regions at solid walls if(Grid % region % type(reg) .eq. WALL .or. & Grid % region % type(reg) .eq. WALLFL) then do s = Faces_In_Region(reg) @@ -150,8 +227,11 @@ subroutine Update_Boundary_Values(Process, Flow, Turb, Vof, update) 0.0) if(Turb % model .eq. RSM_MANCEAU_HANJALIC) f22 % n(c2) = 0.0 end do ! faces - else if(Grid % region % type(reg).eq. OUTFLOW .or. & - Grid % region % type(reg).eq. PRESSURE) then + + ! Regions outflow, pressure or symmetry + else if(Grid % region % type(reg) .eq. OUTFLOW .or. & + Grid % region % type(reg) .eq. PRESSURE .or. & + Grid % region % type(reg) .eq. SYMMETRY) then do s = Faces_In_Region(reg) c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) @@ -171,57 +251,6 @@ subroutine Update_Boundary_Values(Process, Flow, Turb, Vof, update) end do ! regions end if ! turbulence model - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - ! On the boundary perform the extrapolation - if(c2 < 0) then - - ! Spalart Allmaras - if(Turb % model .eq. SPALART_ALLMARAS .or. & - Turb % model .eq. DES_SPALART) then - if ( Grid % Bnd_Cond_Type(c2) .eq. OUTFLOW .or. & - Grid % Bnd_Cond_Type(c2) .eq. CONVECT .or. & - Grid % Bnd_Cond_Type(c2) .eq. PRESSURE .or. & - Grid % Bnd_Cond_Type(c2) .eq. SYMMETRY) then - vis % n(c2) = vis % n(c1) - end if - end if - - ! k-epsilon-zeta-f - if(Turb % model .eq. K_EPS_ZETA_F .or. & - Turb % model .eq. HYBRID_LES_RANS) then - if(Grid % Bnd_Cond_Type(c2) .eq. OUTFLOW .or. & - Grid % Bnd_Cond_Type(c2) .eq. PRESSURE .or. & - Grid % Bnd_Cond_Type(c2) .eq. SYMMETRY) then - kin % n(c2) = kin % n(c1) - eps % n(c2) = eps % n(c1) - zeta % n(c2) = zeta % n(c1) - f22 % n(c2) = f22 % n(c1) - if(Flow % heat_transfer) then - t2 % n(c2) = t2 % n(c1) - end if - end if - - end if - - ! k-epsilon - if(Turb % model .eq. K_EPS) then - if(Grid % Bnd_Cond_Type(c2) .eq. OUTFLOW .or. & - Grid % Bnd_Cond_Type(c2) .eq. PRESSURE .or. & - Grid % Bnd_Cond_Type(c2) .eq. SYMMETRY) then - kin % n(c2) = kin % n(c1) - eps % n(c2) = eps % n(c1) - if(Flow % heat_transfer) then - t2 % n(c2) = t2 % n(c1) - end if - end if - end if - - end if ! c2 < 0 - end do - end if ! update turbulence !-------------------! From 38f036df1cfeff3a8aaa5ae897789926628a22c5 Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 6 Mar 2023 20:44:12 +0100 Subject: [PATCH 041/223] Fixed the Spalart-Allmaras model in convective On branch bojan_fixed_cell_ranges new file: Turb_Mod/Alias_Vis.f90 modified: Process_Mod/Convective_Outflow.f90 modified: Turb_Mod.f90 --- Sources/Process/Process_Mod/Convective_Outflow.f90 | 3 ++- Sources/Process/Turb_Mod.f90 | 2 ++ Sources/Process/Turb_Mod/Alias_Vis.f90 | 14 ++++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 Sources/Process/Turb_Mod/Alias_Vis.f90 diff --git a/Sources/Process/Process_Mod/Convective_Outflow.f90 b/Sources/Process/Process_Mod/Convective_Outflow.f90 index aba7f6cde..762d021b1 100644 --- a/Sources/Process/Process_Mod/Convective_Outflow.f90 +++ b/Sources/Process/Process_Mod/Convective_Outflow.f90 @@ -15,7 +15,7 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Bulk_Type), pointer :: bulk - type(Var_Type), pointer :: u, v, w, t, phi + type(Var_Type), pointer :: u, v, w, t, phi, vis type(Var_Type), pointer :: kin, eps, zeta, f22, t2 type(Var_Type), pointer :: uu, vv, ww, uv, uw, vw type(Face_Type), pointer :: v_flux @@ -33,6 +33,7 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) call Turb % Alias_K_Eps_Zeta_F(kin, eps, zeta, f22) call Turb % Alias_Stresses (uu, vv, ww, uv, uw, vw) call Turb % Alias_T2 (t2) + call Turb % Alias_Vis (vis) !------------------------------------------------! ! Compute bulk velocity via a user function. ! diff --git a/Sources/Process/Turb_Mod.f90 b/Sources/Process/Turb_Mod.f90 index faab376d3..121c32655 100644 --- a/Sources/Process/Turb_Mod.f90 +++ b/Sources/Process/Turb_Mod.f90 @@ -141,6 +141,7 @@ module Turb_Mod procedure :: Alias_Heat_Fluxes procedure :: Alias_Stresses procedure :: Alias_T2 + procedure :: Alias_Vis procedure :: Calculate_Deltas procedure :: Calculate_Heat_Flux @@ -281,6 +282,7 @@ module Turb_Mod # include "Turb_Mod/Alias_Heat_Fluxes.f90" # include "Turb_Mod/Alias_Stresses.f90" # include "Turb_Mod/Alias_T2.f90" +# include "Turb_Mod/Alias_Vis.f90" # include "Turb_Mod/Calculate_Deltas.f90" # include "Turb_Mod/Calculate_Heat_Flux.f90" diff --git a/Sources/Process/Turb_Mod/Alias_Vis.f90 b/Sources/Process/Turb_Mod/Alias_Vis.f90 new file mode 100644 index 000000000..79ab4d045 --- /dev/null +++ b/Sources/Process/Turb_Mod/Alias_Vis.f90 @@ -0,0 +1,14 @@ +!==============================================================================! + subroutine Alias_Vis(Turb, vis) +!------------------------------------------------------------------------------! +! Create alias for t2 variable. ! +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Turb_Type), target :: Turb + type(Var_Type), pointer :: vis +!==============================================================================! + + vis => Turb % vis + + end subroutine From d7c395fac02be9386c132d62a2a07d83ee59cdad Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 7 Mar 2023 13:34:25 +0100 Subject: [PATCH 042/223] Makes a distinguishment for Bnd_Cond_Name function It has been dividied into two: - Bnd_Cond_Name_At_Cell - Bnd_Cond_Name_At_Face which, obvisouly, refer to boundary condition at boundary cell and at a face. For the latter, it is important only for periodicity used for copy boundary condition. On branch bojan_fixed_cell_ranges modified: Shared/Grid_Mod.f90 renamed: Shared/Grid_Mod/Bnd_Cond_Name.f90 -> Shared/Grid_Mod/Bnd_Cond_Name_At_Cell.f90 new file: Shared/Grid_Mod/Bnd_Cond_Name_At_Face.f90 modified: Shared/Grid_Mod/Calculate_Face_Geometry.f90 modified: Shared/Grid_Mod/Load_Cfn.f90 modified: Shared/Region_Mod.f90 modified: Process/Eddies_Mod/Gather_Bnd_Cells.f90 modified: Process/Eddies_Mod/Superimpose.f90 modified: Process/Interface_Mod/Create.f90 modified: Process/Var_Mod/Bnd_Cond_Name.f90 --- .../Process/Eddies_Mod/Gather_Bnd_Cells.f90 | 4 ++-- Sources/Process/Eddies_Mod/Superimpose.f90 | 4 ++-- Sources/Process/Interface_Mod/Create.f90 | 16 +++++++------- Sources/Process/Var_Mod/Bnd_Cond_Name.f90 | 2 +- Sources/Shared/Grid_Mod.f90 | 6 +++-- ...ond_Name.f90 => Bnd_Cond_Name_At_Cell.f90} | 6 ++--- .../Shared/Grid_Mod/Bnd_Cond_Name_At_Face.f90 | 22 +++++++++++++++++++ .../Grid_Mod/Calculate_Face_Geometry.f90 | 6 ++--- Sources/Shared/Grid_Mod/Load_Cfn.f90 | 5 ++++- Sources/Shared/Region_Mod.f90 | 1 + 10 files changed, 50 insertions(+), 22 deletions(-) rename Sources/Shared/Grid_Mod/{Bnd_Cond_Name.f90 => Bnd_Cond_Name_At_Cell.f90} (69%) create mode 100644 Sources/Shared/Grid_Mod/Bnd_Cond_Name_At_Face.f90 diff --git a/Sources/Process/Eddies_Mod/Gather_Bnd_Cells.f90 b/Sources/Process/Eddies_Mod/Gather_Bnd_Cells.f90 index d65402899..5fc09d0ad 100644 --- a/Sources/Process/Eddies_Mod/Gather_Bnd_Cells.f90 +++ b/Sources/Process/Eddies_Mod/Gather_Bnd_Cells.f90 @@ -26,7 +26,7 @@ subroutine Eddies_Mod_Gather_Bnd_Cells(eddies) ! Count boundary cells in this processor eddies % n_bnd_cells = 0 do c = -Grid % n_bnd_cells, -1 - if(Grid % Bnd_Cond_Name( c) .eq. eddies % bc_name) then + if(Grid % Bnd_Cond_Name_At_Cell(c) .eq. eddies % bc_name) then eddies % n_bnd_cells = eddies % n_bnd_cells + 1 end if end do @@ -63,7 +63,7 @@ subroutine Eddies_Mod_Gather_Bnd_Cells(eddies) cnt = 0 do c = -Grid % n_bnd_cells, -1 - if(Grid % Bnd_Cond_Name( c) .eq. eddies % bc_name) then + if(Grid % Bnd_Cond_Name_At_Cell(c) .eq. eddies % bc_name) then cnt = cnt + 1 eddies % bnd_xc(cnt + s_bnd_cell_proc(this_proc)) = Grid % xc(c) eddies % bnd_yc(cnt + s_bnd_cell_proc(this_proc)) = Grid % yc(c) diff --git a/Sources/Process/Eddies_Mod/Superimpose.f90 b/Sources/Process/Eddies_Mod/Superimpose.f90 index 0318dacd4..458d7d0d1 100644 --- a/Sources/Process/Eddies_Mod/Superimpose.f90 +++ b/Sources/Process/Eddies_Mod/Superimpose.f90 @@ -20,7 +20,7 @@ subroutine Eddies_Mod_Superimpose(eddies) Flow => eddies % pnt_flow do c = -Grid % n_bnd_cells, -1 - if(Grid % Bnd_Cond_Name( c) .eq. eddies % bc_name) then + if(Grid % Bnd_Cond_Name_At_Cell(c) .eq. eddies % bc_name) then Flow % u % n(c) = Flow % u % b(c) Flow % v % n(c) = Flow % v % b(c) Flow % w % n(c) = Flow % w % b(c) @@ -49,7 +49,7 @@ subroutine Eddies_Mod_Superimpose(eddies) ! Select cell for each cell randomly do c = -Grid % n_bnd_cells, -1 - if(Grid % Bnd_Cond_Name( c) .eq. eddies % bc_name) then + if(Grid % Bnd_Cond_Name_At_Cell(c) .eq. eddies % bc_name) then xc = Grid % xc(c) yc = Grid % yc(c) diff --git a/Sources/Process/Interface_Mod/Create.f90 b/Sources/Process/Interface_Mod/Create.f90 index 6f07c597c..7572a8fac 100644 --- a/Sources/Process/Interface_Mod/Create.f90 +++ b/Sources/Process/Interface_Mod/Create.f90 @@ -99,7 +99,7 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) do s = 1, Grid(d1) % n_faces c2 = Grid(d1) % faces_c(2,s) if(c2 < 0) then - if(Grid(d1) % Bnd_Cond_Name(c2) .eq. keys(1)) then + if(Grid(d1) % Bnd_Cond_Name_At_Cell(c2) .eq. keys(1)) then n1 = n1 + 1 end if end if @@ -109,7 +109,7 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) do s = 1, Grid(d1) % n_faces if(Grid(d1) % faces_s(s) > 0) then ! only if it has a shadow c1 = Grid(d1) % faces_c(1,s) - if(Grid(d1) % Bnd_Cond_Name(s) .eq. keys(1) .and. & + if(Grid(d1) % Bnd_Cond_Name_At_Face(s) .eq. keys(1) .and. & Grid(d1) % Comm % cell_proc(c1) .eq. this_proc) then n1 = n1 + 1 end if @@ -124,7 +124,7 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) do s = 1, Grid(d2) % n_faces c2 = Grid(d2) % faces_c(2,s) if(c2 < 0) then - if(Grid(d2) % Bnd_Cond_Name(c2) .eq. keys(2)) then + if(Grid(d2) % Bnd_Cond_Name_At_Cell(c2) .eq. keys(2)) then n2 = n2 + 1 end if end if @@ -134,7 +134,7 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) do s = 1, Grid(d2) % n_faces if(Grid(d2) % faces_s(s) > 0) then ! only if it has a shadow c1 = Grid(d2) % faces_c(1,s) - if(Grid(d2) % Bnd_Cond_Name(s) .eq. keys(2) .and. & + if(Grid(d2) % Bnd_Cond_Name_At_Face(s) .eq. keys(2) .and. & Grid(d2) % Comm % cell_proc(c1) .eq. this_proc) then n2 = n2 + 1 end if @@ -206,7 +206,7 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) c1 = Grid(d1) % faces_c(1,s) c2 = Grid(d1) % faces_c(2,s) if(c2 < 0) then - if(Grid(d1) % Bnd_Cond_Name(c2) .eq. keys(1)) then + if(Grid(d1) % Bnd_Cond_Name_At_Cell(c2) .eq. keys(1)) then n1 = n1 + 1 pos = n1 if(n_proc > 1) pos = pos + off_1(this_proc) @@ -223,7 +223,7 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) c1 = Grid(d1) % faces_c(1,s) c2 = Grid(d1) % faces_c(2,s) if(Grid(d1) % faces_s(s) > 0) then ! only if it has a shadow - if(Grid(d1) % Bnd_Cond_Name(s) .eq. keys(1) .and. & + if(Grid(d1) % Bnd_Cond_Name_At_Face(s) .eq. keys(1) .and. & Grid(d1) % Comm % cell_proc(c1) .eq. this_proc) then n1 = n1 + 1 pos = n1 @@ -244,7 +244,7 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) c1 = Grid(d2) % faces_c(1,s) c2 = Grid(d2) % faces_c(2,s) if(c2 < 0) then - if(Grid(d2) % Bnd_Cond_Name(c2) .eq. keys(2)) then + if(Grid(d2) % Bnd_Cond_Name_At_Cell(c2) .eq. keys(2)) then n2 = n2 + 1 pos = n2 if(n_proc > 1) pos = pos + off_2(this_proc) @@ -261,7 +261,7 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) c1 = Grid(d2) % faces_c(1,s) c2 = Grid(d2) % faces_c(2,s) if(Grid(d2) % faces_s(s) > 0) then ! only if it has a shadow - if(Grid(d2) % Bnd_Cond_Name(s) .eq. keys(2) .and. & + if(Grid(d2) % Bnd_Cond_Name_At_Face(s) .eq. keys(2) .and. & Grid(d2) % Comm % cell_proc(c1) .eq. this_proc) then n2 = n2 + 1 pos = n2 diff --git a/Sources/Process/Var_Mod/Bnd_Cond_Name.f90 b/Sources/Process/Var_Mod/Bnd_Cond_Name.f90 index 616ece53b..02e1442ce 100644 --- a/Sources/Process/Var_Mod/Bnd_Cond_Name.f90 +++ b/Sources/Process/Var_Mod/Bnd_Cond_Name.f90 @@ -9,7 +9,7 @@ character(SL) function Var_Mod_Bnd_Cond_Name(phi, bnd_cell) integer :: bnd_cell !------------------------------------------------------------------------------! - Var_Mod_Bnd_Cond_Name = phi % pnt_grid % Bnd_Cond_Name(bnd_cell) + Var_Mod_Bnd_Cond_Name = phi % pnt_grid % Bnd_Cond_Name_At_Cell(bnd_cell) end function diff --git a/Sources/Shared/Grid_Mod.f90 b/Sources/Shared/Grid_Mod.f90 index 9add449fb..5c416d0bd 100644 --- a/Sources/Shared/Grid_Mod.f90 +++ b/Sources/Shared/Grid_Mod.f90 @@ -185,7 +185,8 @@ module Grid_Mod procedure :: Allocate_Faces procedure :: Allocate_Nodes procedure :: Allocate_Regions - procedure :: Bnd_Cond_Name + procedure :: Bnd_Cond_Name_At_Cell + procedure :: Bnd_Cond_Name_At_Face procedure :: Bnd_Cond_Type procedure :: Bounding_Box procedure :: Calculate_Cell_Centers @@ -240,7 +241,8 @@ module Grid_Mod # include "Grid_Mod/Allocate_Faces.f90" # include "Grid_Mod/Allocate_Nodes.f90" # include "Grid_Mod/Allocate_Regions.f90" -# include "Grid_Mod/Bnd_Cond_Name.f90" +# include "Grid_Mod/Bnd_Cond_Name_At_Cell.f90" +# include "Grid_Mod/Bnd_Cond_Name_At_Face.f90" # include "Grid_Mod/Bnd_Cond_Type.f90" # include "Grid_Mod/Bounding_Box.f90" # include "Grid_Mod/Calculate_Cell_Centers.f90" diff --git a/Sources/Shared/Grid_Mod/Bnd_Cond_Name.f90 b/Sources/Shared/Grid_Mod/Bnd_Cond_Name_At_Cell.f90 similarity index 69% rename from Sources/Shared/Grid_Mod/Bnd_Cond_Name.f90 rename to Sources/Shared/Grid_Mod/Bnd_Cond_Name_At_Cell.f90 index d7eee90be..b16e888e5 100644 --- a/Sources/Shared/Grid_Mod/Bnd_Cond_Name.f90 +++ b/Sources/Shared/Grid_Mod/Bnd_Cond_Name_At_Cell.f90 @@ -1,7 +1,7 @@ !==============================================================================! - character(SL) function Bnd_Cond_Name(Grid, cell) + character(SL) function Bnd_Cond_Name_At_Cell(Grid, cell) !------------------------------------------------------------------------------! -! Provides a shortcut to obtain boundary condition type. ! +! Provides a shortcut to obtain boundary condition name at boundary cell. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -9,7 +9,7 @@ character(SL) function Bnd_Cond_Name(Grid, cell) integer, intent(in) :: cell !==============================================================================! - Bnd_Cond_Name = Grid % region % name(Grid % region % at_cell(cell)) + Bnd_Cond_Name_At_Cell = Grid % region % name(Grid % region % at_cell(cell)) end function diff --git a/Sources/Shared/Grid_Mod/Bnd_Cond_Name_At_Face.f90 b/Sources/Shared/Grid_Mod/Bnd_Cond_Name_At_Face.f90 new file mode 100644 index 000000000..618e21cd9 --- /dev/null +++ b/Sources/Shared/Grid_Mod/Bnd_Cond_Name_At_Face.f90 @@ -0,0 +1,22 @@ +!==============================================================================! + character(SL) function Bnd_Cond_Name_At_Face(Grid, face) +!------------------------------------------------------------------------------! +! Provides a shortcut to obtain boundary condition name at a face. ! +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Grid_Type) :: Grid + integer, intent(in) :: face +!==============================================================================! + + Assert(Grid % region % at_face(face) .ge. 0) + Assert(Grid % region % at_face(face) .le. Grid % per_z_reg) + + if(Grid % region % at_face(face) .eq. 0) then + Bnd_Cond_Name_At_Face = 'UNDEFINED' + else + Bnd_Cond_Name_At_Face = Grid % region % name(Grid % region % at_face(face)) + end if + + end function + diff --git a/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 b/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 index 6daba51b0..8fd76670b 100644 --- a/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 +++ b/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 @@ -194,7 +194,7 @@ subroutine Calculate_Face_Geometry(Grid) if(abs(Grid % xc(c2) - Grid % xc(c1) ) > 1.5 * abs(Grid % dx(s))) then if(Grid % xc(c2) > Grid % xc(c1)) then Assert(Grid % faces_s(s) > 0) - Grid % region % at_cell(s) = Grid % per_x_reg + Grid % region % at_face(s) = Grid % per_x_reg end if end if end if @@ -203,7 +203,7 @@ subroutine Calculate_Face_Geometry(Grid) if(abs(Grid % yc(c2) - Grid % yc(c1) ) > 1.5 * abs(Grid % dy(s))) then if(Grid % yc(c2) > Grid % yc(c1)) then Assert(Grid % faces_s(s) > 0) - Grid % region % at_cell(s) = Grid % per_y_reg + Grid % region % at_face(s) = Grid % per_y_reg end if end if end if @@ -212,7 +212,7 @@ subroutine Calculate_Face_Geometry(Grid) if(abs(Grid % zc(c2) - Grid % zc(c1) ) > 1.5 * abs(Grid % dz(s))) then if(Grid % zc(c2) > Grid % zc(c1)) then Assert(Grid % faces_s(s) > 0) - Grid % region % at_cell(s) = Grid % per_z_reg + Grid % region % at_face(s) = Grid % per_z_reg end if end if end if diff --git a/Sources/Shared/Grid_Mod/Load_Cfn.f90 b/Sources/Shared/Grid_Mod/Load_Cfn.f90 index 69cc494f4..b0914df6a 100644 --- a/Sources/Shared/Grid_Mod/Load_Cfn.f90 +++ b/Sources/Shared/Grid_Mod/Load_Cfn.f90 @@ -261,9 +261,12 @@ subroutine Load_Cfn(Grid, this_proc, domain) ! Physical boundary cells (and all the faces) ! (This opens the oportunity to store bounary condition info in ... ! ... the faces thus ridding us of the "if(c2 < 0) then" checks) - allocate (Grid % region % at_cell(-Grid % n_bnd_cells-1:Grid % n_faces)) + allocate (Grid % region % at_cell(-Grid % n_bnd_cells:-1)) read(fu) (Grid % region % at_cell(c), c = -Grid % n_bnd_cells, -1) + allocate (Grid % region % at_face(1:Grid % n_faces)) + Grid % region % at_face(1:Grid % n_faces) = 0 + call Grid % Determine_Regions_Ranges() close(fu) diff --git a/Sources/Shared/Region_Mod.f90 b/Sources/Shared/Region_Mod.f90 index d74fb022e..af2c6a494 100644 --- a/Sources/Shared/Region_Mod.f90 +++ b/Sources/Shared/Region_Mod.f90 @@ -42,6 +42,7 @@ module Region_Mod ! Values start from one, zero is internal cell ! (Follows nomenclature from "../Shared/Comm_Mod_Par.f90") integer, allocatable :: at_cell(:) ! region at cell + integer, allocatable :: at_face(:) ! region at face (for periodicity) integer, allocatable :: f_cell(:) ! first (bnd) cell for region integer, allocatable :: l_cell(:) ! last (bnd) cell for region integer, allocatable :: f_face(:) ! first (bnd) cell for region From 0c2dc94ca05b0b8037a2da8f3924a7637884423c Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 7 Mar 2023 13:43:12 +0100 Subject: [PATCH 043/223] Avoids zillion messages when opening control file On branch bojan_fixed_cell_ranges modified: Shared/Control_Mod/Basic_Functions/Open_Domain_File.f90 modified: Shared/Control_Mod/Basic_Functions/Open_Root_File.f90 --- .../Shared/Control_Mod/Basic_Functions/Open_Domain_File.f90 | 3 ++- .../Shared/Control_Mod/Basic_Functions/Open_Root_File.f90 | 6 ++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Open_Domain_File.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Open_Domain_File.f90 index bbf733e07..cabe0ba30 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Open_Domain_File.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Open_Domain_File.f90 @@ -9,6 +9,7 @@ subroutine Control_Mod_Open_Domain_File(dom, file_name) character(len=*) :: file_name !==============================================================================! - call File % Open_For_Reading_Ascii(file_name, dom_control_file_unit(dom)) + call File % Open_For_Reading_Ascii(file_name, dom_control_file_unit(dom), & + processor=this_proc) end subroutine diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Open_Root_File.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Open_Root_File.f90 index 743acdbeb..574224b15 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Open_Root_File.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Open_Root_File.f90 @@ -8,10 +8,8 @@ subroutine Control_Mod_Open_Root_File(file_name) character(len=*) :: file_name !==============================================================================! - ! Unused - ! control_file_name = file_name - - call File % Open_For_Reading_Ascii(file_name, root_control_file_unit) + call File % Open_For_Reading_Ascii(file_name, root_control_file_unit, & + processor=this_proc) ! Make root default to begin with control_file_unit = root_control_file_unit From c3481869876804a92352664c04011c3603e98980 Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 7 Mar 2023 13:44:11 +0100 Subject: [PATCH 044/223] Calculate_Fluxes.f90 -> Calculate_Bulk_Fluxes.f90 On branch bojan_fixed_cell_ranges modified: Process/Field_Mod.f90 renamed: Process/Field_Mod/Utilities/Calculate_Fluxes.f90 -> Process/Field_Mod/Utilities/Calculate_Bulk_Fluxes.f90 modified: Process/Main_Pro.f90 --- Sources/Process/Field_Mod.f90 | 4 +- ...e_Fluxes.f90 => Calculate_Bulk_Fluxes.f90} | 81 +++++++++---------- Sources/Process/Main_Pro.f90 | 2 +- 3 files changed, 42 insertions(+), 45 deletions(-) rename Sources/Process/Field_Mod/Utilities/{Calculate_Fluxes.f90 => Calculate_Bulk_Fluxes.f90} (54%) diff --git a/Sources/Process/Field_Mod.f90 b/Sources/Process/Field_Mod.f90 index 8d107396c..a4af1f259 100644 --- a/Sources/Process/Field_Mod.f90 +++ b/Sources/Process/Field_Mod.f90 @@ -228,7 +228,7 @@ module Field_Mod procedure :: Alias_Momentum procedure :: Buoyancy_Forces procedure :: Calculate_Courant_In_Cells ! for post-processing - procedure :: Calculate_Fluxes + procedure :: Calculate_Bulk_Fluxes procedure :: Compute_Wall_Distance ! see: Potential_Initialization procedure :: Potential_Initialization ! see: Compute_Wall_Distance procedure :: Prandtl_Numb @@ -291,7 +291,7 @@ module Field_Mod # include "Field_Mod/Utilities/Alias_Momentum.f90" # include "Field_Mod/Utilities/Buoyancy_Forces.f90" # include "Field_Mod/Utilities/Calculate_Courant_In_Cells.f90" -# include "Field_Mod/Utilities/Calculate_Fluxes.f90" +# include "Field_Mod/Utilities/Calculate_Bulk_Fluxes.f90" # include "Field_Mod/Utilities/Calculate_Shear_And_Vorticity.f90" # include "Field_Mod/Utilities/Potential_Initialization.f90" # include "Field_Mod/Utilities/Prandtl_Numb.f90" diff --git a/Sources/Process/Field_Mod/Utilities/Calculate_Fluxes.f90 b/Sources/Process/Field_Mod/Utilities/Calculate_Bulk_Fluxes.f90 similarity index 54% rename from Sources/Process/Field_Mod/Utilities/Calculate_Fluxes.f90 rename to Sources/Process/Field_Mod/Utilities/Calculate_Bulk_Fluxes.f90 index 5aff9cd04..190aba0cb 100644 --- a/Sources/Process/Field_Mod/Utilities/Calculate_Fluxes.f90 +++ b/Sources/Process/Field_Mod/Utilities/Calculate_Bulk_Fluxes.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Calculate_Fluxes(Flow, v_flux) + subroutine Calculate_Bulk_Fluxes(Flow, v_flux) !------------------------------------------------------------------------------! ! Calculate volume fluxes through whole domain. ! !------------------------------------------------------------------------------! @@ -25,55 +25,52 @@ subroutine Calculate_Fluxes(Flow, v_flux) !---------------------------------------------------------------------------! ! Summ up volume mass fluxes [m^3/s] over all faces at monitoring plane ! !---------------------------------------------------------------------------! - do s = 1, Grid % n_faces + do s = Faces_In_Domain() c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) - if(Grid % Comm % cell_proc(c1) .eq. this_proc) then + xc1 = Grid % xc(c1) + yc1 = Grid % yc(c1) + zc1 = Grid % zc(c1) + xc2 = Grid % xc(c1) + Grid % dx(s) + yc2 = Grid % yc(c1) + Grid % dy(s) + zc2 = Grid % zc(c1) + Grid % dz(s) - xc1 = Grid % xc(c1) - yc1 = Grid % yc(c1) - zc1 = Grid % zc(c1) - xc2 = Grid % xc(c1) + Grid % dx(s) - yc2 = Grid % yc(c1) + Grid % dy(s) - zc2 = Grid % zc(c1) + Grid % dz(s) + ! If the flux is across a buffer face, it is summed up twice. + ! The variable "wgt" is here to take care of that. + wgt = 1.0 + if(Grid % Comm % cell_proc(c2) .ne. this_proc) wgt = 0.5 - ! If the flux is across a buffer face, it is summed up twice. - ! The variable "wgt" is here to take care of that. - wgt = 1.0 - if(Grid % Comm % cell_proc(c2) .ne. this_proc) wgt = 0.5 - - !-------! - ! X ! - !-------! - if((xc1 <= bulk % xp).and.(xc2 > bulk % xp)) then - bulk % flux_x = bulk % flux_x + wgt * v_flux(s) - end if - if((xc2 < bulk % xp).and.(xc1 >= bulk % xp)) then - bulk % flux_x = bulk % flux_x - wgt * v_flux(s) - end if - - !-------! - ! Y ! - !-------! - if((yc1 <= bulk % yp).and.(yc2 > bulk % yp)) then - bulk % flux_y = bulk % flux_y + wgt * v_flux(s) - end if - if((yc2 < bulk % yp).and.(yc1 >= bulk % yp)) then - bulk % flux_y = bulk % flux_y - wgt * v_flux(s) - end if + !-------! + ! X ! + !-------! + if((xc1 <= bulk % xp).and.(xc2 > bulk % xp)) then + bulk % flux_x = bulk % flux_x + wgt * v_flux(s) + end if + if((xc2 < bulk % xp).and.(xc1 >= bulk % xp)) then + bulk % flux_x = bulk % flux_x - wgt * v_flux(s) + end if - !-------! - ! Z ! - !-------! - if((zc1 <= bulk % zp).and.(zc2 > bulk % zp)) then - bulk % flux_z = bulk % flux_z + wgt * v_flux(s) - end if - if((zc2 < bulk % zp).and.(zc1 >= bulk % zp)) then - bulk % flux_z = bulk % flux_z - wgt * v_flux(s) - end if + !-------! + ! Y ! + !-------! + if((yc1 <= bulk % yp).and.(yc2 > bulk % yp)) then + bulk % flux_y = bulk % flux_y + wgt * v_flux(s) + end if + if((yc2 < bulk % yp).and.(yc1 >= bulk % yp)) then + bulk % flux_y = bulk % flux_y - wgt * v_flux(s) + end if + !-------! + ! Z ! + !-------! + if((zc1 <= bulk % zp).and.(zc2 > bulk % zp)) then + bulk % flux_z = bulk % flux_z + wgt * v_flux(s) end if + if((zc2 < bulk % zp).and.(zc1 >= bulk % zp)) then + bulk % flux_z = bulk % flux_z - wgt * v_flux(s) + end if + end do call Comm_Mod_Global_Sum_Real(bulk % flux_x) diff --git a/Sources/Process/Main_Pro.f90 b/Sources/Process/Main_Pro.f90 index afc7e755c..5c755e2bd 100644 --- a/Sources/Process/Main_Pro.f90 +++ b/Sources/Process/Main_Pro.f90 @@ -331,7 +331,7 @@ program Process_Prog call Process % Piso_Algorithm(Flow(d), Turb(d), Vof(d), Por(d), & Sol(d), curr_dt, ini) - call Flow(d) % Calculate_Fluxes(Flow(d) % v_flux % n) + call Flow(d) % Calculate_Bulk_Fluxes(Flow(d) % v_flux % n) ! Deal with turbulence (if you dare ;-)) call Turb(d) % Main_Turb(Sol(d), curr_dt, ini) From 680b697e0fb2d63b97ad25870624b01f5a222fee Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 7 Mar 2023 13:45:20 +0100 Subject: [PATCH 045/223] Following commit: d7c395fac02be9386c132d62a2a07d83ee59cdad On branch bojan_fixed_cell_ranges modified: Tests/Les/Forrest/User_Mod/Beginning_Of_Time_Step.f90 modified: Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 modified: Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 modified: Tests/Vof/Dam_Break_3d/User_Mod/Initialize_Variables.f90 --- Tests/Les/Forrest/User_Mod/Beginning_Of_Time_Step.f90 | 2 +- .../User_Mod/Save_Impinging_Jet_Nu.f90 | 2 +- .../User_Mod/Impinging_Jet_Nu.f90 | 2 +- Tests/Vof/Dam_Break_3d/User_Mod/Initialize_Variables.f90 | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Tests/Les/Forrest/User_Mod/Beginning_Of_Time_Step.f90 b/Tests/Les/Forrest/User_Mod/Beginning_Of_Time_Step.f90 index 249f06f3e..f5611280f 100644 --- a/Tests/Les/Forrest/User_Mod/Beginning_Of_Time_Step.f90 +++ b/Tests/Les/Forrest/User_Mod/Beginning_Of_Time_Step.f90 @@ -29,7 +29,7 @@ subroutine User_Mod_Beginning_Of_Time_Step(Flow, Turb, Vof, Swarm, & c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) if(c2 < 0) then - if(Grid % Bnd_Cond_Name(c2) .eq. 'TOP') then + if(Grid % Bnd_Cond_Name_At_Cell(c2) .eq. 'TOP') then u % n(c2) = u % n(c1) v % n(c2) = v % n(c1) w % n(c2) = 0.0 diff --git a/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 b/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 index 51201b22c..a1c61f2ed 100644 --- a/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 +++ b/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 @@ -85,7 +85,7 @@ subroutine Save_Impinging_Jet_Nu(Turb, ts) c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) if(c2 < 0) then - if(Grid % Bnd_Cond_Name(c2) .eq. 'LOWER_WALL') then + if(Grid % Bnd_Cond_Name_At_Cell(c2) .eq. 'LOWER_WALL') then r = sqrt(Grid % xc(c1)*Grid % xc(c1) + & Grid % yc(c1)*Grid % yc(c1)) + TINY if(r < rad(i+1) .and. r > rad(i)) then diff --git a/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 b/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 index 7124513a2..ce65faa84 100644 --- a/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 +++ b/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 @@ -85,7 +85,7 @@ subroutine User_Mod_Impinging_Jet_Nu(Turb, ts) c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) if(c2 < 0) then - if(Grid % Bnd_Cond_Name(c2) .eq. 'LOWER_WALL') then + if(Grid % Bnd_Cond_Name_At_Cell(c2) .eq. 'LOWER_WALL') then r = sqrt(Grid % xc(c1)*Grid % xc(c1) + & Grid % yc(c1)*Grid % yc(c1)) + TINY if(r < rad_1(i+1) .and. & diff --git a/Tests/Vof/Dam_Break_3d/User_Mod/Initialize_Variables.f90 b/Tests/Vof/Dam_Break_3d/User_Mod/Initialize_Variables.f90 index e9fbf04da..9801235c4 100644 --- a/Tests/Vof/Dam_Break_3d/User_Mod/Initialize_Variables.f90 +++ b/Tests/Vof/Dam_Break_3d/User_Mod/Initialize_Variables.f90 @@ -65,7 +65,7 @@ subroutine User_Mod_Initialize_Variables(Flow, Turb, Vof, Swarm, Sol) c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) if(c2 < 0) then - if(Grid % Bnd_Cond_Name(c2) .eq. 'STEP') then + if(Grid % Bnd_Cond_Name_At_Cell(c2) .eq. 'STEP') then do n = 1, Grid % cells_n_nodes(c1) dist = sqrt( & (Grid % xn(Grid % cells_n(n,c1))-x_probe(i_probe)) ** 2 & From a64cccb2021eec1ea95347bc64eae66b0f039223 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 8 Mar 2023 14:45:46 +0100 Subject: [PATCH 046/223] Updates for OPENMP options in makefiles On branch bojan_fixed_cell_ranges modified: Convert/makefile modified: Divide/makefile modified: Generate/makefile modified: Process/makefile --- Sources/Convert/makefile | 2 +- Sources/Divide/makefile | 5 ++++- Sources/Generate/makefile | 2 +- Sources/Process/makefile | 5 ++++- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Sources/Convert/makefile b/Sources/Convert/makefile index 452971840..71bd82c8a 100644 --- a/Sources/Convert/makefile +++ b/Sources/Convert/makefile @@ -50,7 +50,7 @@ $(info #-----------------------------------------------------------------------) $(info # Usage: ) $(info # make ) $(info # ) -$(info # ) +$(info # ) $(info # ) $(info # Note: The first item, for each of the options above, is the default. ) $(info # ) diff --git a/Sources/Divide/makefile b/Sources/Divide/makefile index 4dba10f99..f71ef3cdb 100644 --- a/Sources/Divide/makefile +++ b/Sources/Divide/makefile @@ -50,7 +50,7 @@ $(info #-----------------------------------------------------------------------) $(info # Usage: ) $(info # make ) $(info # ) -$(info # ) +$(info # ) $(info # ) $(info # Note: The first item, for each of the options above, is the default. ) $(info # ) @@ -137,6 +137,9 @@ else ifeq ($(REAL), double) OPT_F_COMP += -fdefault-real-8 endif + ifeq ($(OPENMP), yes) + OPT_F_COMP += -fopenmp + endif endif #----------------------------------------------------------- diff --git a/Sources/Generate/makefile b/Sources/Generate/makefile index 610dea35e..935632f5e 100644 --- a/Sources/Generate/makefile +++ b/Sources/Generate/makefile @@ -50,7 +50,7 @@ $(info #-----------------------------------------------------------------------) $(info # Usage: ) $(info # make ) $(info # ) -$(info # ) +$(info # ) $(info # ) $(info # Note: The first item, for each of the options above, is the default. ) $(info # ) diff --git a/Sources/Process/makefile b/Sources/Process/makefile index 7eb2563a2..a41ede460 100644 --- a/Sources/Process/makefile +++ b/Sources/Process/makefile @@ -55,8 +55,8 @@ $(info #-----------------------------------------------------------------------) $(info # Usage: ) $(info # make ) $(info # ) +$(info # ) $(info # ) -$(info # ) $(info # ) $(info # Notes: ) $(info # 1. The first item, for each of the options above, is the default. ) @@ -148,6 +148,9 @@ else ifeq ($(REAL), double) OPT_F_COMP += -fdefault-real-8 endif + ifeq ($(OPENMP), yes) + OPT_F_COMP += -fopenmp + endif endif # Set initial options for C compiler - this is probably not needed From 191bcdd0b62a8317a67fe04d1fd55ff2568241ae Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 9 Mar 2023 10:59:03 +0100 Subject: [PATCH 047/223] Added Save_Vtk_Face to Grid_Mod On branch bojan_fixed_cell_ranges modified: Shared/Grid_Mod.f90 new file: Shared/Grid_Mod/Save_Vtk_Face.f90 --- Sources/Shared/Grid_Mod.f90 | 2 ++ Sources/Shared/Grid_Mod/Save_Vtk_Face.f90 | 39 +++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 Sources/Shared/Grid_Mod/Save_Vtk_Face.f90 diff --git a/Sources/Shared/Grid_Mod.f90 b/Sources/Shared/Grid_Mod.f90 index 5c416d0bd..39f1d574c 100644 --- a/Sources/Shared/Grid_Mod.f90 +++ b/Sources/Shared/Grid_Mod.f90 @@ -224,6 +224,7 @@ module Grid_Mod procedure :: Save_Cfn procedure :: Save_Dim procedure :: Save_Debug_Vtu + procedure :: Save_Vtk_Face procedure :: Save_Vtu_Cells procedure :: Save_Vtu_Edges procedure :: Save_Vtu_Faces @@ -280,6 +281,7 @@ module Grid_Mod # include "Grid_Mod/Save_Cfn.f90" # include "Grid_Mod/Save_Dim.f90" # include "Grid_Mod/Save_Debug_Vtu.f90" +# include "Grid_Mod/Save_Vtk_Face.f90" # include "Grid_Mod/Save_Vtu_Cells.f90" # include "Grid_Mod/Save_Vtu_Edges.f90" # include "Grid_Mod/Save_Vtu_Faces.f90" diff --git a/Sources/Shared/Grid_Mod/Save_Vtk_Face.f90 b/Sources/Shared/Grid_Mod/Save_Vtk_Face.f90 new file mode 100644 index 000000000..7c57cddc2 --- /dev/null +++ b/Sources/Shared/Grid_Mod/Save_Vtk_Face.f90 @@ -0,0 +1,39 @@ +!==============================================================================! + subroutine Save_Vtk_Face(Grid, s, head, rank) +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Grid_Type) :: Grid + integer, intent(in) :: s + character(*) :: head + integer, intent(in) :: rank +!-----------------------------------[Locals]-----------------------------------! + integer :: i_nod, n, fu + character(len=80) :: filename ! don't use SL for separate compilation +!==============================================================================! + + write(filename,'(a,"-",i7.7,".vtk")') trim(head), rank + + open(newunit=fu, file=filename) + write(fu,'(a26)') '# vtk DataFile Version 2.0' + write(fu,'(a6,i7.7)') 'File: ', s + write(fu,'(a5)') 'ASCII' + write(fu,*) ' ' + write(fu,'(a16)') 'DATASET POLYDATA' + + ! Write the points out + write(fu,'(a6,i7,a6)') 'POINTS', Grid % faces_n_nodes(s), ' float' + do i_nod = 1, Grid % faces_n_nodes(s) + n = Grid % faces_n(i_nod, s) + write(fu,'(3f12.6)') Grid % xn(n), Grid % yn(n), Grid % zn(n) + end do + + ! Write polygons and data out + write(fu,'(a8,i7,i7)') 'POLYGONS', 1, Grid % faces_n_nodes(s) + 1 + write(fu,'(i7)') Grid % faces_n_nodes(s) + do i_nod = 1, Grid % faces_n_nodes(s) + write(fu,'(i7)') i_nod-1 + end do + close(fu) + + end From 41101651f163964fb2c13e93d0a842bf2f651263 Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 9 Mar 2023 13:34:44 +0100 Subject: [PATCH 048/223] Added Save_Vtk_Face to Grid_Mod On branch bojan_fixed_cell_ranges modified: Shared/Grid_Mod.f90 new file: Shared/Grid_Mod/Save_Vtk_Face.f90 On branch bojan_fixed_cell_ranges modified: Shared/Grid_Mod.f90 new file: Shared/Grid_Mod/Save_Vtk_Cell.f90 --- Sources/Shared/Grid_Mod.f90 | 2 + Sources/Shared/Grid_Mod/Save_Vtk_Cell.f90 | 86 +++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 Sources/Shared/Grid_Mod/Save_Vtk_Cell.f90 diff --git a/Sources/Shared/Grid_Mod.f90 b/Sources/Shared/Grid_Mod.f90 index 39f1d574c..79c8e15b1 100644 --- a/Sources/Shared/Grid_Mod.f90 +++ b/Sources/Shared/Grid_Mod.f90 @@ -224,6 +224,7 @@ module Grid_Mod procedure :: Save_Cfn procedure :: Save_Dim procedure :: Save_Debug_Vtu + procedure :: Save_Vtk_Cell procedure :: Save_Vtk_Face procedure :: Save_Vtu_Cells procedure :: Save_Vtu_Edges @@ -281,6 +282,7 @@ module Grid_Mod # include "Grid_Mod/Save_Cfn.f90" # include "Grid_Mod/Save_Dim.f90" # include "Grid_Mod/Save_Debug_Vtu.f90" +# include "Grid_Mod/Save_Vtk_Cell.f90" # include "Grid_Mod/Save_Vtk_Face.f90" # include "Grid_Mod/Save_Vtu_Cells.f90" # include "Grid_Mod/Save_Vtu_Edges.f90" diff --git a/Sources/Shared/Grid_Mod/Save_Vtk_Cell.f90 b/Sources/Shared/Grid_Mod/Save_Vtk_Cell.f90 new file mode 100644 index 000000000..ad9f90afa --- /dev/null +++ b/Sources/Shared/Grid_Mod/Save_Vtk_Cell.f90 @@ -0,0 +1,86 @@ +!==============================================================================! + subroutine Save_Vtk_Cell(Grid, c, head, rank) +!------------------------------------------------------------------------------! +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Grid_Type) :: Grid + integer, intent(in) :: c + character(*) :: head + integer, intent(in) :: rank +!-----------------------------------[Locals]-----------------------------------! + integer :: fu, i_nod, l_nod, n, i_fac, s, ndata, npoly + character(len=SL) :: filename + integer, allocatable :: local_node(:) +!==============================================================================! + + allocate(local_node(Grid % n_nodes)) + local_node(:) = 0 + + write(filename,'(a,"-",i7.7,".vtk")') trim(head), rank + + open(newunit=fu, file=filename) + write(fu,'(a26)') '# vtk DataFile Version 2.0' + write(fu,'(a6,i7.7)') 'File: ', rank + write(fu,'(a5)') 'ASCII' + write(fu,*) ' ' + write(fu,'(a16)') 'DATASET POLYDATA' + + ! Write the points out + write(fu,'(a6,i7,a6)') 'POINTS', abs(Grid % cells_n_nodes(c)), ' float' + l_nod = 0 + do i_nod = 1, abs(Grid % cells_n_nodes(c)) + n = Grid % cells_n(i_nod, c) + write(fu,'(3es15.6)') Grid % xn(n), Grid % yn(n), Grid % zn(n) + l_nod = l_nod + 1 + local_node(n) = l_nod + end do + + ! Count the polygons and data + npoly = 0 + ndata = 0 + do i_fac = 1, Grid % cells_n_faces(c) + s = Grid % cells_f(i_fac, c) + npoly = npoly + 1 + ndata = ndata + Grid % faces_n_nodes(s) + 1 + end do + + ! Write polygons and data out + write(fu,'(a8,i7,i7)') 'POLYGONS', npoly, ndata + do i_fac = 1, Grid % cells_n_faces(c) + s = Grid % cells_f(i_fac, c) + write(fu,'(i5)') Grid % faces_n_nodes(s) + do i_nod = 1, Grid % faces_n_nodes(s) + n = Grid % faces_n(i_nod, s) + write(fu,'(i7)') local_node(n) - 1 + end do + end do + + ! Beginning of face data + write(fu,'(a9,i7)') 'CELL_DATA', npoly + + ! Write out the face local number + write(fu,'(a24)') 'SCALARS face_local int 1' + write(fu,'(a20)') 'LOOKUP_TABLE default' + do i_fac = 1, Grid % cells_n_faces(c) + write(fu,'(i9)') i_fac + end do + + ! Write out the face global number + write(fu,'(a25)') 'SCALARS face_global int 1' + write(fu,'(a20)') 'LOOKUP_TABLE default' + do i_fac = 1, Grid % cells_n_faces(c) + write(fu,'(i9)') Grid % cells_f(i_fac, c) + end do + + ! Write out the face surface vectors + write(fu,'(a25)') 'SCALARS face_surf float 3' + write(fu,'(a20)') 'LOOKUP_TABLE default' + do i_fac = 1, Grid % cells_n_faces(c) + s = Grid % cells_f(i_fac, c) + write(fu,'(3es15.6)') Grid % sx(s), Grid % sy(s), Grid % sz(s) + end do + + close(fu) + + end From 44261ecc4b47f2625a7bf69fc8ec1d7b51f4e24b Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 9 Mar 2023 15:27:59 +0100 Subject: [PATCH 049/223] Changed format of the written numbers. On branch bojan_fixed_cell_ranges modified: Shared/Grid_Mod/Save_Vtk_Cell.f90 modified: Shared/Grid_Mod/Save_Vtk_Face.f90 --- Sources/Shared/Grid_Mod/Save_Vtk_Cell.f90 | 2 +- Sources/Shared/Grid_Mod/Save_Vtk_Face.f90 | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Sources/Shared/Grid_Mod/Save_Vtk_Cell.f90 b/Sources/Shared/Grid_Mod/Save_Vtk_Cell.f90 index ad9f90afa..aaa354644 100644 --- a/Sources/Shared/Grid_Mod/Save_Vtk_Cell.f90 +++ b/Sources/Shared/Grid_Mod/Save_Vtk_Cell.f90 @@ -17,7 +17,7 @@ subroutine Save_Vtk_Cell(Grid, c, head, rank) allocate(local_node(Grid % n_nodes)) local_node(:) = 0 - write(filename,'(a,"-",i7.7,".vtk")') trim(head), rank + write(filename,'(a,"-",i9.9,".vtk")') trim(head), rank open(newunit=fu, file=filename) write(fu,'(a26)') '# vtk DataFile Version 2.0' diff --git a/Sources/Shared/Grid_Mod/Save_Vtk_Face.f90 b/Sources/Shared/Grid_Mod/Save_Vtk_Face.f90 index 7c57cddc2..d1aa8d30a 100644 --- a/Sources/Shared/Grid_Mod/Save_Vtk_Face.f90 +++ b/Sources/Shared/Grid_Mod/Save_Vtk_Face.f90 @@ -12,7 +12,7 @@ subroutine Save_Vtk_Face(Grid, s, head, rank) character(len=80) :: filename ! don't use SL for separate compilation !==============================================================================! - write(filename,'(a,"-",i7.7,".vtk")') trim(head), rank + write(filename,'(a,"-",i9.9,".vtk")') trim(head), rank open(newunit=fu, file=filename) write(fu,'(a26)') '# vtk DataFile Version 2.0' @@ -25,7 +25,7 @@ subroutine Save_Vtk_Face(Grid, s, head, rank) write(fu,'(a6,i7,a6)') 'POINTS', Grid % faces_n_nodes(s), ' float' do i_nod = 1, Grid % faces_n_nodes(s) n = Grid % faces_n(i_nod, s) - write(fu,'(3f12.6)') Grid % xn(n), Grid % yn(n), Grid % zn(n) + write(fu,'(3es15.6)') Grid % xn(n), Grid % yn(n), Grid % zn(n) end do ! Write polygons and data out @@ -34,6 +34,15 @@ subroutine Save_Vtk_Face(Grid, s, head, rank) do i_nod = 1, Grid % faces_n_nodes(s) write(fu,'(i7)') i_nod-1 end do + + ! Beginning of face data + write(fu,'(a9,i7)') 'CELL_DATA', 1 + + ! Write out the face surface vectors + write(fu,'(a25)') 'SCALARS face_surf float 3' + write(fu,'(a20)') 'LOOKUP_TABLE default' + write(fu,'(3es15.6)') Grid % sx(s), Grid % sy(s), Grid % sz(s) + close(fu) end From a22ac35facae881c43895f515047ff6cf8a8119a Mon Sep 17 00:00:00 2001 From: Niceno Date: Fri, 10 Mar 2023 09:41:27 +0100 Subject: [PATCH 050/223] Added three new asserts. On branch bojan_fixed_cell_ranges modified: Convert/Convert_Mod/Find_Faces.f90 --- Sources/Convert/Convert_Mod/Find_Faces.f90 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Sources/Convert/Convert_Mod/Find_Faces.f90 b/Sources/Convert/Convert_Mod/Find_Faces.f90 index 0fa33508d..ddf68c883 100644 --- a/Sources/Convert/Convert_Mod/Find_Faces.f90 +++ b/Sources/Convert/Convert_Mod/Find_Faces.f90 @@ -54,6 +54,7 @@ subroutine Find_Faces(Convert, Grid) if(Grid % cells_n_nodes(c) .eq. 6) max_fac = max(max_fac, 5) if(Grid % cells_n_nodes(c) .eq. 8) max_fac = max(max_fac, 6) end do + Assert(max_fac .ne. 0) !---------------------------------------------------! ! Find max number of faces' nodes for this grid ! @@ -65,6 +66,7 @@ subroutine Find_Faces(Convert, Grid) if(Grid % cells_n_nodes(c) .eq. 6) max_nod = max(max_nod, 4) if(Grid % cells_n_nodes(c) .eq. 8) max_nod = max(max_nod, 4) end do + Assert(max_nod .ne. 0) !---------------------------------------------------! ! Fill the generic coordinates with some values ! @@ -109,8 +111,6 @@ subroutine Find_Faces(Convert, Grid) !------------------------------------------------! ! Anotate cell faces with same coordinates ! - ! (I am afraid that this might be influenced ! - ! by the numerical round-off errors) ! !------------------------------------------------! cnt = 1 starts(1) = 1 @@ -131,6 +131,8 @@ subroutine Find_Faces(Convert, Grid) !---------------------------------------------! call Adjust_First_Dim(max_fac, Grid % cells_c) ! i_fac goes to max_fac call Adjust_First_Dim(max_nod, Grid % faces_n) ! i_nod goes to max_nod + Assert(maxval(maxval(Grid % cells_c, dim=2), dim=1) == 0) + do n3 = 1, cnt if(starts(n3) .ne. ends(n3)) then do i1=starts(n3),ends(n3) From bb154a6d9745f89f4e6f4f7c13bc66bd3b162b79 Mon Sep 17 00:00:00 2001 From: Niceno Date: Fri, 10 Mar 2023 09:42:35 +0100 Subject: [PATCH 051/223] Added a check for boundary cells. On branch bojan_fixed_cell_ranges modified: Convert/Convert_Mod/Find_Parents.f90 --- Sources/Convert/Convert_Mod/Find_Parents.f90 | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/Sources/Convert/Convert_Mod/Find_Parents.f90 b/Sources/Convert/Convert_Mod/Find_Parents.f90 index e34f8c79d..925874868 100644 --- a/Sources/Convert/Convert_Mod/Find_Parents.f90 +++ b/Sources/Convert/Convert_Mod/Find_Parents.f90 @@ -12,7 +12,7 @@ subroutine Find_Parents(Convert, Grid) type(Grid_Type) :: Grid !-----------------------------------[Locals]-----------------------------------! integer :: fn(6,4), i_fac, j_fac, i_nod, i_cel, c1, c2 - integer :: nodes(4), n_match, dir, bc, cnt_c, cnt_f + integer :: nodes(4), n_match, n_match_tot, dir, bc, cnt_c, cnt_f integer :: n_face_nodes ! number of nodes in a face integer :: n_cell_faces ! number of faces in a cell logical, allocatable :: is_node_bnd(:) @@ -37,7 +37,7 @@ subroutine Find_Parents(Convert, Grid) file=__FILE__, line=__LINE__) end if - allocate(is_node_bnd(Grid % n_nodes)); is_node_bnd(:) = .false. + allocate(is_node_bnd (Grid % n_nodes)); is_node_bnd(:) = .false. allocate(cell_near_bnd(Grid % n_cells)); cell_near_bnd(:) = 0 !--------------------------------------------------------------! @@ -83,6 +83,7 @@ subroutine Find_Parents(Convert, Grid) !----------------------! ! Real work begins ! !----------------------! + n_match_tot = 0 do bc = Boundary_Regions() @@ -185,10 +186,24 @@ subroutine Find_Parents(Convert, Grid) end if end if end do + print *, '# Number of matches: ', n_match + n_match_tot = n_match_tot + n_match end do ! bc + if(n_match_tot .ne. Grid % n_bnd_cells) then + call Message % Error(70, 'Number of boundary cells found is not the '// & + 'same as the one prescribed boundary cells. '// & + 'The probable cause for it is that some ' // & + 'internal faces in Gmsh are denoted as ' // & + 'boundary conditions (physical groups). ' // & + '\n \n ' // & + 'Check the Gmsh mesh for physical groups ' // & + 'and try to repair this.', & + file=__FILE__, line=__LINE__) + end if + call Profiler % Stop('Find_Parents') end subroutine From 162de1b15286bd6f1f544a0be2ec96244b7e74fd Mon Sep 17 00:00:00 2001 From: Niceno Date: Fri, 10 Mar 2023 09:43:11 +0100 Subject: [PATCH 052/223] Check if there are boundary conditions are defined On branch bojan_fixed_cell_ranges modified: Convert/Convert_Mod/Load_Gmsh.f90 --- Sources/Convert/Convert_Mod/Load_Gmsh.f90 | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Sources/Convert/Convert_Mod/Load_Gmsh.f90 b/Sources/Convert/Convert_Mod/Load_Gmsh.f90 index 0e287fe82..14d9cc508 100644 --- a/Sources/Convert/Convert_Mod/Load_Gmsh.f90 +++ b/Sources/Convert/Convert_Mod/Load_Gmsh.f90 @@ -395,6 +395,15 @@ subroutine Load_Gmsh(Convert, Grid, file_name) print '(a38,i9)', '# Total number of boundary sections: ', n_bnd_sect print '(a38,i9)', '# Total number of boundary cells: ', Grid % n_bnd_cells + if(n_bnd_sect .eq. 0) then + call Message % Error(60, 'No boundary sections (physical groups in ' // & + 'Gmsh) have been defined. Convert can''t ' // & + 'work with grids like that. ' // & + '\n \n ' // & + 'Define physical groups in Gmsh and retry.', & + file=__FILE__, line=__LINE__) + end if + !--------------------------------------------! ! ! ! Allocate memory for Grid_Mod variables ! From b9acdfdcd568133bce13d1670529e013c8c405c1 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 11 Mar 2023 09:08:19 +0100 Subject: [PATCH 053/223] Transfered improved gradients for pressure to here These are essentially in commits 217e85ddbacf2dd088e0714d5b570a3c420f6db8 and dc5c39a55d28782856a554e0540f61cb2c945af2 in the branch bojan_weighted_gradients. I didn't do a pull, but did a simple copying of the files here. On branch bojan_fixed_cell_ranges modified: Sources/Process/Field_Mod/Gradients/Grad_Gauss_Pressure.f90 modified: Tests/Functionality/Gradients/User_Mod/Initialize_Variables.f90 --- .../Gradients/Grad_Gauss_Pressure.f90 | 170 +++++++---------- .../User_Mod/Initialize_Variables.f90 | 174 +++++++----------- 2 files changed, 140 insertions(+), 204 deletions(-) diff --git a/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Pressure.f90 b/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Pressure.f90 index 8a8b1b0be..ea76291e9 100644 --- a/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Pressure.f90 +++ b/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Pressure.f90 @@ -9,137 +9,105 @@ subroutine Grad_Gauss_Pressure(Flow, p) type(Var_Type), target :: p ! should be pressure or pressure correction !----------------------------------[Locals]------------------------------------! type(Grid_Type), pointer :: Grid - integer :: s, c, c1, c2 + integer :: s, c, c1, c2, iter integer :: i_fac, c1_prim, c2_prim, s_prim - integer, contiguous, pointer :: c_at_bnd(:), c_cnt(:) + integer, contiguous, pointer :: c_computed(:), c_visited(:) !------------------------------[Local parameters]------------------------------! integer, parameter :: YES = 1 integer, parameter :: NO = YES-1 !==============================================================================! - call Work % Connect_Int_Cell(c_at_bnd, c_cnt) + call Work % Connect_Int_Cell(c_computed, c_visited) ! Take alias Grid => Flow % pnt_grid - !--------------------------------------! - ! Initialization of c_at_bnd array ! - !--------------------------------------! - c_at_bnd(:) = NO - c_cnt(:) = 0 - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0) c_at_bnd(c1) = YES - end do - ! Initialize with some gradients with the most robust and reliable tool ! you have at your disposal - least square cell-based method. These ! gradients should be properly calculated inside the domain. call Flow % Grad_Least_Pressure(p) - !--------------------------------------------------------------------! - ! Step 1: Extrapolate interior gradient values to boundary cells ! - ! using only values from interior cells - which are good ! - ! This step will leave the boundary cells surrounded by ! - ! other boundary cells unchanged (reset to zero, really) ! - !--------------------------------------------------------------------! - do c = 1, Grid % n_cells + !-----------------------------------------------------------------------! + ! Extrapolate interior gradient values to boundary cells using only ! + ! values which are known, either from interior cells, or cells near ! + ! boundaries computed in previous iterations. ! + !-----------------------------------------------------------------------! - ! Cell is at the boundary, intervene here - if(c_at_bnd(c) .eq. YES) then + ! First assume all are computed although you know the cells near the + ! bounderies are not computed well; but they will be treated below + c_computed(:) = YES - ! Nullify its gradients, and the counter for cells from which you interpolate + ! Mark cells which are not computed for the 1st time + ! At this point, these are cells near the boundaries + do s = 1, Grid % n_faces + c1 = Grid % faces_c(1, s) + c2 = Grid % faces_c(2, s) + if(c2 < 0) c_computed(c1) = NO + end do + + call Grid % Exchange_Cells_Int(c_computed) + + ! Nullify gradients for cells near boundaries + ! (where gradients are not computed properly), + ! and initialize c_visited + do c = 1, Grid % n_cells + if(c_computed(c) .eq. NO) then ! if not computed p % x(c) = 0.0 p % y(c) = 0.0 p % z(c) = 0.0 - - ! Browse through this cell's faces - do i_fac = 1, Grid % cells_n_faces(c) - s_prim = Grid % cells_f(i_fac, c) - c1_prim = Grid % faces_c(1, s_prim) - c2_prim = Grid % faces_c(2, s_prim) - - ! Consider c1_prim if it is not cell at boundary - if(c_at_bnd(c1_prim) .eq. NO) then - p % x(c) = p % x(c) + p % x(c1_prim) - p % y(c) = p % y(c) + p % y(c1_prim) - p % z(c) = p % z(c) + p % z(c1_prim) - c_cnt(c) = c_cnt(c) + 1 - end if - - ! Consider c2_prim if it is not cell at boundary - ! and not a boundary cell. - if(c_at_bnd(c2_prim) .eq. NO .and. & - c2_prim .gt. 0) then - p % x(c) = p % x(c) + p % x(c2_prim) - p % y(c) = p % y(c) + p % y(c2_prim) - p % z(c) = p % z(c) + p % z(c2_prim) - c_cnt(c) = c_cnt(c) + 1 - end if - - end do - - ! Work out the average - if(c_cnt(c) .gt. 0) then - p % x(c) = p % x(c) / c_cnt(c) - p % y(c) = p % y(c) / c_cnt(c) - p % z(c) = p % z(c) / c_cnt(c) - end if - - end if ! c at bnd - + c_visited(c) = 0 + end if end do - !-----------------------------------------------------------------------! - ! Step 2: Previous step left the cells at boundary, which are only ! - ! surrounded by other cells at boundary, untreated. Here, ! - ! you are less selective and extrapolate even from cells at ! - ! boundaries, which were interpolated in the Step 1 above. ! - !-----------------------------------------------------------------------! - do c = 1, Grid % n_cells - - ! Cell is at the boundary, and hasn'p been treated yet - if(c_at_bnd(c) .eq. YES .and. c_cnt(c) .eq. 0) then - - ! Browse through this cell's faces - do i_fac = 1, Grid % cells_n_faces(c) - s_prim = Grid % cells_f(i_fac, c) - c1_prim = Grid % faces_c(1, s_prim) - c2_prim = Grid % faces_c(2, s_prim) - - if(c1_prim .ne. c .and. & ! skip your own self - c_cnt(c1_prim) .gt. 0) then ! consider only cells with values - p % x(c) = p % x(c) + p % x(c1_prim) - p % y(c) = p % y(c) + p % y(c1_prim) - p % z(c) = p % z(c) + p % z(c1_prim) - c_cnt(c) = c_cnt(c) + 1 + !------------------------------------------------! + ! Extrapolate in several iterations, as long ! + ! as there are cells which are not computed. ! + !------------------------------------------------! + do iter = 1, 3 + + ! Browse through faces to find the cells which need ... + ! ... updating, and accumulate gradients in them as well + do s = 1, Grid % n_faces + c1 = Grid % faces_c(1, s) + c2 = Grid % faces_c(2, s) + + if(c2 > 0) then + if(c_computed(c1) .eq. NO .and. c_computed(c2) .eq. YES) then + p % x(c1) = p % x(c1) + p % x(c2) + p % y(c1) = p % y(c1) + p % y(c2) + p % z(c1) = p % z(c1) + p % z(c2) + c_visited(c1) = c_visited(c1) + 1 end if - if(c2_prim .ne. c .and. & ! skip your own self - c2_prim .gt. 0 .and. & ! consider only cells with values - c_cnt(c2_prim) .gt. 0) then ! don'p use boundary cells - p % x(c) = p % x(c) + p % x(c2_prim) - p % y(c) = p % y(c) + p % y(c2_prim) - p % z(c) = p % z(c) + p % z(c2_prim) - c_cnt(c) = c_cnt(c) + 1 + if(c_computed(c2) .eq. NO .and. c_computed(c1) .eq. YES) then + p % x(c2) = p % x(c2) + p % x(c1) + p % y(c2) = p % y(c2) + p % y(c1) + p % z(c2) = p % z(c2) + p % z(c1) + c_visited(c2) = c_visited(c2) + 1 end if - - end do - - if(c_cnt(c) .gt. 0) then - p % x(c) = p % x(c) / c_cnt(c) - p % y(c) = p % y(c) / c_cnt(c) - p % z(c) = p % z(c) / c_cnt(c) end if + end do + + ! Browse throough cells, and calculate final values ... + ! ... of gradients in the cells which have been visited + do c = 1, Grid % n_cells + if(c_visited(c) > 0) then + p % x(c) = p % x(c) / c_visited(c) + p % y(c) = p % y(c) / c_visited(c) + p % z(c) = p % z(c) / c_visited(c) + c_visited(c) = 0 + c_computed(c) = YES ! mark it as computed for the next iteration + end if + end do + call Grid % Exchange_Cells_Real(p % x) + call Grid % Exchange_Cells_Real(p % y) + call Grid % Exchange_Cells_Real(p % z) - end if ! c at bnd - - end do + end do ! iter ! Perform Gauss from gradients which are good inside obtained above call Flow % Grad_Gauss_Variable(p) - call Work % Disconnect_Int_Cell(c_at_bnd, c_cnt) + call Work % Disconnect_Int_Cell(c_computed, c_visited) end subroutine diff --git a/Tests/Functionality/Gradients/User_Mod/Initialize_Variables.f90 b/Tests/Functionality/Gradients/User_Mod/Initialize_Variables.f90 index 446057595..b915f259b 100644 --- a/Tests/Functionality/Gradients/User_Mod/Initialize_Variables.f90 +++ b/Tests/Functionality/Gradients/User_Mod/Initialize_Variables.f90 @@ -18,7 +18,7 @@ subroutine User_Mod_Initialize_Variables(Flow, Turb, Vof, Swarm, Sol) character(8) :: name = 'check_xx' real, contiguous, pointer :: phi_f(:), phi_n(:), phi_c(:) real, contiguous, pointer :: phi_x(:), phi_y(:), phi_z(:) - integer, contiguous, pointer :: c_at_bnd(:), c_cnt(:) + integer, contiguous, pointer :: c_computed(:), c_visited(:) !------------------------------[Local parameters]------------------------------! integer, parameter :: YES = 1 integer, parameter :: NO = YES-1 @@ -27,7 +27,7 @@ subroutine User_Mod_Initialize_Variables(Flow, Turb, Vof, Swarm, Sol) call Work % Connect_Real_Face(phi_f) call Work % Connect_Real_Node(phi_n) call Work % Connect_Real_Cell(phi_x, phi_y, phi_z, phi_c) - call Work % Connect_Int_Cell (c_at_bnd, c_cnt) + call Work % Connect_Int_Cell (c_computed, c_visited) ! Take aliases Grid => Flow % pnt_grid @@ -38,17 +38,6 @@ subroutine User_Mod_Initialize_Variables(Flow, Turb, Vof, Swarm, Sol) Flow % gauss_miter = 100 Flow % gauss_tol = 1e-3 - !----------------------------! - ! Find cells at boundary ! - !----------------------------! - c_at_bnd(:) = NO - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1, s) - c2 = Grid % faces_c(2, s) - - if(c2 < 0) c_at_bnd(c1) = YES - end do - !----------------------------------------------------------------------! ! ! ! Test 1: ! @@ -214,107 +203,83 @@ subroutine User_Mod_Initialize_Variables(Flow, Turb, Vof, Swarm, Sol) t % grad_method = LEAST_SQUARES call Flow % Grad_Variable(t) - !--------------------------------------------------------------------! - ! Step 1: Extrapolate interior gradient values to boundary cells ! - ! using only values from interior cells - which are good ! - ! This step will leave the boundary cells surrounded by ! - ! other boundary cells unchanged (reset to zero, really) ! - !--------------------------------------------------------------------! - c_cnt(:) = 0 - do c = 1, Grid % n_cells + !-----------------------------------------------------------------------! + ! Extrapolate interior gradient values to boundary cells using only ! + ! values which are known, either from interior cells, or cells near ! + ! boundaries computed in previous iterations. ! + !-----------------------------------------------------------------------! - ! Cell is at the boundary, intervene here - if(c_at_bnd(c) .eq. YES) then + ! First assume all are computed although you know the cells near the + ! bounderies are not computed well; but they will be treated below + c_computed(:) = YES - ! Nullify its gradients, and the counter - ! for cells from which you interpolate + ! Mark cells which are not computed for the 1st time + ! At this point, these are cells near the boundaries + do s = 1, Grid % n_faces + c1 = Grid % faces_c(1, s) + c2 = Grid % faces_c(2, s) + if(c2 < 0) c_computed(c1) = NO + end do + + call Grid % Exchange_Cells_Int(c_computed) + + ! Nullify gradients for cells near boundaries + ! (where gradients are not computed properly), + ! and initialize c_visited + do c = 1, Grid % n_cells + if(c_computed(c) .eq. NO) then ! if not computed t % x(c) = 0.0 t % y(c) = 0.0 t % z(c) = 0.0 - c_cnt(c) = 0 ! probably not needed, initialized above - - ! Browse through this cell's faces - do i_fac = 1, Grid % cells_n_faces(c) - s_prim = Grid % cells_f(i_fac, c) - c1_prim = Grid % faces_c(1, s_prim) - c2_prim = Grid % faces_c(2, s_prim) - - ! Consider c1_prim if it is not cell at boundary - if(c_at_bnd(c1_prim) .eq. NO) then - t % x(c) = t % x(c) + t % x(c1_prim) - t % y(c) = t % y(c) + t % y(c1_prim) - t % z(c) = t % z(c) + t % z(c1_prim) - c_cnt(c) = c_cnt(c) + 1 - end if - - ! Consider c2_prim if it is not cell at boundary - ! and not a boundary cell. - if(c_at_bnd(c2_prim) .eq. NO .and. & - c2_prim .gt. 0) then - t % x(c) = t % x(c) + t % x(c2_prim) - t % y(c) = t % y(c) + t % y(c2_prim) - t % z(c) = t % z(c) + t % z(c2_prim) - c_cnt(c) = c_cnt(c) + 1 - end if - - end do - - ! Work out the average - if(c_cnt(c) .gt. 0) then - t % x(c) = t % x(c) / c_cnt(c) - t % y(c) = t % y(c) / c_cnt(c) - t % z(c) = t % z(c) / c_cnt(c) - end if - - end if ! c at bnd - + c_visited(c) = 0 + end if end do - !-----------------------------------------------------------------------! - ! Step 2: Previous step left the cells at boundary, which are only ! - ! surrounded by other cells at boundary, untreated. Here, ! - ! you are less selective and extrapolate even from cells at ! - ! boundaries, which were interpolated in the Step 1 above. ! - !-----------------------------------------------------------------------! - do c = 1, Grid % n_cells - - ! Cell is at the boundary, and hasn't been treated yet - if(c_at_bnd(c) .eq. YES .and. c_cnt(c) .eq. 0) then - - ! Browse through this cell's faces - do i_fac = 1, Grid % cells_n_faces(c) - s_prim = Grid % cells_f(i_fac, c) - c1_prim = Grid % faces_c(1, s_prim) - c2_prim = Grid % faces_c(2, s_prim) - - if(c1_prim .ne. c .and. & ! skip your own self - c_cnt(c1_prim) .gt. 0) then ! consider only cells with values - t % x(c) = t % x(c) + t % x(c1_prim) - t % y(c) = t % y(c) + t % y(c1_prim) - t % z(c) = t % z(c) + t % z(c1_prim) - c_cnt(c) = c_cnt(c) + 1 + !------------------------------------------------! + ! Extrapolate in several iterations, as long ! + ! as there are cells which are not computed. ! + !------------------------------------------------! + do iter = 1, 3 + + ! Browse through faces to find the cells which need ... + ! ... updating, and accumulate gradients in them as well + do s = 1, Grid % n_faces + c1 = Grid % faces_c(1, s) + c2 = Grid % faces_c(2, s) + + if(c2 > 0) then + if(c_computed(c1) .eq. NO .and. c_computed(c2) .eq. YES) then + t % x(c1) = t % x(c1) + t % x(c2) + t % y(c1) = t % y(c1) + t % y(c2) + t % z(c1) = t % z(c1) + t % z(c2) + c_visited(c1) = c_visited(c1) + 1 end if - if(c2_prim .ne. c .and. & ! skip your own self - c2_prim .gt. 0 .and. & ! consider only cells with values - c_cnt(c2_prim) .gt. 0) then ! don't use boundary cells - t % x(c) = t % x(c) + t % x(c2_prim) - t % y(c) = t % y(c) + t % y(c2_prim) - t % z(c) = t % z(c) + t % z(c2_prim) - c_cnt(c) = c_cnt(c) + 1 + if(c_computed(c2) .eq. NO .and. c_computed(c1) .eq. YES) then + t % x(c2) = t % x(c2) + t % x(c1) + t % y(c2) = t % y(c2) + t % y(c1) + t % z(c2) = t % z(c2) + t % z(c1) + c_visited(c2) = c_visited(c2) + 1 end if - - end do - - if(c_cnt(c) .gt. 0) then - t % x(c) = t % x(c) / c_cnt(c) - t % y(c) = t % y(c) / c_cnt(c) - t % z(c) = t % z(c) / c_cnt(c) end if + end do + + ! Browse throough cells, and calculate final values ... + ! ... of gradients in the cells which have been visited + do c = 1, Grid % n_cells + if(c_visited(c) > 0) then + t % x(c) = t % x(c) / c_visited(c) + t % y(c) = t % y(c) / c_visited(c) + t % z(c) = t % z(c) / c_visited(c) + c_visited(c) = 0 + c_computed(c) = YES ! mark it as computed for the next iteration + end if + end do + call Grid % Exchange_Cells_Real(t % x) + call Grid % Exchange_Cells_Real(t % y) + call Grid % Exchange_Cells_Real(t % z) - end if ! c at bnd - - end do + end do ! iter ! Save the initial guess that you got call Grid % Save_Debug_Vtu( & @@ -372,6 +337,9 @@ subroutine User_Mod_Initialize_Variables(Flow, Turb, Vof, Swarm, Sol) call Work % Disconnect_Real_Face(phi_f) call Work % Disconnect_Real_Node(phi_n) call Work % Disconnect_Real_Cell(phi_x, phi_y, phi_z, phi_c) - call Work % Disconnect_Int_Cell (c_at_bnd, c_cnt) + call Work % Disconnect_Int_Cell (c_computed, c_visited) + + call Comm_Mod_End + stop end subroutine From 8d9a343622a21a76838f11f7b34ddc5181683765 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 12 Mar 2023 13:50:23 +0100 Subject: [PATCH 054/223] Made output 2 characters wider. (I have no idea why is there the range 1:123 in line 90.) On branch bojan_fixed_cell_ranges modified: Shared/Profiler_Mod/Statistics.f90 --- Sources/Shared/Profiler_Mod/Statistics.f90 | 40 +++++++++++----------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/Sources/Shared/Profiler_Mod/Statistics.f90 b/Sources/Shared/Profiler_Mod/Statistics.f90 index 386523ef2..7aff479d9 100644 --- a/Sources/Shared/Profiler_Mod/Statistics.f90 +++ b/Sources/Shared/Profiler_Mod/Statistics.f90 @@ -47,14 +47,14 @@ subroutine Statistics(Profiler, indent) if(this_proc < 2) then line( 1:160) = ' ' - line( 1+indent:63+indent) = & - '#=============================================================#' + line( 1+indent:65+indent) = & + '#===============================================================#' print '(a)', trim(line) - line( 1+indent:63+indent) = & - '# CPU usage statistics #' + line( 1+indent:65+indent) = & + '# CPU usage statistics #' print '(a)', trim(line) - line( 1+indent:63+indent) = & - '#-------------------------------------------------------------#' + line( 1+indent:65+indent) = & + '#---------------------------------------------------------------#' print '(a)', trim(line) line( 1:160) = ' ' line( 1+indent:30+indent) = '# Total CPU time: ' @@ -69,36 +69,36 @@ subroutine Statistics(Profiler, indent) write(line(36+indent:36+indent), '(a1)') ':' write(line(37+indent:38+indent), '(i2.2)') seconds write(line(40+indent:50+indent), '(a11)') '[hhh:mm:ss]' - line(63+indent:63+indent) = '#' + line(65+indent:65+indent) = '#' print '(a)', trim(line) - line( 1+indent:63+indent) = & - '#-------------------------------------------+-----------------#' + line( 1+indent:65+indent) = & + '#---------------------------------------------+-----------------#' print '(a)', trim(line) - line( 1+indent:63+indent) = & - '# Description of the activity: | Spent time: #' + line( 1+indent:65+indent) = & + '# Description of the activity: | Spent time: #' print '(a)', trim(line) - line( 1+indent:63+indent) = & - '#-------------------------------------------+-----------------#' + line( 1+indent:65+indent) = & + '#---------------------------------------------+-----------------#' print '(a)', trim(line) do i_fun = 1, Profiler % n_functions line( 1:160) = ' ' line( 1+indent: 1+indent) = '#' - line(63+indent:63+indent) = '#' + line(65+indent:65+indent) = '#' line( 3+indent: 3+indent) = '-' line( 5+indent: 5+indent+len_trim(Profiler % funct_name(i_fun))) & - = Profiler % funct_name(i_fun)(1:123) - line(45+indent:45+indent) = '|' + = Profiler % funct_name(i_fun)(1:123) + line(47+indent:47+indent) = '|' percent_time = Profiler % funct_time(i_fun) / total_time * 100.0 - write(line(50+indent:55+indent), '(f6.2)') percent_time - line(57+indent:57+indent) = '%' + write(line(52+indent:57+indent), '(f6.2)') percent_time + line(59+indent:59+indent) = '%' if(percent_time > 0.01) then print '(a)', trim(line) end if end do - line( 1+indent:63+indent) = & - '#-------------------------------------------+-----------------#' + line( 1+indent:65+indent) = & + '#---------------------------------------------+-----------------#' print '(a)', trim(line) print *, '' From 7de243be6da7ab9f35b2711d5493737fddc3dc30 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 12 Mar 2023 13:52:23 +0100 Subject: [PATCH 055/223] Made Tokenizer's only member procedure pure. On branch bojan_fixed_cell_ranges modified: Shared/Tokenizer_Mod/Parse.f90 --- Sources/Shared/Tokenizer_Mod/Parse.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/Shared/Tokenizer_Mod/Parse.f90 b/Sources/Shared/Tokenizer_Mod/Parse.f90 index 90cea73b0..a0d232249 100644 --- a/Sources/Shared/Tokenizer_Mod/Parse.f90 +++ b/Sources/Shared/Tokenizer_Mod/Parse.f90 @@ -1,9 +1,9 @@ !==============================================================================! - subroutine Parse(Tok) + pure subroutine Parse(Tok) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Tokenizer_Type) :: Tok + class(Tokenizer_Type), intent(inout) :: Tok !-----------------------------------[Locals]-----------------------------------! integer :: i, l !==============================================================================! From 6317d86f8d0b67c07846da2d2b409fc4f1994ddb Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 12 Mar 2023 13:54:49 +0100 Subject: [PATCH 056/223] New member function "First_Upper" in String_Dom For now, it is used only when calling profiler in combination with different solvers (see procedures in Process_Mod, Turb_Mod and Vof_Mod). Nice thing about it is that it's a function which returns a variable length string, something which is quite advanced thing for Fortran :-/ On branch bojan_fixed_cell_ranges modified: Shared/String_Mod.f90 new file: Shared/String_Mod/First_Upper.f90 modified: Shared/String_Mod/To_Lower_Case.f90 modified: Shared/String_Mod/To_Upper_Case.f90 modified: Process/Process_Mod/Compute_Energy.f90 modified: Process/Process_Mod/Compute_Momentum.f90 modified: Process/Process_Mod/Compute_Pressure.f90 modified: Process/Process_Mod/Compute_Scalar.f90 modified: Process/Turb_Mod/Compute_F22.f90 modified: Process/Turb_Mod/Compute_Stress.f90 modified: Process/Turb_Mod/Compute_Variable.f90 modified: Process/Vof_Mod/Core/Solve_System.f90 --- .../Process/Process_Mod/Compute_Energy.f90 | 6 ++-- .../Process/Process_Mod/Compute_Momentum.f90 | 6 ++-- .../Process/Process_Mod/Compute_Pressure.f90 | 6 ++-- .../Process/Process_Mod/Compute_Scalar.f90 | 10 +++--- Sources/Process/Turb_Mod/Compute_F22.f90 | 10 ++++-- Sources/Process/Turb_Mod/Compute_Stress.f90 | 10 +++--- Sources/Process/Turb_Mod/Compute_Variable.f90 | 10 +++--- Sources/Process/Vof_Mod/Core/Solve_System.f90 | 4 +-- Sources/Shared/String_Mod.f90 | 3 ++ Sources/Shared/String_Mod/First_Upper.f90 | 34 +++++++++++++++++++ Sources/Shared/String_Mod/To_Lower_Case.f90 | 8 ++--- Sources/Shared/String_Mod/To_Upper_Case.f90 | 6 ++-- 12 files changed, 84 insertions(+), 29 deletions(-) create mode 100644 Sources/Shared/String_Mod/First_Upper.f90 diff --git a/Sources/Process/Process_Mod/Compute_Energy.f90 b/Sources/Process/Process_Mod/Compute_Energy.f90 index c9d2316c8..b3b18d5fe 100644 --- a/Sources/Process/Process_Mod/Compute_Energy.f90 +++ b/Sources/Process/Process_Mod/Compute_Energy.f90 @@ -269,7 +269,8 @@ subroutine Compute_Energy(Process, Flow, Turb, Vof, Sol, curr_dt, ini) ! Under-relax the equations call Numerics_Mod_Under_Relax(t, A, b) - call Profiler % Start('Linear_Solver_For_Energy') + call Profiler % Start(String % First_Upper(t % solver) // & + ' (solver for energy)') ! Call linear solver to solve the equations call Sol % Run(t % solver, & @@ -283,7 +284,8 @@ subroutine Compute_Energy(Process, Flow, Turb, Vof, Sol, curr_dt, ini) t % tol, & t % res) - call Profiler % Stop('Linear_Solver_For_Energy') + call Profiler % Stop(String % First_Upper(t % solver) // & + ' (solver for energy)') ! Print some info on the screen call Info_Mod_Iter_Fill_At(1, 6, t % name, t % eniter, t % res) diff --git a/Sources/Process/Process_Mod/Compute_Momentum.f90 b/Sources/Process/Process_Mod/Compute_Momentum.f90 index 58533525d..99470ddd2 100644 --- a/Sources/Process/Process_Mod/Compute_Momentum.f90 +++ b/Sources/Process/Process_Mod/Compute_Momentum.f90 @@ -358,7 +358,8 @@ subroutine Compute_Momentum(Process, Flow, Turb, Vof, Por, Sol, curr_dt, ini) ! Under-relax the equations call Numerics_Mod_Under_Relax(ui, M, b) - call Profiler % Start('Linear_Solver_For_Momentum') + call Profiler % Start(String % First_Upper(ui % solver) // & + ' (solver for momentum)') ! Call linear solver call Sol % Run(ui % solver, & @@ -373,7 +374,8 @@ subroutine Compute_Momentum(Process, Flow, Turb, Vof, Por, Sol, curr_dt, ini) ui % res, & norm = vel_max) - call Profiler % Stop('Linear_Solver_For_Momentum') + call Profiler % Stop(String % First_Upper(ui % solver) // & + ' (solver for momentum)') ! Fill the info screen up if (Flow % p_m_coupling == SIMPLE) then diff --git a/Sources/Process/Process_Mod/Compute_Pressure.f90 b/Sources/Process/Process_Mod/Compute_Pressure.f90 index bf7a7bb56..f809c9fdf 100644 --- a/Sources/Process/Process_Mod/Compute_Pressure.f90 +++ b/Sources/Process/Process_Mod/Compute_Pressure.f90 @@ -185,7 +185,8 @@ subroutine Compute_Pressure(Process, Flow, Vof, Sol, curr_dt, ini) ! Get solver call Control_Mod_Solver_For_Pressure(solver) - call Profiler % Start('Linear_Solver_For_Pressure') + call Profiler % Start(String % First_Upper(pp % solver) // & + ' (solver for pressure)') ! Set singularity to the matrix if(.not. Flow % has_pressure) then @@ -210,7 +211,8 @@ subroutine Compute_Pressure(Process, Flow, Vof, Sol, curr_dt, ini) call Sol % Remove_Singular(A) end if - call Profiler % Stop('Linear_Solver_For_Pressure') + call Profiler % Stop(String % First_Upper(pp % solver) // & + ' (solver for pressure)') if (Flow % p_m_coupling == SIMPLE) then call Info_Mod_Iter_Fill_At(1, 4, pp % name, pp % eniter, pp % res) diff --git a/Sources/Process/Process_Mod/Compute_Scalar.f90 b/Sources/Process/Process_Mod/Compute_Scalar.f90 index 76606ae4d..428362b79 100644 --- a/Sources/Process/Process_Mod/Compute_Scalar.f90 +++ b/Sources/Process/Process_Mod/Compute_Scalar.f90 @@ -39,7 +39,7 @@ subroutine Compute_Scalar(Process, Flow, Turb, Vof, Sol, curr_dt, ini, sc) ! !==============================================================================! - call Profiler % Start('Compute_Scalars (without solvers)') + call Profiler % Start('Compute_Scalar (without solvers)') call Work % Connect_Real_Cell(q_turb, cross) @@ -205,7 +205,8 @@ subroutine Compute_Scalar(Process, Flow, Turb, Vof, Sol, curr_dt, ini, sc) ! Under-relax the equations call Numerics_Mod_Under_Relax(phi, A, b) - call Profiler % Start('Linear_Solver_For_Scalars') + call Profiler % Start(String % First_Upper(phi % solver) // & + ' (solver for scalars)') ! Call linear solver to solve them call Sol % Run(phi % solver, & @@ -219,7 +220,8 @@ subroutine Compute_Scalar(Process, Flow, Turb, Vof, Sol, curr_dt, ini, sc) phi % tol, & phi % res) - call Profiler % Stop('Linear_Solver_For_Scalars') + call Profiler % Stop(String % First_Upper(phi % solver) // & + ' (solver for scalars)') read(phi % name(3:4), *) ns ! reterive the number of scalar row = ceiling(ns/6) ! will be 1 (scal. 1-6), 2 (scal. 6-12), etc. @@ -234,6 +236,6 @@ subroutine Compute_Scalar(Process, Flow, Turb, Vof, Sol, curr_dt, ini, sc) call Work % Disconnect_Real_Cell(q_turb, cross) - call Profiler % Stop('Compute_Scalars (without solvers)') + call Profiler % Stop('Compute_Scalar (without solvers)') end subroutine diff --git a/Sources/Process/Turb_Mod/Compute_F22.f90 b/Sources/Process/Turb_Mod/Compute_F22.f90 index abd52a046..bc8768276 100644 --- a/Sources/Process/Turb_Mod/Compute_F22.f90 +++ b/Sources/Process/Turb_Mod/Compute_F22.f90 @@ -40,6 +40,8 @@ subroutine Compute_F22(Turb, Sol, curr_dt, ini, phi) ! Lsc [m] ! !------------------------------------------------------------------------------! + call Profiler % Start('Compute_F22 (without solvers)') + call Work % Connect_Real_Cell(cross) ! Take aliases @@ -162,7 +164,8 @@ subroutine Compute_F22(Turb, Sol, curr_dt, ini, phi) ! Underrelax the equations call Numerics_Mod_Under_Relax(phi, a, b) - call Profiler % Start('Linear_Solver_For_Turbulence') + call Profiler % Start(String % First_Upper(phi % solver) // & + ' (solver for turbulence)') ! Call linear solver to solve the equations call Sol % Run(phi % solver, & @@ -176,7 +179,8 @@ subroutine Compute_F22(Turb, Sol, curr_dt, ini, phi) phi % tol, & phi % res) - call Profiler % Stop('Linear_Solver_For_Turbulence') + call Profiler % Stop(String % First_Upper(phi % solver) // & + ' (solver for turbulence)') ! Print info on the screen if(Turb % model .eq. K_EPS_ZETA_F) then @@ -189,4 +193,6 @@ subroutine Compute_F22(Turb, Sol, curr_dt, ini, phi) call Work % Disconnect_Real_Cell(cross) + call Profiler % Stop('Compute_F22 (without solvers)') + end subroutine diff --git a/Sources/Process/Turb_Mod/Compute_Stress.f90 b/Sources/Process/Turb_Mod/Compute_Stress.f90 index 13a8d7e1a..6c4e06e8e 100644 --- a/Sources/Process/Turb_Mod/Compute_Stress.f90 +++ b/Sources/Process/Turb_Mod/Compute_Stress.f90 @@ -42,7 +42,7 @@ subroutine Compute_Stress(Turb, Sol, curr_dt, ini, phi) ! ! !------------------------------------------------------------------------------! - call Profiler % Start('Compute_Turbulence (without solvers)') + call Profiler % Start('Compute_Stress (without solvers)') call Work % Connect_Real_Cell(phi_x, phi_y, phi_z, cross, & u1uj_phij, u2uj_phij, u3uj_phij, & @@ -310,7 +310,8 @@ subroutine Compute_Stress(Turb, Sol, curr_dt, ini, phi) ! Under-relax the equations call Numerics_Mod_Under_Relax(phi, a, b) - call Profiler % Start('Linear_Solver_For_Turbulence') + call Profiler % Start(String % First_Upper(phi % solver) // & + ' (solver for turbulence)') ! Call linear solver to solve the equations call Sol % Run(phi % solver, & @@ -324,7 +325,8 @@ subroutine Compute_Stress(Turb, Sol, curr_dt, ini, phi) phi % tol, & phi % res) - call Profiler % Stop('Linear_Solver_For_Turbulence') + call Profiler % Stop(String % First_Upper(phi % solver) // & + ' (solver for turbulence)') ! Print info on the screen if( phi % name .eq. 'UU' ) & @@ -368,6 +370,6 @@ subroutine Compute_Stress(Turb, Sol, curr_dt, ini, phi) u1uj_phij, u2uj_phij, u3uj_phij, & u1uj_phij_x, u2uj_phij_y, u3uj_phij_z) - call Profiler % Stop('Compute_Turbulence (without solvers)') + call Profiler % Stop('Compute_Stress (without solvers)') end subroutine diff --git a/Sources/Process/Turb_Mod/Compute_Variable.f90 b/Sources/Process/Turb_Mod/Compute_Variable.f90 index 27f0408e0..b109b2564 100644 --- a/Sources/Process/Turb_Mod/Compute_Variable.f90 +++ b/Sources/Process/Turb_Mod/Compute_Variable.f90 @@ -39,7 +39,7 @@ subroutine Compute_Variable(Turb, Sol, curr_dt, ini, phi) ! ! !------------------------------------------------------------------------------! - call Profiler % Start('Compute_Turbulence (without solvers)') + call Profiler % Start('Compute_Variable (without solvers)') call Work % Connect_Real_Cell(cross) @@ -240,7 +240,8 @@ subroutine Compute_Variable(Turb, Sol, curr_dt, ini, phi) ! Under-relax the equations call Numerics_Mod_Under_Relax(phi, A, b) - call Profiler % Start('Linear_Solver_For_Turbulence') + call Profiler % Start(String % First_Upper(phi % solver) // & + ' (solver for turbulence)') ! Call linear solver to solve the equations call Sol % Run(phi % solver, & @@ -254,7 +255,8 @@ subroutine Compute_Variable(Turb, Sol, curr_dt, ini, phi) phi % tol, & phi % res) - call Profiler % Stop('Linear_Solver_For_Turbulence') + call Profiler % Stop(String % First_Upper(phi % solver) // & + ' (solver for turbulence)') ! Avoid negative values for all computed turbulent quantities do c = 1, Grid % n_cells @@ -295,6 +297,6 @@ subroutine Compute_Variable(Turb, Sol, curr_dt, ini, phi) call Work % Disconnect_Real_Cell(cross) - call Profiler % Stop('Compute_Turbulence (without solvers)') + call Profiler % Stop('Compute_Variable (without solvers)') end subroutine diff --git a/Sources/Process/Vof_Mod/Core/Solve_System.f90 b/Sources/Process/Vof_Mod/Core/Solve_System.f90 index 40c44a836..44678c1f3 100644 --- a/Sources/Process/Vof_Mod/Core/Solve_System.f90 +++ b/Sources/Process/Vof_Mod/Core/Solve_System.f90 @@ -23,7 +23,7 @@ subroutine Solve_System(Vof, Sol, b) ! Get solver call Control_Mod_Solver_For_Vof(solver) - call Profiler % Start('Linear_Solver_For_Vof') + call Profiler % Start(String % First_Upper(fun % solver)//' (solver for VOF)') ! Call linear solver to solve the equations call Sol % Run(fun % solver, & @@ -37,7 +37,7 @@ subroutine Solve_System(Vof, Sol, b) fun % tol, & fun % res) - call Profiler % Stop('Linear_Solver_For_Vof') + call Profiler % Stop(String % First_Upper(fun % solver)//' (solver for VOF)') if(.not. Flow % heat_transfer) then call Info_Mod_Iter_Fill_At(1, 6, fun % name, fun % eniter, fun % res) diff --git a/Sources/Shared/String_Mod.f90 b/Sources/Shared/String_Mod.f90 index 63eafe74b..28e1a688e 100644 --- a/Sources/Shared/String_Mod.f90 +++ b/Sources/Shared/String_Mod.f90 @@ -2,6 +2,7 @@ module String_Mod !------------------------------------------------------------------------------! ! Procedures for handling string. For now To_Upper_Case and To_Lower_Case ! +! and a function which returns a string with only first letter in upper. ! !------------------------------------------------------------------------------! implicit none !==============================================================================! @@ -12,6 +13,7 @@ module String_Mod type String_Type contains + procedure :: First_Upper procedure :: To_Lower_Case procedure :: To_Upper_Case @@ -22,6 +24,7 @@ module String_Mod contains +# include "String_Mod/First_Upper.f90" # include "String_Mod/To_Lower_Case.f90" # include "String_Mod/To_Upper_Case.f90" diff --git a/Sources/Shared/String_Mod/First_Upper.f90 b/Sources/Shared/String_Mod/First_Upper.f90 new file mode 100644 index 000000000..1bf3b1fe8 --- /dev/null +++ b/Sources/Shared/String_Mod/First_Upper.f90 @@ -0,0 +1,34 @@ +!==============================================================================! + pure function First_Upper(String, char_array) result(char_manip) +!------------------------------------------------------------------------------! +! Returns a string with first letter from the upper case. ! +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(String_Type), intent(in) :: String + character(len=*), intent(in) :: char_array + character(:), allocatable :: char_manip +!-----------------------------------[Locals]-----------------------------------! + integer :: i, value +!==============================================================================! + + ! Copy the string from the argument to the local which you will manipulate + char_manip = trim(char_array) + + ! Then do the necessary manipulations. First the entire string to lower ... + do i = 1, len_trim(char_manip) + value = ichar(char_manip(i:i)) + if(value >= 65 .and. value <= 90) then + char_manip(i:i) = char(value+32) + end if + end do + + ! ... and finally the first character to upper case + if(len_trim(char_manip) > 0) then + value = ichar(char_manip(1:1)) + if (value >= 97 .and. value <= 122) then + char_manip(1:1) = char(value-32) + end if + end if + + end function diff --git a/Sources/Shared/String_Mod/To_Lower_Case.f90 b/Sources/Shared/String_Mod/To_Lower_Case.f90 index c65d93c09..dc5a01247 100644 --- a/Sources/Shared/String_Mod/To_Lower_Case.f90 +++ b/Sources/Shared/String_Mod/To_Lower_Case.f90 @@ -1,12 +1,12 @@ !==============================================================================! - subroutine To_Lower_Case(String, char_array) + pure subroutine To_Lower_Case(String, char_array) !------------------------------------------------------------------------------! -! Transforms String to lowercase. ! +! Transforms string to lowercase. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(String_Type) :: String - character(len=*) :: char_array + class(String_Type), intent(in) :: String + character(len=*), intent(inout) :: char_array !-----------------------------------[Locals]-----------------------------------! integer :: i, value !==============================================================================! diff --git a/Sources/Shared/String_Mod/To_Upper_Case.f90 b/Sources/Shared/String_Mod/To_Upper_Case.f90 index f56f31e25..1703339b9 100644 --- a/Sources/Shared/String_Mod/To_Upper_Case.f90 +++ b/Sources/Shared/String_Mod/To_Upper_Case.f90 @@ -1,12 +1,12 @@ !==============================================================================! subroutine To_Upper_Case(String, char_array) !------------------------------------------------------------------------------! -! Transforms String to uppercase. ! +! Transforms string to uppercase. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(String_Type) :: String - character(len=*) :: char_array + class(String_Type), intent(in) :: String + character(len=*), intent(inout) :: char_array !-----------------------------------[Locals]-----------------------------------! integer :: i, value !==============================================================================! From 42ea75b7ff4314a4b981890a79d2124258304a65 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 12 Mar 2023 14:03:29 +0100 Subject: [PATCH 057/223] Default option for OPENMP in Process is "no" I did it for safety - what if it on some systems cause the code to run slower? It shouldn't it, but it depends on way too many things. On branch bojan_fixed_cell_ranges modified: Process/makefile --- Sources/Process/makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/Process/makefile b/Sources/Process/makefile index a41ede460..98ea3051f 100644 --- a/Sources/Process/makefile +++ b/Sources/Process/makefile @@ -12,7 +12,7 @@ DEBUG ?= no ASSERT ?= yes REAL ?= double MPI ?= no -OPENMP ?= yes +OPENMP ?= no # Directories for objects and modules. (No need to change.) DIR_BINARY = ../../Binaries @@ -55,7 +55,7 @@ $(info #-----------------------------------------------------------------------) $(info # Usage: ) $(info # make ) $(info # ) -$(info # ) +$(info # ) $(info # ) $(info # ) $(info # Notes: ) From 97ad86c7d3318ae14d813b91df50801fa45df12e Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 12 Mar 2023 14:34:02 +0100 Subject: [PATCH 058/223] Updated makefile dependencies. On branch bojan_fixed_cell_ranges modified: Convert/makefile_explicit_dependencies modified: Divide/makefile_explicit_dependencies modified: Generate/makefile_explicit_dependencies modified: Process/makefile_explicit_dependencies --- .../Convert/makefile_explicit_dependencies | 386 ++++------ Sources/Divide/makefile_explicit_dependencies | 262 ++++--- .../Generate/makefile_explicit_dependencies | 298 ++++---- .../Process/makefile_explicit_dependencies | 679 +++++++++--------- 4 files changed, 816 insertions(+), 809 deletions(-) diff --git a/Sources/Convert/makefile_explicit_dependencies b/Sources/Convert/makefile_explicit_dependencies index 830c3844a..d2ae3b42b 100644 --- a/Sources/Convert/makefile_explicit_dependencies +++ b/Sources/Convert/makefile_explicit_dependencies @@ -15,183 +15,157 @@ $(DIR_OBJECT)/Convert_Mod.o \ Convert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Convert_Mod/N_Bnd_Cells_In_Color.f90 +# Dependencies for: ./Convert_Mod/Guess_Format.f90 #--------------------------------------------------- -$(DIR_OBJECT)/N_Bnd_Cells_In_Color.o:\ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Guess_Format.o:\ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Convert_Mod/Calculate_Geometry.f90 +# Dependencies for: ./Convert_Mod/Find_Parents.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Calculate_Geometry.o:\ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Find_Parents.o:\ +$(DIR_OBJECT)/Profiler_Mod.o \ +$(DIR_SHARED)/Profiler_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Convert_Mod/Logo_Con.f90 +# Dependencies for: ./Convert_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Logo_Con.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Convert_Mod.o:\ +$(DIR_OBJECT)/Stl_Mod.o \ +$(DIR_SHARED)/Stl_Mod/*.f90 \ +$(DIR_OBJECT)/Profiler_Mod.o \ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +Convert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Convert_Mod/N_Edges_In_Bnd_Color.f90 +# Dependencies for: ./Isoap_Mod/Main_Isoap.f90 #--------------------------------------------------- -$(DIR_OBJECT)/N_Edges_In_Bnd_Color.o:\ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Main_Isoap.o: #--------------------------------------------------- -# Dependencies for: ./Convert_Mod/N_Nodes_In_Bnd_Color.f90 +# Dependencies for: ./Isoap_Mod/Isopol.f90 #--------------------------------------------------- -$(DIR_OBJECT)/N_Nodes_In_Bnd_Color.o:\ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Isopol.o: #--------------------------------------------------- -# Dependencies for: ./Convert_Mod/Allocate_Memory.f90 +# Dependencies for: ./Message_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Allocate_Memory.o:\ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Message_Mod.o:\ +$(DIR_OBJECT)/Tokenizer_Mod.o \ +$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Convert_Mod/Load_Gambit.f90 +# Dependencies for: ./Isoap_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Load_Gambit.o:\ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Isoap_Mod.o:\ +$(DIR_OBJECT)/Polyhedron_Mod.o \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ +$(DIR_OBJECT)/Iso_Polygons_Mod.o \ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/readme \ +$(DIR_SHARED)/Isoap_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/Dim_Polyhedron.h #--------------------------------------------------- -# Dependencies for: ./Convert_Mod/Create_Dual.f90 +# Dependencies for: ./File_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Create_Dual.o:\ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/File_Mod.o:\ +$(DIR_OBJECT)/String_Mod.o \ +$(DIR_SHARED)/String_Mod/*.f90 \ +$(DIR_OBJECT)/Message_Mod.o \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Convert_Mod/N_Sharp_Corners.f90 +# Dependencies for: ./Region_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/N_Sharp_Corners.o:\ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Region_Mod.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Convert_Mod/Load_Gmsh.f90 +# Dependencies for: ./Gen_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Load_Gmsh.o:\ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Gen_Mod.o:\ +$(DIR_SHARED)/Gen_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Convert_Mod/Guess_Format.f90 +# Dependencies for: ./Sort_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Guess_Format.o:\ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 +$(DIR_OBJECT)/Sort_Mod.o:\ +$(DIR_OBJECT)/Swap_Mod.o \ +$(DIR_SHARED)/Swap_Mod/*.f90 \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Convert_Mod/Load_Fluent.f90 +# Dependencies for: ./Polyhedron_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Load_Fluent.o:\ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Polyhedron_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Convert_Mod/Insert_Buildings.f90 +# Dependencies for: ./Control_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Insert_Buildings.o:\ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Control_Mod.o:\ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Convert_Mod/Find_Parents.f90 +# Dependencies for: ./Probe_1d_Cells.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Find_Parents.o:\ -$(DIR_OBJECT)/Profiler_Mod.o \ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/Probe_1d_Cells.o:\ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Convert_Mod/N_Sharp_Edges.f90 +# Dependencies for: ./Message_Mod/Dashed_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/N_Sharp_Edges.o:\ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Dashed_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Convert_Mod/Grid_Topology.f90 +# Dependencies for: ./Message_Mod/Thin_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Grid_Topology.o:\ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Thin_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Convert_Mod/Find_Faces.f90 +# Dependencies for: ./Message_Mod/Thick_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Find_Faces.o:\ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Thick_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Convert_Mod/Sort_Face_Nodes.f90 +# Dependencies for: ./Work_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Sort_Face_Nodes.o:\ +$(DIR_OBJECT)/Work_Mod.o:\ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 -#--------------------------------------------------- -# Dependencies for: ./Convert_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Convert_Mod.o:\ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Profiler_Mod.o \ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -Convert_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o - -#--------------------------------------------------- -# Dependencies for: ./Sort_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Sort_Mod.o:\ -$(DIR_OBJECT)/Swap_Mod.o \ -$(DIR_SHARED)/Swap_Mod/*.f90 \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 - #--------------------------------------------------- # Dependencies for: ./Probe_1d_Nodes.f90 #--------------------------------------------------- @@ -206,45 +180,6 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 -#--------------------------------------------------- -# Dependencies for: ./Grid_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Grid_Mod.o:\ -$(DIR_OBJECT)/Vtk_Mod.o \ -$(DIR_SHARED)/Vtk_Mod/*.f90 \ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Profiler_Mod.o \ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -$(DIR_OBJECT)/Metis_Mod.o \ -$(DIR_SHARED)/Metis_Mod/*.f90 \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Region_Mod.o - -#--------------------------------------------------- -# Dependencies for: ./File_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/File_Mod.o:\ -$(DIR_OBJECT)/String_Mod.o \ -$(DIR_SHARED)/String_Mod/*.f90 \ -$(DIR_OBJECT)/Message_Mod.o \ -$(DIR_SHARED)/Message_Mod/*.f90 \ -$(DIR_SHARED)/File_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Control_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Control_Mod.o:\ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 \ -$(DIR_SHARED)/Control_Mod/*/*.f90 - #--------------------------------------------------- # Dependencies for: ./Profiler_Mod.f90 #--------------------------------------------------- @@ -253,12 +188,27 @@ $(DIR_SHARED)/Profiler_Mod/*.f90 \ $(DIR_OBJECT)/Comm_Mod.o \ $(DIR_SHARED)/Comm_Mod/*/*.f90 +#--------------------------------------------------- +# Dependencies for: ./Math_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Math_Mod.o:\ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o + #--------------------------------------------------- # Dependencies for: ./Swap_Mod.f90 #--------------------------------------------------- $(DIR_OBJECT)/Swap_Mod.o:\ $(DIR_SHARED)/Swap_Mod/*.f90 +#--------------------------------------------------- +# Dependencies for: ./Assert_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Assert_Mod.o:\ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 \ +$(DIR_SHARED)/Assert_Mod/*.f90 + #--------------------------------------------------- # Dependencies for: ./String_Mod.f90 #--------------------------------------------------- @@ -266,9 +216,11 @@ $(DIR_OBJECT)/String_Mod.o:\ $(DIR_SHARED)/String_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_2d.f90 +# Dependencies for: ./Probe_1d_Cells_Nodes.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_2d.o:\ +$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -278,98 +230,52 @@ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Vtk_Mod.f90 +# Dependencies for: ./Grid_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Vtk_Mod.o:\ +$(DIR_OBJECT)/Grid_Mod.o:\ +$(DIR_OBJECT)/Vtk_Mod.o \ $(DIR_SHARED)/Vtk_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o - -#--------------------------------------------------- -# Dependencies for: ./Comm_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Comm_Mod.o:\ -$(DIR_OBJECT)/Const_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Tokenizer_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Tokenizer_Mod.o:\ -$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o - -#--------------------------------------------------- -# Dependencies for: ./Work_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Work_Mod.o:\ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Message_Mod/Dashed_Line.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Dashed_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o - -#--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thin_Line.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Thin_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o - -#--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thick_Line.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Thick_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o - -#--------------------------------------------------- -# Dependencies for: ./Region_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Region_Mod.o:\ -$(DIR_OBJECT)/Const_Mod.o - -#--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells_Nodes.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ $(DIR_OBJECT)/Sort_Mod.o \ $(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_OBJECT)/Region_Mod.o \ +$(DIR_OBJECT)/Profiler_Mod.o \ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/Metis_Mod.o \ +$(DIR_SHARED)/Metis_Mod/*.f90 \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Assert_Mod.f90 +# Dependencies for: ./Stl_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Assert_Mod.o:\ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Stl_Mod.o:\ +$(DIR_SHARED)/Stl_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod.f90 +# Dependencies for: ./Comm_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Message_Mod.o:\ -$(DIR_OBJECT)/Tokenizer_Mod.o \ -$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ -$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/Comm_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Math_Mod.f90 +# Dependencies for: ./Iso_Polygons_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Math_Mod.o:\ -$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Vtk_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Vtk_Mod.o:\ +$(DIR_SHARED)/Vtk_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- @@ -381,21 +287,21 @@ $(DIR_OBJECT)/Assert_Mod.o \ $(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Gen_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Gen_Mod.o:\ -$(DIR_SHARED)/Gen_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells.f90 +# Dependencies for: ./Probe_2d.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells.o:\ +$(DIR_OBJECT)/Probe_2d.o:\ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_SHARED)/File_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Tokenizer_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Tokenizer_Mod.o:\ +$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o diff --git a/Sources/Divide/makefile_explicit_dependencies b/Sources/Divide/makefile_explicit_dependencies index bb1754972..32baced14 100644 --- a/Sources/Divide/makefile_explicit_dependencies +++ b/Sources/Divide/makefile_explicit_dependencies @@ -1,3 +1,10 @@ +#--------------------------------------------------- +# Dependencies for: ./Main_Div.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Main_Div.o:\ +$(DIR_OBJECT)/Divide_Mod.o \ +Divide_Mod/*.f90 + #--------------------------------------------------- # Dependencies for: ./Divide_Mod.f90 #--------------------------------------------------- @@ -8,13 +15,6 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ Divide_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o -#--------------------------------------------------- -# Dependencies for: ./Main_Div.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Main_Div.o:\ -$(DIR_OBJECT)/Divide_Mod.o \ -Divide_Mod/*.f90 - #--------------------------------------------------- # Dependencies for: ./Divide_Mod/Logo_Div.f90 #--------------------------------------------------- @@ -22,46 +22,37 @@ $(DIR_OBJECT)/Logo_Div.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Sort_Mod.f90 +# Dependencies for: ./Isoap_Mod/Main_Isoap.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Sort_Mod.o:\ -$(DIR_OBJECT)/Swap_Mod.o \ -$(DIR_SHARED)/Swap_Mod/*.f90 \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 +$(DIR_OBJECT)/Main_Isoap.o: #--------------------------------------------------- -# Dependencies for: ./Probe_1d_Nodes.f90 +# Dependencies for: ./Isoap_Mod/Isopol.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Nodes.o:\ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 +$(DIR_OBJECT)/Isopol.o: #--------------------------------------------------- -# Dependencies for: ./Grid_Mod.f90 +# Dependencies for: ./Message_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Grid_Mod.o:\ -$(DIR_OBJECT)/Vtk_Mod.o \ -$(DIR_SHARED)/Vtk_Mod/*.f90 \ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Profiler_Mod.o \ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -$(DIR_OBJECT)/Metis_Mod.o \ -$(DIR_SHARED)/Metis_Mod/*.f90 \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Region_Mod.o +$(DIR_OBJECT)/Message_Mod.o:\ +$(DIR_OBJECT)/Tokenizer_Mod.o \ +$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Isoap_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Isoap_Mod.o:\ +$(DIR_OBJECT)/Polyhedron_Mod.o \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ +$(DIR_OBJECT)/Iso_Polygons_Mod.o \ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/readme \ +$(DIR_SHARED)/Isoap_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/Dim_Polyhedron.h #--------------------------------------------------- # Dependencies for: ./File_Mod.f90 @@ -74,102 +65,136 @@ $(DIR_SHARED)/Message_Mod/*.f90 \ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Control_Mod.f90 +# Dependencies for: ./Region_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Control_Mod.o:\ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 \ -$(DIR_SHARED)/Control_Mod/*/*.f90 +$(DIR_OBJECT)/Region_Mod.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Profiler_Mod.f90 +# Dependencies for: ./Gen_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Profiler_Mod.o:\ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 +$(DIR_OBJECT)/Gen_Mod.o:\ +$(DIR_SHARED)/Gen_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Swap_Mod.f90 +# Dependencies for: ./Sort_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Swap_Mod.o:\ -$(DIR_SHARED)/Swap_Mod/*.f90 +$(DIR_OBJECT)/Sort_Mod.o:\ +$(DIR_OBJECT)/Swap_Mod.o \ +$(DIR_SHARED)/Swap_Mod/*.f90 \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./String_Mod.f90 +# Dependencies for: ./Polyhedron_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/String_Mod.o:\ -$(DIR_SHARED)/String_Mod/*.f90 +$(DIR_OBJECT)/Polyhedron_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_2d.f90 +# Dependencies for: ./Control_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_2d.o:\ +$(DIR_OBJECT)/Control_Mod.o:\ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Probe_1d_Cells.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Probe_1d_Cells.o:\ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Vtk_Mod.f90 +# Dependencies for: ./Message_Mod/Dashed_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Vtk_Mod.o:\ -$(DIR_SHARED)/Vtk_Mod/*.f90 \ +$(DIR_OBJECT)/Dashed_Line.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Comm_Mod.f90 +# Dependencies for: ./Message_Mod/Thin_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Comm_Mod.o:\ -$(DIR_OBJECT)/Const_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 +$(DIR_OBJECT)/Thin_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Tokenizer_Mod.f90 +# Dependencies for: ./Message_Mod/Thick_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Tokenizer_Mod.o:\ -$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ +$(DIR_OBJECT)/Thick_Line.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- # Dependencies for: ./Work_Mod.f90 #--------------------------------------------------- $(DIR_OBJECT)/Work_Mod.o:\ -$(DIR_SHARED)/Work_Mod/*.f90 \ $(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Dashed_Line.f90 +# Dependencies for: ./Probe_1d_Nodes.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Dashed_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Probe_1d_Nodes.o:\ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thin_Line.f90 +# Dependencies for: ./Profiler_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thin_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Profiler_Mod.o:\ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thick_Line.f90 +# Dependencies for: ./Math_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thick_Line.o:\ +$(DIR_OBJECT)/Math_Mod.o:\ +$(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Region_Mod.f90 +# Dependencies for: ./Swap_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Region_Mod.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Swap_Mod.o:\ +$(DIR_SHARED)/Swap_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Assert_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Assert_Mod.o:\ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 \ +$(DIR_SHARED)/Assert_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./String_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/String_Mod.o:\ +$(DIR_SHARED)/String_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Probe_1d_Cells_Nodes.f90 @@ -186,29 +211,52 @@ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Assert_Mod.f90 +# Dependencies for: ./Grid_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Assert_Mod.o:\ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o:\ +$(DIR_OBJECT)/Vtk_Mod.o \ +$(DIR_SHARED)/Vtk_Mod/*.f90 \ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Region_Mod.o \ +$(DIR_OBJECT)/Profiler_Mod.o \ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/Metis_Mod.o \ +$(DIR_SHARED)/Metis_Mod/*.f90 \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_OBJECT)/Assert_Mod.o \ $(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod.f90 +# Dependencies for: ./Stl_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Message_Mod.o:\ -$(DIR_OBJECT)/Tokenizer_Mod.o \ -$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ -$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/Stl_Mod.o:\ +$(DIR_SHARED)/Stl_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Comm_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Comm_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Math_Mod.f90 +# Dependencies for: ./Iso_Polygons_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Math_Mod.o:\ -$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Vtk_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Vtk_Mod.o:\ +$(DIR_SHARED)/Vtk_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- @@ -220,21 +268,21 @@ $(DIR_OBJECT)/Assert_Mod.o \ $(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Gen_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Gen_Mod.o:\ -$(DIR_SHARED)/Gen_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells.f90 +# Dependencies for: ./Probe_2d.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells.o:\ +$(DIR_OBJECT)/Probe_2d.o:\ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_SHARED)/File_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Tokenizer_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Tokenizer_Mod.o:\ +$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o diff --git a/Sources/Generate/makefile_explicit_dependencies b/Sources/Generate/makefile_explicit_dependencies index 77d858acf..0935d3d9f 100644 --- a/Sources/Generate/makefile_explicit_dependencies +++ b/Sources/Generate/makefile_explicit_dependencies @@ -1,14 +1,3 @@ -#--------------------------------------------------- -# Dependencies for: ./Range_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Range_Mod.o:\ -$(DIR_OBJECT)/Const_Mod.o - -#--------------------------------------------------- -# Dependencies for: ./Refines_Mod/Connectivity.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Connectivity.o: - #--------------------------------------------------- # Dependencies for: ./Domain_Mod.f90 #--------------------------------------------------- @@ -24,15 +13,6 @@ $(DIR_SHARED)/Gen_Mod/*.f90 \ Domain_Mod/*.f90 \ $(DIR_OBJECT)/Block_Mod.o -#--------------------------------------------------- -# Dependencies for: ./Smooths_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Smooths_Mod.o:\ -Smooths_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 - #--------------------------------------------------- # Dependencies for: ./Refines_Mod.f90 #--------------------------------------------------- @@ -45,22 +25,6 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/Gen_Mod.o \ $(DIR_SHARED)/Gen_Mod/*.f90 -#--------------------------------------------------- -# Dependencies for: ./Main_Gen.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Main_Gen.o:\ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/Generate_Mod.o \ -Generate_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 - #--------------------------------------------------- # Dependencies for: ./Generate_Mod.f90 #--------------------------------------------------- @@ -99,19 +63,15 @@ $(DIR_OBJECT)/Gen_Mod.o \ $(DIR_SHARED)/Gen_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Sort_Mod.f90 +# Dependencies for: ./Range_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Sort_Mod.o:\ -$(DIR_OBJECT)/Swap_Mod.o \ -$(DIR_SHARED)/Swap_Mod/*.f90 \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 +$(DIR_OBJECT)/Range_Mod.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Probe_1d_Nodes.f90 +# Dependencies for: ./Main_Gen.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Nodes.o:\ +$(DIR_OBJECT)/Main_Gen.o:\ $(DIR_OBJECT)/Sort_Mod.o \ $(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Math_Mod.o \ @@ -119,24 +79,57 @@ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/Generate_Mod.o \ +Generate_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Grid_Mod.f90 +# Dependencies for: ./Refines_Mod/Connectivity.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Grid_Mod.o:\ -$(DIR_OBJECT)/Vtk_Mod.o \ -$(DIR_SHARED)/Vtk_Mod/*.f90 \ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Profiler_Mod.o \ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/Connectivity.o: + +#--------------------------------------------------- +# Dependencies for: ./Smooths_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Smooths_Mod.o:\ +Smooths_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Region_Mod.o +$(DIR_SHARED)/Grid_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Isoap_Mod/Main_Isoap.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Main_Isoap.o: + +#--------------------------------------------------- +# Dependencies for: ./Isoap_Mod/Isopol.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Isopol.o: + +#--------------------------------------------------- +# Dependencies for: ./Message_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Message_Mod.o:\ +$(DIR_OBJECT)/Tokenizer_Mod.o \ +$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Isoap_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Isoap_Mod.o:\ +$(DIR_OBJECT)/Polyhedron_Mod.o \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ +$(DIR_OBJECT)/Iso_Polygons_Mod.o \ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/readme \ +$(DIR_SHARED)/Isoap_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/Dim_Polyhedron.h #--------------------------------------------------- # Dependencies for: ./File_Mod.f90 @@ -149,102 +142,136 @@ $(DIR_SHARED)/Message_Mod/*.f90 \ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Control_Mod.f90 +# Dependencies for: ./Region_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Control_Mod.o:\ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 \ -$(DIR_SHARED)/Control_Mod/*/*.f90 +$(DIR_OBJECT)/Region_Mod.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Profiler_Mod.f90 +# Dependencies for: ./Gen_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Profiler_Mod.o:\ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 +$(DIR_OBJECT)/Gen_Mod.o:\ +$(DIR_SHARED)/Gen_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Swap_Mod.f90 +# Dependencies for: ./Sort_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Swap_Mod.o:\ -$(DIR_SHARED)/Swap_Mod/*.f90 +$(DIR_OBJECT)/Sort_Mod.o:\ +$(DIR_OBJECT)/Swap_Mod.o \ +$(DIR_SHARED)/Swap_Mod/*.f90 \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./String_Mod.f90 +# Dependencies for: ./Polyhedron_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/String_Mod.o:\ -$(DIR_SHARED)/String_Mod/*.f90 +$(DIR_OBJECT)/Polyhedron_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_2d.f90 +# Dependencies for: ./Control_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_2d.o:\ +$(DIR_OBJECT)/Control_Mod.o:\ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Probe_1d_Cells.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Probe_1d_Cells.o:\ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Vtk_Mod.f90 +# Dependencies for: ./Message_Mod/Dashed_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Vtk_Mod.o:\ -$(DIR_SHARED)/Vtk_Mod/*.f90 \ +$(DIR_OBJECT)/Dashed_Line.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Comm_Mod.f90 +# Dependencies for: ./Message_Mod/Thin_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Comm_Mod.o:\ -$(DIR_OBJECT)/Const_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 +$(DIR_OBJECT)/Thin_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Tokenizer_Mod.f90 +# Dependencies for: ./Message_Mod/Thick_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Tokenizer_Mod.o:\ -$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ +$(DIR_OBJECT)/Thick_Line.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- # Dependencies for: ./Work_Mod.f90 #--------------------------------------------------- $(DIR_OBJECT)/Work_Mod.o:\ -$(DIR_SHARED)/Work_Mod/*.f90 \ $(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Dashed_Line.f90 +# Dependencies for: ./Probe_1d_Nodes.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Dashed_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Probe_1d_Nodes.o:\ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thin_Line.f90 +# Dependencies for: ./Profiler_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thin_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Profiler_Mod.o:\ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thick_Line.f90 +# Dependencies for: ./Math_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thick_Line.o:\ +$(DIR_OBJECT)/Math_Mod.o:\ +$(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Region_Mod.f90 +# Dependencies for: ./Swap_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Region_Mod.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Swap_Mod.o:\ +$(DIR_SHARED)/Swap_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Assert_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Assert_Mod.o:\ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 \ +$(DIR_SHARED)/Assert_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./String_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/String_Mod.o:\ +$(DIR_SHARED)/String_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Probe_1d_Cells_Nodes.f90 @@ -261,29 +288,52 @@ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Assert_Mod.f90 +# Dependencies for: ./Grid_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Assert_Mod.o:\ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o:\ +$(DIR_OBJECT)/Vtk_Mod.o \ +$(DIR_SHARED)/Vtk_Mod/*.f90 \ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Region_Mod.o \ +$(DIR_OBJECT)/Profiler_Mod.o \ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/Metis_Mod.o \ +$(DIR_SHARED)/Metis_Mod/*.f90 \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_OBJECT)/Assert_Mod.o \ $(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod.f90 +# Dependencies for: ./Stl_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Message_Mod.o:\ -$(DIR_OBJECT)/Tokenizer_Mod.o \ -$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ -$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/Stl_Mod.o:\ +$(DIR_SHARED)/Stl_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Comm_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Comm_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Math_Mod.f90 +# Dependencies for: ./Iso_Polygons_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Math_Mod.o:\ -$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Vtk_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Vtk_Mod.o:\ +$(DIR_SHARED)/Vtk_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- @@ -295,21 +345,21 @@ $(DIR_OBJECT)/Assert_Mod.o \ $(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Gen_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Gen_Mod.o:\ -$(DIR_SHARED)/Gen_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells.f90 +# Dependencies for: ./Probe_2d.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells.o:\ +$(DIR_OBJECT)/Probe_2d.o:\ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_SHARED)/File_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Tokenizer_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Tokenizer_Mod.o:\ +$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o diff --git a/Sources/Process/makefile_explicit_dependencies b/Sources/Process/makefile_explicit_dependencies index 158ffed72..d0057bfa5 100644 --- a/Sources/Process/makefile_explicit_dependencies +++ b/Sources/Process/makefile_explicit_dependencies @@ -1,29 +1,3 @@ -#--------------------------------------------------- -# Dependencies for: ./Turb_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Turb_Mod.o:\ -Turb_Mod/*.f90 \ -$(DIR_OBJECT)/Info_Mod.o \ -Info_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Front_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Front_Mod.o:\ -$(DIR_OBJECT)/Vert_Mod.o \ -Vert_Mod/*.f90 \ -$(DIR_OBJECT)/Side_Mod.o \ -$(DIR_SHARED)/Isoap_Mod/readme \ -$(DIR_OBJECT)/Isoap_Mod.o \ -$(DIR_SHARED)/Isoap_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/Dim_Polyhedron.h \ -Front_Mod/readme \ -Front_Mod/*.f90 \ -$(DIR_OBJECT)/Field_Mod.o \ -Field_Mod/*/*.f90 \ -$(DIR_OBJECT)/Elem_Mod.o \ -Elem_Mod/*.f90 - #--------------------------------------------------- # Dependencies for: ./Backup_Mod.f90 #--------------------------------------------------- @@ -33,43 +7,29 @@ User_Mod/*.f90 \ Backup_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Face_Mod.f90 +# Dependencies for: ./Monitor_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Face_Mod.o:\ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -Face_Mod/*.f90 +$(DIR_OBJECT)/Monitor_Mod.o:\ +Monitor_Mod/*.f90 \ +$(DIR_OBJECT)/Field_Mod.o \ +Field_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Field_Mod.f90 +# Dependencies for: ./Matrix_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Field_Mod.o:\ -$(DIR_OBJECT)/Solver_Mod.o \ -Solver_Mod/*.f90 \ -$(DIR_OBJECT)/Numerics_Mod.o \ -Numerics_Mod/*.f90 \ -Field_Mod/*/*.f90 \ -$(DIR_OBJECT)/Face_Mod.o \ -Face_Mod/*.f90 \ -$(DIR_OBJECT)/Bulk_Mod.o \ -Bulk_Mod/*.f90 +$(DIR_OBJECT)/Matrix_Mod.o:\ +Matrix_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Native_Mod.f90 +# Dependencies for: ./Particle_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Native_Mod.o:\ -$(DIR_OBJECT)/Work_Mod.o \ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_OBJECT)/Vector_Mod.o \ -Vector_Mod/*.f90 \ -Native_Mod/*.f90 \ -$(DIR_OBJECT)/Matrix_Mod.o \ -Matrix_Mod/*.f90 \ -$(DIR_OBJECT)/Control_Mod.o \ -$(DIR_SHARED)/Control_Mod/*/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 +$(DIR_OBJECT)/Particle_Mod.o:\ +$(DIR_OBJECT)/Vof_Mod.o \ +Vof_Mod/*/*.f90 \ +Particle_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Process_Mod.f90 @@ -111,73 +71,73 @@ $(DIR_OBJECT)/Bulk_Mod.o \ Bulk_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Vert_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Vert_Mod.o:\ -Vert_Mod/*.f90 \ -$(DIR_OBJECT)/Point_Mod.o \ -Point_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Monitor_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Monitor_Mod.o:\ -Monitor_Mod/*.f90 \ -$(DIR_OBJECT)/Field_Mod.o \ -Field_Mod/*/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Var_Mod.f90 +# Dependencies for: ./Vector_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Var_Mod.o:\ -Var_Mod/*.f90 \ +$(DIR_OBJECT)/Vector_Mod.o:\ +Vector_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Vof_Mod.f90 +# Dependencies for: ./Results_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Vof_Mod.o:\ -Vof_Mod/*/*.f90 \ -$(DIR_OBJECT)/Turb_Mod.o \ -Turb_Mod/*.f90 \ -Surf_Mod/readme \ -$(DIR_OBJECT)/Surf_Mod.o \ -Surf_Mod/*.f90 +$(DIR_OBJECT)/Results_Mod.o:\ +Results_Mod/*.f90 \ +$(DIR_OBJECT)/Backup_Mod.o \ +Backup_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Info_Mod.f90 +# Dependencies for: ./Native_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Info_Mod.o:\ -Info_Mod/*.f90 \ -$(DIR_OBJECT)/Field_Mod.o \ -Field_Mod/*/*.f90 +$(DIR_OBJECT)/Native_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_OBJECT)/Vector_Mod.o \ +Vector_Mod/*.f90 \ +Native_Mod/*.f90 \ +$(DIR_OBJECT)/Matrix_Mod.o \ +Matrix_Mod/*.f90 \ +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Surf_Mod/Place_Surf_At_Value.f90 +# Dependencies for: ./Interface_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Place_Surf_At_Value.o: +$(DIR_OBJECT)/Interface_Mod.o:\ +$(DIR_OBJECT)/Turb_Mod.o \ +Turb_Mod/*.f90 \ +$(DIR_OBJECT)/Profiler_Mod.o \ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +Interface_Mod/*.f90 \ +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Swarm_Mod.f90 +# Dependencies for: ./Read_Controls_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Swarm_Mod.o:\ +$(DIR_OBJECT)/Read_Controls_Mod.o:\ +$(DIR_OBJECT)/Swarm_Mod.o \ Swarm_Mod/*.f90 \ -$(DIR_OBJECT)/Particle_Mod.o \ -Particle_Mod/*.f90 +Read_Controls_Mod/*.f90 \ +$(DIR_OBJECT)/Eddies_Mod.o \ +Eddies_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./User_Mod.f90 +# Dependencies for: ./Numerics_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/User_Mod.o:\ -User_Mod/*.f90 \ -$(DIR_OBJECT)/Swarm_Mod.o \ -Swarm_Mod/*.f90 \ -$(DIR_OBJECT)/Porosity_Mod.o \ -Porosity_Mod/*.f90 \ -$(DIR_OBJECT)/Interface_Mod.o \ -Interface_Mod/*.f90 +$(DIR_OBJECT)/Numerics_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_OBJECT)/Var_Mod.o \ +Var_Mod/*.f90 \ +Numerics_Mod/*.f90 \ +$(DIR_OBJECT)/Matrix_Mod.o \ +Matrix_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Main_Pro.f90 @@ -187,12 +147,12 @@ $(DIR_OBJECT)/Process_Mod.o \ Process_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Particle_Mod.f90 +# Dependencies for: ./Vert_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Particle_Mod.o:\ -$(DIR_OBJECT)/Vof_Mod.o \ -Vof_Mod/*/*.f90 \ -Particle_Mod/*.f90 +$(DIR_OBJECT)/Vert_Mod.o:\ +Vert_Mod/*.f90 \ +$(DIR_OBJECT)/Point_Mod.o \ +Point_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Porosity_Mod.f90 @@ -209,12 +169,18 @@ $(DIR_SHARED)/Control_Mod/*/*.f90 \ $(DIR_SHARED)/Control_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Petsc_Mod.f90 +# Dependencies for: ./Solver_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Petsc_Mod.o:\ -Petsc_Mod/*/*.f90 \ -$(DIR_OBJECT)/Native_Mod.o \ -Native_Mod/*.f90 +$(DIR_OBJECT)/Solver_Mod.o:\ +Solver_Mod/*.f90 \ +$(DIR_OBJECT)/Petsc_Mod.o \ +Petsc_Mod/*/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Elem_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Elem_Mod.o:\ +Elem_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Eddies_Mod.f90 @@ -227,92 +193,121 @@ Field_Mod/*/*.f90 \ Eddies_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Bulk_Mod.f90 +# Dependencies for: ./User_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Bulk_Mod.o:\ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -Bulk_Mod/*.f90 +$(DIR_OBJECT)/User_Mod.o:\ +User_Mod/*.f90 \ +$(DIR_OBJECT)/Swarm_Mod.o \ +Swarm_Mod/*.f90 \ +$(DIR_OBJECT)/Porosity_Mod.o \ +Porosity_Mod/*.f90 \ +$(DIR_OBJECT)/Interface_Mod.o \ +Interface_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Results_Mod.f90 +# Dependencies for: ./Petsc_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Results_Mod.o:\ -Results_Mod/*.f90 \ -$(DIR_OBJECT)/Backup_Mod.o \ -Backup_Mod/*.f90 +$(DIR_OBJECT)/Petsc_Mod.o:\ +Petsc_Mod/*/*.f90 \ +$(DIR_OBJECT)/Native_Mod.o \ +Native_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Vector_Mod.f90 +# Dependencies for: ./Field_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Vector_Mod.o:\ -Vector_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Field_Mod.o:\ +$(DIR_OBJECT)/Solver_Mod.o \ +Solver_Mod/*.f90 \ +$(DIR_OBJECT)/Numerics_Mod.o \ +Numerics_Mod/*.f90 \ +Field_Mod/*/*.f90 \ +$(DIR_OBJECT)/Face_Mod.o \ +Face_Mod/*.f90 \ +$(DIR_OBJECT)/Bulk_Mod.o \ +Bulk_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Matrix_Mod.f90 +# Dependencies for: ./Front_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Matrix_Mod.o:\ -Matrix_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Front_Mod.o:\ +$(DIR_OBJECT)/Vert_Mod.o \ +Vert_Mod/*.f90 \ +$(DIR_OBJECT)/Side_Mod.o \ +$(DIR_SHARED)/Isoap_Mod/readme \ +$(DIR_OBJECT)/Isoap_Mod.o \ +$(DIR_SHARED)/Isoap_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/Dim_Polyhedron.h \ +Front_Mod/readme \ +Front_Mod/*.f90 \ +$(DIR_OBJECT)/Field_Mod.o \ +Field_Mod/*/*.f90 \ +$(DIR_OBJECT)/Elem_Mod.o \ +Elem_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Read_Controls_Mod.f90 +# Dependencies for: ./Swarm_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Read_Controls_Mod.o:\ -$(DIR_OBJECT)/Swarm_Mod.o \ +$(DIR_OBJECT)/Swarm_Mod.o:\ Swarm_Mod/*.f90 \ -Read_Controls_Mod/*.f90 \ -$(DIR_OBJECT)/Eddies_Mod.o \ -Eddies_Mod/*.f90 +$(DIR_OBJECT)/Particle_Mod.o \ +Particle_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Process_Mod/Initialize_Variables.f90 +# Dependencies for: ./Turb_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Initialize_Variables.o:\ -$(DIR_OBJECT)/Vof_Mod.o \ -Vof_Mod/*/*.f90 \ -$(DIR_OBJECT)/User_Mod.o \ -User_Mod/*.f90 \ -$(DIR_OBJECT)/Turb_Mod.o \ +$(DIR_OBJECT)/Turb_Mod.o:\ Turb_Mod/*.f90 \ -$(DIR_OBJECT)/Swarm_Mod.o \ -Swarm_Mod/*.f90 \ -$(DIR_OBJECT)/Numerics_Mod.o \ -Numerics_Mod/*.f90 \ +$(DIR_OBJECT)/Info_Mod.o \ +Info_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Bulk_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Bulk_Mod.o:\ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Field_Mod.o \ -Field_Mod/*/*.f90 \ -$(DIR_OBJECT)/Control_Mod.o \ -$(DIR_SHARED)/Control_Mod/*/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o \ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 \ -$(DIR_OBJECT)/Bulk_Mod.o \ Bulk_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Process_Mod/Logo_Pro.f90 +# Dependencies for: ./Var_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Logo_Pro.o:\ -$(DIR_OBJECT)/Solver_Mod.o \ -Solver_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Var_Mod.o:\ +Var_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Process_Mod/Update_Region_Values.f90 +# Dependencies for: ./Info_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Update_Region_Values.o:\ +$(DIR_OBJECT)/Info_Mod.o:\ +Info_Mod/*.f90 \ +$(DIR_OBJECT)/Field_Mod.o \ +Field_Mod/*/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Surf_Mod/Place_Surf_At_Value.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Place_Surf_At_Value.o: + +#--------------------------------------------------- +# Dependencies for: ./Vof_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Vof_Mod.o:\ +Vof_Mod/*/*.f90 \ +$(DIR_OBJECT)/Turb_Mod.o \ +Turb_Mod/*.f90 \ +Surf_Mod/readme \ +$(DIR_OBJECT)/Surf_Mod.o \ +Surf_Mod/*.f90 \ +$(DIR_OBJECT)/Stl_Mod.o \ +$(DIR_SHARED)/Stl_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Process_Mod/Update_Boundary_Values.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Update_Boundary_Values.o:\ $(DIR_OBJECT)/Vof_Mod.o \ Vof_Mod/*/*.f90 \ $(DIR_OBJECT)/Turb_Mod.o \ @@ -330,25 +325,42 @@ $(DIR_OBJECT)/Comm_Mod.o \ $(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Interface_Mod.f90 +# Dependencies for: ./Process_Mod/Initialize_Variables.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Interface_Mod.o:\ +$(DIR_OBJECT)/Initialize_Variables.o:\ +$(DIR_OBJECT)/Vof_Mod.o \ +Vof_Mod/*/*.f90 \ +$(DIR_OBJECT)/User_Mod.o \ +User_Mod/*.f90 \ $(DIR_OBJECT)/Turb_Mod.o \ Turb_Mod/*.f90 \ -$(DIR_OBJECT)/Profiler_Mod.o \ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -Interface_Mod/*.f90 \ +$(DIR_OBJECT)/Swarm_Mod.o \ +Swarm_Mod/*.f90 \ +$(DIR_OBJECT)/Numerics_Mod.o \ +Numerics_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_OBJECT)/Field_Mod.o \ +Field_Mod/*/*.f90 \ $(DIR_OBJECT)/Control_Mod.o \ $(DIR_SHARED)/Control_Mod/*/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 +$(DIR_SHARED)/Control_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o \ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 \ +$(DIR_OBJECT)/Bulk_Mod.o \ +Bulk_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Solver_Mod.f90 +# Dependencies for: ./Process_Mod/Logo_Pro.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Solver_Mod.o:\ +$(DIR_OBJECT)/Logo_Pro.o:\ +$(DIR_OBJECT)/Solver_Mod.o \ Solver_Mod/*.f90 \ -$(DIR_OBJECT)/Petsc_Mod.o \ -Petsc_Mod/*/*.f90 +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- # Dependencies for: ./Surf_Mod.f90 @@ -360,6 +372,15 @@ Front_Mod/readme \ $(DIR_OBJECT)/Front_Mod.o \ Front_Mod/*.f90 +#--------------------------------------------------- +# Dependencies for: ./Face_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Face_Mod.o:\ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +Face_Mod/*.f90 + #--------------------------------------------------- # Dependencies for: ./Point_Mod.f90 #--------------------------------------------------- @@ -370,65 +391,47 @@ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Elem_Mod.f90 +# Dependencies for: ./Isoap_Mod/Main_Isoap.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Elem_Mod.o:\ -Elem_Mod/*.f90 +$(DIR_OBJECT)/Main_Isoap.o: #--------------------------------------------------- -# Dependencies for: ./Numerics_Mod.f90 +# Dependencies for: ./Isoap_Mod/Isopol.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Numerics_Mod.o:\ -$(DIR_OBJECT)/Work_Mod.o \ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_OBJECT)/Var_Mod.o \ -Var_Mod/*.f90 \ -Numerics_Mod/*.f90 \ -$(DIR_OBJECT)/Matrix_Mod.o \ -Matrix_Mod/*.f90 +$(DIR_OBJECT)/Isopol.o: #--------------------------------------------------- -# Dependencies for: ./Stl_Mod.f90 +# Dependencies for: ./Message_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Stl_Mod.o:\ -$(DIR_SHARED)/Stl_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 +$(DIR_OBJECT)/Message_Mod.o:\ +$(DIR_OBJECT)/Tokenizer_Mod.o \ +$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +# Dependencies for: ./Isoap_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 +$(DIR_OBJECT)/Isoap_Mod.o:\ +$(DIR_OBJECT)/Polyhedron_Mod.o \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ +$(DIR_OBJECT)/Iso_Polygons_Mod.o \ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/readme \ +$(DIR_SHARED)/Isoap_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/Dim_Polyhedron.h #--------------------------------------------------- -# Dependencies for: ./Grid_Mod.f90 +# Dependencies for: ./File_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Grid_Mod.o:\ -$(DIR_OBJECT)/Vtk_Mod.o \ -$(DIR_SHARED)/Vtk_Mod/*.f90 \ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Profiler_Mod.o \ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -$(DIR_OBJECT)/Metis_Mod.o \ -$(DIR_SHARED)/Metis_Mod/*.f90 \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Region_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/File_Mod.o:\ +$(DIR_OBJECT)/String_Mod.o \ +$(DIR_SHARED)/String_Mod/*.f90 \ +$(DIR_OBJECT)/Message_Mod.o \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Region_Mod.f90 @@ -437,72 +440,52 @@ $(DIR_OBJECT)/Region_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Polyhedron_Mod.f90 +# Dependencies for: ./Gen_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Polyhedron_Mod.o:\ -$(DIR_OBJECT)/Work_Mod.o \ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 +$(DIR_OBJECT)/Gen_Mod.o:\ +$(DIR_SHARED)/Gen_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Profiler_Mod.f90 +# Dependencies for: ./Sort_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Profiler_Mod.o:\ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 +$(DIR_OBJECT)/Sort_Mod.o:\ +$(DIR_OBJECT)/Swap_Mod.o \ +$(DIR_SHARED)/Swap_Mod/*.f90 \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Metis_Mod.f90 +# Dependencies for: ./Polyhedron_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Metis_Mod.o:\ -$(DIR_SHARED)/Metis_Mod/*.f90 \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Polyhedron_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod.f90 +# Dependencies for: ./Control_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Isoap_Mod.o:\ -$(DIR_OBJECT)/Polyhedron_Mod.o \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ -$(DIR_OBJECT)/Iso_Polygons_Mod.o \ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/readme \ -$(DIR_SHARED)/Isoap_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/Dim_Polyhedron.h +$(DIR_OBJECT)/Control_Mod.o:\ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_1d_Nodes.f90 +# Dependencies for: ./Probe_1d_Cells.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Nodes.o:\ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Probe_1d_Cells.o:\ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./String_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/String_Mod.o:\ -$(DIR_SHARED)/String_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Iso_Polygons_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thick_Line.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Thick_Line.o:\ +$(DIR_SHARED)/File_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- @@ -518,31 +501,27 @@ $(DIR_OBJECT)/Thin_Line.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Message_Mod.f90 +# Dependencies for: ./Message_Mod/Thick_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Message_Mod.o:\ -$(DIR_OBJECT)/Tokenizer_Mod.o \ -$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ -$(DIR_SHARED)/Message_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Thick_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Control_Mod.f90 +# Dependencies for: ./Work_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Control_Mod.o:\ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_SHARED)/Control_Mod/*/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 +$(DIR_OBJECT)/Work_Mod.o:\ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_2d.f90 +# Dependencies for: ./Probe_1d_Nodes.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_2d.o:\ +$(DIR_OBJECT)/Probe_1d_Nodes.o:\ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -552,27 +531,25 @@ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod/Main_Isoap.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Main_Isoap.o: - -#--------------------------------------------------- -# Dependencies for: ./Isoap_Mod/Isopol.f90 +# Dependencies for: ./Profiler_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Isopol.o: +$(DIR_OBJECT)/Profiler_Mod.o:\ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Vtk_Mod.f90 +# Dependencies for: ./Math_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Vtk_Mod.o:\ -$(DIR_SHARED)/Vtk_Mod/*.f90 \ +$(DIR_OBJECT)/Math_Mod.o:\ +$(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Gen_Mod.f90 +# Dependencies for: ./Swap_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Gen_Mod.o:\ -$(DIR_SHARED)/Gen_Mod/*.f90 +$(DIR_OBJECT)/Swap_Mod.o:\ +$(DIR_SHARED)/Swap_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Assert_Mod.f90 @@ -583,27 +560,53 @@ $(DIR_SHARED)/Comm_Mod/*/*.f90 \ $(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./File_Mod.f90 +# Dependencies for: ./String_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/File_Mod.o:\ -$(DIR_OBJECT)/String_Mod.o \ -$(DIR_SHARED)/String_Mod/*.f90 \ -$(DIR_OBJECT)/Message_Mod.o \ -$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/String_Mod.o:\ +$(DIR_SHARED)/String_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Swap_Mod.f90 +# Dependencies for: ./Grid_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Swap_Mod.o:\ -$(DIR_SHARED)/Swap_Mod/*.f90 +$(DIR_OBJECT)/Grid_Mod.o:\ +$(DIR_OBJECT)/Vtk_Mod.o \ +$(DIR_SHARED)/Vtk_Mod/*.f90 \ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Region_Mod.o \ +$(DIR_OBJECT)/Profiler_Mod.o \ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/Metis_Mod.o \ +$(DIR_SHARED)/Metis_Mod/*.f90 \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Tokenizer_Mod.f90 +# Dependencies for: ./Stl_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Tokenizer_Mod.o:\ -$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Stl_Mod.o:\ +$(DIR_SHARED)/Stl_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Comm_Mod.f90 @@ -613,42 +616,42 @@ $(DIR_OBJECT)/Const_Mod.o \ $(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Sort_Mod.f90 +# Dependencies for: ./Iso_Polygons_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Sort_Mod.o:\ -$(DIR_OBJECT)/Swap_Mod.o \ -$(DIR_SHARED)/Swap_Mod/*.f90 \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 +$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Math_Mod.f90 +# Dependencies for: ./Vtk_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Math_Mod.o:\ -$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Vtk_Mod.o:\ +$(DIR_SHARED)/Vtk_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Work_Mod.f90 +# Dependencies for: ./Metis_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Work_Mod.o:\ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Metis_Mod.o:\ +$(DIR_SHARED)/Metis_Mod/*.f90 \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells.f90 +# Dependencies for: ./Probe_2d.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells.o:\ +$(DIR_OBJECT)/Probe_2d.o:\ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_SHARED)/File_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Tokenizer_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Tokenizer_Mod.o:\ +$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o From f9611efad4efbb64c815bf892d8775431ee1da9c Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 12 Mar 2023 14:35:19 +0100 Subject: [PATCH 059/223] Forgotten file from commit: 6317d86f8d0b67c07846da2d2b409fc4f1994ddb On branch bojan_fixed_cell_ranges modified: Process/Field_Mod/Utilities/Potential_Initialization.f90 --- .../Field_Mod/Utilities/Potential_Initialization.f90 | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Sources/Process/Field_Mod/Utilities/Potential_Initialization.f90 b/Sources/Process/Field_Mod/Utilities/Potential_Initialization.f90 index 303e4d326..2d7bd10f4 100644 --- a/Sources/Process/Field_Mod/Utilities/Potential_Initialization.f90 +++ b/Sources/Process/Field_Mod/Utilities/Potential_Initialization.f90 @@ -23,6 +23,8 @@ subroutine Potential_Initialization(Flow, Sol) real, parameter :: DT = 1.0e+6 ! false time step !==============================================================================! + call Profiler % Start('Potential_Initialization') + call Work % Connect_Real_Cell(log_dist, cross) if(this_proc < 2) then @@ -209,6 +211,9 @@ subroutine Potential_Initialization(Flow, Sol) ! ! !---------------------------------! + call Profiler % Start(String % First_Upper(phi % solver) // & + ' (solver for potential initialization)') + ! Call linear solver to solve the equations call Sol % Run(phi % solver, & phi % prec, & @@ -221,6 +226,9 @@ subroutine Potential_Initialization(Flow, Sol) phi % tol, & phi % res) + call Profiler % Stop(String % First_Upper(phi % solver) // & + ' (solver for potential initialization)') + if(this_proc < 2) then print '(a,i4,a,e12.4)', ' # Computed potential in ', phi % eniter, & ' iterations with residual: ', phi % res @@ -327,4 +335,6 @@ subroutine Potential_Initialization(Flow, Sol) call Work % Disconnect_Real_Cell(log_dist, cross) + call Profiler % Stop('Potential_Initialization') + end subroutine From 0e5695e02f8b723f0e7c91e719dae7d965f98fc7 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 12 Mar 2023 14:36:18 +0100 Subject: [PATCH 060/223] Fine adjustments to position of profiler. On branch bojan_fixed_cell_ranges modified: Process/Main_Pro.f90 --- Sources/Process/Main_Pro.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Process/Main_Pro.f90 b/Sources/Process/Main_Pro.f90 index 5c755e2bd..043440f83 100644 --- a/Sources/Process/Main_Pro.f90 +++ b/Sources/Process/Main_Pro.f90 @@ -446,7 +446,7 @@ program Process_Prog ! Finalize the program profler call Profiler % Stop('Main') - call Profiler % Statistics(indent=34) + call Profiler % Statistics(indent=33) !--------------------------! ! Finalize the solvers ! From 98b4e1a41eafcad38be0ed3c4262c9a7e1e96836 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 12 Mar 2023 20:20:21 +0100 Subject: [PATCH 061/223] Computes all three gradient componetns in one loop It proved to be much faster this way. This is for least squares method. On branch bojan_omp_grad modified: Process/Field_Mod.f90 new file: Process/Field_Mod/Gradients/Grad_Three_Components_No_Refresh.f90 --- Sources/Process/Field_Mod.f90 | 2 + .../Grad_Three_Components_No_Refresh.f90 | 113 ++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 Sources/Process/Field_Mod/Gradients/Grad_Three_Components_No_Refresh.f90 diff --git a/Sources/Process/Field_Mod.f90 b/Sources/Process/Field_Mod.f90 index a4af1f259..9a9e88756 100644 --- a/Sources/Process/Field_Mod.f90 +++ b/Sources/Process/Field_Mod.f90 @@ -201,6 +201,7 @@ module Field_Mod procedure :: Grad procedure :: Grad_Component procedure, private :: Grad_Component_No_Refresh + procedure, private :: Grad_Three_Components_No_Refresh ! procedure :: Grad_Component_Faces_To_Cells ! not used ! procedure :: Grad_Component_Nodes_To_Cells ! not used ! procedure :: Grad_Component_Cells_To_Nodes ! not used @@ -264,6 +265,7 @@ module Field_Mod # include "Field_Mod/Gradients/Grad.f90" # include "Field_Mod/Gradients/Grad_Component.f90" # include "Field_Mod/Gradients/Grad_Component_No_Refresh.f90" +# include "Field_Mod/Gradients/Grad_Three_Components_No_Refresh.f90" ! include "Field_Mod/Gradients/Grad_Component_Faces_To_Cells.f90" ! include "Field_Mod/Gradients/Grad_Component_Nodes_To_Cells.f90" ! include "Field_Mod/Gradients/Grad_Component_Cells_To_Nodes.f90" diff --git a/Sources/Process/Field_Mod/Gradients/Grad_Three_Components_No_Refresh.f90 b/Sources/Process/Field_Mod/Gradients/Grad_Three_Components_No_Refresh.f90 new file mode 100644 index 000000000..f24939e0c --- /dev/null +++ b/Sources/Process/Field_Mod/Gradients/Grad_Three_Components_No_Refresh.f90 @@ -0,0 +1,113 @@ +!==============================================================================! + subroutine Grad_Three_Components_No_Refresh(Flow, phi, phi_x, phi_y, phi_z) +!------------------------------------------------------------------------------! +! Calculates gradient of generic variable phi by a least squares method, ! +! without refershing the buffers. ! +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Field_Type), target :: Flow + real, intent(in) :: phi ( -Flow % pnt_grid % n_bnd_cells & + :Flow % pnt_grid % n_cells) + real, intent(out) :: phi_x( -Flow % pnt_grid % n_bnd_cells & + :Flow % pnt_grid % n_cells) + real, intent(out) :: phi_y( -Flow % pnt_grid % n_bnd_cells & + :Flow % pnt_grid % n_cells) + real, intent(out) :: phi_z( -Flow % pnt_grid % n_bnd_cells & + :Flow % pnt_grid % n_cells) +!-----------------------------------[Locals]-----------------------------------! + type(Grid_Type), pointer :: Grid + real, contiguous, pointer :: dx(:), dy(:), dz(:), grad_c2c(:,:) + integer, contiguous, pointer :: faces_c(:,:) + integer :: s, c1, c2, reg + real :: dphi1, dphi2 +!-----------------------------[Local parameters]-------------------------------! + integer, dimension(3,3), parameter :: MAP = reshape((/ 1, 4, 5, & + 4, 2, 6, & + 5, 6, 3 /), shape(MAP)) +!==============================================================================! + + ! Take alias + ! OpenMP doesn't unerstand Fortran's members (%), that's why ... + ! ... aliases for faces_c, grad_c2c, dx, dy and dz are needed + Grid => Flow % pnt_grid + dx => Grid % dx + dy => Grid % dy + dz => Grid % dz + grad_c2c => Flow % grad_c2c + faces_c => Grid % faces_c + + ! Initialize gradients + phi_x(1:Grid % n_cells) = 0. + phi_y(1:Grid % n_cells) = 0. + phi_z(1:Grid % n_cells) = 0. + + ! On the boundaries update only c1 - if not symmetry + do reg = Boundary_Regions() + if(Grid % region % type(reg) .ne. SYMMETRY) then + !$omp parallel do & + !$omp private(s, c1, c2, dphi1) & + !$omp shared(faces_c, grad_c2c, dx, dy, dz, phi, phi_x, phi_y, phi_z) + do s = Faces_In_Region(reg) + c1 = faces_c(1,s) + c2 = faces_c(2,s) + + dphi1 = phi(c2)-phi(c1) + + phi_x(c1) = phi_x(c1) & + + dphi1 * ( grad_c2c(MAP(1,1),c1) * dx(s) & + + grad_c2c(MAP(1,2),c1) * dy(s) & + + grad_c2c(MAP(1,3),c1) * dz(s)) + phi_y(c1) = phi_y(c1) & + + dphi1 * ( grad_c2c(MAP(2,1),c1) * dx(s) & + + grad_c2c(MAP(2,2),c1) * dy(s) & + + grad_c2c(MAP(2,3),c1) * dz(s)) + phi_z(c1) = phi_z(c1) & + + dphi1 * ( grad_c2c(MAP(3,1),c1) * dx(s) & + + grad_c2c(MAP(3,2),c1) * dy(s) & + + grad_c2c(MAP(3,3),c1) * dz(s)) + end do + !$omp end parallel do + end if ! symmetry + end do + + ! Inside the domain + !$omp parallel do & + !$omp private(s, c1, c2, dphi1, dphi2) & + !$omp shared(faces_c, grad_c2c, dx, dy, dz, phi, phi_x, phi_y, phi_z) + do s = Faces_In_Domain() + c1 = faces_c(1,s) + c2 = faces_c(2,s) + + dphi1 = phi(c2)-phi(c1) + dphi2 = phi(c2)-phi(c1) + + phi_x(c1) = phi_x(c1) & + + dphi1 * ( grad_c2c(MAP(1,1),c1) * dx(s) & + + grad_c2c(MAP(1,2),c1) * dy(s) & + + grad_c2c(MAP(1,3),c1) * dz(s)) + phi_y(c1) = phi_y(c1) & + + dphi1 * ( grad_c2c(MAP(2,1),c1) * dx(s) & + + grad_c2c(MAP(2,2),c1) * dy(s) & + + grad_c2c(MAP(2,3),c1) * dz(s)) + phi_z(c1) = phi_z(c1) & + + dphi1 * ( grad_c2c(MAP(3,1),c1) * dx(s) & + + grad_c2c(MAP(3,2),c1) * dy(s) & + + grad_c2c(MAP(3,3),c1) * dz(s)) + + phi_x(c2) = phi_x(c2) & + + dphi2 * ( grad_c2c(MAP(1,1),c2) * dx(s) & + + grad_c2c(MAP(1,2),c2) * dy(s) & + + grad_c2c(MAP(1,3),c2) * dz(s)) + phi_y(c2) = phi_y(c2) & + + dphi2 * ( grad_c2c(MAP(2,1),c2) * dx(s) & + + grad_c2c(MAP(2,2),c2) * dy(s) & + + grad_c2c(MAP(2,3),c2) * dz(s)) + phi_z(c2) = phi_z(c2) & + + dphi2 * ( grad_c2c(MAP(3,1),c2) * dx(s) & + + grad_c2c(MAP(3,2),c2) * dy(s) & + + grad_c2c(MAP(3,3),c2) * dz(s)) + end do + !$omp end parallel do + + end subroutine From 957bd2b93bb08593e02e002b18fcc9e06c7e5736 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 12 Mar 2023 20:22:52 +0100 Subject: [PATCH 062/223] IMPORTANT: OpenMP for gradient calculation This implementation is "only" inserting OpenMP commands before the loops, taking care that proper variables are declared as private and shared. (Essentially, loop indices are private, arrays and matrices are shared.) The speed-up I got varied anywhere from 1.6 to 3.7 (it is all stated in procedures' headers) on 4 threads on an HP laptop with 8 cores. Given that the laptop is by no means a high-performance computer, I reckon this is okaysih. The document which made me going was a presentation from Princeston: "Introduction to Parallel Programming with MPI and OpenMP" by Charles Augustine. At the time of this implementation, the document could be found here: https://princetonuniversity.github.io/PUbootcamp/sessions/parallel-programming/Intro_PP_bootcamp_2018.pdf On branch bojan_omp_grad modified: Process/Field_Mod/Gradients/Grad_Component_No_Refresh.f90 modified: Process/Field_Mod/Gradients/Grad_Gauss.f90 modified: Process/Field_Mod/Gradients/Grad_Gauss_Pressure.f90 modified: Process/Field_Mod/Gradients/Grad_Gauss_Variable.f90 modified: Process/Field_Mod/Gradients/Grad_Least_Variable.f90 modified: Process/Field_Mod/Interpolations/Interpolate_To_Faces_Linear.f90 --- .../Gradients/Grad_Component_No_Refresh.f90 | 59 ++++++---- .../Field_Mod/Gradients/Grad_Gauss.f90 | 63 +++++++---- .../Gradients/Grad_Gauss_Pressure.f90 | 101 ++++++++++++------ .../Gradients/Grad_Gauss_Variable.f90 | 21 ++-- .../Gradients/Grad_Least_Variable.f90 | 22 +++- .../Interpolate_To_Faces_Linear.f90 | 86 ++++++++++----- 6 files changed, 243 insertions(+), 109 deletions(-) diff --git a/Sources/Process/Field_Mod/Gradients/Grad_Component_No_Refresh.f90 b/Sources/Process/Field_Mod/Gradients/Grad_Component_No_Refresh.f90 index 326f0255b..e20e8ed20 100644 --- a/Sources/Process/Field_Mod/Gradients/Grad_Component_No_Refresh.f90 +++ b/Sources/Process/Field_Mod/Gradients/Grad_Component_No_Refresh.f90 @@ -7,15 +7,17 @@ subroutine Grad_Component_No_Refresh(Flow, phi, i, phii) implicit none !---------------------------------[Arguments]----------------------------------! class(Field_Type), target :: Flow - real :: phi ( -Flow % pnt_grid % n_bnd_cells & + real, intent(in) :: phi ( -Flow % pnt_grid % n_bnd_cells & :Flow % pnt_grid % n_cells) integer, intent(in) :: i real, intent(out) :: phii( -Flow % pnt_grid % n_bnd_cells & :Flow % pnt_grid % n_cells) !-----------------------------------[Locals]-----------------------------------! - type(Grid_Type), pointer :: Grid - integer :: s, c1, c2, reg - real :: dphi1, dphi2 + type(Grid_Type), pointer :: Grid + real, contiguous, pointer :: dx(:), dy(:), dz(:), grad_c2c(:,:) + integer, contiguous, pointer :: faces_c(:,:) + integer :: s, c1, c2, reg + real :: dphi1, dphi2 !-----------------------------[Local parameters]-------------------------------! integer, dimension(3,3), parameter :: MAP = reshape((/ 1, 4, 5, & 4, 2, 6, & @@ -23,7 +25,14 @@ subroutine Grad_Component_No_Refresh(Flow, phi, i, phii) !==============================================================================! ! Take alias - Grid => Flow % pnt_grid + ! OpenMP doesn't unerstand Fortran's members (%), that's why ... + ! ... aliases for faces_c, grad_c2c, dx, dy and dz are needed + Grid => Flow % pnt_grid + dx => Grid % dx + dy => Grid % dy + dz => Grid % dz + grad_c2c => Flow % grad_c2c + faces_c => Grid % faces_c ! Initialize gradients phii(1:Grid % n_cells) = 0. @@ -31,37 +40,45 @@ subroutine Grad_Component_No_Refresh(Flow, phi, i, phii) ! On the boundaries update only c1 - if not symmetry do reg = Boundary_Regions() if(Grid % region % type(reg) .ne. SYMMETRY) then + !$omp parallel do & + !$omp private(s, c1, c2, dphi1) & + !$omp shared(faces_c, grad_c2c, dx, dy, dz, phi, phii) do s = Faces_In_Region(reg) - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) + c1 = faces_c(1,s) + c2 = faces_c(2,s) dphi1 = phi(c2)-phi(c1) - phii(c1) = phii(c1) & - + dphi1 * ( Flow % grad_c2c(MAP(i,1),c1) * Grid % dx(s) & - + Flow % grad_c2c(MAP(i,2),c1) * Grid % dy(s) & - + Flow % grad_c2c(MAP(i,3),c1) * Grid % dz(s)) + phii(c1) = phii(c1) & + + dphi1 * ( grad_c2c(MAP(i,1),c1) * dx(s) & + + grad_c2c(MAP(i,2),c1) * dy(s) & + + grad_c2c(MAP(i,3),c1) * dz(s)) end do + !$omp end parallel do end if ! symmetry end do ! Inside the domain + !$omp parallel do & + !$omp private(s, c1, c2, dphi1, dphi2) & + !$omp shared(faces_c, grad_c2c, dx, dy, dz, phi, phii) do s = Faces_In_Domain() - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) + c1 = faces_c(1,s) + c2 = faces_c(2,s) dphi1 = phi(c2)-phi(c1) dphi2 = phi(c2)-phi(c1) - phii(c1) = phii(c1) & - + dphi1 * ( Flow % grad_c2c(MAP(i,1),c1) * Grid % dx(s) & - + Flow % grad_c2c(MAP(i,2),c1) * Grid % dy(s) & - + Flow % grad_c2c(MAP(i,3),c1) * Grid % dz(s)) + phii(c1) = phii(c1) & + + dphi1 * ( grad_c2c(MAP(i,1),c1) * dx(s) & + + grad_c2c(MAP(i,2),c1) * dy(s) & + + grad_c2c(MAP(i,3),c1) * dz(s)) - phii(c2) = phii(c2) & - + dphi2 * ( Flow % grad_c2c(MAP(i,1),c2) * Grid % dx(s) & - + Flow % grad_c2c(MAP(i,2),c2) * Grid % dy(s) & - + Flow % grad_c2c(MAP(i,3),c2) * Grid % dz(s)) + phii(c2) = phii(c2) & + + dphi2 * ( grad_c2c(MAP(i,1),c2) * dx(s) & + + grad_c2c(MAP(i,2),c2) * dy(s) & + + grad_c2c(MAP(i,3),c2) * dz(s)) end do + !$omp end parallel do end subroutine diff --git a/Sources/Process/Field_Mod/Gradients/Grad_Gauss.f90 b/Sources/Process/Field_Mod/Gradients/Grad_Gauss.f90 index 17a66b17a..87a46d5ee 100644 --- a/Sources/Process/Field_Mod/Gradients/Grad_Gauss.f90 +++ b/Sources/Process/Field_Mod/Gradients/Grad_Gauss.f90 @@ -7,6 +7,8 @@ subroutine Grad_Gauss(Flow, phi_f, phi_x, phi_y, phi_z) ! embedded in an iterative algorithm which also updates face values. ! ! See also it's sister function Interpolate_To_Faces from this module, and ! ! its parent function Grad_Gauss_Variable, also from this module. ! +! ! +! With OpenMP, this procedure got a speedup of 3.5 on 1M mesh and 4 threads. ! !------------------------------------------------------------------------------! implicit none !--------------------------------[Arguments]-----------------------------------! @@ -19,51 +21,76 @@ subroutine Grad_Gauss(Flow, phi_f, phi_x, phi_y, phi_z) real :: phi_z( -Flow % pnt_grid % n_bnd_cells: & Flow % pnt_grid % n_cells) !----------------------------------[Locals]------------------------------------! - type(Grid_Type), pointer :: Grid - integer :: s, c1, c2, c, reg + type(Grid_Type), pointer :: Grid + real, contiguous, pointer :: sx(:), sy(:), sz(:), vol(:) + integer, contiguous, pointer :: faces_c(:,:) + integer :: s, c1, c2, c, reg !==============================================================================! + call Profiler % Start('Grad_Gauss') + ! Take alias - Grid => Flow % pnt_grid + ! OpenMP doesn't unerstand Fortran's members (%), that's ... + ! ... why aliases for faces_c, sx, sy, sz and vol are needed + Grid => Flow % pnt_grid + faces_c => Grid % faces_c + sx => Grid % sx + sy => Grid % sy + sz => Grid % sz + vol => Grid % vol !-----------------------------------------------! ! Update gradients from the values at faces ! !-----------------------------------------------! + !$omp parallel do private(c) shared(phi_x, phi_y, phi_z) do c = Cells_In_Domain() phi_x(c) = 0.0 phi_y(c) = 0.0 phi_z(c) = 0.0 end do + !$omp end parallel do ! Faces in boundary region first do reg = Boundary_Regions() + !$omp parallel do & + !$omp private(s, c1) & + !$omp shared(faces_c, phi_f, phi_x, phi_y, phi_z, sx, sy, sz) do s = Faces_In_Region(reg) - c1 = Grid % faces_c(1,s) + c1 = faces_c(1,s) - phi_x(c1) = phi_x(c1) - phi_f(s) * Grid % sx(s) - phi_y(c1) = phi_y(c1) - phi_f(s) * Grid % sy(s) - phi_z(c1) = phi_z(c1) - phi_f(s) * Grid % sz(s) + phi_x(c1) = phi_x(c1) - phi_f(s) * sx(s) + phi_y(c1) = phi_y(c1) - phi_f(s) * sy(s) + phi_z(c1) = phi_z(c1) - phi_f(s) * sz(s) end do + !$omp end parallel do end do ! Faces inside the domain + !$omp parallel do & + !$omp private(s, c1, c2) & + !$omp shared(faces_c, phi_f, phi_x, phi_y, phi_z, sx, sy, sz) do s = Faces_In_Domain() - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) + c1 = faces_c(1,s) + c2 = faces_c(2,s) - phi_x(c1) = phi_x(c1) - phi_f(s) * Grid % sx(s) - phi_y(c1) = phi_y(c1) - phi_f(s) * Grid % sy(s) - phi_z(c1) = phi_z(c1) - phi_f(s) * Grid % sz(s) + phi_x(c1) = phi_x(c1) - phi_f(s) * sx(s) + phi_y(c1) = phi_y(c1) - phi_f(s) * sy(s) + phi_z(c1) = phi_z(c1) - phi_f(s) * sz(s) - phi_x(c2) = phi_x(c2) + phi_f(s) * Grid % sx(s) - phi_y(c2) = phi_y(c2) + phi_f(s) * Grid % sy(s) - phi_z(c2) = phi_z(c2) + phi_f(s) * Grid % sz(s) + phi_x(c2) = phi_x(c2) + phi_f(s) * sx(s) + phi_y(c2) = phi_y(c2) + phi_f(s) * sy(s) + phi_z(c2) = phi_z(c2) + phi_f(s) * sz(s) end do + !$omp end parallel do + !$omp parallel do private(c) shared(phi_x, phi_y, phi_z, vol) do c = Cells_In_Domain() - phi_x(c) = -phi_x(c) / Grid % vol(c) - phi_y(c) = -phi_y(c) / Grid % vol(c) - phi_z(c) = -phi_z(c) / Grid % vol(c) + phi_x(c) = -phi_x(c) / vol(c) + phi_y(c) = -phi_y(c) / vol(c) + phi_z(c) = -phi_z(c) / vol(c) end do + !$omp end parallel do + + call Profiler % Stop('Grad_Gauss') end subroutine diff --git a/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Pressure.f90 b/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Pressure.f90 index ea76291e9..5ebc551c5 100644 --- a/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Pressure.f90 +++ b/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Pressure.f90 @@ -2,6 +2,8 @@ subroutine Grad_Gauss_Pressure(Flow, p) !------------------------------------------------------------------------------! ! Tries to find pressure gradients with Gaussian in an iterative fashion. ! +! ! +! With OpenMP, this procedure got a speedup of 3.5 on 1M mesh and 4 threads. ! !------------------------------------------------------------------------------! implicit none !--------------------------------[Arguments]-----------------------------------! @@ -9,18 +11,27 @@ subroutine Grad_Gauss_Pressure(Flow, p) type(Var_Type), target :: p ! should be pressure or pressure correction !----------------------------------[Locals]------------------------------------! type(Grid_Type), pointer :: Grid - integer :: s, c, c1, c2, iter + integer :: s, c, c1, c2, iter, reg integer :: i_fac, c1_prim, c2_prim, s_prim - integer, contiguous, pointer :: c_computed(:), c_visited(:) + integer, contiguous, pointer :: c_computed(:), c_visited(:), faces_c(:,:) + real, contiguous, pointer :: p_x(:), p_y(:), p_z(:) !------------------------------[Local parameters]------------------------------! integer, parameter :: YES = 1 integer, parameter :: NO = YES-1 !==============================================================================! + call Profiler % Start('Grad_Gauss_Pressure') + call Work % Connect_Int_Cell(c_computed, c_visited) ! Take alias - Grid => Flow % pnt_grid + ! OpenMP doesn't unerstand Fortran's members (%), that's ... + ! ... why aliases for faces_c, p_x, p_y and p_z are needed + Grid => Flow % pnt_grid + faces_c => Grid % faces_c + p_x => p % x + p_y => p % y + p_z => p % z ! Initialize with some gradients with the most robust and reliable tool ! you have at your disposal - least square cell-based method. These @@ -39,26 +50,36 @@ subroutine Grad_Gauss_Pressure(Flow, p) ! Mark cells which are not computed for the 1st time ! At this point, these are cells near the boundaries - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1, s) - c2 = Grid % faces_c(2, s) - if(c2 < 0) c_computed(c1) = NO - end do + do reg = Boundary_Regions() + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1, s) + c_computed(c1) = NO + end do ! faces + end do ! all boundary regions call Grid % Exchange_Cells_Int(c_computed) ! Nullify gradients for cells near boundaries ! (where gradients are not computed properly), ! and initialize c_visited - do c = 1, Grid % n_cells + !$omp parallel do & + !$omp private(c) & + !$omp shared(c_computed, c_visited, p_x, p_y, p_z) + do c = Cells_In_Domain() if(c_computed(c) .eq. NO) then ! if not computed - p % x(c) = 0.0 - p % y(c) = 0.0 - p % z(c) = 0.0 + p_x(c) = 0.0 + p_y(c) = 0.0 + p_z(c) = 0.0 c_visited(c) = 0 end if end do + ! It seems these are not needed + !? call Grid % Exchange_Cells_Real(p % x) + !? call Grid % Exchange_Cells_Real(p % y) + !? call Grid % Exchange_Cells_Real(p % z) + !? all Grid % Exchange_Cells_Int(c_visited) + !------------------------------------------------! ! Extrapolate in several iterations, as long ! ! as there are cells which are not computed. ! @@ -67,38 +88,48 @@ subroutine Grad_Gauss_Pressure(Flow, p) ! Browse through faces to find the cells which need ... ! ... updating, and accumulate gradients in them as well - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1, s) - c2 = Grid % faces_c(2, s) - - if(c2 > 0) then - if(c_computed(c1) .eq. NO .and. c_computed(c2) .eq. YES) then - p % x(c1) = p % x(c1) + p % x(c2) - p % y(c1) = p % y(c1) + p % y(c2) - p % z(c1) = p % z(c1) + p % z(c2) - c_visited(c1) = c_visited(c1) + 1 - end if - - if(c_computed(c2) .eq. NO .and. c_computed(c1) .eq. YES) then - p % x(c2) = p % x(c2) + p % x(c1) - p % y(c2) = p % y(c2) + p % y(c1) - p % z(c2) = p % z(c2) + p % z(c1) - c_visited(c2) = c_visited(c2) + 1 - end if + !$omp parallel do & + !$omp private(s, c1, c2) & + !$omp shared(faces_c, c_computed, c_visited, p_x, p_y, p_z) + do s = Faces_In_Domain() + c1 = faces_c(1, s) + c2 = faces_c(2, s) + + if(c_computed(c1) .eq. NO .and. c_computed(c2) .eq. YES) then + p_x(c1) = p_x(c1) + p_x(c2) + p_y(c1) = p_y(c1) + p_y(c2) + p_z(c1) = p_z(c1) + p_z(c2) + c_visited(c1) = c_visited(c1) + 1 + end if + + if(c_computed(c2) .eq. NO .and. c_computed(c1) .eq. YES) then + p_x(c2) = p_x(c2) + p_x(c1) + p_y(c2) = p_y(c2) + p_y(c1) + p_z(c2) = p_z(c2) + p_z(c1) + c_visited(c2) = c_visited(c2) + 1 end if end do + !$omp end parallel do + + ! It seems this is not needed + !? call Grid % Exchange_Cells_Int(c_visited) ! Browse throough cells, and calculate final values ... ! ... of gradients in the cells which have been visited - do c = 1, Grid % n_cells + !$omp parallel do & + !$omp private(c) & + !$omp shared(c_computed, c_visited, p_x, p_y, p_z) + do c = Cells_In_Domain() if(c_visited(c) > 0) then - p % x(c) = p % x(c) / c_visited(c) - p % y(c) = p % y(c) / c_visited(c) - p % z(c) = p % z(c) / c_visited(c) + p_x(c) = p_x(c) / c_visited(c) + p_y(c) = p_y(c) / c_visited(c) + p_z(c) = p_z(c) / c_visited(c) c_visited(c) = 0 c_computed(c) = YES ! mark it as computed for the next iteration end if end do + !$omp end parallel do + call Grid % Exchange_Cells_Real(p % x) call Grid % Exchange_Cells_Real(p % y) call Grid % Exchange_Cells_Real(p % z) @@ -110,4 +141,6 @@ subroutine Grad_Gauss_Pressure(Flow, p) call Work % Disconnect_Int_Cell(c_computed, c_visited) + call Profiler % Stop('Grad_Gauss_Pressure') + end subroutine diff --git a/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Variable.f90 b/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Variable.f90 index ace7574fb..57e6321d2 100644 --- a/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Variable.f90 +++ b/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Variable.f90 @@ -5,6 +5,9 @@ subroutine Grad_Gauss_Variable(Flow, phi) ! really bad for tetrahedral grids with no initial values of gradients, and ! ! a more elaborate approach is therefore needed, which will probably be in ! ! Grad_Gauss_Pressure, when introduced. +! ! +! With OpenMP, this procedure got a speedup of 1.6 on 1M mesh and 4 threads. ! +! I reckon there is not so much potential for improving this, few loops. ! !------------------------------------------------------------------------------! implicit none !--------------------------------[Arguments]-----------------------------------! @@ -35,11 +38,6 @@ subroutine Grad_Gauss_Variable(Flow, phi) !-------------------------------! do iter = 1, Flow % gauss_miter - ! Save the old iteration (phi_f_o(:) = phi_f_n(:) doesn't work for Intel) - do s = 1, Grid % n_faces - phi_f_o(s) = phi_f_n(s) - end do - ! Estimate values at faces from the ! values in cells and last gradients call Flow % Interpolate_To_Faces_Linear(phi_f_n, phi % n, & @@ -48,8 +46,17 @@ subroutine Grad_Gauss_Variable(Flow, phi) ! Update gradients from the values at faces call Flow % Grad_Gauss(phi_f_n, phi % x, phi % y, phi % z) - ! Take the difference between two iterations - res = maxval(abs(phi_f_n(:)-phi_f_o(:))) / norm + ! Take the difference between two iterations to find residual + ! and copy the new value to the old value along the way + res = 0.0 + !$omp parallel do private(s) shared(phi_f_n, phi_f_o) reduction(max : res) + do s = 1, Grid % n_faces + res = max(res, abs(phi_f_n(s) - phi_f_o(s))) + phi_f_o(s) = phi_f_n(s) + end do + !$omp end parallel do + + res = res / norm call Comm_Mod_Global_Max_Real(res) if(res < Flow % gauss_tol) exit diff --git a/Sources/Process/Field_Mod/Gradients/Grad_Least_Variable.f90 b/Sources/Process/Field_Mod/Gradients/Grad_Least_Variable.f90 index 7aa2c6e67..05925541c 100644 --- a/Sources/Process/Field_Mod/Gradients/Grad_Least_Variable.f90 +++ b/Sources/Process/Field_Mod/Gradients/Grad_Least_Variable.f90 @@ -2,6 +2,16 @@ subroutine Grad_Least_Variable(Flow, var) !------------------------------------------------------------------------------! ! Calculates gradient of a variable from field Flow with least squares ! +! ! +! With OpenMP, this procedure got a speedup of 3.2 on 1M mesh and 4 threads. ! +! Yet, in the tests, it was called only to initialize Gaussian methods and ! +! the measuring times where therefore short. The numbers may be innacurate. ! +! It should be tested on a case with least squares only. ! +! ! +! On a case with least squares only, speed-up was 3.3, still not whopping. ! +! ! +! But, the new version, the one which call all three components at once, ! +! showed a speed-up of 3.7 on 1M mesh and 4 threads, which is good. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -19,10 +29,14 @@ subroutine Grad_Least_Variable(Flow, var) ! Refresh buffers for variable call Grid % Exchange_Cells_Real(var % n) - ! Compute individual gradients without refreshing buffers - call Flow % Grad_Component_No_Refresh(var % n, 1, var % x) ! dp/dx - call Flow % Grad_Component_No_Refresh(var % n, 2, var % y) ! dp/dy - call Flow % Grad_Component_No_Refresh(var % n, 3, var % z) ! dp/dz + ! Old: Compute individual gradients without refreshing buffers + ! call Flow % Grad_Component_No_Refresh(var % n, 1, var % x) ! dp/dx + ! call Flow % Grad_Component_No_Refresh(var % n, 2, var % y) ! dp/dy + ! call Flow % Grad_Component_No_Refresh(var % n, 3, var % z) ! dp/dz + + ! New: Compute all gradient components without refreshing buffers + call Flow % Grad_Three_Components_No_Refresh(var % n, & + var % x, var % y, var % z) ! Refresh buffers for gradient components call Grid % Exchange_Cells_Real(var % x) diff --git a/Sources/Process/Field_Mod/Interpolations/Interpolate_To_Faces_Linear.f90 b/Sources/Process/Field_Mod/Interpolations/Interpolate_To_Faces_Linear.f90 index 422144dbe..43fce98e6 100644 --- a/Sources/Process/Field_Mod/Interpolations/Interpolate_To_Faces_Linear.f90 +++ b/Sources/Process/Field_Mod/Interpolations/Interpolate_To_Faces_Linear.f90 @@ -8,6 +8,8 @@ subroutine Interpolate_To_Faces_Linear(Flow, phi_f, phi_c, & ! was intended to be ebmedded in an iterative algorithm for gradient calcu- ! ! lation by Gaussian theorem. See also it's sister function Grad_Gauss and ! ! parent function Grad_Gauss_Variable from this module. ! +! ! +! With OpenMP, this procedure got a speedup of 2.6 on 1M mesh and 4 threads. ! !------------------------------------------------------------------------------! implicit none !--------------------------------[Arguments]-----------------------------------! @@ -22,12 +24,30 @@ subroutine Interpolate_To_Faces_Linear(Flow, phi_f, phi_c, & real, optional :: phi_z( -Flow % pnt_grid % n_bnd_cells: & Flow % pnt_grid % n_cells) !----------------------------------[Locals]------------------------------------! - type(Grid_Type), pointer :: Grid - integer :: s, c1, c2, reg + type(Grid_Type), pointer :: Grid + real, contiguous, pointer :: xf(:), yf(:), zf(:), xc(:), yc(:), zc(:) + real, contiguous, pointer :: rx(:), ry(:), rz(:), f(:) + integer, contiguous, pointer :: faces_c(:,:) + integer :: s, c1, c2, reg !==============================================================================! + call Profiler % Start('Interpolate_To_Faces_Linear') + ! Take alias - Grid => Flow % pnt_grid + ! OpenMP doesn't unerstand Fortran's members (%), that's why ... + ! ... aliases for faces_c, xf, yf, zf, xc ... and rz are needed + Grid => Flow % pnt_grid + faces_c => Grid % faces_c + f => Grid % f + xf => Grid % xf + yf => Grid % yf + zf => Grid % zf + xc => Grid % xc + yc => Grid % yc + zc => Grid % zc + rx => Grid % rx + ry => Grid % ry + rz => Grid % rz ! Refresh buffers for gradient components (needed) call Grid % Exchange_Cells_Real(phi_c) @@ -42,20 +62,27 @@ subroutine Interpolate_To_Faces_Linear(Flow, phi_f, phi_c, & ! Perform linear average for boundary faces ! (Why doesn't it take care of boundary conditions? - check this!) do reg = Boundary_Regions() + !$omp parallel do & + !$omp private(s, c1) & + !$omp shared(faces_c, phi_f, phi_c) do s = Faces_In_Region(reg) - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) + c1 = faces_c(1,s) phi_f(s) = phi_c(c1) end do + !$omp end parallel do end do ! Perform linear average for inside faces + !$omp parallel do & + !$omp private(s, c1, c2) & + !$omp shared(faces_c, phi_f, f, phi_c) do s = Faces_In_Domain() - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) + c1 = faces_c(1,s) + c2 = faces_c(2,s) - phi_f(s) = Grid % f(s) * phi_c(c1) + (1.0 - Grid % f(s)) * phi_c(c2) + phi_f(s) = f(s) * phi_c(c1) + (1.0 - f(s)) * phi_c(c2) end do + !$omp end parallel do !-----------------------------------------------------! ! If gradients present, improve the interpolation ! @@ -63,31 +90,40 @@ subroutine Interpolate_To_Faces_Linear(Flow, phi_f, phi_c, & if(present(phi_x)) then do reg = Boundary_Regions() + !$omp parallel do & + !$omp private(s, c1) & + !$omp shared(faces_c, phi_f, phi_x, phi_y, phi_z, xf, yf, zf, xc, yc, zc) do s = Faces_In_Region(reg) - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - phi_f(s) = phi_f(s) & - + phi_x(c1) * (Grid % xf(s) - Grid % xc(c1)) & - + phi_y(c1) * (Grid % yf(s) - Grid % yc(c1)) & - + phi_z(c1) * (Grid % zf(s) - Grid % zc(c1)) + c1 = faces_c(1,s) + phi_f(s) = phi_f(s) & + + phi_x(c1) * (xf(s) - xc(c1)) & + + phi_y(c1) * (yf(s) - yc(c1)) & + + phi_z(c1) * (zf(s) - zc(c1)) end do ! faces + !$omp end parallel do end do ! all boundary regions + !$omp parallel do & + !$omp private(s, c1, c2) & + !$omp shared(faces_c, phi_f, f, phi_x, phi_y, phi_z, rx, ry, rz) do s = Faces_In_Domain() - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) + c1 = faces_c(1,s) + c2 = faces_c(2,s) - phi_f(s) = phi_f(s) & - + Grid % f(s) & - * ( phi_x(c1) * Grid % rx(s) & - + phi_y(c1) * Grid % ry(s) & - + phi_z(c1) * Grid % rz(s) ) & - + (1.0 - Grid % f(s)) & - * ( phi_x(c2) * Grid % rx(s) & - + phi_y(c2) * Grid % ry(s) & - + phi_z(c2) * Grid % rz(s) ) + phi_f(s) = phi_f(s) & + + f(s) & + * ( phi_x(c1) * rx(s) & + + phi_y(c1) * ry(s) & + + phi_z(c1) * rz(s) ) & + + (1.0 - f(s)) & + * ( phi_x(c2) * rx(s) & + + phi_y(c2) * ry(s) & + + phi_z(c2) * rz(s) ) end do + !$omp end parallel do end if ! gradients are present + call Profiler % Stop('Interpolate_To_Faces_Linear') + end subroutine From 4243e1f0063ad38480470eb90a70f3f03e7e5eba Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 12 Mar 2023 20:33:49 +0100 Subject: [PATCH 063/223] Important: OpenMP for linear solvers. Similar to check in 957bd2b93bb08593e02e002b18fcc9e06c7e5736, this is a mere insertion of OpenMP commands with proper care of private and shared variables. (I am not sure if this check in will end up on top or below this one once I synchronize them.) Here, with solvers, the speed-up is not nearly as good as it was for gradient calculation. The speed up was around 2.6 on 4 threads of an 8 core HP laptop, way less than what I was getting for gradients. (It seems that matrix-vector multipli- cation is less effective than the sheer access to faces_c data.) In any case, I came across a presentation from Cray and EdF, which seems to be authored by my friend Charles Moulinec, in which they openly describe how they distributed data for face-cell data structure, and I hope something similar could soon be implemented in T-Flows. The document is called: "Parallel Sparse Matrix Vector Product with OpenMP for SMP in Code Saturne" and the authors are: V. Szeremi, L. Anton, C. Moulinec, C. Evangelinos, Y. Fournier. At the time of referring to it, it could be found under: https://people.bath.ac.uk/em459/WorkshopJun2016/Talks/anton.pdf Oh, and by the way, I also got rid of Cgs solver. I don't think it was ever working in T-Flows; not in Delft, not now, it doesn't even work if the version from PetsC is used. On branch bojan_fixed_cell_ranges modified: Documentation/all_control_keywords modified: Sources/Process/Native_Mod.f90 modified: Sources/Process/Native_Mod/Bicg.f90 modified: Sources/Process/Native_Mod/Cg.f90 deleted: Sources/Process/Native_Mod/Cgs.f90 modified: Sources/Process/Native_Mod/Normalized_Root_Mean_Square.f90 modified: Sources/Process/Native_Mod/Prec_Form.f90 modified: Sources/Process/Native_Mod/Prec_Solve.f90 modified: Sources/Process/Native_Mod/Solve_Native.f90 --- Documentation/all_control_keywords | 16 +- Sources/Process/Native_Mod.f90 | 2 - Sources/Process/Native_Mod/Bicg.f90 | 76 ++++-- Sources/Process/Native_Mod/Cg.f90 | 71 +++-- Sources/Process/Native_Mod/Cgs.f90 | 245 ------------------ .../Normalized_Root_Mean_Square.f90 | 39 ++- Sources/Process/Native_Mod/Prec_Form.f90 | 28 +- Sources/Process/Native_Mod/Prec_Solve.f90 | 30 ++- Sources/Process/Native_Mod/Solve_Native.f90 | 2 - 9 files changed, 178 insertions(+), 331 deletions(-) delete mode 100644 Sources/Process/Native_Mod/Cgs.f90 diff --git a/Documentation/all_control_keywords b/Documentation/all_control_keywords index 9287c37fa..5f664766f 100644 --- a/Documentation/all_control_keywords +++ b/Documentation/all_control_keywords @@ -76,14 +76,14 @@ SIMPLE_UNDERRELAXATION_FOR_TURBULENCE | 0.7 | from 0 to 1, more around 0.5 SIMPLE_UNDERRELAXATION_FOR_VOF | 0.5 | from 0 to 1, around 0.7 should be OK SKEWNESS_CORRECTION_VOF | no | yes - SOLVER_FOR_ENERGY | bicg | cg, cgs - SOLVER_FOR_MOMENTUM | bicg | cg, cgs - SOLVER_FOR_POTENTIAL | cg | bicg, cgs - SOLVER_FOR_PRESSURE | cg | bicg, cgs - SOLVER_FOR_SCALARS | bicg | cg, cgs - SOLVER_FOR_TURBULENCE | bicg | cg, cgs - SOLVER_FOR_VOF | bicg | cg, cgs - SOLVER_FOR_WALL_DISTANCE | cg | cgs, bicg + SOLVER_FOR_ENERGY | bicg | cg + SOLVER_FOR_MOMENTUM | bicg | cg + SOLVER_FOR_POTENTIAL | cg | bicg + SOLVER_FOR_PRESSURE | cg | bicg + SOLVER_FOR_SCALARS | bicg | cg + SOLVER_FOR_TURBULENCE | bicg | cg + SOLVER_FOR_VOF | bicg | cg + SOLVER_FOR_WALL_DISTANCE | cg | bicg TIME_INTEGRATION_SCHEME | linear | parabolic TIME_STEP | 1.0e-2 | any real number, usually < 0.1 TOLERANCE_FOR_GAUSS_GRADIENTS | 1.0e-3 | any small number, but < 1.0e-3 is OK diff --git a/Sources/Process/Native_Mod.f90 b/Sources/Process/Native_Mod.f90 index 1da0aa136..fedb9f3d2 100644 --- a/Sources/Process/Native_Mod.f90 +++ b/Sources/Process/Native_Mod.f90 @@ -35,7 +35,6 @@ module Native_Mod contains procedure, private :: Bicg ! bicg solver procedure, private :: Cg ! cg solver - procedure, private :: Cgs ! cgs solver procedure :: Create_Native procedure, private :: Normalized_Root_Mean_Square procedure, private :: Prec_Form @@ -50,7 +49,6 @@ module Native_Mod # include "Native_Mod/Bicg.f90" # include "Native_Mod/Cg.f90" -# include "Native_Mod/Cgs.f90" # include "Native_Mod/Create_Native.f90" # include "Native_Mod/Normalized_Root_Mean_Square.f90" # include "Native_Mod/Prec_Form.f90" diff --git a/Sources/Process/Native_Mod/Bicg.f90 b/Sources/Process/Native_Mod/Bicg.f90 index 39d750434..9559bb812 100644 --- a/Sources/Process/Native_Mod/Bicg.f90 +++ b/Sources/Process/Native_Mod/Bicg.f90 @@ -6,7 +6,7 @@ subroutine Bicg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) implicit none !---------------------------------[Arguments]----------------------------------! class(Native_Type), target :: Nat - type(Matrix_Type) :: A + type(Matrix_Type), target :: A real :: x(-Nat % pnt_grid % n_bnd_cells : & Nat % pnt_grid % n_cells) real :: b( Nat % pnt_grid % n_cells) @@ -17,21 +17,27 @@ subroutine Bicg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) real :: fin_res ! final residual real, optional :: norm ! normalization !-----------------------------------[Locals]-----------------------------------! - type(Matrix_Type), pointer :: D - type(Grid_Type), pointer :: Grid - integer :: nt, ni, nb - real :: alfa, beta, rho, rho_old, bnrm2, res - integer :: i, j, k, iter - real :: sum_a, fn - integer :: sum_n - real, contiguous, pointer :: p1(:), q1(:), r1(:), p2(:), q2(:), r2(:) + type(Matrix_Type), pointer :: D + type(Grid_Type), pointer :: Grid + integer :: nt, ni, nb + real :: alfa, beta, rho, rho_old, bnrm2, res + integer :: i, j, k, iter + real :: sum_a, fn + integer :: sum_n + real, contiguous, pointer :: p1(:), q1(:), r1(:), p2(:), q2(:), r2(:) + real, contiguous, pointer :: a_val(:) + integer, contiguous, pointer :: a_col(:), a_row(:), a_dia(:) !==============================================================================! call Work % Connect_Real_Cell(p1, q1, r1, p2, q2, r2) ! Take some aliases - Grid => Nat % pnt_grid - D => Nat % D + Grid => Nat % pnt_grid + D => Nat % D + a_val => A % val + a_col => A % col + a_row => A % row + a_dia => A % dia nt = Grid % n_cells ni = Grid % n_cells - Grid % Comm % n_buff_cells @@ -44,20 +50,27 @@ subroutine Bicg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) !--------------------------! sum_a = 0.0 sum_n = 0 + !$omp parallel do private(i) shared(a_val, a_dia) & + !$omp reduction(+ : sum_a) reduction(+ : sum_n) do i = 1, ni - sum_a = sum_a + A % val(A % dia(i)) + sum_a = sum_a + a_val(a_dia(i)) sum_n = sum_n + 1 end do + !$omp end parallel do + call Comm_Mod_Global_Sum_Real(sum_a) call Comm_Mod_Global_Sum_Int (sum_n) ! this is stored somewhere, check + sum_a = sum_a / sum_n fn = 1.0 / sum_a + !$omp parallel do private(i, j) shared(a_row, a_val, b, fn) do i = 1, nt - do j = A % row(i), A % row(i+1)-1 - A % val(j) = A % val(j) * fn + do j = a_row(i), a_row(i+1)-1 + a_val(j) = a_val(j) * fn end do b(i) = b(i) * fn end do + !$omp end parallel do !---------------------! ! Preconditioning ! @@ -97,9 +110,11 @@ subroutine Bicg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) !-----------------------! ! Choose initial r~ ! !-----------------------! + !$omp parallel do private(i) shared(r2, r1) do i = 1, ni r2(i) = r1(i) end do + !$omp end parallel do !---------------! ! ! @@ -123,16 +138,20 @@ subroutine Bicg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) call Comm_Mod_Global_Sum_Real(rho) if(iter .eq. 1) then + !$omp parallel do private(i) shared(p1, q1, p2, q2) do i = 1, ni p1(i) = q1(i) p2(i) = q2(i) end do + !$omp end parallel do else beta = rho / rho_old + !$omp parallel do private(i) shared(p1, p2, q1, q2, beta) do i = 1, ni p1(i) = q1(i) + beta * p1(i) p2(i) = q2(i) + beta * p2(i) end do + !$omp end parallel do end if !---------------! @@ -141,21 +160,28 @@ subroutine Bicg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) !---------------! call Grid % Exchange_Cells_Real(p1(-nb:ni)) call Grid % Exchange_Cells_Real(p2(-nb:ni)) + !$omp parallel do private(i, j, k) & + !$omp shared(p1, q1, p2, q2, a_row, a_col, a_val) do i = 1, ni q1(i) = 0.0 q2(i) = 0.0 - do j = A % row(i), A % row(i+1)-1 - k = A % col(j) - q1(i) = q1(i) + A % val(j) * p1(k) - q2(i) = q2(i) + A % val(j) * p2(k) + do j = a_row(i), a_row(i+1)-1 + k = a_col(j) + q1(i) = q1(i) + a_val(j) * p1(k) + q2(i) = q2(i) + a_val(j) * p2(k) end do end do + !$omp end parallel do !----------------------! ! alfa = rho/(p,q) ! !----------------------! alfa = 0.0 - alfa = alfa + dot_product(p2(1:ni), q1(1:ni)) + !$omp parallel do private(i) shared(p2, q1) reduction(+ : alfa) + do i = 1, ni + alfa = alfa + p2(i) * q1(i) + end do + !$omp end parallel do call Comm_Mod_Global_Sum_Real(alfa) alfa = rho / alfa @@ -163,11 +189,13 @@ subroutine Bicg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) ! x = x + alfa p ! ! r = r - alfa q ! !--------------------! + !$omp parallel do private(i) shared(x, r1, r2, p1, q1, q2, alfa) do i = 1, ni - x (i) = x (i) + alfa*p1(i) - r1(i) = r1(i) - alfa*q1(i) - r2(i) = r2(i) - alfa*q2(i) + x (i) = x (i) + alfa * p1(i) + r1(i) = r1(i) - alfa * q1(i) + r2(i) = r2(i) - alfa * q2(i) end do + !$omp end parallel do !-----------------------! ! Check convergence ! @@ -204,8 +232,8 @@ subroutine Bicg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) ! De-normalize the system ! !-----------------------------! do i = 1, nt - do j = A % row(i), A % row(i+1)-1 - A % val(j) = A % val(j) / fn + do j = a_row(i), a_row(i+1)-1 + a_val(j) = a_val(j) / fn end do b(i) = b(i) / fn end do diff --git a/Sources/Process/Native_Mod/Cg.f90 b/Sources/Process/Native_Mod/Cg.f90 index 4474877c1..f2312735c 100644 --- a/Sources/Process/Native_Mod/Cg.f90 +++ b/Sources/Process/Native_Mod/Cg.f90 @@ -6,7 +6,7 @@ subroutine Cg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) implicit none !---------------------------------[Arguments]----------------------------------! class(Native_Type), target :: Nat - type(Matrix_Type) :: A + type(Matrix_Type), target :: A real :: x(-Nat % pnt_grid % n_bnd_cells : & Nat % pnt_grid % n_cells) real :: b( Nat % pnt_grid % n_cells) @@ -17,21 +17,27 @@ subroutine Cg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) real :: fin_res ! final residual real, optional :: norm ! normalization !-----------------------------------[Locals]-----------------------------------! - type(Matrix_Type), pointer :: D - type(Grid_Type), pointer :: Grid - integer :: nt, ni, nb - real :: alfa, beta, rho, rho_old, bnrm2, res - integer :: i, j, k, iter - real :: sum_a, fn - integer :: sum_n - real, contiguous, pointer :: p1(:), q1(:), r1(:) + type(Matrix_Type), pointer :: D + type(Grid_Type), pointer :: Grid + integer :: nt, ni, nb + real :: alfa, beta, rho, rho_old, bnrm2, res + integer :: i, j, k, iter + real :: sum_a, fn + integer :: sum_n + real, contiguous, pointer :: p1(:), q1(:), r1(:) + real, contiguous, pointer :: a_val(:) + integer, contiguous, pointer :: a_col(:), a_row(:), a_dia(:) !==============================================================================! call Work % Connect_Real_Cell(p1, q1, r1) ! Take some aliases - Grid => Nat % pnt_grid - D => Nat % D + Grid => Nat % pnt_grid + D => Nat % D + a_val => A % val + a_col => A % col + a_row => A % row + a_dia => A % dia nt = Grid % n_cells ni = Grid % n_cells - Grid % Comm % n_buff_cells @@ -44,20 +50,27 @@ subroutine Cg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) !--------------------------! sum_a = 0.0 sum_n = 0 + !$omp parallel do private(i) shared(a_val, a_dia) & + !$omp reduction(+ : sum_a) reduction(+ : sum_n) do i = 1, ni - sum_a = sum_a + A % val(A % dia(i)) + sum_a = sum_a + a_val(a_dia(i)) sum_n = sum_n + 1 end do + !$omp end parallel do + call Comm_Mod_Global_Sum_Real(sum_a) call Comm_Mod_Global_Sum_Int (sum_n) ! this is stored somewhere, check + sum_a = sum_a / sum_n fn = 1.0 / sum_a + !$omp parallel do private(i, j) shared(a_row, a_val, b, fn) do i = 1, nt - do j = A % row(i), A % row(i+1)-1 - A % val(j) = A % val(j) * fn + do j = a_row(i), a_row(i+1)-1 + a_val(j) = a_val(j) * fn end do b(i) = b(i) * fn end do + !$omp end parallel do !---------------------! ! Preconditioning ! @@ -97,9 +110,11 @@ subroutine Cg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) !-----------! ! p = r ! !-----------! + !$omp parallel do private(i) shared(p1, r1) do i = 1, ni p1(i) = r1(i) end do + !$omp end parallel do !---------------! ! ! @@ -121,43 +136,57 @@ subroutine Cg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) call Comm_Mod_Global_Sum_Real(rho) if(iter .eq. 1) then + !$omp parallel do private(i) shared(p1, q1) do i = 1, ni p1(i) = q1(i) end do + !$omp end parallel do else beta = rho / rho_old + !$omp parallel do private(i) shared(p1, q1, beta) do i = 1, ni p1(i) = q1(i) + beta * p1(i) end do + !$omp end parallel do end if !------------! ! q = Ap ! !------------! call Grid % Exchange_Cells_Real(p1(-nb:ni)) + !$omp parallel do private(i, j, k) shared(p1, q1, a_row, a_col, a_val) do i = 1, ni q1(i) = 0.0 - do j = A % row(i), A % row(i+1)-1 - k = A % col(j) - q1(i) = q1(i) + A % val(j) * p1(k) + do j = a_row(i), a_row(i+1)-1 + k = a_col(j) + q1(i) = q1(i) + a_val(j) * p1(k) end do end do + !$omp end parallel do !------------------------! ! alfa = (r,z)/(p,q) ! !------------------------! - alfa = dot_product(p1(1:ni), q1(1:ni)) + alfa = 0.0 + !$omp parallel do private(i) shared(p1, q1) reduction(+ : alfa) + do i = 1, ni + alfa = alfa + p1(i) * q1(i) + end do + !$omp end parallel do + call Comm_Mod_Global_Sum_Real(alfa) - alfa = rho/alfa + alfa = rho / alfa !---------------------! ! x = x + alfa p ! ! r = r - alfa Ap ! !---------------------! + !$omp parallel do private(i) shared(x, r1, p1, q1, alfa) do i = 1, ni x (i) = x (i) + alfa * p1(i) r1(i) = r1(i) - alfa * q1(i) end do + !$omp end parallel do !-----------------------! ! Check convergence ! @@ -194,8 +223,8 @@ subroutine Cg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) ! De-normalize the system ! !-----------------------------! do i = 1, nt - do j = A % row(i), A % row(i+1)-1 - A % val(j) = A % val(j) / fn + do j = a_row(i), a_row(i+1)-1 + a_val(j) = a_val(j) / fn end do b(i) = b(i) / fn end do diff --git a/Sources/Process/Native_Mod/Cgs.f90 b/Sources/Process/Native_Mod/Cgs.f90 deleted file mode 100644 index da4fb5e7f..000000000 --- a/Sources/Process/Native_Mod/Cgs.f90 +++ /dev/null @@ -1,245 +0,0 @@ -!==============================================================================! - subroutine Cgs(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) -!------------------------------------------------------------------------------! -! Solves the linear systems of equations by a preconditioned CGS method ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Native_Type), target :: Nat - type(Matrix_Type) :: A - real :: x(-Nat % pnt_grid % n_bnd_cells : & - Nat % pnt_grid % n_cells) - real :: b( Nat % pnt_grid % n_cells) - character(SL) :: prec ! preconditioner - integer :: miter ! maximum and actual ... - integer :: niter ! ... number of iterations - real :: tol ! tolerance - real :: fin_res ! final residual - real, optional :: norm ! normalization -!-----------------------------------[Locals]-----------------------------------! - type(Matrix_Type), pointer :: D - type(Grid_Type), pointer :: Grid - integer :: nt, ni, nb - real :: alfa, beta, rho, rho_old, bnrm2, res - integer :: i, j, k, iter - real :: sum_a, fn - integer :: sum_n - real, contiguous, pointer :: p1(:), q1(:), r1(:), p2(:), q2(:), r2(:), & - u1(:), u2(:), v2(:), u1_plus_q1(:) -!==============================================================================! - - call Work % Connect_Real_Cell(p1, q1, r1, p2, q2, r2, & - u1, u2, v2, u1_plus_q1) - - ! Take some aliases - Grid => Nat % pnt_grid - D => Nat % D - - nt = Grid % n_cells - ni = Grid % n_cells - Grid % Comm % n_buff_cells - nb = Grid % n_bnd_cells - - res = 0.0 - - !--------------------------! - ! Normalize the system ! - !--------------------------! - sum_a = 0.0 - sum_n = 0 - do i = 1, ni - sum_a = sum_a + A % val(A % dia(i)) - sum_n = sum_n + 1 - end do - call Comm_Mod_Global_Sum_Real(sum_a) - call Comm_Mod_Global_Sum_Int (sum_n) ! this is stored somewhere, check - sum_a = sum_a / sum_n - fn = 1.0 / sum_a - do i = 1, nt - do j = A % row(i), A % row(i+1)-1 - A % val(j) = A % val(j) * fn - end do - b(i) = b(i) * fn - end do - - !---------------------! - ! Preconditioning ! - !---------------------! - call Nat % Prec_Form(ni, A, D, prec) - - !-----------------------------------! - ! This is quite tricky point. ! - ! What if bnrm2 is very small ? ! - !-----------------------------------! - if(.not. present(norm)) then - bnrm2 = Nat % Normalized_Root_Mean_Square(ni, b(1:nt), A, x(1:nt)) - else - bnrm2 = Nat % Normalized_Root_Mean_Square(ni, b(1:nt), A, x(1:nt), norm) - end if - - if(bnrm2 < tol) then - iter=0 - goto 1 - end if - - !-----------------! - ! r1 = b - Ax ! - !-----------------! - call Nat % Residual_Vector(ni, r1(1:nt), b(1:nt), A, x(1:nt)) - - !--------------------------------! - ! Calculate initial residual ! - !--------------------------------! - res = Nat % Normalized_Root_Mean_Square(ni, r1(1:nt), A, x(1:nt)) - - if(res < tol) then - iter = 0 - goto 1 - end if - - !-------------! - ! r2 = r1 ! - !-------------! - do i = 1, ni - r2(i) = r1(i) - end do - - !---------------! - ! ! - ! Main loop ! - ! ! - !---------------! - do iter = 1, miter - - !-------------------! - ! rho = (r2,z1) ! - !-------------------! - rho = dot_product(r1(1:ni), r2(1:ni)) - call Comm_Mod_Global_Sum_Real(rho) - - if(iter .eq. 1) then - do i = 1, ni - u1(i) = r1(i) - u2(i) = u1(i) - end do - else - beta = rho / rho_old - do i = 1, ni - u1(i) = r1(i) + beta * q1(i) - u2(i) = u1(i) + beta * (q1(i) + beta*u2(i)) - end do - end if - - !---------------------! - ! Solve M p2 = u2 ! - !---------------------! - call Nat % Prec_Solve(ni, A, D, p2(1:nt), u2(1:nt), prec) - - !--------------! - ! v2 = Ap2 ! - !--------------! - call Grid % Exchange_Cells_Real(p2(-nb:ni)) - do i = 1, ni - v2(i) = 0.0 - do j = A % row(i), A % row(i+1)-1 - k = A % col(j) - v2(i) = v2(i) + A % val(j) * p2(k) - end do - alfa = alfa + r2(i) * v2(i) - end do - - !------------------------! - ! alfa = rho/(r2,v2) ! - !------------------------! - alfa = dot_product(r2(1:ni), v2(1:ni)) - call Comm_Mod_Global_Sum_Real(alfa) - alfa=rho / alfa - - !-------------------------! - ! q1 = u1 - alfa * v2 ! - !-------------------------! - do i = 1, ni - q1(i) = u1(i) - alfa * v2(i) - end do - - !-------------------------! - ! solve Mp1 = u1 + q1 ! - !-------------------------! - do i = 1, ni - u1_plus_q1(i) = u1(i) + q1(i) - end do - call Nat % Prec_Solve(ni, A, D, p1(1:nt), u1_plus_q1(1:nt), prec) - - !---------------------! - ! x = x + alfa p1 ! - !---------------------! - do i = 1, ni - x(i) = x(i) + alfa * p1(i) - end do - - !---------------! - ! q2 = A p1 ! - !---------------! - call Grid % Exchange_Cells_Real(p1(-nb:ni)) - do i = 1, ni - q2(i) = 0.0 - do j = A % row(i), A % row(i+1)-1 - k = A % col(j) - q2(i) = q2(i) + A % val(j) * p1(k) - end do - end do - - !---------------------! - ! r = r - alfa q2 ! - !---------------------! - do i = 1, ni - r1(i) = r1(i) - alfa * q2(i) - end do - - !-----------------------! - ! Check convergence ! - !-----------------------! - if(.not. present(norm)) then - res = Nat % Normalized_Root_Mean_Square(ni, r1(1:nt), A, x(1:nt)) - else - res = Nat % Normalized_Root_Mean_Square(ni, r1(1:nt), A, x(1:nt), norm) - end if - - if(res < tol) goto 1 - - rho_old = rho - - end do ! iter - - ! Correct the number of executed iterations, because - ! Fortran goes one number up do loop's upper limit - iter = iter - 1 - - !----------------------------------! - ! ! - ! Convergence has been reached ! - ! ! - !----------------------------------! -1 continue - - !-------------------------------------------! - ! Refresh the solution vector's buffers ! - !-------------------------------------------! - call Grid % Exchange_Cells_Real(x(-nb:ni)) - - !-----------------------------! - ! De-normalize the system ! - !-----------------------------! - do i = 1, nt - do j = A % row(i), A % row(i+1)-1 - A % val(j) = A % val(j) / fn - end do - b(i) = b(i) / fn - end do - - fin_res = res - niter = iter - - call Work % Disconnect_Real_Cell(p1, q1, r1, p2, q2, r2, & - u1, u2, v2, u1_plus_q1) - - end subroutine diff --git a/Sources/Process/Native_Mod/Normalized_Root_Mean_Square.f90 b/Sources/Process/Native_Mod/Normalized_Root_Mean_Square.f90 index c24d01f5b..080a8cc28 100644 --- a/Sources/Process/Native_Mod/Normalized_Root_Mean_Square.f90 +++ b/Sources/Process/Native_Mod/Normalized_Root_Mean_Square.f90 @@ -6,29 +6,46 @@ real function Normalized_Root_Mean_Square(Native, ni, r, A, x, norm) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Native_Type) :: Native - integer :: ni - real :: r(:) ! this may be only in inner cells - type(Matrix_Type) :: A - real :: x(:) ! presumably, this goes to buffer cells - real, optional :: norm ! optional number for normalization + class(Native_Type), intent(in) :: Native + integer, intent(in) :: ni + real, intent(in) :: r(:) ! this may be in inner cells + type(Matrix_Type), target, intent(in) :: A + real, intent(in) :: x(:) ! this goes to buffer cells + real, optional, intent(in) :: norm ! number for normalization !-----------------------------------[Locals]-----------------------------------! - real :: rms, x_max, x_min - integer :: i + real :: rms, x_max, x_min + integer :: i + real, contiguous, pointer :: a_val(:) + integer, contiguous, pointer :: a_dia(:) !==============================================================================! + ! Take some aliases + a_val => A % val + a_dia => A % dia + ! Compute rms normalizing it with main diagonal in the system matrix rms = 0.0 + !$omp parallel do private(i) shared(r, a_val, a_dia) reduction(+ : rms) do i = 1, ni - rms = rms + r(i)**2 / A % val(A % dia(i))**2 + rms = rms + r(i)**2 / a_val(a_dia(i))**2 end do + !$omp end parallel do + call Comm_Mod_Global_Sum_Real(rms) rms = sqrt(rms) ! Normalize it with absolute values of the unknown if(.not. present(norm)) then - x_min = minval(x(1:ni)) - x_max = maxval(x(1:ni)) + x_min = +HUGE + x_max = -HUGE + !$omp parallel do private(i) shared(x) & + !$omp reduction(max : x_max) & + !$omp reduction(min : x_min) + do i = 1, ni + x_min = min(x_min, x(i)) + x_max = max(x_max, x(i)) + end do + !$omp end parallel do else x_min = 0.0 x_max = norm diff --git a/Sources/Process/Native_Mod/Prec_Form.f90 b/Sources/Process/Native_Mod/Prec_Form.f90 index c0b9c0bd9..0aba1c2ee 100644 --- a/Sources/Process/Native_Mod/Prec_Form.f90 +++ b/Sources/Process/Native_Mod/Prec_Form.f90 @@ -5,23 +5,33 @@ subroutine Prec_Form(Native, ni, A, D, prec) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Native_Type) :: Native - integer :: ni - type(Matrix_Type) :: A - type(Matrix_Type) :: D - character(SL) :: prec ! preconditioner + class(Native_Type), intent(in) :: Native + integer, intent(in) :: ni + type(Matrix_Type), target, intent(in) :: A + type(Matrix_Type), target, intent(inout) :: D + character(SL), intent(in) :: prec ! preconditioner !-----------------------------------[Locals]-----------------------------------! - real :: sum1 - integer :: i, j, k + real :: sum1 + integer :: i, j, k + real, contiguous, pointer :: a_val(:), d_val(:) + integer, contiguous, pointer :: a_dia(:), d_dia(:) !==============================================================================! + ! Take some aliases + a_val => A % val + a_dia => A % dia + d_val => D % val + d_dia => D % dia + !---------------------------------! ! 1) diagonal preconditioning ! !---------------------------------! if(prec .eq. 'jacobi') then + !$omp parallel do private(i) shared (a_val, a_dia, d_val, d_dia) do i = 1, ni - D % val(D % dia(i)) = A % val(A % dia(i)) + d_val(d_dia(i)) = a_val(a_dia(i)) end do + !$omp end parallel do !--------------------------------------------! ! 2) incomplete cholesky preconditioning ! @@ -40,9 +50,11 @@ subroutine Prec_Form(Native, ni, A, D, prec) ! .) no preconditioning ! !---------------------------! else + !$omp parallel do private(i) shared (d_val, d_dia) do i = 1, ni D % val(D % dia(i)) = 1.0 end do + !$omp end parallel do end if end subroutine diff --git a/Sources/Process/Native_Mod/Prec_Solve.f90 b/Sources/Process/Native_Mod/Prec_Solve.f90 index d195a8431..3ed5fcf35 100644 --- a/Sources/Process/Native_Mod/Prec_Solve.f90 +++ b/Sources/Process/Native_Mod/Prec_Solve.f90 @@ -13,25 +13,33 @@ subroutine Prec_Solve(Native, ni, A, D, x, b, prec) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Native_Type) :: Native - integer :: ni - type(Matrix_Type) :: A - type(Matrix_Type) :: D - real :: x(:) - real :: b(:) - character(SL) :: prec ! preconditioner + class(Native_Type), intent(in) :: Native + integer, intent(in) :: ni + type(Matrix_Type), target, intent(in) :: A + type(Matrix_Type), target, intent(in) :: D + real, intent(out) :: x(:) + real, intent(in) :: b(:) + character(SL), intent(in) :: prec ! preconditioner !-----------------------------------[Locals]-----------------------------------! - integer :: i, j, k - real :: sum1 + integer :: i, j, k + real :: sum1 + real, contiguous, pointer :: d_val(:) + integer, contiguous, pointer :: d_dia(:) !==============================================================================! + ! Take some aliases + d_val => D % val + d_dia => D % dia + !---------------------------------! ! 1) diagonal preconditioning ! !---------------------------------! if(prec .eq. 'jacobi') then + !$omp parallel do private(i) shared (x, b, d_val, d_dia) do i = 1, ni - x(i) = b(i)/D % val(D % dia(i)) + x(i) = b(i) / d_val(d_dia(i)) end do + !$omp end parallel do !--------------------------------------------! ! 2) incomplete cholesky preconditioning ! @@ -66,9 +74,11 @@ subroutine Prec_Solve(Native, ni, A, D, x, b, prec) ! .) no preconditioning ! !---------------------------! else + !$omp parallel do private(i) shared (x, b) do i = 1, ni x(i) = b(i) end do + !$omp end parallel do end if end subroutine diff --git a/Sources/Process/Native_Mod/Solve_Native.f90 b/Sources/Process/Native_Mod/Solve_Native.f90 index c8301ed0f..bda40067d 100644 --- a/Sources/Process/Native_Mod/Solve_Native.f90 +++ b/Sources/Process/Native_Mod/Solve_Native.f90 @@ -27,8 +27,6 @@ subroutine Solve_Native(Nat, & call Nat % Bicg(A, x, b, prec, miter, niter, tol, fin_res, norm) else if(solver .eq. 'cg') then call Nat % Cg (A, x, b, prec, miter, niter, tol, fin_res, norm) - else if(solver .eq. 'cgs') then - call Nat % Cgs (A, x, b, prec, miter, niter, tol, fin_res, norm) else print *, '# ERROR: Unknown native solver: ', solver print *, '# This error is critical, stopping!' From ba0f49b0839371c75ac63c2817cf9b0895857cf9 Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 13 Mar 2023 14:00:23 +0100 Subject: [PATCH 064/223] Preparations for threading for OpenMP and alike In order to use METIS for decomposition of domains into threads, a more flexible call is needed. It is not enough to send Grid's faces_c to Create_Metis and let it work on entire, grid, one needs the possibility to browse only through a range defined with arguments s_f and s_l (first and last cell). So, argument list to Create_Metis has changed. Following that, Grid % Decompose must work out these ranges to send them to Create_Metis. Since the range is now determined in Grid, Create_Metis doesn't select only inside cells, Grid's Decompose is doing it. In addition, for the sake of brevity, a new procedure has been added, called Call_Metis and is a member of Metis. It has always been the same, the call to METIS is rather long and doesn't have to be inside other functions. Last but not the least, in modified procedures, intents and asserts have been inserted where appropriate. On branch bojan_fixed_cell_ranges modified: Shared/Grid_Mod/Decompose.f90 modified: Shared/Metis_Mod.f90 new file: Shared/Metis_Mod/Call_Metis.f90 modified: Shared/Metis_Mod/Create_Metis.f90 --- Sources/Shared/Grid_Mod/Decompose.f90 | 43 ++++++++++------------- Sources/Shared/Metis_Mod.f90 | 5 +++ Sources/Shared/Metis_Mod/Call_Metis.f90 | 35 ++++++++++++++++++ Sources/Shared/Metis_Mod/Create_Metis.f90 | 32 ++++++++--------- 4 files changed, 74 insertions(+), 41 deletions(-) create mode 100644 Sources/Shared/Metis_Mod/Call_Metis.f90 diff --git a/Sources/Shared/Grid_Mod/Decompose.f90 b/Sources/Shared/Grid_Mod/Decompose.f90 index c0641f7b3..7b159819c 100644 --- a/Sources/Shared/Grid_Mod/Decompose.f90 +++ b/Sources/Shared/Grid_Mod/Decompose.f90 @@ -1,14 +1,14 @@ !==============================================================================! subroutine Decompose(Grid, n_parts) !------------------------------------------------------------------------------! -! Coarsens the grid with METIS library. ! +! Decomposes the grid with METIS library. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Grid_Type) :: Grid - integer :: n_parts + class(Grid_Type), intent(inout) :: Grid + integer, intent(in) :: n_parts !-----------------------------------[Locals]-----------------------------------! - integer :: c, c1, c2, s + integer :: c, c1, c2, s, s_f, s_l integer, allocatable :: part(:) ! result of partitioning !==============================================================================! @@ -20,27 +20,20 @@ subroutine Decompose(Grid, n_parts) !----------------------------------------------------------------------------! ! Prepare METIS and Exectute a call to METIS graph partitioning function ! !----------------------------------------------------------------------------! - call Metis % Create_Metis(Grid % faces_c, n_parts) - - Metis % options = -1 ! Initialize all to default - Metis % options(METIS_OPTION_DBGLVL) = 0 - - call Metis_PartGraphRecursive( & ! rank intent type METIS - Metis % n_verts, & ! 1. (in), int nvtxs - Metis % n_constrains, & ! 2. (in), int ncon - Metis % row, & ! 3. (in), int(:) xadj - Metis % col, & ! 4. (in), int(:) adjncy - Metis % vert_weights, & ! 5. (in), int(:) vwgt - Metis % vert_data, & ! 6. (in), int(:) vsize - Metis % edge_weights, & ! 7. (in), int(:) adjwgt - n_parts, & ! 8. (in), int(:) nparts - Metis % part_weight, & ! 9. (in), real(:) tpwgts - Metis % imbalance, & ! 10. (in), real(:) ubvec - Metis % options, & ! 11. (in), int(:) options - Metis % return_val, & ! 12. (out) int(:) objval - part(:)) ! 13. (out) int(:) part - - part(:) = part(:) + 1 ! +1, METIS works from zero + + ! Set the bounding faces + s_l = Grid % n_faces + Grid % n_shadows ! last face at this point + do s_f = 1, s_l ! search for first inside face + if(Grid % faces_c(2, s_f) > 0) exit ! when you find first inside face + end do + + ! Call METIS with estimated face range + call Metis % Create_Metis(s_f, s_l, Grid % faces_c, n_parts) + + !-----------------------------! + ! Execute a call to METIS ! + !-----------------------------! + call Metis % Call_Metis(n_parts, part) !-----------------------------------------------------! ! Save the result from the call to METIS function ! diff --git a/Sources/Shared/Metis_Mod.f90 b/Sources/Shared/Metis_Mod.f90 index 80b500797..ec13cfb38 100644 --- a/Sources/Shared/Metis_Mod.f90 +++ b/Sources/Shared/Metis_Mod.f90 @@ -36,12 +36,16 @@ module Metis_Mod imbalance(:) ! allowed imbalance contains + procedure :: Call_Metis procedure :: Create_Metis end type type(Metis_Type) :: Metis + !----------------------------------------! + ! Handles for calls to METIS library ! + !----------------------------------------! integer, parameter :: METIS_OPTION_PTYPE = 1 integer, parameter :: METIS_OPTION_OBJTYPE = 2 integer, parameter :: METIS_OPTION_CTYPE = 3 @@ -69,6 +73,7 @@ module Metis_Mod integer, parameter :: METIS_OPTION_UBVEC = 25 contains +# include "Metis_Mod/Call_Metis.f90" # include "Metis_Mod/Create_Metis.f90" end module diff --git a/Sources/Shared/Metis_Mod/Call_Metis.f90 b/Sources/Shared/Metis_Mod/Call_Metis.f90 new file mode 100644 index 000000000..338488b83 --- /dev/null +++ b/Sources/Shared/Metis_Mod/Call_Metis.f90 @@ -0,0 +1,35 @@ +!==============================================================================! + subroutine Call_Metis(Metis, n_parts, part) +!------------------------------------------------------------------------------! +! Executes a call to METIS for decomposition ! +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Metis_Type), intent(inout) :: Metis + integer, intent(in) :: n_parts + integer, dimension(:), intent(out) :: part +!-----------------------------------[Locals]-----------------------------------! +! integer :: s, i, v, v1, v2 +!==============================================================================! + + Metis % options = -1 ! Initialize all to default + Metis % options(METIS_OPTION_DBGLVL) = 0 + + call Metis_PartGraphRecursive( & ! rank intent type METIS + Metis % n_verts, & ! 1. (in), int nvtxs + Metis % n_constrains, & ! 2. (in), int ncon + Metis % row, & ! 3. (in), int(:) xadj + Metis % col, & ! 4. (in), int(:) adjncy + Metis % vert_weights, & ! 5. (in), int(:) vwgt + Metis % vert_data, & ! 6. (in), int(:) vsize + Metis % edge_weights, & ! 7. (in), int(:) adjwgt + n_parts, & ! 8. (in), int(:) nparts + Metis % part_weight, & ! 9. (in), real(:) tpwgts + Metis % imbalance, & ! 10. (in), real(:) ubvec + Metis % options, & ! 11. (in), int(:) options + Metis % return_val, & ! 12. (out) int(:) objval + part(:)) ! 13. (out) int(:) part + + part(:) = part(:) + 1 ! +1, METIS works from zero + + end subroutine diff --git a/Sources/Shared/Metis_Mod/Create_Metis.f90 b/Sources/Shared/Metis_Mod/Create_Metis.f90 index f262dc0b9..2fbd07758 100644 --- a/Sources/Shared/Metis_Mod/Create_Metis.f90 +++ b/Sources/Shared/Metis_Mod/Create_Metis.f90 @@ -1,29 +1,31 @@ !==============================================================================! - subroutine Create_Metis(Metis, face_to_cell, n_parts) + subroutine Create_Metis(Metis, e_f, e_l, edge_conn, n_parts) !------------------------------------------------------------------------------! ! Prepares all the arrays for a call to METIS function(s) ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Metis_Type) :: Metis - integer, allocatable, intent(in), dimension(:,:) :: face_to_cell - integer, optional, intent(in) :: n_parts + class(Metis_Type), intent(out) :: Metis + integer, intent(in) :: e_f, e_l + integer, dimension(:,:), intent(in) :: edge_conn + integer, intent(in) :: n_parts !-----------------------------------[Locals]-----------------------------------! integer :: s, i, v, v1, v2 !==============================================================================! Assert(n_parts > 0) + Assert(e_l > e_f) + Assert(e_f >= lbound(edge_conn, 2)) + Assert(e_l <= ubound(edge_conn, 2)) !------------------------------------------------------------! ! Number of vertices and number of edges for first level ! !------------------------------------------------------------! Metis % n_verts = 0 Metis % n_edges = 0 - do s = 1, size(face_to_cell, 2) - if(face_to_cell(2, s) > 0) then - Metis % n_edges = Metis % n_edges + 1 - Metis % n_verts = max(Metis % n_verts, face_to_cell(2, s)) - end if + do s = e_f, e_l + Metis % n_edges = Metis % n_edges + 1 + Metis % n_verts = max(Metis % n_verts, edge_conn(2, s)) end do Assert(Metis % n_verts > 0) Assert(Metis % n_edges > 0) @@ -40,13 +42,11 @@ subroutine Create_Metis(Metis, face_to_cell, n_parts) ! Form edge connectivity ! !----------------------------! i = 0 - do s = 1, size(face_to_cell, 2) - if(face_to_cell(2, s) > 0) then - i = i + 1 - Metis % edges_v(1:2, i) = face_to_cell(1:2, s) - Assert(Metis % edges_v(1,i) > 0) - Assert(Metis % edges_v(2,i) > 0) - end if + do s = e_f, e_l + i = i + 1 + Metis % edges_v(1:2, i) = edge_conn(1:2, s) + Assert(Metis % edges_v(1,i) > 0) + Assert(Metis % edges_v(2,i) > 0) end do !------------------------------! From 8339a68370ee964c52d246a67e35bb388c9eb7f9 Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 13 Mar 2023 19:35:06 +0100 Subject: [PATCH 065/223] Fixed output @ default user function for particles On branch bojan_fixed_cell_ranges modified: User_Mod/Insert_Particles.f90 --- Sources/Process/User_Mod/Insert_Particles.f90 | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/Sources/Process/User_Mod/Insert_Particles.f90 b/Sources/Process/User_Mod/Insert_Particles.f90 index b65dc4a01..80aa2a8d9 100644 --- a/Sources/Process/User_Mod/Insert_Particles.f90 +++ b/Sources/Process/User_Mod/Insert_Particles.f90 @@ -20,15 +20,11 @@ subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, curr_dt, time) Grid => Flow % pnt_grid ! Remove the following six lines in real Lagrangian tracking simulations - if(this_proc < 2) then - print *, '#======================================================' // & - '=======================================================' - print *, '# WARNING: You are running a Lagrangian tracking simulation' // & - 'with the default version of Insert_Particles.' - print *, '# You have probably forgotten to compile Process with ' // & - 'DIR_CASE= directive.' - print *, '#------------------------------------------------------' // & - '-------------------------------------------------------' - end if + call Message % Warning(72, & + 'You are running a Lagrangian tracking simulation ' // & + 'with the default version of Insert_Particles. You ' // & + 'have probably forgotten to compile Process with ' // & + 'DIR_CASE= directive.', & + file=__FILE__, line=__LINE__) end subroutine From c49fa0280e94b3af6e797e50a4a6b4dde2e1fad3 Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 13 Mar 2023 20:17:51 +0100 Subject: [PATCH 066/223] As a constant, Program_Name should be upper case On branch bojan_fixed_cell_ranges modified: Shared/Program_Name.h90 --- Sources/Shared/Program_Name.h90 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Sources/Shared/Program_Name.h90 b/Sources/Shared/Program_Name.h90 index 703d318d2..7d5c99605 100644 --- a/Sources/Shared/Program_Name.h90 +++ b/Sources/Shared/Program_Name.h90 @@ -3,11 +3,11 @@ !------------------------------------------------------------------------------! # if T_FLOWS_PROGRAM == 1 -# define Program_Name "Generate" +# define PROGRAM_NAME "Generate" # elif T_FLOWS_PROGRAM == 2 -# define Program_Name "Divide" +# define PROGRAM_NAME "Divide" # elif T_FLOWS_PROGRAM == 3 -# define Program_Name "Convert" +# define PROGRAM_NAME "Convert" # else -# define Program_Name "Process" +# define PROGRAM_NAME "Process" # endif From 538859f78861d2e5a117e51b32a5020643b5af14 Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 13 Mar 2023 20:19:05 +0100 Subject: [PATCH 067/223] Embryo of implementation of threads for OpenMP So far, it introduces new field in Grid_Mod called cell_thread (for future OMP thread), allocates memory for it, and determines it from a call to METIS from Grid % Determine_Regions_Ranges. On branch bojan_fixed_cell_ranges modified: Shared/Grid_Mod.f90 modified: Shared/Grid_Mod/Allocate_Cells.f90 modified: Shared/Grid_Mod/Determine_Regions_Ranges.f90 --- Sources/Shared/Grid_Mod.f90 | 5 ++ Sources/Shared/Grid_Mod/Allocate_Cells.f90 | 3 + .../Grid_Mod/Determine_Regions_Ranges.f90 | 88 +++++++++++++++---- 3 files changed, 81 insertions(+), 15 deletions(-) diff --git a/Sources/Shared/Grid_Mod.f90 b/Sources/Shared/Grid_Mod.f90 index 79c8e15b1..b8884b916 100644 --- a/Sources/Shared/Grid_Mod.f90 +++ b/Sources/Shared/Grid_Mod.f90 @@ -9,6 +9,7 @@ module Grid_Mod ! (that means in "Generate", "Divide", "Convert", "Process". ! !------------------------------------------------------------------------------! !----------------------------------[Modules]-----------------------------------! + use Omp_Lib ! for OpenMP functionality use Assert_Mod use Profiler_Mod use File_Mod @@ -100,6 +101,10 @@ module Grid_Mod ! For each cell; type of the boundary condition in a given direction integer, allocatable :: cells_bnd_region(:,:) + ! Threads (for OpenMP and alike) + integer :: n_threads + integer, allocatable :: cell_thread(:) + !-------------------------! ! Face-based variables ! !-------------------------! diff --git a/Sources/Shared/Grid_Mod/Allocate_Cells.f90 b/Sources/Shared/Grid_Mod/Allocate_Cells.f90 index 586afbd48..fb56c040d 100644 --- a/Sources/Shared/Grid_Mod/Allocate_Cells.f90 +++ b/Sources/Shared/Grid_Mod/Allocate_Cells.f90 @@ -57,6 +57,9 @@ subroutine Allocate_Cells(Grid, nc, nb) Grid % Comm % cell_glo(c) = c end do + ! Allocate thread i.d. + allocate(Grid % cell_thread(-nb:nc)); Grid % cell_thread(:) = 0 + ! Allocate new and old numbers (this is so often used, maybe is better here) allocate(Grid % new_c(-nb:nc)); Grid % new_c(:) = 0 allocate(Grid % old_c(-nb:nc)); Grid % old_c(:) = 0 diff --git a/Sources/Shared/Grid_Mod/Determine_Regions_Ranges.f90 b/Sources/Shared/Grid_Mod/Determine_Regions_Ranges.f90 index de15665e0..4d650f8cb 100644 --- a/Sources/Shared/Grid_Mod/Determine_Regions_Ranges.f90 +++ b/Sources/Shared/Grid_Mod/Determine_Regions_Ranges.f90 @@ -6,22 +6,31 @@ subroutine Determine_Regions_Ranges(Grid) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Grid_Type) :: Grid + class(Grid_Type), intent(inout) :: Grid !------------------------------[Local parameters]------------------------------! logical, parameter :: DEBUG = .false. !-----------------------------------[Locals]-----------------------------------! integer :: c, c1, c2, reg, s, siz + integer :: c_f, c_l, s_f, s_l ! first/last cell, first/last face !==============================================================================! !-------------------! + ! ! ! Cells' ranges ! + ! ! !-------------------! - ! Set non-realizable ranges + !-------------------------------! + ! Set non-realizable ranges ! + !-------------------------------! Grid % region % f_cell(:) = -1 Grid % region % l_cell(:) = -HUGE_INT - ! Browse forward and backward to find first and last cell for each range + !----------------------------------------------------------------------------! + ! Browse forward and backward to find first and last cell for each range ! + !----------------------------------------------------------------------------! + + ! Forward do c = -Grid % n_bnd_cells, -1 if(Grid % Comm % cell_proc(c) .eq. this_proc) then reg = Grid % region % at_cell(c) @@ -31,6 +40,7 @@ subroutine Determine_Regions_Ranges(Grid) end if end do + ! Backward do c = -1, -Grid % n_bnd_cells, -1 if(Grid % Comm % cell_proc(c) .eq. this_proc) then reg = Grid % region % at_cell(c) @@ -40,7 +50,9 @@ subroutine Determine_Regions_Ranges(Grid) end if end do - ! Inside cells + !------------------! + ! Inside cells ! + !------------------! reg = Grid % n_regions Grid % region % f_cell(reg) = Grid % n_cells Grid % region % l_cell(reg) = 1 @@ -55,9 +67,12 @@ subroutine Determine_Regions_Ranges(Grid) end if end do - ! Buffer cells - ! Note: leave Grid % region % l_cell(reg) at Grid % n_cells since - ! it makes macro Cells_In_Domain_And_Buffers() work in sequential + !------------------! + ! Buffer cells ! + !- - - - - - - - - +--------------------------------------------------! + ! Note: leave Grid % region % l_cell(reg) at Grid % n_cells since ! + ! it makes macro Cells_In_Domain_And_Buffers() work in sequential ! + !---------------------------------------------------------------------! reg = Grid % n_regions + 1 Grid % region % f_cell(reg) = Grid % n_cells + 1 Grid % region % l_cell(reg) = Grid % n_cells @@ -73,7 +88,7 @@ subroutine Determine_Regions_Ranges(Grid) end do if(DEBUG) then - write(1000+this_proc, '(a,a)') ' # Cell ranges from ', Program_Name + write(1000+this_proc, '(a,a)') ' # Cell ranges from ', PROGRAM_NAME do reg = All_Regions() siz = Grid % region % l_cell(reg) - Grid % region % f_cell(reg) + 1 write(1000+this_proc,'(a,i3,i15,i15,i15,a,a)') ' # Region: ', reg, & @@ -85,14 +100,20 @@ subroutine Determine_Regions_Ranges(Grid) end if !-------------------! + ! ! ! Faces' ranges ! + ! ! !-------------------! - ! Set non-realizable ranges + !-------------------------------! + ! Set non-realizable ranges ! + !-------------------------------! Grid % region % f_face(:) = 0 Grid % region % l_face(:) = -1 - ! Browse through colors and faces to set faces' ranges + !----------------------------------------------------------! + ! Browse through colors and faces to set faces' ranges ! + !----------------------------------------------------------! do reg = Boundary_Regions() if(Grid % region % f_cell(reg) < Grid % region % l_cell(reg)) then do s = 1, Grid % n_faces @@ -107,7 +128,9 @@ subroutine Determine_Regions_Ranges(Grid) end if end do - ! Inside faces + !------------------! + ! Inside faces ! + !------------------! reg = Grid % n_regions Grid % region % f_face(reg) = Grid % n_faces Grid % region % l_face(reg) = 1 @@ -128,6 +151,9 @@ subroutine Determine_Regions_Ranges(Grid) end if ! c2 > 0 end do + !-------------! + ! Check 1 ! + !-------------! do s = Faces_In_Domain() c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) @@ -135,7 +161,7 @@ subroutine Determine_Regions_Ranges(Grid) end do if(DEBUG) then - write(2000+this_proc, '(a,a)') ' # Face ranges from ', Program_Name + write(2000+this_proc, '(a,a)') ' # Face ranges from ', PROGRAM_NAME do reg = All_Regions() siz = Grid % region % l_face(reg) - Grid % region % f_face(reg) + 1 write(2000+this_proc,'(a,i3,i15,i15,i15,a,a)') ' # Region: ', reg, & @@ -146,9 +172,9 @@ subroutine Determine_Regions_Ranges(Grid) end do end if - !-----------! - ! Check ! - !-----------! + !-------------! + ! Check 2 ! + !-------------! do reg = Boundary_Regions() do s = Faces_In_Region(reg) c = Grid % faces_c(2, s) @@ -156,4 +182,36 @@ subroutine Determine_Regions_Ranges(Grid) end do end do + !--------------------------! + ! ! + ! Take care of threads ! + ! ! + !--------------------------! + Grid % n_threads = 0 +# ifdef _OPENMP + Grid % n_threads = omp_get_max_threads() +# endif + + !----------------------------------------------------------! + ! If there is more than one thread, decompose the mesh ! + !----------------------------------------------------------! + if(PROGRAM_NAME == "Process" .and. & + Grid % n_threads > 1) then + + ! Set the face range to the inside faces + s_f = Grid % region % f_face(Grid % n_regions) + s_l = Grid % region % l_face(Grid % n_regions) + + ! Create METIS + call Metis % Create_Metis(s_f, s_l, Grid % faces_c, Grid % n_threads) + + ! Set the cell range to the inside faces + c_f = Grid % region % f_cell(Grid % n_regions) + c_l = Grid % region % l_cell(Grid % n_regions) + + ! Call METIS + call Metis % Call_Metis(Grid % n_threads, & + Grid % cell_thread(c_f:c_l)) + end if + end subroutine From 6426e0d8ec5cd6d913318e06387c5b124ded3425 Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 13 Mar 2023 20:21:24 +0100 Subject: [PATCH 068/223] Saves threads and cell inertia (long forgotten) On branch bojan_fixed_cell_ranges modified: Process/Results_Mod/Save_Results.f90 modified: Shared/Grid_Mod/Save_Vtu_Cells.f90 --- Sources/Process/Results_Mod/Save_Results.f90 | 19 ++++- Sources/Shared/Grid_Mod/Save_Vtu_Cells.f90 | 82 +++++++++++++++----- 2 files changed, 79 insertions(+), 22 deletions(-) diff --git a/Sources/Process/Results_Mod/Save_Results.f90 b/Sources/Process/Results_Mod/Save_Results.f90 index 4e46f15d9..37cdd956c 100644 --- a/Sources/Process/Results_Mod/Save_Results.f90 +++ b/Sources/Process/Results_Mod/Save_Results.f90 @@ -393,7 +393,7 @@ subroutine Save_Results(Results, & end if !--------------------! - ! Processor i.d. ! + ! Cell processor ! !--------------------! do c1 = c_f, c_l int_save(c1) = Grid % Comm % cell_proc(c1) @@ -405,6 +405,14 @@ subroutine Save_Results(Results, & int_save(c_f:c_l), & f8, f9, data_offset, run) + !-----------------! + ! Cell thread ! + !-----------------! + int_save(c_f:c_l) = Grid % cell_thread(c_f:c_l) + call Results % Save_Scalar_Int("Grid Thread [1]", plot_inside, & + int_save(c_f:c_l), & + f8, f9, data_offset, run) + !-------------------! ! Domain number ! !-------------------! @@ -841,6 +849,15 @@ subroutine Save_Results(Results, & plot_inside, & Grid % vol(c_f:c_l), & f8, f9, data_offset, run) + call Results % Save_Tensor_6_Real("Grid Cell Inertia [m^2]", & + plot_inside, & + Grid % ixx(c_f:c_l), & + Grid % iyy(c_f:c_l), & + Grid % izz(c_f:c_l), & + Grid % ixy(c_f:c_l), & + Grid % iyz(c_f:c_l), & + Grid % ixz(c_f:c_l), & + f8, f9, data_offset, run) call Results % Save_Scalar_Real("Grid Wall Distance [m]", & plot_inside, & Grid % wall_dist(c_f:c_l), & diff --git a/Sources/Shared/Grid_Mod/Save_Vtu_Cells.f90 b/Sources/Shared/Grid_Mod/Save_Vtu_Cells.f90 index 532a82958..a95d38798 100644 --- a/Sources/Shared/Grid_Mod/Save_Vtu_Cells.f90 +++ b/Sources/Shared/Grid_Mod/Save_Vtu_Cells.f90 @@ -142,42 +142,61 @@ subroutine Save_Vtu_Cells(Grid, sub, n_nodes_sub, n_cells_sub) !---------------! write(fu) IN_3 // '' // LF - ! Processor i.d. + ! Cell processor write(str1, '(i0.0)') data_offset - write(fu) IN_4 // '' // LF + write(fu) IN_4 // '' // LF + write(fu) IN_4 // '' // LF + data_offset = data_offset + SP + n_cells_sub * IP ! prepare for next + + ! Cell thread + write(str1, '(i0.0)') data_offset + write(fu) IN_4 // '' // LF write(fu) IN_4 // '' // LF data_offset = data_offset + SP + n_cells_sub * IP ! prepare for next ! Number of nodes write(str1, '(i0.0)') data_offset - write(fu) IN_4 // '' // LF + write(fu) IN_4 // '' // LF write(fu) IN_4 // '' // LF data_offset = data_offset + SP + n_cells_sub * IP ! prepare for next ! Wall distance write(str1, '(i0.0)') data_offset - write(fu) IN_4 // '' // LF + write(fu) IN_4 // '' // LF write(fu) IN_4 // '' // LF data_offset = data_offset + SP + n_cells_sub * RP ! prepare for next ! Cell volume write(str1, '(i0.0)') data_offset - write(fu) IN_4 // '' // LF + write(fu) IN_4 // '' // LF write(fu) IN_4 // '' // LF data_offset = data_offset + SP + n_cells_sub * RP ! prepare for next + ! Cell inertia + write(str1, '(i0.0)') data_offset + write(fu) IN_4 // '' // LF + write(fu) IN_4 // '' // LF + data_offset = data_offset + SP + n_cells_sub * RP * 6 ! prepare for next + !------------! ! ! ! Footer ! @@ -314,7 +333,7 @@ subroutine Save_Vtu_Cells(Grid, sub, n_nodes_sub, n_cells_sub) ! Cell data ! !---------------! - ! Processor i.d. + ! Cell processor data_size = int(n_cells_sub * IP, SP) write(fu) data_size do c = 1, Grid % n_cells @@ -323,6 +342,15 @@ subroutine Save_Vtu_Cells(Grid, sub, n_nodes_sub, n_cells_sub) end if end do + ! Cell thread + data_size = int(n_cells_sub * IP, SP) + write(fu) data_size + do c = 1, Grid % n_cells + if(Grid % new_c(c) .ne. 0) then + write(fu) Grid % cell_thread(c) + end if + end do + ! Number of nodes data_size = int(n_cells_sub * IP, SP) write(fu) data_size @@ -350,6 +378,16 @@ subroutine Save_Vtu_Cells(Grid, sub, n_nodes_sub, n_cells_sub) end if end do + ! Cell inertia + data_size = int(n_cells_sub * RP * 6, SP) + write(fu) data_size + do c = 1, Grid % n_cells + if(Grid % new_c(c) .ne. 0) then + write(fu) Grid % ixx(c), Grid % iyy(c), Grid % izz(c), & + Grid % ixy(c), Grid % iyz(c), Grid % ixz(c) + end if + end do + write(fu) LF // IN_0 // '' // LF write(fu) IN_0 // '' // LF @@ -381,11 +419,13 @@ subroutine Save_Vtu_Cells(Grid, sub, n_nodes_sub, n_cells_sub) ! Data section is not mandatory, but very useful write(fu,'(a,a)') IN_2, '' write(fu,'(a,a)') IN_3, '' + ' Name="Grid Processor [1]"/>' + write(fu,'(a,a)') IN_3, '' write(fu,'(a,a)') IN_3, '' + ' Name="Grid Wall Distance [m]"/>' write(fu,'(a,a)') IN_3, '' + ' Name="Grid Cell Volume [m^3]"/>' write(fu,'(a,a)') IN_2, '' ! Write out the names of all the pieces From 574087f2ef7a214a25ae556fef7ce732127aa235 Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 13 Mar 2023 20:36:23 +0100 Subject: [PATCH 069/223] Added a script for Divide (Not sure how it went missing?) On branch bojan_fixed_cell_ranges new file: divide.scr --- Tests/Laminar/Module/divide.scr | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 Tests/Laminar/Module/divide.scr diff --git a/Tests/Laminar/Module/divide.scr b/Tests/Laminar/Module/divide.scr new file mode 100644 index 000000000..24c007bec --- /dev/null +++ b/Tests/Laminar/Module/divide.scr @@ -0,0 +1,2 @@ +module_dual +8 From 0e87141babb9fc7eeb86d66e01e178edeb038547 Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 14 Mar 2023 13:24:30 +0100 Subject: [PATCH 070/223] Introduced Grid % Determine_Threads On branch bojan_fixed_cell_ranges modified: Shared/Grid_Mod.f90 modified: Shared/Grid_Mod/Determine_Regions_Ranges.f90 new file: Shared/Grid_Mod/Determine_Threads.f90 modified: Shared/Grid_Mod/Load_Cfn.f90 --- Sources/Shared/Grid_Mod.f90 | 2 + .../Grid_Mod/Determine_Regions_Ranges.f90 | 33 -------------- Sources/Shared/Grid_Mod/Determine_Threads.f90 | 45 +++++++++++++++++++ Sources/Shared/Grid_Mod/Load_Cfn.f90 | 1 + 4 files changed, 48 insertions(+), 33 deletions(-) create mode 100644 Sources/Shared/Grid_Mod/Determine_Threads.f90 diff --git a/Sources/Shared/Grid_Mod.f90 b/Sources/Shared/Grid_Mod.f90 index b8884b916..b41a2de90 100644 --- a/Sources/Shared/Grid_Mod.f90 +++ b/Sources/Shared/Grid_Mod.f90 @@ -209,6 +209,7 @@ module Grid_Mod procedure :: Correct_Face_Surfaces procedure :: Decompose procedure :: Determine_Regions_Ranges + procedure :: Determine_Threads procedure :: Exchange_Cells_Int procedure :: Exchange_Cells_Log procedure :: Exchange_Cells_Real @@ -268,6 +269,7 @@ module Grid_Mod # include "Grid_Mod/Check_Cells_Closure.f90" # include "Grid_Mod/Decompose.f90" # include "Grid_Mod/Determine_Regions_Ranges.f90" +# include "Grid_Mod/Determine_Threads.f90" # include "Grid_Mod/Exchange_Cells_Int.f90" # include "Grid_Mod/Exchange_Cells_Log.f90" # include "Grid_Mod/Exchange_Cells_Real.f90" diff --git a/Sources/Shared/Grid_Mod/Determine_Regions_Ranges.f90 b/Sources/Shared/Grid_Mod/Determine_Regions_Ranges.f90 index 4d650f8cb..e5c274dd7 100644 --- a/Sources/Shared/Grid_Mod/Determine_Regions_Ranges.f90 +++ b/Sources/Shared/Grid_Mod/Determine_Regions_Ranges.f90 @@ -11,7 +11,6 @@ subroutine Determine_Regions_Ranges(Grid) logical, parameter :: DEBUG = .false. !-----------------------------------[Locals]-----------------------------------! integer :: c, c1, c2, reg, s, siz - integer :: c_f, c_l, s_f, s_l ! first/last cell, first/last face !==============================================================================! !-------------------! @@ -182,36 +181,4 @@ subroutine Determine_Regions_Ranges(Grid) end do end do - !--------------------------! - ! ! - ! Take care of threads ! - ! ! - !--------------------------! - Grid % n_threads = 0 -# ifdef _OPENMP - Grid % n_threads = omp_get_max_threads() -# endif - - !----------------------------------------------------------! - ! If there is more than one thread, decompose the mesh ! - !----------------------------------------------------------! - if(PROGRAM_NAME == "Process" .and. & - Grid % n_threads > 1) then - - ! Set the face range to the inside faces - s_f = Grid % region % f_face(Grid % n_regions) - s_l = Grid % region % l_face(Grid % n_regions) - - ! Create METIS - call Metis % Create_Metis(s_f, s_l, Grid % faces_c, Grid % n_threads) - - ! Set the cell range to the inside faces - c_f = Grid % region % f_cell(Grid % n_regions) - c_l = Grid % region % l_cell(Grid % n_regions) - - ! Call METIS - call Metis % Call_Metis(Grid % n_threads, & - Grid % cell_thread(c_f:c_l)) - end if - end subroutine diff --git a/Sources/Shared/Grid_Mod/Determine_Threads.f90 b/Sources/Shared/Grid_Mod/Determine_Threads.f90 new file mode 100644 index 000000000..32c3a3aba --- /dev/null +++ b/Sources/Shared/Grid_Mod/Determine_Threads.f90 @@ -0,0 +1,45 @@ +!==============================================================================! + subroutine Determine_Threads(Grid) +!------------------------------------------------------------------------------! +! Take care of threads for OpenMP ! +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Grid_Type), intent(inout) :: Grid +!------------------------------[Local parameters]------------------------------! + logical, parameter :: DEBUG = .false. +!-----------------------------------[Locals]-----------------------------------! + integer :: c_f, c_l, s_f, s_l ! first/last cell, first/last face +!==============================================================================! + + !----------------------------! + ! Find number of threads ! + !----------------------------! + Grid % n_threads = 0 +# ifdef _OPENMP + Grid % n_threads = omp_get_max_threads() +# endif + + !----------------------------------------------------------! + ! If there is more than one thread, decompose the mesh ! + !----------------------------------------------------------! + if(PROGRAM_NAME == "Process" .and. & + Grid % n_threads > 1) then + + ! Set the face range to the inside faces + s_f = Grid % region % f_face(Grid % n_regions) + s_l = Grid % region % l_face(Grid % n_regions) + + ! Create METIS + call Metis % Create_Metis(s_f, s_l, Grid % faces_c, Grid % n_threads) + + ! Set the cell range to the inside faces + c_f = Grid % region % f_cell(Grid % n_regions) + c_l = Grid % region % l_cell(Grid % n_regions) + + ! Call METIS + call Metis % Call_Metis(Grid % n_threads, & + Grid % cell_thread(c_f:c_l)) + end if + + end subroutine diff --git a/Sources/Shared/Grid_Mod/Load_Cfn.f90 b/Sources/Shared/Grid_Mod/Load_Cfn.f90 index b0914df6a..ad680fb1b 100644 --- a/Sources/Shared/Grid_Mod/Load_Cfn.f90 +++ b/Sources/Shared/Grid_Mod/Load_Cfn.f90 @@ -268,6 +268,7 @@ subroutine Load_Cfn(Grid, this_proc, domain) Grid % region % at_face(1:Grid % n_faces) = 0 call Grid % Determine_Regions_Ranges() + call Grid % Determine_Threads() close(fu) From b880cc87438078f5510ad9fa5cb06a9ef4b12470 Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 14 Mar 2023 21:17:17 +0100 Subject: [PATCH 071/223] IMPORTANT: Renamed option OPENMP to OMP Makes more sense since option for Message Passing Interface is only three letters long, so better do the same for OpenMP On branch bojan_fixed_cell_ranges modified: Convert/makefile modified: Divide/makefile modified: Generate/makefile modified: Process/makefile --- Sources/Convert/makefile | 12 ++++++------ Sources/Divide/makefile | 10 +++++----- Sources/Generate/makefile | 12 ++++++------ Sources/Process/makefile | 10 +++++----- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/Sources/Convert/makefile b/Sources/Convert/makefile index 71bd82c8a..4cc0a0d0f 100644 --- a/Sources/Convert/makefile +++ b/Sources/Convert/makefile @@ -12,7 +12,7 @@ DEBUG ?= no ASSERT ?= yes REAL ?= double MPI ?= no -OPENMP ?= yes +OMP ?= yes # Directories for objects and modules. (No need to change.) DIR_BINARY = ../../Binaries @@ -50,7 +50,7 @@ $(info #-----------------------------------------------------------------------) $(info # Usage: ) $(info # make ) $(info # ) -$(info # ) +$(info # ) $(info # ) $(info # Note: The first item, for each of the options above, is the default. ) $(info # ) @@ -59,7 +59,7 @@ $(info # make - compile with gnu compiler ) $(info # make FORTAN=intel - compile with intel compiler ) $(info # make DEBUG=yes - compile with gnu compiler in debug mode ) $(info # make ASSERT=no - compile without assert with gnu compiler ) -$(info # make OPENMP=yes - compile with gnu compiler for parallel Convert ) +$(info # make OMP=yes - compile with gnu compiler for parallel Convert ) $(info #-----------------------------------------------------------------------) #------------------- @@ -92,7 +92,7 @@ ifeq ($(FORTRAN), intel) ifeq ($(REAL), double) OPT_F_COMP += -r8 endif - ifeq ($(OPENMP), yes) + ifeq ($(OMP), yes) OPT_F_COMP += -qopenmp endif @@ -111,7 +111,7 @@ else ifeq ($(FORTRAN), nvidia) ifeq ($(REAL), double) OPT_F_COMP += -r8 endif - ifeq ($(OPENMP), yes) + ifeq ($(OMP), yes) OPT_F_COMP += -mp endif @@ -139,7 +139,7 @@ else ifeq ($(REAL), double) OPT_F_COMP += -fdefault-real-8 endif - ifeq ($(OPENMP), yes) + ifeq ($(OMP), yes) OPT_F_COMP += -fopenmp endif endif diff --git a/Sources/Divide/makefile b/Sources/Divide/makefile index f71ef3cdb..2ed90806e 100644 --- a/Sources/Divide/makefile +++ b/Sources/Divide/makefile @@ -12,7 +12,7 @@ DEBUG ?= no ASSERT ?= yes REAL ?= double MPI ?= no -OPENMP ?= no +OMP ?= no # Directories for objects and modules. (No need to change.) DIR_BINARY = ../../Binaries @@ -50,7 +50,7 @@ $(info #-----------------------------------------------------------------------) $(info # Usage: ) $(info # make ) $(info # ) -$(info # ) +$(info # ) $(info # ) $(info # Note: The first item, for each of the options above, is the default. ) $(info # ) @@ -90,7 +90,7 @@ ifeq ($(FORTRAN), intel) ifeq ($(REAL), double) OPT_F_COMP += -r8 endif - ifeq ($(OPENMP), yes) + ifeq ($(OMP), yes) OPT_F_COMP += -qopenmp endif @@ -109,7 +109,7 @@ else ifeq ($(FORTRAN), nvidia) ifeq ($(REAL), double) OPT_F_COMP += -r8 endif - ifeq ($(OPENMP), yes) + ifeq ($(OMP), yes) OPT_F_COMP += -mp endif @@ -137,7 +137,7 @@ else ifeq ($(REAL), double) OPT_F_COMP += -fdefault-real-8 endif - ifeq ($(OPENMP), yes) + ifeq ($(OMP), yes) OPT_F_COMP += -fopenmp endif endif diff --git a/Sources/Generate/makefile b/Sources/Generate/makefile index 935632f5e..c35f98415 100644 --- a/Sources/Generate/makefile +++ b/Sources/Generate/makefile @@ -12,7 +12,7 @@ DEBUG ?= no ASSERT ?= yes REAL ?= double MPI ?= no -OPENMP ?= yes +OMP ?= yes # Directories for objects and modules. (No need to change.) DIR_BINARY = ../../Binaries @@ -50,7 +50,7 @@ $(info #-----------------------------------------------------------------------) $(info # Usage: ) $(info # make ) $(info # ) -$(info # ) +$(info # ) $(info # ) $(info # Note: The first item, for each of the options above, is the default. ) $(info # ) @@ -59,7 +59,7 @@ $(info # make - compile with gnu compiler ) $(info # make FORTAN=intel - compile with intel compiler ) $(info # make DEBUG=yes - compile with gnu compiler in debug mode ) $(info # make ASSERT=no - compile without assert with gnu compiler ) -$(info # make OPENMP=yes - compile with gnu compiler for parallel Generate ) +$(info # make OMP=yes - compile with gnu compiler for parallel Generate ) $(info #-----------------------------------------------------------------------) #------------------- @@ -91,7 +91,7 @@ ifeq ($(FORTRAN), intel) ifeq ($(REAL), double) OPT_F_COMP += -r8 endif - ifeq ($(OPENMP), yes) + ifeq ($(OMP), yes) OPT_F_COMP += -qopenmp endif @@ -110,7 +110,7 @@ else ifeq ($(FORTRAN), nvidia) ifeq ($(REAL), double) OPT_F_COMP += -r8 endif - ifeq ($(OPENMP), yes) + ifeq ($(OMP), yes) OPT_F_COMP += -mp endif @@ -138,7 +138,7 @@ else ifeq ($(REAL), double) OPT_F_COMP += -fdefault-real-8 endif - ifeq ($(OPENMP), yes) + ifeq ($(OMP), yes) OPT_F_COMP += -fopenmp endif endif diff --git a/Sources/Process/makefile b/Sources/Process/makefile index 98ea3051f..593228df6 100644 --- a/Sources/Process/makefile +++ b/Sources/Process/makefile @@ -12,7 +12,7 @@ DEBUG ?= no ASSERT ?= yes REAL ?= double MPI ?= no -OPENMP ?= no +OMP ?= no # Directories for objects and modules. (No need to change.) DIR_BINARY = ../../Binaries @@ -55,7 +55,7 @@ $(info #-----------------------------------------------------------------------) $(info # Usage: ) $(info # make ) $(info # ) -$(info # ) +$(info # ) $(info # ) $(info # ) $(info # Notes: ) @@ -101,7 +101,7 @@ ifeq ($(FORTRAN), intel) ifeq ($(REAL), double) OPT_F_COMP += -r8 endif - ifeq ($(OPENMP), yes) + ifeq ($(OMP), yes) OPT_F_COMP += -qopenmp endif @@ -120,7 +120,7 @@ else ifeq ($(FORTRAN), nvidia) ifeq ($(REAL), double) OPT_F_COMP += -r8 endif - ifeq ($(OPENMP), yes) + ifeq ($(OMP), yes) OPT_F_COMP += -mp endif @@ -148,7 +148,7 @@ else ifeq ($(REAL), double) OPT_F_COMP += -fdefault-real-8 endif - ifeq ($(OPENMP), yes) + ifeq ($(OMP), yes) OPT_F_COMP += -fopenmp endif endif From 807fa3e656da300b013e84f7e28f1ee5cdd1c999 Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 14 Mar 2023 21:21:03 +0100 Subject: [PATCH 072/223] Gave member function a more meaningful name: Sort_Cells_Smart -> Sort_Cells_By_Coordinates First I called it "Smart" believing it will be able to reduce matrix bandwidth thus leading to increase in performance, but it never materialized. It only sorts cells by coordinates. On branch bojan_fixed_cell_ranges modified: Convert/Main_Con.f90 modified: Generate/Main_Gen.f90 modified: Shared/Grid_Mod.f90 renamed: Shared/Grid_Mod/Sort_Cells_Smart.f90 -> Shared/Grid_Mod/Sort_Cells_By_Coordinates.f90 --- Sources/Convert/Main_Con.f90 | 2 +- Sources/Generate/Main_Gen.f90 | 8 ++++---- Sources/Shared/Grid_Mod.f90 | 4 ++-- ...Sort_Cells_Smart.f90 => Sort_Cells_By_Coordinates.f90} | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) rename Sources/Shared/Grid_Mod/{Sort_Cells_Smart.f90 => Sort_Cells_By_Coordinates.f90} (98%) diff --git a/Sources/Convert/Main_Con.f90 b/Sources/Convert/Main_Con.f90 index 8cb94c935..da7dc5515 100644 --- a/Sources/Convert/Main_Con.f90 +++ b/Sources/Convert/Main_Con.f90 @@ -152,7 +152,7 @@ program Convert_Prog ! Keep in mind that Grid_Mod_Calculate_Wall_Distance is ... ! ... faster if it is called after Grid_Mod_Sort_Faces_Smart - call Grid(g) % Sort_Cells_Smart() + call Grid(g) % Sort_Cells_By_Coordinates() call Grid(g) % Sort_Faces_Smart() if( (g-n_grids) .eq. 0) then diff --git a/Sources/Generate/Main_Gen.f90 b/Sources/Generate/Main_Gen.f90 index 432bc28db..0f43791a9 100644 --- a/Sources/Generate/Main_Gen.f90 +++ b/Sources/Generate/Main_Gen.f90 @@ -52,10 +52,10 @@ program Generate_Prog call Refines_Mod_Connectivity (refines, Grid, .true.) ! real run call Generate % Calculate_Geometry(Grid, .true.) - call Grid % Sort_Cells_Smart () - call Grid % Sort_Faces_Smart () - call Grid % Calculate_Wall_Distance() - call Grid % Find_Cells_Faces () + call Grid % Sort_Cells_By_Coordinates() + call Grid % Sort_Faces_Smart () + call Grid % Calculate_Wall_Distance () + call Grid % Find_Cells_Faces () ! Prepare for saving call Grid % Initialize_New_Numbers() diff --git a/Sources/Shared/Grid_Mod.f90 b/Sources/Shared/Grid_Mod.f90 index b41a2de90..8080f01ef 100644 --- a/Sources/Shared/Grid_Mod.f90 +++ b/Sources/Shared/Grid_Mod.f90 @@ -236,7 +236,7 @@ module Grid_Mod procedure :: Save_Vtu_Edges procedure :: Save_Vtu_Faces procedure :: Sort_Cells_By_Index - procedure :: Sort_Cells_Smart + procedure :: Sort_Cells_By_Coordinates procedure :: Sort_Faces_By_Index procedure :: Sort_Faces_Smart procedure :: Write_Template_Control_File @@ -295,7 +295,7 @@ module Grid_Mod # include "Grid_Mod/Save_Vtu_Edges.f90" # include "Grid_Mod/Save_Vtu_Faces.f90" # include "Grid_Mod/Sort_Cells_By_Index.f90" -# include "Grid_Mod/Sort_Cells_Smart.f90" +# include "Grid_Mod/Sort_Cells_By_Coordinates.f90" # include "Grid_Mod/Sort_Faces_By_Index.f90" # include "Grid_Mod/Sort_Faces_Smart.f90" # include "Grid_Mod/Write_Template_Control_File.f90" diff --git a/Sources/Shared/Grid_Mod/Sort_Cells_Smart.f90 b/Sources/Shared/Grid_Mod/Sort_Cells_By_Coordinates.f90 similarity index 98% rename from Sources/Shared/Grid_Mod/Sort_Cells_Smart.f90 rename to Sources/Shared/Grid_Mod/Sort_Cells_By_Coordinates.f90 index 3cd0ca41b..2754d4188 100644 --- a/Sources/Shared/Grid_Mod/Sort_Cells_Smart.f90 +++ b/Sources/Shared/Grid_Mod/Sort_Cells_By_Coordinates.f90 @@ -1,11 +1,11 @@ !==============================================================================! - subroutine Sort_Cells_Smart(Grid) + subroutine Sort_Cells_By_Coordinates(Grid) !------------------------------------------------------------------------------! ! Sorts cells by their geometrical positions. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Grid_Type) :: Grid + class(Grid_Type), intent(inout) :: Grid !-----------------------------------[Locals]-----------------------------------! integer :: s, c, c1, c2, n integer :: mcc, mcn, mcf From 6178fdf3fe2d2d224fdf1fc8b4ea587e730e2f9c Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 14 Mar 2023 21:48:21 +0100 Subject: [PATCH 073/223] Gave another member function more meaningful name: Sort_Faces_Smart -> Sort_Faces_By_Region Altough it is certainly not stupid to sor faces by regions "Smart" is a too generic of a name. "By_Region" is exactly what it is. On branch bojan_fixed_cell_ranges modified: Convert/Main_Con.f90 modified: Generate/Main_Gen.f90 modified: Shared/Grid_Mod.f90 renamed: Shared/Grid_Mod/Sort_Faces_Smart.f90 -> Shared/Grid_Mod/Sort_Faces_By_Region.f90 --- Sources/Convert/Main_Con.f90 | 4 ++-- Sources/Generate/Main_Gen.f90 | 2 +- Sources/Shared/Grid_Mod.f90 | 4 ++-- .../{Sort_Faces_Smart.f90 => Sort_Faces_By_Region.f90} | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) rename Sources/Shared/Grid_Mod/{Sort_Faces_Smart.f90 => Sort_Faces_By_Region.f90} (99%) diff --git a/Sources/Convert/Main_Con.f90 b/Sources/Convert/Main_Con.f90 index da7dc5515..d211d5435 100644 --- a/Sources/Convert/Main_Con.f90 +++ b/Sources/Convert/Main_Con.f90 @@ -151,10 +151,10 @@ program Convert_Prog call Convert % Calculate_Geometry(Grid(g), g-n_grids) ! if zero, ask ! Keep in mind that Grid_Mod_Calculate_Wall_Distance is ... - ! ... faster if it is called after Grid_Mod_Sort_Faces_Smart + ! ... faster if it is called after Grid_Mod_Sort_Faces_By_Region call Grid(g) % Sort_Cells_By_Coordinates() - call Grid(g) % Sort_Faces_Smart() + call Grid(g) % Sort_Faces_By_Region() if( (g-n_grids) .eq. 0) then call Grid(g) % Calculate_Wall_Distance() end if diff --git a/Sources/Generate/Main_Gen.f90 b/Sources/Generate/Main_Gen.f90 index 0f43791a9..8ef442521 100644 --- a/Sources/Generate/Main_Gen.f90 +++ b/Sources/Generate/Main_Gen.f90 @@ -53,7 +53,7 @@ program Generate_Prog call Generate % Calculate_Geometry(Grid, .true.) call Grid % Sort_Cells_By_Coordinates() - call Grid % Sort_Faces_Smart () + call Grid % Sort_Faces_By_Region () call Grid % Calculate_Wall_Distance () call Grid % Find_Cells_Faces () diff --git a/Sources/Shared/Grid_Mod.f90 b/Sources/Shared/Grid_Mod.f90 index 8080f01ef..2d6834f12 100644 --- a/Sources/Shared/Grid_Mod.f90 +++ b/Sources/Shared/Grid_Mod.f90 @@ -238,7 +238,7 @@ module Grid_Mod procedure :: Sort_Cells_By_Index procedure :: Sort_Cells_By_Coordinates procedure :: Sort_Faces_By_Index - procedure :: Sort_Faces_Smart + procedure :: Sort_Faces_By_Region procedure :: Write_Template_Control_File end type @@ -297,7 +297,7 @@ module Grid_Mod # include "Grid_Mod/Sort_Cells_By_Index.f90" # include "Grid_Mod/Sort_Cells_By_Coordinates.f90" # include "Grid_Mod/Sort_Faces_By_Index.f90" -# include "Grid_Mod/Sort_Faces_Smart.f90" +# include "Grid_Mod/Sort_Faces_By_Region.f90" # include "Grid_Mod/Write_Template_Control_File.f90" end module diff --git a/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 b/Sources/Shared/Grid_Mod/Sort_Faces_By_Region.f90 similarity index 99% rename from Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 rename to Sources/Shared/Grid_Mod/Sort_Faces_By_Region.f90 index cbcc96d7f..051df14f0 100644 --- a/Sources/Shared/Grid_Mod/Sort_Faces_Smart.f90 +++ b/Sources/Shared/Grid_Mod/Sort_Faces_By_Region.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Sort_Faces_Smart(Grid) + subroutine Sort_Faces_By_Region(Grid) !------------------------------------------------------------------------------! ! Sorts array of faces in a smart way. That would mean boundary faces ! ! first, boundary region by boundary region, then inside faces, then ! @@ -10,7 +10,7 @@ subroutine Sort_Faces_Smart(Grid) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Grid_Type) :: Grid + class(Grid_Type), intent(inout) :: Grid !------------------------------[Local parameters]------------------------------! logical, parameter :: DEBUG = .false. !-----------------------------------[Locals]-----------------------------------! From 79f18d32a341ff474ba897706eea84dbb35a615a Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 14 Mar 2023 22:15:53 +0100 Subject: [PATCH 074/223] Added a missing "!$omp end parallel do" On branch bojan_fixed_cell_ranges modified: Process/Field_Mod/Gradients/Grad_Gauss_Pressure.f90 --- Sources/Process/Field_Mod/Gradients/Grad_Gauss_Pressure.f90 | 1 + 1 file changed, 1 insertion(+) diff --git a/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Pressure.f90 b/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Pressure.f90 index 5ebc551c5..5d532b56d 100644 --- a/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Pressure.f90 +++ b/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Pressure.f90 @@ -73,6 +73,7 @@ subroutine Grad_Gauss_Pressure(Flow, p) c_visited(c) = 0 end if end do + !$omp end parallel do ! It seems these are not needed !? call Grid % Exchange_Cells_Real(p % x) From 01e04e781b2d8b1b0e26ed22a55008d7bfa38677 Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 14 Mar 2023 22:45:36 +0100 Subject: [PATCH 075/223] Added an additional check on how faces are sorted On branch bojan_fixed_cell_ranges modified: Shared/Grid_Mod/Determine_Regions_Ranges.f90 --- .../Grid_Mod/Determine_Regions_Ranges.f90 | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/Sources/Shared/Grid_Mod/Determine_Regions_Ranges.f90 b/Sources/Shared/Grid_Mod/Determine_Regions_Ranges.f90 index e5c274dd7..c86cac43e 100644 --- a/Sources/Shared/Grid_Mod/Determine_Regions_Ranges.f90 +++ b/Sources/Shared/Grid_Mod/Determine_Regions_Ranges.f90 @@ -11,6 +11,7 @@ subroutine Determine_Regions_Ranges(Grid) logical, parameter :: DEBUG = .false. !-----------------------------------[Locals]-----------------------------------! integer :: c, c1, c2, reg, s, siz + integer :: last_face_only_inside, first_face_in_buffers !==============================================================================! !-------------------! @@ -159,6 +160,25 @@ subroutine Determine_Regions_Ranges(Grid) Assert(c2 > 0) end do + !-------------! + ! Check 2 ! + !-------------! + last_face_only_inside = 0 + first_face_in_buffers = HUGE_INT ! first face in buffers + do s = Faces_In_Domain() + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + if(Grid % Comm % cell_proc(c1) .eq. this_proc .and. & + Grid % Comm % cell_proc(c2) .eq. this_proc) then + last_face_only_inside = max(last_face_only_inside, s) + end if + if(Grid % Comm % cell_proc(c1) .eq. this_proc .and. & + Grid % Comm % cell_proc(c2) .ne. this_proc) then + first_face_in_buffers = min(first_face_in_buffers, s) + end if + end do + Assert(last_face_only_inside < first_face_in_buffers) + if(DEBUG) then write(2000+this_proc, '(a,a)') ' # Face ranges from ', PROGRAM_NAME do reg = All_Regions() @@ -172,7 +192,7 @@ subroutine Determine_Regions_Ranges(Grid) end if !-------------! - ! Check 2 ! + ! Check 3 ! !-------------! do reg = Boundary_Regions() do s = Faces_In_Region(reg) From d40f02197081cfd33972178b779ea5dff9a2843a Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 15 Mar 2023 10:36:41 +0100 Subject: [PATCH 076/223] New macro: Cells_In_Buffers() On branch bojan_fixed_cell_ranges modified: Shared/Browse.h90 --- Sources/Shared/Browse.h90 | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/Sources/Shared/Browse.h90 b/Sources/Shared/Browse.h90 index bd68effb8..9f5af006f 100644 --- a/Sources/Shared/Browse.h90 +++ b/Sources/Shared/Browse.h90 @@ -2,34 +2,38 @@ ! Definition of potentially usefull macros in T-Flows. ! !------------------------------------------------------------------------------! -# define Boundary_Regions() \ +# define Boundary_Regions() \ 1, Grid % n_bnd_regions -# define Boundary_And_Inside_Regions() \ +# define Boundary_And_Inside_Regions() \ 1, Grid % n_regions -# define Boundary_Inside_And_Buffer_Regions() \ +# define Boundary_Inside_And_Buffer_Regions() \ 1, Grid % n_regions + 1 -# define All_Regions() \ +# define All_Regions() \ 1, Grid % n_bnd_regions + 5 -# define Faces_In_Region(reg) \ - Grid % region % f_face(reg), \ +# define Faces_In_Region(reg) \ + Grid % region % f_face(reg), \ Grid % region % l_face(reg) -# define Faces_In_Domain() \ - Grid % region % f_face(Grid % n_regions), \ +# define Faces_In_Domain() \ + Grid % region % f_face(Grid % n_regions), \ Grid % region % l_face(Grid % n_regions) -# define Cells_In_Region(reg) \ - Grid % region % f_cell(reg), \ +# define Cells_In_Region(reg) \ + Grid % region % f_cell(reg), \ Grid % region % l_cell(reg) -# define Cells_In_Domain() \ - Grid % region % f_cell(Grid % n_regions), \ +# define Cells_In_Domain() \ + Grid % region % f_cell(Grid % n_regions), \ Grid % region % l_cell(Grid % n_regions) -# define Cells_In_Domain_And_Buffers() \ - Grid % region % f_cell(Grid % n_regions), \ +# define Cells_In_Domain_And_Buffers() \ + Grid % region % f_cell(Grid % n_regions), \ + Grid % region % l_cell(Grid % n_regions + 1) + +# define Cells_In_Buffers() \ + Grid % region % f_cell(Grid % n_regions + 1), \ Grid % region % l_cell(Grid % n_regions + 1) From 5f588cbe7e266d14c054d3f39a4b1ff61ae8cef6 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 15 Mar 2023 10:39:25 +0100 Subject: [PATCH 077/223] Call to Determine_Threads is better of in Main_Pro Because it should be called after Load_Dim and it should not be called from Divide. On branch bojan_fixed_cell_ranges modified: Process/Main_Pro.f90 modified: Shared/Grid_Mod/Load_Cfn.f90 --- Sources/Process/Main_Pro.f90 | 1 + Sources/Shared/Grid_Mod/Load_Cfn.f90 | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Process/Main_Pro.f90 b/Sources/Process/Main_Pro.f90 index 043440f83..f9cb25b19 100644 --- a/Sources/Process/Main_Pro.f90 +++ b/Sources/Process/Main_Pro.f90 @@ -85,6 +85,7 @@ program Process_Prog ! Load the finite volume Grid call Grid(d) % Load_Cfn(this_proc, domain=d) call Grid(d) % Load_Dim(this_proc, domain=d) + call Grid(d) % Determine_Threads() call Grid(d) % Calculate_Face_Geometry() ! Find communication patterns diff --git a/Sources/Shared/Grid_Mod/Load_Cfn.f90 b/Sources/Shared/Grid_Mod/Load_Cfn.f90 index ad680fb1b..b0914df6a 100644 --- a/Sources/Shared/Grid_Mod/Load_Cfn.f90 +++ b/Sources/Shared/Grid_Mod/Load_Cfn.f90 @@ -268,7 +268,6 @@ subroutine Load_Cfn(Grid, this_proc, domain) Grid % region % at_face(1:Grid % n_faces) = 0 call Grid % Determine_Regions_Ranges() - call Grid % Determine_Threads() close(fu) From bed15f66482e459f837e4213c81f4653f768fbf3 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 15 Mar 2023 10:41:14 +0100 Subject: [PATCH 078/223] RISKY: Removed a condition when forming copy bcs Without this, copy boundary condition wouldn't work when cells are sorted in threads. On branch bojan_fixed_cell_ranges modified: Shared/Grid_Mod/Calculate_Face_Geometry.f90 --- .../Grid_Mod/Calculate_Face_Geometry.f90 | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 b/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 index 8fd76670b..819d58569 100644 --- a/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 +++ b/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 @@ -192,28 +192,22 @@ subroutine Calculate_Face_Geometry(Grid) if(abs(Grid % dx(s)) > PICO) then if(abs(Grid % xc(c2) - Grid % xc(c1) ) > 1.5 * abs(Grid % dx(s))) then - if(Grid % xc(c2) > Grid % xc(c1)) then - Assert(Grid % faces_s(s) > 0) - Grid % region % at_face(s) = Grid % per_x_reg - end if + Assert(Grid % faces_s(s) > 0) + Grid % region % at_face(s) = Grid % per_x_reg end if end if if(abs(Grid % dy(s)) > PICO) then if(abs(Grid % yc(c2) - Grid % yc(c1) ) > 1.5 * abs(Grid % dy(s))) then - if(Grid % yc(c2) > Grid % yc(c1)) then - Assert(Grid % faces_s(s) > 0) - Grid % region % at_face(s) = Grid % per_y_reg - end if + Assert(Grid % faces_s(s) > 0) + Grid % region % at_face(s) = Grid % per_y_reg end if end if if(abs(Grid % dz(s)) > PICO) then if(abs(Grid % zc(c2) - Grid % zc(c1) ) > 1.5 * abs(Grid % dz(s))) then - if(Grid % zc(c2) > Grid % zc(c1)) then - Assert(Grid % faces_s(s) > 0) - Grid % region % at_face(s) = Grid % per_z_reg - end if + Assert(Grid % faces_s(s) > 0) + Grid % region % at_face(s) = Grid % per_z_reg end if end if From 8881b08b85c00f2da84bf2c3051df92189098658 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 15 Mar 2023 10:42:56 +0100 Subject: [PATCH 079/223] cell_glo and node_glo are now arrays. They can't be sent to sorting routines as pointers. On branch bojan_fixed_cell_ranges modified: Shared/Comm_Mod.f90 --- Sources/Shared/Comm_Mod.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/Shared/Comm_Mod.f90 b/Sources/Shared/Comm_Mod.f90 index 56d9a31e5..8f0371c18 100644 --- a/Sources/Shared/Comm_Mod.f90 +++ b/Sources/Shared/Comm_Mod.f90 @@ -36,8 +36,8 @@ module Comm_Mod integer, allocatable :: cell_proc(:) ! Global cell and node numbers - integer, contiguous, pointer :: cell_glo(:) - integer, contiguous, pointer :: node_glo(:) + integer, allocatable :: cell_glo(:) + integer, allocatable :: node_glo(:) ! Variables which follow are for backup saving to single file integer :: nc_sub ! number of cells in subdomain From 5fbcc802c79f2024bd2bfa5513b95f42a343c819 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 15 Mar 2023 11:37:11 +0100 Subject: [PATCH 080/223] Modernized and cleand the coding a little bit. That translates to setting inetion to procedure arguments, declaring some as pure and removing unused arguments. This wasn't a hell of important, and I also didn't thoroughly test it. At this stage I only know they compile. Test will tell more, On branch bojan_fixed_cell_ranges modified: Sources/Shared/Isoap_Mod/Extract_Iso_Polygons.f90 modified: Sources/Shared/Polyhedron_Mod/Allocate_Polyhedron.f90 modified: Sources/Shared/Polyhedron_Mod/Calculate_Cell_Centroid.f90 modified: Sources/Shared/Polyhedron_Mod/Calculate_Cell_Volume.f90 modified: Sources/Shared/Polyhedron_Mod/Calculate_Face_Centroid.f90 modified: Sources/Shared/Polyhedron_Mod/Extract_From_Grid.f90 --- Sources/Shared/Isoap_Mod/Extract_Iso_Polygons.f90 | 8 ++++---- Sources/Shared/Polyhedron_Mod/Allocate_Polyhedron.f90 | 6 +++--- Sources/Shared/Polyhedron_Mod/Calculate_Cell_Centroid.f90 | 7 +++---- Sources/Shared/Polyhedron_Mod/Calculate_Cell_Volume.f90 | 8 ++++---- Sources/Shared/Polyhedron_Mod/Calculate_Face_Centroid.f90 | 8 ++++---- Sources/Shared/Polyhedron_Mod/Extract_From_Grid.f90 | 8 ++++---- 6 files changed, 22 insertions(+), 23 deletions(-) diff --git a/Sources/Shared/Isoap_Mod/Extract_Iso_Polygons.f90 b/Sources/Shared/Isoap_Mod/Extract_Iso_Polygons.f90 index 2e31f9666..604bd823b 100644 --- a/Sources/Shared/Isoap_Mod/Extract_Iso_Polygons.f90 +++ b/Sources/Shared/Isoap_Mod/Extract_Iso_Polygons.f90 @@ -3,10 +3,10 @@ subroutine Extract_Iso_Polygons(Isoap, Grid, cell, phi_n) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Isoap_Type) :: Isoap - type(Grid_Type) :: Grid - integer, intent(in) :: cell - real :: phi_n(:) + class(Isoap_Type), intent(out) :: Isoap + type(Grid_Type), target, intent(in) :: Grid + integer, intent(in) :: cell + real, optional, intent(in) :: phi_n(:) !------------------------------[Local parameters]------------------------------! logical, parameter :: DEBUG = .false. ! if true, a lot of files are created !-----------------------------------[Locals]-----------------------------------! diff --git a/Sources/Shared/Polyhedron_Mod/Allocate_Polyhedron.f90 b/Sources/Shared/Polyhedron_Mod/Allocate_Polyhedron.f90 index 47a2e97b3..6d8697668 100644 --- a/Sources/Shared/Polyhedron_Mod/Allocate_Polyhedron.f90 +++ b/Sources/Shared/Polyhedron_Mod/Allocate_Polyhedron.f90 @@ -5,9 +5,9 @@ subroutine Allocate_Polyhedron(Pol, n_faces, n_nodes) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Polyhedron_Type) :: Pol - integer, intent(in) :: n_faces - integer, intent(in) :: n_nodes + class(Polyhedron_Type), intent(out) :: Pol + integer, intent(in) :: n_faces + integer, intent(in) :: n_nodes !==============================================================================! allocate(Pol % faces_n_nodes(n_faces)) diff --git a/Sources/Shared/Polyhedron_Mod/Calculate_Cell_Centroid.f90 b/Sources/Shared/Polyhedron_Mod/Calculate_Cell_Centroid.f90 index df18305c7..b25f39753 100644 --- a/Sources/Shared/Polyhedron_Mod/Calculate_Cell_Centroid.f90 +++ b/Sources/Shared/Polyhedron_Mod/Calculate_Cell_Centroid.f90 @@ -1,13 +1,12 @@ !==============================================================================! - subroutine Calculate_Cell_Centroid(Pol, cell, xc, yc, zc) + pure subroutine Calculate_Cell_Centroid(Pol, xc, yc, zc) !------------------------------------------------------------------------------! ! Calculate cell's centroid, this information is not stored in Polyledron ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Polyhedron_Type) :: Pol - integer, intent(in) :: cell - real, intent(out) :: xc, yc, zc + class(Polyhedron_Type), intent(in) :: Pol + real, intent(out) :: xc, yc, zc !-----------------------------------[Locals]-----------------------------------! integer :: i !==============================================================================! diff --git a/Sources/Shared/Polyhedron_Mod/Calculate_Cell_Volume.f90 b/Sources/Shared/Polyhedron_Mod/Calculate_Cell_Volume.f90 index 33401083e..c68186d7b 100644 --- a/Sources/Shared/Polyhedron_Mod/Calculate_Cell_Volume.f90 +++ b/Sources/Shared/Polyhedron_Mod/Calculate_Cell_Volume.f90 @@ -1,12 +1,12 @@ !==============================================================================! - subroutine Calculate_Cell_Volume(Pol, vol) + pure subroutine Calculate_Cell_Volume(Pol, vol) !------------------------------------------------------------------------------! ! Calculate cell's volume, this information is not stored in Polyhedron ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Polyhedron_Type) :: Pol - real, intent(out) :: vol + class(Polyhedron_Type), intent(in) :: Pol + real, intent(out) :: vol !-----------------------------------[Locals]-----------------------------------! integer :: i_nod, j_nod, i, j, s real :: dv, xc, yc, zc, xf, yf, zf @@ -17,7 +17,7 @@ subroutine Calculate_Cell_Volume(Pol, vol) ! Calculate cell's centroid (maybe taking it from ... ! ... Grid would be easier albeit less general?) - call Pol % Calculate_Cell_Centroid(s, xc, yc, zc) + call Pol % Calculate_Cell_Centroid(xc, yc, zc) do s = 1, Pol % n_faces diff --git a/Sources/Shared/Polyhedron_Mod/Calculate_Face_Centroid.f90 b/Sources/Shared/Polyhedron_Mod/Calculate_Face_Centroid.f90 index d9add5566..79b69b030 100644 --- a/Sources/Shared/Polyhedron_Mod/Calculate_Face_Centroid.f90 +++ b/Sources/Shared/Polyhedron_Mod/Calculate_Face_Centroid.f90 @@ -1,13 +1,13 @@ !==============================================================================! - subroutine Calculate_Face_Centroid(Pol, face, xf, yf, zf) + pure subroutine Calculate_Face_Centroid(Pol, face, xf, yf, zf) !------------------------------------------------------------------------------! ! Calculate face's centroid, this information is not stored in Polyhedron ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Polyhedron_Type) :: Pol - integer, intent(in) :: face - real, intent(out) :: xf, yf, zf + class(Polyhedron_Type), intent(in) :: Pol + integer, intent(in) :: face + real, intent(out) :: xf, yf, zf !-----------------------------------[Locals]-----------------------------------! integer :: i_nod, i !==============================================================================! diff --git a/Sources/Shared/Polyhedron_Mod/Extract_From_Grid.f90 b/Sources/Shared/Polyhedron_Mod/Extract_From_Grid.f90 index 7cf8b19df..859b04283 100644 --- a/Sources/Shared/Polyhedron_Mod/Extract_From_Grid.f90 +++ b/Sources/Shared/Polyhedron_Mod/Extract_From_Grid.f90 @@ -3,10 +3,10 @@ subroutine Extract_From_Grid(Pol, Grid, cell, phi_n) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Polyhedron_Type) :: Pol - type(Grid_Type) :: Grid - integer, intent(in) :: cell - real, optional :: phi_n(:) + class(Polyhedron_Type), intent(out) :: Pol + type(Grid_Type), target, intent(in) :: Grid + integer, intent(in) :: cell + real, optional, intent(in) :: phi_n(:) !------------------------------[Local parameters]------------------------------! logical, parameter :: DEBUG = .false. ! if true, a lot of files are created !-----------------------------------[Locals]-----------------------------------! From 890437a438c4d81ebdecf5771c22c9d05fafe12a Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 15 Mar 2023 11:41:05 +0100 Subject: [PATCH 081/223] Two modifications to the Grid_Mod: 1. Replaced the unused Sort_Cells_By_Index with the new (and hopefully used) Sort_Cells_By_Thread. 2. Removed unused user_arrays and n_user_arrays On branch bojan_fixed_cell_ranges modified: Sources/Shared/Grid_Mod.f90 deleted: Sources/Shared/Grid_Mod/Sort_Cells_By_Index.f90 new file: Sources/Shared/Grid_Mod/Sort_Cells_By_Thread.f90 modified: Sources/Process/Backup_Mod/Load.f90 modified: Sources/Process/Backup_Mod/Save.f90 modified: Sources/Process/Results_Mod/Save_Results.f90 --- Sources/Process/Backup_Mod/Load.f90 | 13 -- Sources/Process/Backup_Mod/Save.f90 | 13 -- Sources/Process/Results_Mod/Save_Results.f90 | 12 -- Sources/Shared/Grid_Mod.f90 | 9 +- .../Shared/Grid_Mod/Sort_Cells_By_Index.f90 | 46 ------ .../Shared/Grid_Mod/Sort_Cells_By_Thread.f90 | 151 ++++++++++++++++++ 6 files changed, 153 insertions(+), 91 deletions(-) delete mode 100644 Sources/Shared/Grid_Mod/Sort_Cells_By_Index.f90 create mode 100644 Sources/Shared/Grid_Mod/Sort_Cells_By_Thread.f90 diff --git a/Sources/Process/Backup_Mod/Load.f90 b/Sources/Process/Backup_Mod/Load.f90 index a8a93c2e2..38f7b0139 100644 --- a/Sources/Process/Backup_Mod/Load.f90 +++ b/Sources/Process/Backup_Mod/Load.f90 @@ -381,19 +381,6 @@ subroutine Backup_Mod_Load(Fld, Tur, Vof, Swr, time, time_step, backup) Swr % n_reflected) end if - !-----------------! - ! ! - ! User arrays ! - ! ! - !-----------------! - - do ua = 1, Grid % n_user_arrays - a_name = 'A_00' - write(a_name(3:4),'(I2.2)') ua - call Backup_Mod_Read_Cell_Real(Grid, d, vc, a_name, & - Grid % user_array(ua, :)) - end do - ! Close backup file call Comm % Close_File(fh) diff --git a/Sources/Process/Backup_Mod/Save.f90 b/Sources/Process/Backup_Mod/Save.f90 index 008dfc4d5..8d14ab23b 100644 --- a/Sources/Process/Backup_Mod/Save.f90 +++ b/Sources/Process/Backup_Mod/Save.f90 @@ -355,19 +355,6 @@ subroutine Backup_Mod_Save(Fld, Tur, Vof, Swr, time, time_step, domain) Swr % n_reflected) end if - !-----------------! - ! ! - ! User arrays ! - ! ! - !-----------------! - - do ua = 1, Grid % n_user_arrays - a_name = 'A_??' - write(a_name(3:4),'(I2.2)') ua - call Backup_Mod_Write_Cell_Real(Grid, d, vc, a_name, & - Grid % user_array(ua, :)) - end do - ! Variable count (store +1 to count its own self) call Backup_Mod_Write_Int(Comm, d, vc, 'variable_count', vc + 1) diff --git a/Sources/Process/Results_Mod/Save_Results.f90 b/Sources/Process/Results_Mod/Save_Results.f90 index 37cdd956c..252f11bff 100644 --- a/Sources/Process/Results_Mod/Save_Results.f90 +++ b/Sources/Process/Results_Mod/Save_Results.f90 @@ -993,18 +993,6 @@ subroutine Save_Results(Results, & end if end if - !----------------------! - ! Save user arrays ! - !----------------------! - do ua = 1, Grid % n_user_arrays - - a_name = 'A_00' - write(a_name(3:4), '(i2.2)') ua - call Results % Save_Scalar_Real(a_name, plot_inside, & - Grid % user_array(ua,c_f:c_l), & - f8, f9, data_offset, run) - end do - !----------------------! ! ! ! End of cell data ! diff --git a/Sources/Shared/Grid_Mod.f90 b/Sources/Shared/Grid_Mod.f90 index 2d6834f12..b851c7aec 100644 --- a/Sources/Shared/Grid_Mod.f90 +++ b/Sources/Shared/Grid_Mod.f90 @@ -180,11 +180,6 @@ module Grid_Mod !------------------------------------------! type(Comm_Type) :: Comm - ! User arrays. I am neither sure if this is the ... - ! ... best place for them nor do I need them at all? - integer :: n_user_arrays - real, allocatable :: user_array(:,:) - contains procedure :: Allocate_Cells procedure :: Allocate_Faces @@ -235,7 +230,7 @@ module Grid_Mod procedure :: Save_Vtu_Cells procedure :: Save_Vtu_Edges procedure :: Save_Vtu_Faces - procedure :: Sort_Cells_By_Index + procedure :: Sort_Cells_By_Thread procedure :: Sort_Cells_By_Coordinates procedure :: Sort_Faces_By_Index procedure :: Sort_Faces_By_Region @@ -294,8 +289,8 @@ module Grid_Mod # include "Grid_Mod/Save_Vtu_Cells.f90" # include "Grid_Mod/Save_Vtu_Edges.f90" # include "Grid_Mod/Save_Vtu_Faces.f90" -# include "Grid_Mod/Sort_Cells_By_Index.f90" # include "Grid_Mod/Sort_Cells_By_Coordinates.f90" +# include "Grid_Mod/Sort_Cells_By_Thread.f90" # include "Grid_Mod/Sort_Faces_By_Index.f90" # include "Grid_Mod/Sort_Faces_By_Region.f90" # include "Grid_Mod/Write_Template_Control_File.f90" diff --git a/Sources/Shared/Grid_Mod/Sort_Cells_By_Index.f90 b/Sources/Shared/Grid_Mod/Sort_Cells_By_Index.f90 deleted file mode 100644 index 4c94d387a..000000000 --- a/Sources/Shared/Grid_Mod/Sort_Cells_By_Index.f90 +++ /dev/null @@ -1,46 +0,0 @@ -!==============================================================================! - subroutine Sort_Cells_By_Index(Grid, indx, n) -!------------------------------------------------------------------------------! -! Sorts array of cells according to indx. ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Grid_Type) :: Grid - integer :: n, indx(n) -!-----------------------------------[Locals]-----------------------------------! - integer :: i - integer, allocatable :: work_1(:) - integer, allocatable :: work_2(:,:) -!==============================================================================! - - allocate(work_1( n)) - allocate(work_2(24,n)) - - ! Sort number of nodes in a cell - do i = 1, n - work_1( indx(i) ) = Grid % cells_n_nodes(i) - end do - do i = 1, n - Grid % cells_n_nodes(i) = work_1( i ) - end do - - ! Sort cells_n - do i = 1, n - work_2(1:8, indx(i)) = Grid % cells_n(1:8, i) - end do - do i = 1, n - Grid % cells_n(1:8, i) = work_2(1:8, i) - end do - - ! Sort cells_c - do i = 1, n - work_2(1:24, indx(i)) = Grid % cells_c(1:24, i) - end do - do i = 1, n - Grid % cells_c(1:24, i) = work_2(1:24, i) - end do - - deallocate(work_1) - deallocate(work_2) - - end subroutine diff --git a/Sources/Shared/Grid_Mod/Sort_Cells_By_Thread.f90 b/Sources/Shared/Grid_Mod/Sort_Cells_By_Thread.f90 new file mode 100644 index 000000000..ab9235782 --- /dev/null +++ b/Sources/Shared/Grid_Mod/Sort_Cells_By_Thread.f90 @@ -0,0 +1,151 @@ +!==============================================================================! + subroutine Sort_Cells_By_Thread(Grid) +!------------------------------------------------------------------------------! +! Sorts cells by their thread. ! +! ! +! Note: it has a sister procedure in Sort_Cells_By_Coordinates, which is ! +! a bad practice because there is a lot of code duplication, but I ! +! will think about it at a later time. ! +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Grid_Type) :: Grid +!-----------------------------------[Locals]-----------------------------------! + integer :: s, c, c1, c2, n, nc + integer :: mcc, mcn, mcf + integer :: max_diff_1, max_diff_2, c1_s1, c2_s1, c1_s2, c2_s2 + integer, allocatable :: old_nn (:) ! old number of nodes (per cell) + integer, allocatable :: old_nodes(:,:) ! old nodes list per cell + integer, allocatable :: old_nc (:) ! old number of cells (per cell) + integer, allocatable :: old_nf (:) ! old number of faces (per cell) + integer, allocatable :: old_faces(:,:) ! old faces list per cell + integer, allocatable :: old_cells(:,:) ! old cells list per cell + integer, allocatable :: thread(:), cell(:), old_proc(:) +!==============================================================================! + + mcc = size(Grid % cells_c, 1) + mcn = size(Grid % cells_n, 1) + mcf = size(Grid % cells_f, 1) + + allocate(old_nn (Grid % n_cells)); old_nn (:) = 0 + allocate(old_nodes(mcn, Grid % n_cells)); old_nodes(:,:) = 0 + allocate(old_nc (Grid % n_cells)); old_nc (:) = 0 + allocate(old_cells(mcc ,Grid % n_cells)); old_cells(:,:) = 0 + allocate(old_nf (Grid % n_cells)); old_nf (:) = 0 + allocate(old_faces(mcf, Grid % n_cells)); old_faces(:,:) = 0 + allocate(thread (Grid % n_cells)); thread (:) = 0 + allocate(cell (Grid % n_cells)); cell (:) = 0 + allocate(old_proc (Grid % n_cells)) + + !---------------------------------! + ! Store old processor numbers ! + !---------------------------------! + do c = 1, Grid % n_cells + old_proc(c) = Grid % Comm % cell_proc(c) + end do + + !------------------------! + ! Store cells' nodes ! + !------------------------! + do c = 1, Grid % n_cells + old_nn (c) = Grid % cells_n_nodes(c) + old_nodes(1:mcn, c) = Grid % cells_n(1:mcn, c) + old_nf (c) = Grid % cells_n_faces(c) + old_faces(1:mcf, c) = Grid % cells_f(1:mcf, c) + old_nc (c) = Grid % cells_n_cells(c) + old_cells(1:mcc, c) = Grid % cells_c(1:mcc, c) + end do + + !--------------------------! + ! Set sorting criteria ! + !--------------------------! + do c = 1, Grid % n_cells + thread(c) = Grid % cell_thread(c) ! in buffers, should be > n_threads + cell (c) = c + Grid % old_c(c) = c + end do + + !--------------------------------------------------! + ! Sort new numbers according to three criteria ! + !--------------------------------------------------! + call Sort % Two_Int_Carry_Int(thread(1:Grid % n_cells), & + cell (1:Grid % n_cells), & + Grid % old_c(1:Grid % n_cells)) + + ! Check if buffers stayed untouched + do c = Cells_In_Buffers() + Assert(Grid % old_c(c) .eq. c) + end do + + ! This is a bit of a bluff + do c = 1, Grid % n_cells + Grid % new_c(Grid % old_c(c)) = c + end do + + !----------------------------------! + ! Update cell numbers at faces ! + !----------------------------------! + do s = 1, Grid % n_faces + Grid % n_shadows + c1 = Grid % faces_c(1, s) + c2 = Grid % faces_c(2, s) + Grid % faces_c(1, s) = Grid % new_c(c1) + if(c2 > 0) then + Grid % faces_c(2, s) = Grid % new_c(c2) + + ! If the face changed its orientation during cell renumeration + if(Grid % faces_c(2, s) < Grid % faces_c(1, s)) then + + ! Swap c1 and c2 of course ... + call Swap_Int(Grid % faces_c(1, s), Grid % faces_c(2, s)) + + ! ...but also reverse the order of face's nodes ... + n = Grid % faces_n_nodes(s) ! number of nodes in this face + call Sort % Reverse_Order_Int(Grid % faces_n(1:n, s)) + + ! ... and fix the geometrical quantities + Grid % sx(s) = -Grid % sx(s) + Grid % sy(s) = -Grid % sy(s) + Grid % sz(s) = -Grid % sz(s) + Grid % dx(s) = -Grid % dx(s) + Grid % dy(s) = -Grid % dy(s) + Grid % dz(s) = -Grid % dz(s) + Grid % f (s) = 1.0 - Grid % f(s) + end if + end if + end do + + !-----------------------------------------------! + ! Do the sorting of data pertinent to cells ! + !-----------------------------------------------! + do c = 1, Grid % n_cells + Grid % cells_n_nodes(Grid % new_c(c)) = old_nn (c) + Grid % cells_n(1:mcn,Grid % new_c(c)) = old_nodes(1:mcn, c) + Grid % cells_n_faces(Grid % new_c(c)) = old_nf (c) + Grid % cells_f(1:mcf,Grid % new_c(c)) = old_faces(1:mcf, c) + Grid % cells_n_cells(Grid % new_c(c)) = old_nc (c) + Grid % cells_c(1:mcc,Grid % new_c(c)) = old_cells(1:mcc, c) + end do + nc = Grid % n_cells ! abbreviate the syntax + call Sort % Real_By_Index(nc, Grid % xc (1), Grid % new_c(1)) + call Sort % Real_By_Index(nc, Grid % yc (1), Grid % new_c(1)) + call Sort % Real_By_Index(nc, Grid % zc (1), Grid % new_c(1)) + call Sort % Real_By_Index(nc, Grid % vol (1), Grid % new_c(1)) + call Sort % Real_By_Index(nc, Grid % ixx (1), Grid % new_c(1)) + call Sort % Real_By_Index(nc, Grid % iyy (1), Grid % new_c(1)) + call Sort % Real_By_Index(nc, Grid % izz (1), Grid % new_c(1)) + call Sort % Real_By_Index(nc, Grid % ixy (1), Grid % new_c(1)) + call Sort % Real_By_Index(nc, Grid % ixz (1), Grid % new_c(1)) + call Sort % Real_By_Index(nc, Grid % iyz (1), Grid % new_c(1)) + call Sort % Real_By_Index(nc, Grid % wall_dist (1), Grid % new_c(1)) + call Sort % Int_By_Index (nc, Grid % cell_thread (1), Grid % new_c(1)) + call Sort % Int_By_Index (nc, Grid % Comm % cell_glo (1), Grid % new_c(1)) + call Sort % Int_By_Index (nc, Grid % Comm % cell_proc(1), Grid % new_c(1)) + + !-----------------------------! + ! Check processor numbers ! + !-----------------------------! + do c = 1, Grid % n_cells + Assert(old_proc(c) .eq. Grid % Comm % cell_proc(c)) + end do + + end subroutine From e01629248f7261daa35f39a96158c5001334f4fe Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 15 Mar 2023 11:46:33 +0100 Subject: [PATCH 082/223] Limits division in threads only to inside cells. That makes sense. Since the recently introduced macro do c = Cells_In_Domain() browses through inside cells only, it makes perfect sense to believe that threads in OpenMP will browse through inside cells only. Also, see the newly introduced procedure Sort_Cells_By_Thread which makes sure the same approach is taken there. Things will change for faces, since s = Faces_In_Domain() browses through faces in the domain and the buffers, but these developments will follow. On branch bojan_fixed_cell_ranges modified: Sources/Shared/Grid_Mod/Determine_Threads.f90 --- Sources/Shared/Grid_Mod/Determine_Threads.f90 | 39 +++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/Sources/Shared/Grid_Mod/Determine_Threads.f90 b/Sources/Shared/Grid_Mod/Determine_Threads.f90 index 32c3a3aba..676cdbb65 100644 --- a/Sources/Shared/Grid_Mod/Determine_Threads.f90 +++ b/Sources/Shared/Grid_Mod/Determine_Threads.f90 @@ -9,6 +9,7 @@ subroutine Determine_Threads(Grid) !------------------------------[Local parameters]------------------------------! logical, parameter :: DEBUG = .false. !-----------------------------------[Locals]-----------------------------------! + integer :: c, s integer :: c_f, c_l, s_f, s_l ! first/last cell, first/last face !==============================================================================! @@ -30,16 +31,46 @@ subroutine Determine_Threads(Grid) s_f = Grid % region % f_face(Grid % n_regions) s_l = Grid % region % l_face(Grid % n_regions) + ! In case of parallel runs, you do not want the faces in buffers, + ! you want threads only in inside cells, not spreading to buffers + do s = Faces_In_Domain() + if(Grid % Comm % cell_proc(Grid % faces_c(2, s)) .ne. this_proc) then + s_l = s - 1 + exit + end if + end do + + ! Check 1 + do s = s_f, s_l + Assert(Grid % Comm % cell_proc(Grid % faces_c(1, s)) .eq. this_proc) + Assert(Grid % Comm % cell_proc(Grid % faces_c(2, s)) .eq. this_proc) + end do + ! Create METIS call Metis % Create_Metis(s_f, s_l, Grid % faces_c, Grid % n_threads) - ! Set the cell range to the inside faces + ! Set some high value for threads everywhere. In calls which follow + ! cells which are not in buffers will be over-written by true threads + Grid % cell_thread(:) = Grid % n_threads * 10 + + ! Set the cell range to the inside of the domain, no buffer cells here c_f = Grid % region % f_cell(Grid % n_regions) c_l = Grid % region % l_cell(Grid % n_regions) - ! Call METIS - call Metis % Call_Metis(Grid % n_threads, & - Grid % cell_thread(c_f:c_l)) + ! Call METIS to assign regions to inside cells (not in buffers). In + ! buffers, you should still have values you assigned a few lines above + call Metis % Call_Metis(Grid % n_threads, Grid % cell_thread(c_f:c_l)) + + do c = Cells_In_Domain() + Assert(Grid % cell_thread(c) .le. Grid % n_threads) + end do + do c = Cells_In_Buffers() + Assert(Grid % cell_thread(c) .gt. Grid % n_threads) + end do + + ! Now this is quite brave + call Grid % Sort_Cells_By_Thread() + end if end subroutine From 963c1cd3c2233f23c60c9fc0142c1aff35dbdb2b Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 15 Mar 2023 12:18:28 +0100 Subject: [PATCH 083/223] Added a self-check to Form_Cells_Comm It shuold have been done ages ago :-( On branch bojan_fixed_cell_ranges modified: Shared/Grid_Mod/Form_Cells_Comm.f90 --- Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 | 42 ++++++++++++++++++--- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 b/Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 index d4ae9ad03..4c4577721 100644 --- a/Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 +++ b/Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 @@ -7,11 +7,12 @@ subroutine Form_Cells_Comm(Grid) !---------------------------------[Arguments]----------------------------------! class(Grid_Type) :: Grid !-----------------------------------[Locals]-----------------------------------! - integer :: sub, ms, mr, cnt + integer :: sub, ms, mr, cnt, n_fail integer :: c, c1, c2, s, n_buff_faces, n_max_buff_cells, i_cel integer, allocatable :: send_cells(:), recv_cells(:) integer, allocatable :: send_buff_cnt(:,:), recv_buff_cnt(:,:) integer, allocatable :: need_cell(:,:), from_proc(:,:) + real, allocatable :: xc(:), yc(:), zc(:) logical, parameter :: DEBUG = .false. !==============================================================================! @@ -223,10 +224,39 @@ subroutine Form_Cells_Comm(Grid) !-------------------------------------! Grid % n_faces = Grid % n_faces - n_buff_faces - ! De-allocate locally used memory - deallocate(send_buff_cnt) - deallocate(recv_buff_cnt) - deallocate(send_cells) - deallocate(recv_cells) + !------------------------------------------! + ! Check if communication patterns work ! + !------------------------------------------! + allocate(xc(-Grid % n_bnd_cells : Grid % n_cells)); xc(:) = 0.0 + allocate(yc(-Grid % n_bnd_cells : Grid % n_cells)); yc(:) = 0.0 + allocate(zc(-Grid % n_bnd_cells : Grid % n_cells)); zc(:) = 0.0 + + do c = Cells_In_Domain() + xc(c) = Grid % xc(c) + yc(c) = Grid % yc(c) + zc(c) = Grid % zc(c) + end do + + call Grid % Exchange_Cells_Real(xc) + call Grid % Exchange_Cells_Real(yc) + call Grid % Exchange_Cells_Real(zc) + + n_fail = 0 + do c = Cells_In_Buffers() + if( .not. ( Math % Approx_Real(xc(c), Grid % xc(c)) .and. & + Math % Approx_Real(yc(c), Grid % yc(c)) .and. & + Math % Approx_Real(zc(c), Grid % zc(c)) ) ) then + n_fail = n_fail + 1 + end if + end do + call Comm_Mod_Global_Sum_Int(n_fail) + if(n_fail .gt. 0) then + call Message % Error(55, & + 'Ouch, this hurts. Formation of commuication ' // & + 'patterns has failed. Hopefully, you just ran ' // & + 'the simulation on fewer processor than there ' // & + 'are subdomains. \n \n This error is critical.', & + file=__FILE__, line=__LINE__, one_proc=.true.) + end if end subroutine From 2669fb1dada1d8a591edc79f7613b2e0e14c76e1 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 15 Mar 2023 20:03:57 +0100 Subject: [PATCH 084/223] NEAT: Uses macros for browsing This brings some performance advantages, which is negligible since the procedure is called only one, but more importantly it makes the procedure more understandable. Some asserts which were added help the cause too. On branch bojan_fixed_cell_ranges modified: Shared/Grid_Mod/Form_Cells_Comm.f90 --- Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 | 32 ++++++++++----------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 b/Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 index 4c4577721..6ff3032d1 100644 --- a/Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 +++ b/Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 @@ -28,11 +28,12 @@ subroutine Form_Cells_Comm(Grid) ! Count buffer cells inside ! !-------------------------------! Grid % Comm % n_buff_cells = 0 - do c = 1, Grid % n_cells - if(Grid % Comm % cell_proc(c) .ne. this_proc) then - Grid % Comm % n_buff_cells = & - Grid % Comm % n_buff_cells + 1 - end if + do c = Cells_In_Domain() + Assert(Grid % Comm % cell_proc(c) .eq. this_proc) + end do + do c = Cells_In_Buffers() + Assert(Grid % Comm % cell_proc(c) .ne. this_proc) + Grid % Comm % n_buff_cells = Grid % Comm % n_buff_cells + 1 end do !------------------------! @@ -52,8 +53,7 @@ subroutine Form_Cells_Comm(Grid) !--------------------------------------------------------! recv_buff_cnt(:,:) = 0 recv_cells(:) = 0 - do c = Grid % n_cells - Grid % Comm % n_buff_cells + 1, & - Grid % n_cells + do c = Cells_In_Buffers() sub = Grid % Comm % cell_proc(c) recv_buff_cnt(this_proc, sub) = recv_buff_cnt(this_proc, sub) + 1 recv_cells(c) = sub @@ -89,13 +89,11 @@ subroutine Form_Cells_Comm(Grid) ! and also from which processor it is ! !-------------------------------------------! i_cel = 0 - do c = Grid % n_cells - Grid % Comm % n_buff_cells + 1, & - Grid % n_cells - if(Grid % Comm % cell_proc(c) .ne. this_proc) then - i_cel = i_cel + 1 - need_cell(i_cel, this_proc) = Grid % Comm % cell_glo(c) - from_proc(i_cel, this_proc) = Grid % Comm % cell_proc(c) - end if + do c = Cells_In_Buffers() + Assert(Grid % Comm % cell_proc(c) .ne. this_proc) + i_cel = i_cel + 1 + need_cell(i_cel, this_proc) = Grid % Comm % cell_glo(c) + from_proc(i_cel, this_proc) = Grid % Comm % cell_proc(c) end do !----------------------------------------------! @@ -177,7 +175,7 @@ subroutine Form_Cells_Comm(Grid) send_cells(:) = 0 do i_cel = 1, n_max_buff_cells if(from_proc(i_cel, sub) .eq. this_proc) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain() if(Grid % Comm % cell_glo(c) .eq. need_cell(i_cel, sub)) then send_cells(c) = sub ! identify cnt = cnt + 1 @@ -191,7 +189,7 @@ subroutine Form_Cells_Comm(Grid) ' cells to send to processor', sub ! This worries me. Why should this be from -Grid % n_bnd_cells or not - do c = 1, Grid % n_cells + do c = Cells_In_Domain() if(send_cells(c) .eq. sub) then ms = ms + 1 Grid % Comm % cells_send(sub) % map(ms) = c @@ -199,7 +197,7 @@ subroutine Form_Cells_Comm(Grid) end do ! This worries me. Why should this be from -Grid % n_bnd_cells or not - do c = 1, Grid % n_cells + do c = Cells_In_Buffers() if(recv_cells(c) .eq. sub) then mr = mr + 1 Grid % Comm % cells_recv(sub) % map(mr) = c From 827664b848cce46f85bb81490f38047cd535c794 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 15 Mar 2023 20:20:48 +0100 Subject: [PATCH 085/223] Uses simpler test for self-checking On branch bojan_fixed_cell_ranges modified: Shared/Grid_Mod/Form_Cells_Comm.f90 --- Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 b/Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 index 6ff3032d1..9caf5b70e 100644 --- a/Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 +++ b/Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 @@ -12,7 +12,7 @@ subroutine Form_Cells_Comm(Grid) integer, allocatable :: send_cells(:), recv_cells(:) integer, allocatable :: send_buff_cnt(:,:), recv_buff_cnt(:,:) integer, allocatable :: need_cell(:,:), from_proc(:,:) - real, allocatable :: xc(:), yc(:), zc(:) + integer, allocatable :: glo(:) ! used for checking the communication logical, parameter :: DEBUG = .false. !==============================================================================! @@ -225,25 +225,17 @@ subroutine Form_Cells_Comm(Grid) !------------------------------------------! ! Check if communication patterns work ! !------------------------------------------! - allocate(xc(-Grid % n_bnd_cells : Grid % n_cells)); xc(:) = 0.0 - allocate(yc(-Grid % n_bnd_cells : Grid % n_cells)); yc(:) = 0.0 - allocate(zc(-Grid % n_bnd_cells : Grid % n_cells)); zc(:) = 0.0 + allocate(glo(-Grid % n_bnd_cells : Grid % n_cells)); glo(:) = 0 do c = Cells_In_Domain() - xc(c) = Grid % xc(c) - yc(c) = Grid % yc(c) - zc(c) = Grid % zc(c) + glo(c) = Grid % Comm % cell_glo(c) end do - call Grid % Exchange_Cells_Real(xc) - call Grid % Exchange_Cells_Real(yc) - call Grid % Exchange_Cells_Real(zc) + call Grid % Exchange_Cells_Int(glo) n_fail = 0 do c = Cells_In_Buffers() - if( .not. ( Math % Approx_Real(xc(c), Grid % xc(c)) .and. & - Math % Approx_Real(yc(c), Grid % yc(c)) .and. & - Math % Approx_Real(zc(c), Grid % zc(c)) ) ) then + if(.not. glo(c) .eq. Grid % Comm % cell_glo(c)) then n_fail = n_fail + 1 end if end do From f7a9b0572b899972144cbafa513a5a6401ac0de8 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 15 Mar 2023 20:24:34 +0100 Subject: [PATCH 086/223] Got rid of OPENMP options (it is obsolete by now) Instead, wheather a program uses OpenMP or not is left to the default option in the makefile for each subprogram. On branch bojan_fixed_cell_ranges modified: ../Tests/test_build.sh --- Tests/test_build.sh | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/Tests/test_build.sh b/Tests/test_build.sh index 6a98285d0..8c3d11f08 100755 --- a/Tests/test_build.sh +++ b/Tests/test_build.sh @@ -31,13 +31,11 @@ set -e FORTRAN="gnu" FCOMP="" DEBUG="no" -OPENMP="yes" # Intel compiler (python is messed up with Intel, don't plot for now) # FORTRAN="intel" # FCOMP="mpiifort" # DEBUG="no" -# OPENMP="yes" # Variable MODE can be set to "interactive" or "noninteractive", depending if # the script is ran in interactive mode (without command line options) or in @@ -437,21 +435,19 @@ function user_compile { git checkout User_Mod/*.f90 >> $FULL_LOG 2>&1 if [ -z "${3+xxx}" ]; then - elog "make FORTRAN=$FORTRAN FCOMP=$FCOMP DEBUG=$DEBUG OPENMP=$OPENMP MPI=$2" + elog "make FORTRAN=$FORTRAN FCOMP=$FCOMP DEBUG=$DEBUG MPI=$2" make \ FORTRAN=$FORTRAN \ FCOMP=$FCOMP \ DEBUG=$DEBUG \ - OPENMP=$OPENMP \ MPI=$2 >> $FULL_LOG 2>&1 success=$? else - elog "make FORTRAN=$FORTRAN FCOMP=$FCOMP DEBUG=$DEBUG OPENMP=$OPENMP MPI=$2 DIR_CASE=$3" + elog "make FORTRAN=$FORTRAN FCOMP=$FCOMP DEBUG=$DEBUG MPI=$2 DIR_CASE=$3" make \ FORTRAN=$FORTRAN \ FCOMP=$FCOMP \ DEBUG=$DEBUG \ - OPENMP=$OPENMP \ MPI=$2 \ DIR_CASE=$3 >> $FULL_LOG 2>&1 success=$? @@ -489,21 +485,19 @@ function clean_compile { make clean >> $FULL_LOG 2>&1 if [ -z "${3+xxx}" ]; then - elog "make FORTRAN=$FORTRAN FCOMP=$FCOMP DEBUG=$DEBUG OPENMP=$OPENMP MPI=$2" + elog "make FORTRAN=$FORTRAN FCOMP=$FCOMP DEBUG=$DEBUG MPI=$2" make \ FORTRAN=$FORTRAN \ FCOMP=$FCOMP \ DEBUG=$DEBUG \ - OPENMP=$OPENMP \ MPI=$2 >> $FULL_LOG 2>&1 success=$? else - elog "make FORTRAN=$FORTRAN FCOMP=$FCOMP DEBUG=$DEBUG OPENMP=$OPENMP MPI=$2 DIR_CASE=$3" + elog "make FORTRAN=$FORTRAN FCOMP=$FCOMP DEBUG=$DEBUG MPI=$2 DIR_CASE=$3" make \ FORTRAN=$FORTRAN \ FCOMP=$FCOMP \ DEBUG=$DEBUG \ - OPENMP=$OPENMP \ MPI=$2 \ DIR_CASE=$3 >> $FULL_LOG 2>&1 success=$? @@ -1730,12 +1724,10 @@ function chose_test { FORTRAN="intel" FCOMP="mpiifort" DEBUG="no" - OPENMP="yes" elif [ $FORTRAN == "intel" ]; then FORTRAN="gnu" FCOMP="" DEBUG="no" - OPENMP="yes" fi fi From 3795e28002b290770d71f90a43660c4be9a7d949 Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 16 Mar 2023 01:19:15 +0100 Subject: [PATCH 087/223] Insignificant: Corrected a case for variable. On branch bojan_fixed_cell_ranges modified: Shared/Control_Mod/Numerics/Max_Substep_Cycles_Vof.f90 --- Sources/Shared/Control_Mod/Numerics/Max_Substep_Cycles_Vof.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Shared/Control_Mod/Numerics/Max_Substep_Cycles_Vof.f90 b/Sources/Shared/Control_Mod/Numerics/Max_Substep_Cycles_Vof.f90 index 0c6f4a7b5..c513739ca 100644 --- a/Sources/Shared/Control_Mod/Numerics/Max_Substep_Cycles_Vof.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Max_Substep_Cycles_Vof.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Max_Substep_Cycles_Vof(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_int_Item('MAX_SUBSTEP_CYCLES_VOF', & + call Control_Mod_Read_Int_Item('MAX_SUBSTEP_CYCLES_VOF', & 100, val, verbose) end subroutine From b50959bd52c34f310f12e6a43c0a4773169fc036 Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 16 Mar 2023 08:09:23 +0100 Subject: [PATCH 088/223] Important: Introduced module for OpenMP: Vect_Mod Currently, for OpenMP METIS is called inside each subdomain and resorts the cells according to local decompositions. There is a complication with that. These decompositions change global cell numbers, having an impact on formation of communication patterns (which is resolved with this checkin), but also to formation of maps for backup. This could be solved too, by introducing another map in addition to backup map, but I am not too keen on reordering all the values every time backup is performed. In the following, I will use simple geometrical ordering of cells to define threads. It seems to be a more reasonalble thing to do at this point, when it's not even fully clear if and when will OpenMP yield signiifcant improvements in speed. On branch bojan_fixed_cell_ranges new file: Shared/Control_Mod/Max_Threads.f90 new file: Shared/Vect_Mod.f90 modified: Convert/makefile modified: Convert/makefile_explicit_dependencies modified: Divide/makefile modified: Divide/makefile_explicit_dependencies modified: Generate/makefile modified: Generate/makefile_explicit_dependencies modified: Process/Main_Pro.f90 modified: Process/Results_Mod/Save_Results.f90 modified: Process/makefile modified: Process/makefile_explicit_dependencies modified: Shared/Control_Mod.f90 modified: Shared/Grid_Mod.f90 modified: Shared/Grid_Mod/Allocate_Cells.f90 modified: Shared/Grid_Mod/Determine_Threads.f90 modified: Shared/Grid_Mod/Form_Cells_Comm.f90 modified: Shared/Grid_Mod/Form_Maps_For_Backup.f90 modified: Shared/Grid_Mod/Save_Vtu_Cells.f90 modified: Shared/Grid_Mod/Sort_Cells_By_Thread.f90 modified: ../Documentation/all_control_keywords --- Documentation/all_control_keywords | 1 + Sources/Convert/makefile | 3 +- .../Convert/makefile_explicit_dependencies | 13 ++- Sources/Divide/makefile | 3 +- Sources/Divide/makefile_explicit_dependencies | 13 ++- Sources/Generate/makefile | 3 +- .../Generate/makefile_explicit_dependencies | 13 ++- Sources/Process/Main_Pro.f90 | 4 + Sources/Process/Results_Mod/Save_Results.f90 | 2 +- Sources/Process/makefile | 3 +- .../Process/makefile_explicit_dependencies | 13 ++- Sources/Shared/Control_Mod.f90 | 6 ++ Sources/Shared/Control_Mod/Max_Threads.f90 | 16 ++++ Sources/Shared/Grid_Mod.f90 | 18 ++-- Sources/Shared/Grid_Mod/Allocate_Cells.f90 | 2 +- Sources/Shared/Grid_Mod/Determine_Threads.f90 | 54 +++++++++--- Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 | 62 ++++++++++++-- .../Shared/Grid_Mod/Form_Maps_For_Backup.f90 | 28 +++++-- Sources/Shared/Grid_Mod/Save_Vtu_Cells.f90 | 2 +- .../Shared/Grid_Mod/Sort_Cells_By_Thread.f90 | 30 +++---- Sources/Shared/Vect_Mod.f90 | 84 +++++++++++++++++++ 21 files changed, 301 insertions(+), 72 deletions(-) create mode 100644 Sources/Shared/Control_Mod/Max_Threads.f90 create mode 100644 Sources/Shared/Vect_Mod.f90 diff --git a/Documentation/all_control_keywords b/Documentation/all_control_keywords index 5f664766f..1b271b5c6 100644 --- a/Documentation/all_control_keywords +++ b/Documentation/all_control_keywords @@ -57,6 +57,7 @@ MAX_SMOOTHING_CYCLES_CURVATURE_VOF | 2 | an integer up to 5 makes sense MAX_SMOOTHING_CYCLES_NORMAL_VOF | 0 | an integer up to 5 should be fine MAX_SUBSTEP_CYCLES_VOF | 100 | any integer + MAX_THREADS | 2 | integers, up to number of cores MIN_SIMPLE_ITERATIONS | 3 | any integer, but better > 2 NORMALIZATION_FOR_ENERGY_SOLVER | 1.0 | any real number, but mostly it is 1.0 NORMALIZATION_FOR_MOMENTUM_SOLVER | 1.0 | any real number, but mostly it is 1.0 diff --git a/Sources/Convert/makefile b/Sources/Convert/makefile index 4cc0a0d0f..2cfc15b95 100644 --- a/Sources/Convert/makefile +++ b/Sources/Convert/makefile @@ -175,18 +175,19 @@ endif # Modules in shared directories SRC_F_MOD = Const_Mod.f90 \ + Region_Mod.f90 \ String_Mod.f90 \ Tokenizer_Mod.f90 \ Comm_Mod.f90 \ Assert_Mod.f90 \ Message_Mod.f90 \ + Vect_Mod.f90 \ Profiler_Mod.f90 \ Math_Mod.f90 \ File_Mod.f90 \ Gen_Mod.f90 \ Vtk_Mod.f90 \ Metis_Mod.f90 \ - Region_Mod.f90 \ Swap_Mod.f90 \ Sort_Mod.f90 \ Grid_Mod.f90 \ diff --git a/Sources/Convert/makefile_explicit_dependencies b/Sources/Convert/makefile_explicit_dependencies index d2ae3b42b..51556e814 100644 --- a/Sources/Convert/makefile_explicit_dependencies +++ b/Sources/Convert/makefile_explicit_dependencies @@ -180,6 +180,14 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 +#--------------------------------------------------- +# Dependencies for: ./Vect_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Vect_Mod.o:\ +$(DIR_OBJECT)/Region_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 + #--------------------------------------------------- # Dependencies for: ./Profiler_Mod.f90 #--------------------------------------------------- @@ -235,6 +243,7 @@ $(DIR_SHARED)/File_Mod/*.f90 $(DIR_OBJECT)/Grid_Mod.o:\ $(DIR_OBJECT)/Vtk_Mod.o \ $(DIR_SHARED)/Vtk_Mod/*.f90 \ +$(DIR_OBJECT)/Vect_Mod.o \ $(DIR_OBJECT)/Sort_Mod.o \ $(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Region_Mod.o \ @@ -245,9 +254,7 @@ $(DIR_SHARED)/Metis_Mod/*.f90 \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Stl_Mod.f90 diff --git a/Sources/Divide/makefile b/Sources/Divide/makefile index 2ed90806e..27069d6ab 100644 --- a/Sources/Divide/makefile +++ b/Sources/Divide/makefile @@ -173,18 +173,19 @@ endif # Modules in shared directories SRC_F_MOD = Const_Mod.f90 \ + Region_Mod.f90 \ String_Mod.f90 \ Tokenizer_Mod.f90 \ Comm_Mod.f90 \ Assert_Mod.f90 \ Message_Mod.f90 \ + Vect_Mod.f90 \ Profiler_Mod.f90 \ Math_Mod.f90 \ File_Mod.f90 \ Gen_Mod.f90 \ Vtk_Mod.f90 \ Metis_Mod.f90 \ - Region_Mod.f90 \ Swap_Mod.f90 \ Sort_Mod.f90 \ Grid_Mod.f90 diff --git a/Sources/Divide/makefile_explicit_dependencies b/Sources/Divide/makefile_explicit_dependencies index 32baced14..40c9031ae 100644 --- a/Sources/Divide/makefile_explicit_dependencies +++ b/Sources/Divide/makefile_explicit_dependencies @@ -161,6 +161,14 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 +#--------------------------------------------------- +# Dependencies for: ./Vect_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Vect_Mod.o:\ +$(DIR_OBJECT)/Region_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 + #--------------------------------------------------- # Dependencies for: ./Profiler_Mod.f90 #--------------------------------------------------- @@ -216,6 +224,7 @@ $(DIR_SHARED)/File_Mod/*.f90 $(DIR_OBJECT)/Grid_Mod.o:\ $(DIR_OBJECT)/Vtk_Mod.o \ $(DIR_SHARED)/Vtk_Mod/*.f90 \ +$(DIR_OBJECT)/Vect_Mod.o \ $(DIR_OBJECT)/Sort_Mod.o \ $(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Region_Mod.o \ @@ -226,9 +235,7 @@ $(DIR_SHARED)/Metis_Mod/*.f90 \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Stl_Mod.f90 diff --git a/Sources/Generate/makefile b/Sources/Generate/makefile index c35f98415..3aa0db39a 100644 --- a/Sources/Generate/makefile +++ b/Sources/Generate/makefile @@ -174,18 +174,19 @@ endif # Modules in shared directories SRC_F_MOD = Const_Mod.f90 \ + Region_Mod.f90 \ String_Mod.f90 \ Tokenizer_Mod.f90 \ Comm_Mod.f90 \ Assert_Mod.f90 \ Message_Mod.f90 \ + Vect_Mod.f90 \ Profiler_Mod.f90 \ Math_Mod.f90 \ File_Mod.f90 \ Gen_Mod.f90 \ Vtk_Mod.f90 \ Metis_Mod.f90 \ - Region_Mod.f90 \ Swap_Mod.f90 \ Sort_Mod.f90 \ Grid_Mod.f90 diff --git a/Sources/Generate/makefile_explicit_dependencies b/Sources/Generate/makefile_explicit_dependencies index 0935d3d9f..7dd96e734 100644 --- a/Sources/Generate/makefile_explicit_dependencies +++ b/Sources/Generate/makefile_explicit_dependencies @@ -238,6 +238,14 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 +#--------------------------------------------------- +# Dependencies for: ./Vect_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Vect_Mod.o:\ +$(DIR_OBJECT)/Region_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 + #--------------------------------------------------- # Dependencies for: ./Profiler_Mod.f90 #--------------------------------------------------- @@ -293,6 +301,7 @@ $(DIR_SHARED)/File_Mod/*.f90 $(DIR_OBJECT)/Grid_Mod.o:\ $(DIR_OBJECT)/Vtk_Mod.o \ $(DIR_SHARED)/Vtk_Mod/*.f90 \ +$(DIR_OBJECT)/Vect_Mod.o \ $(DIR_OBJECT)/Sort_Mod.o \ $(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Region_Mod.o \ @@ -303,9 +312,7 @@ $(DIR_SHARED)/Metis_Mod/*.f90 \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Stl_Mod.f90 diff --git a/Sources/Process/Main_Pro.f90 b/Sources/Process/Main_Pro.f90 index f9cb25b19..3707f3f5d 100644 --- a/Sources/Process/Main_Pro.f90 +++ b/Sources/Process/Main_Pro.f90 @@ -85,7 +85,11 @@ program Process_Prog ! Load the finite volume Grid call Grid(d) % Load_Cfn(this_proc, domain=d) call Grid(d) % Load_Dim(this_proc, domain=d) + + ! Determine threads for OpenMP runs + call Control_Mod_Max_Threads(Grid(d) % Vect % d_threads, .true.) call Grid(d) % Determine_Threads() + call Grid(d) % Calculate_Face_Geometry() ! Find communication patterns diff --git a/Sources/Process/Results_Mod/Save_Results.f90 b/Sources/Process/Results_Mod/Save_Results.f90 index 252f11bff..38a15573b 100644 --- a/Sources/Process/Results_Mod/Save_Results.f90 +++ b/Sources/Process/Results_Mod/Save_Results.f90 @@ -408,7 +408,7 @@ subroutine Save_Results(Results, & !-----------------! ! Cell thread ! !-----------------! - int_save(c_f:c_l) = Grid % cell_thread(c_f:c_l) + int_save(c_f:c_l) = Grid % Vect % cell_thread(c_f:c_l) call Results % Save_Scalar_Int("Grid Thread [1]", plot_inside, & int_save(c_f:c_l), & f8, f9, data_offset, run) diff --git a/Sources/Process/makefile b/Sources/Process/makefile index 593228df6..fa26d2a6a 100644 --- a/Sources/Process/makefile +++ b/Sources/Process/makefile @@ -248,11 +248,13 @@ endif # Modules in shared directory SRC_F_MOD = Const_Mod.f90 \ + Region_Mod.f90 \ String_Mod.f90 \ Comm_Mod.f90 \ Assert_Mod.f90 \ Tokenizer_Mod.f90 \ Message_Mod.f90 \ + Vect_Mod.f90 \ Profiler_Mod.f90 \ Math_Mod.f90 \ Swap_Mod.f90 \ @@ -260,7 +262,6 @@ SRC_F_MOD = Const_Mod.f90 \ File_Mod.f90 \ Control_Mod.f90 \ Vtk_Mod.f90 \ - Region_Mod.f90 \ Metis_Mod.f90 \ Grid_Mod.f90 \ Work_Mod.f90 \ diff --git a/Sources/Process/makefile_explicit_dependencies b/Sources/Process/makefile_explicit_dependencies index d0057bfa5..0c410b9c0 100644 --- a/Sources/Process/makefile_explicit_dependencies +++ b/Sources/Process/makefile_explicit_dependencies @@ -530,6 +530,14 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 +#--------------------------------------------------- +# Dependencies for: ./Vect_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Vect_Mod.o:\ +$(DIR_OBJECT)/Region_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 + #--------------------------------------------------- # Dependencies for: ./Profiler_Mod.f90 #--------------------------------------------------- @@ -585,6 +593,7 @@ $(DIR_SHARED)/File_Mod/*.f90 $(DIR_OBJECT)/Grid_Mod.o:\ $(DIR_OBJECT)/Vtk_Mod.o \ $(DIR_SHARED)/Vtk_Mod/*.f90 \ +$(DIR_OBJECT)/Vect_Mod.o \ $(DIR_OBJECT)/Sort_Mod.o \ $(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Region_Mod.o \ @@ -595,9 +604,7 @@ $(DIR_SHARED)/Metis_Mod/*.f90 \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Stl_Mod.f90 diff --git a/Sources/Shared/Control_Mod.f90 b/Sources/Shared/Control_Mod.f90 index 522ab17e6..750d61cb8 100644 --- a/Sources/Shared/Control_Mod.f90 +++ b/Sources/Shared/Control_Mod.f90 @@ -65,6 +65,12 @@ module Control_Mod # include "Control_Mod/Linear_Solvers.f90" + !-------------! + ! Threads ! + !-------------! + +# include "Control_Mod/Max_Threads.f90" + !--------------------! ! Native solvers ! !--------------------! diff --git a/Sources/Shared/Control_Mod/Max_Threads.f90 b/Sources/Shared/Control_Mod/Max_Threads.f90 new file mode 100644 index 000000000..2867fca99 --- /dev/null +++ b/Sources/Shared/Control_Mod/Max_Threads.f90 @@ -0,0 +1,16 @@ +!==============================================================================! + subroutine Control_Mod_Max_Threads(val, verbose) +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + integer, intent(out) :: val + logical, optional :: verbose +!==============================================================================! + +# ifdef _OPENMP + call Control_Mod_Read_Int_Item('MAX_THREADS', 2, val, verbose) +# else + val = 1 +# endif + + end subroutine diff --git a/Sources/Shared/Grid_Mod.f90 b/Sources/Shared/Grid_Mod.f90 index b851c7aec..6224f6f16 100644 --- a/Sources/Shared/Grid_Mod.f90 +++ b/Sources/Shared/Grid_Mod.f90 @@ -9,8 +9,7 @@ module Grid_Mod ! (that means in "Generate", "Divide", "Convert", "Process". ! !------------------------------------------------------------------------------! !----------------------------------[Modules]-----------------------------------! - use Omp_Lib ! for OpenMP functionality - use Assert_Mod + use Vect_Mod use Profiler_Mod use File_Mod use Region_Mod @@ -101,10 +100,6 @@ module Grid_Mod ! For each cell; type of the boundary condition in a given direction integer, allocatable :: cells_bnd_region(:,:) - ! Threads (for OpenMP and alike) - integer :: n_threads - integer, allocatable :: cell_thread(:) - !-------------------------! ! Face-based variables ! !-------------------------! @@ -175,11 +170,16 @@ module Grid_Mod integer, allocatable :: edges_bc(:,:) ! edges' boundary conditions integer, allocatable :: edges_fb(:,:) ! edges' faces on boundaries - !------------------------------------------! - ! Communication class for parallel run ! - !------------------------------------------! + !-------------------------------------------! + ! Communication class for parallel runs ! + !-------------------------------------------! type(Comm_Type) :: Comm + !-------------------------------------------! + ! Vectorization class for manycore runs ! + !-------------------------------------------! + type(Vect_Type) :: Vect + contains procedure :: Allocate_Cells procedure :: Allocate_Faces diff --git a/Sources/Shared/Grid_Mod/Allocate_Cells.f90 b/Sources/Shared/Grid_Mod/Allocate_Cells.f90 index fb56c040d..32f13f23a 100644 --- a/Sources/Shared/Grid_Mod/Allocate_Cells.f90 +++ b/Sources/Shared/Grid_Mod/Allocate_Cells.f90 @@ -58,7 +58,7 @@ subroutine Allocate_Cells(Grid, nc, nb) end do ! Allocate thread i.d. - allocate(Grid % cell_thread(-nb:nc)); Grid % cell_thread(:) = 0 + allocate(Grid % Vect % cell_thread(-nb:nc)); Grid % Vect % cell_thread(:) = 0 ! Allocate new and old numbers (this is so often used, maybe is better here) allocate(Grid % new_c(-nb:nc)); Grid % new_c(:) = 0 diff --git a/Sources/Shared/Grid_Mod/Determine_Threads.f90 b/Sources/Shared/Grid_Mod/Determine_Threads.f90 index 676cdbb65..cd7fda810 100644 --- a/Sources/Shared/Grid_Mod/Determine_Threads.f90 +++ b/Sources/Shared/Grid_Mod/Determine_Threads.f90 @@ -9,23 +9,50 @@ subroutine Determine_Threads(Grid) !------------------------------[Local parameters]------------------------------! logical, parameter :: DEBUG = .false. !-----------------------------------[Locals]-----------------------------------! - integer :: c, s - integer :: c_f, c_l, s_f, s_l ! first/last cell, first/last face + integer :: c, s + integer :: c_f, c_l, s_f, s_l ! first/last cell, first/last face + character(SL) :: st1, st2 !==============================================================================! + !----------------------------! ! Find number of threads ! - !----------------------------! - Grid % n_threads = 0 -# ifdef _OPENMP - Grid % n_threads = omp_get_max_threads() -# endif + !- - - - - - - - - - - - - - +-----------------------! + ! This is all a bit silly at this stage, it will ! + ! make more sense when Vect_Mod matures a bit. ! + !----------------------------------------------------! + + ! You read desired number of threads from control file, try to use that + if(Grid % Vect % d_threads .lt. Grid % Vect % Get_Max_Threads()) then + call Grid % Vect % Set_Num_Threads(Grid % Vect % d_threads) + + else if(Grid % Vect % d_threads .gt. Grid % Vect % Get_Max_Threads()) then + write(st1, '(i0.0)') Grid % Vect % d_threads + write(st2, '(i0.0)') Grid % Vect % Get_Max_Threads() + call Message % Error(80, & + 'You are trying to run with '//trim(st1)//' OpenMP threads ' // & + 'but there are only '//trim(st2)//' available. ' // & + 'The workaround is to either increase the environment ' // & + 'variable OMP_NUM_THREAD, or decrease parameter MAX_THREADS ' // & + 'in control file.', & + file=__FILE__, line=__LINE__, one_proc=.true.) + end if + + ! Set n_threads to whatever you adjusted above + Grid % Vect % n_threads = Grid % Vect % Get_Max_Threads() + + if(Grid % Vect % n_threads > 1) then + write(st1, '(i0.0)') Grid % Vect % n_threads + call Message % Framed(48, 'NOTE from OpenMP!', & + 'You are running a simulation on ' // & + trim(st1) // ' threads.', one_proc=.true.) + end if !----------------------------------------------------------! ! If there is more than one thread, decompose the mesh ! !----------------------------------------------------------! if(PROGRAM_NAME == "Process" .and. & - Grid % n_threads > 1) then + Grid % Vect % n_threads > 1) then ! Set the face range to the inside faces s_f = Grid % region % f_face(Grid % n_regions) @@ -47,11 +74,11 @@ subroutine Determine_Threads(Grid) end do ! Create METIS - call Metis % Create_Metis(s_f, s_l, Grid % faces_c, Grid % n_threads) + call Metis % Create_Metis(s_f, s_l, Grid % faces_c, Grid % Vect % n_threads) ! Set some high value for threads everywhere. In calls which follow ! cells which are not in buffers will be over-written by true threads - Grid % cell_thread(:) = Grid % n_threads * 10 + Grid % Vect % cell_thread(:) = Grid % Vect % n_threads * 10 ! Set the cell range to the inside of the domain, no buffer cells here c_f = Grid % region % f_cell(Grid % n_regions) @@ -59,13 +86,14 @@ subroutine Determine_Threads(Grid) ! Call METIS to assign regions to inside cells (not in buffers). In ! buffers, you should still have values you assigned a few lines above - call Metis % Call_Metis(Grid % n_threads, Grid % cell_thread(c_f:c_l)) + call Metis % Call_Metis(Grid % Vect % n_threads, & + Grid % Vect % cell_thread(c_f:c_l)) do c = Cells_In_Domain() - Assert(Grid % cell_thread(c) .le. Grid % n_threads) + Assert(Grid % Vect % cell_thread(c) .le. Grid % Vect % n_threads) end do do c = Cells_In_Buffers() - Assert(Grid % cell_thread(c) .gt. Grid % n_threads) + Assert(Grid % Vect % cell_thread(c) .gt. Grid % Vect % n_threads) end do ! Now this is quite brave diff --git a/Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 b/Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 index 9caf5b70e..f2bbed398 100644 --- a/Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 +++ b/Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 @@ -2,6 +2,25 @@ subroutine Form_Cells_Comm(Grid) !------------------------------------------------------------------------------! ! Find communication patterns for cells from Process ! +! ! +! This is not the simplest procedure in T-Flows, so in this header I will ! +! try to explain how it works. In a nutshell, it browses through buffer ! +! cells of all sub-domains and stores their global numbers as well as sub- ! +! domain numbers they are from (in need_cell and from_proc matrices). ! +! This information is distributed among all the processor by performing a ! +! global sum over integer arrays, and with that continues to form buffers. ! +! ! +! For this procedure to work, it is essential that global cell numbers are ! +! the same in buffers and in inside cells from which the data is needed. ! +! This was the case until the moment we started sorting inside cells to be ! +! in different threads for vectorization. Once that happened, an extra ! +! measure was taken, by sorting buffers with criteria in send_sort() and ! +! recv_sort(). (Though, the latter one might not be needed.) ! +! +! In other words: because we are browsing through cells in separate dom- ! +! ains independently, we must ensure they are in right order. This is en- ! +! sured by forming send_sort() and recv_sort() and applying them order ! +! cells in send and receive buffers. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -12,6 +31,7 @@ subroutine Form_Cells_Comm(Grid) integer, allocatable :: send_cells(:), recv_cells(:) integer, allocatable :: send_buff_cnt(:,:), recv_buff_cnt(:,:) integer, allocatable :: need_cell(:,:), from_proc(:,:) + integer, allocatable :: send_sort(:), recv_sort(:) integer, allocatable :: glo(:) ! used for checking the communication logical, parameter :: DEBUG = .false. !==============================================================================! @@ -154,6 +174,7 @@ subroutine Form_Cells_Comm(Grid) allocate(Grid % Comm % cells_send(sub) % i_buff(ms)); allocate(Grid % Comm % cells_send(sub) % l_buff(ms)); allocate(Grid % Comm % cells_send(sub) % r_buff(ms)); + allocate(send_sort(ms)); end if if(mr > 0) then @@ -162,14 +183,13 @@ subroutine Form_Cells_Comm(Grid) allocate(Grid % Comm % cells_recv(sub) % l_buff(mr)); allocate(Grid % Comm % cells_recv(sub) % r_buff(mr)); allocate(Grid % Comm % cells_recv(sub) % o_buff(mr)); + allocate(recv_sort(mr)); end if !------------------------------------------! ! Form send_cells from the information ! ! in matrices from_proc and need_cell ! !------------------------------------------! - ms = 0 - mr = 0 cnt = 0 send_cells(:) = 0 @@ -188,22 +208,42 @@ subroutine Form_Cells_Comm(Grid) ' # It did find ', cnt, & ' cells to send to processor', sub - ! This worries me. Why should this be from -Grid % n_bnd_cells or not + ! Browse through cells in domain to find what you have to send + ms = 0 do c = Cells_In_Domain() if(send_cells(c) .eq. sub) then ms = ms + 1 Grid % Comm % cells_send(sub) % map(ms) = c + send_sort(ms) = Grid % Comm % cell_glo(c) ! store sorting criterion end if end do - ! This worries me. Why should this be from -Grid % n_bnd_cells or not + ! Important link for robustness: insures that the sent cells in this + ! domain are ordered in the same way as receive cells in other domain + if(ms > 0) then + call Sort % Int_Carry_Int(send_sort, & + Grid % Comm % cells_send(sub) % map) + end if + + ! Browse through cells in buffers to find out what you need to receive + mr = 0 do c = Cells_In_Buffers() if(recv_cells(c) .eq. sub) then mr = mr + 1 Grid % Comm % cells_recv(sub) % map(mr) = c + recv_sort(mr) = Grid % Comm % cell_glo(c) ! store sorting criterion end if end do + ! Important link for robustness: insures that the receive cells in this + ! domain are ordered in the same way as sent cells in other domain. + ! (Yet, this is not engaged yet since the cells in buffers has not been + ! fiddled with like the cells in domain due to OpenMP threading.) + ! if(mr > 0) then + ! call Sort % Int_Carry_Int(recv_sort, & + ! Grid % Comm % cells_recv(sub) % map) + ! end if + if(DEBUG) then write(100*this_proc+sub, '(a,i0.0,a,i0.0,a,i0.0,a,i0.0)') & ' # send/recv (', this_proc, '/', sub, ') = ', ms, ' / ', mr @@ -213,6 +253,10 @@ subroutine Form_Cells_Comm(Grid) Grid % Comm % cells_send(sub) % n_items = ms Grid % Comm % cells_recv(sub) % n_items = mr + ! Free sorting arrays for the next iteration + if(ms > 0) deallocate(send_sort) + if(mr > 0) deallocate(recv_sort) + end if ! sub .ne. this_proc end do ! sub @@ -241,11 +285,11 @@ subroutine Form_Cells_Comm(Grid) end do call Comm_Mod_Global_Sum_Int(n_fail) if(n_fail .gt. 0) then - call Message % Error(55, & - 'Ouch, this hurts. Formation of commuication ' // & - 'patterns has failed. Hopefully, you just ran ' // & - 'the simulation on fewer processor than there ' // & - 'are subdomains. \n \n This error is critical.', & + call Message % Error(55, & + 'Ouch, this hurts. Formation of communication ' // & + 'patterns has failed. Hopefully, you just ran ' // & + 'the simulation on fewer processor than there ' // & + 'are subdomains. \n \n This error is critical.', & file=__FILE__, line=__LINE__, one_proc=.true.) end if diff --git a/Sources/Shared/Grid_Mod/Form_Maps_For_Backup.f90 b/Sources/Shared/Grid_Mod/Form_Maps_For_Backup.f90 index bea551102..9325d0c51 100644 --- a/Sources/Shared/Grid_Mod/Form_Maps_For_Backup.f90 +++ b/Sources/Shared/Grid_Mod/Form_Maps_For_Backup.f90 @@ -2,13 +2,7 @@ subroutine Form_Maps_For_Backup(Grid) !------------------------------------------------------------------------------! ! Forms maps for parallel backup ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Grid_Type) :: Grid -!-----------------------------------[Locals]-----------------------------------! - integer :: c, cnt, reg -!==============================================================================! +! ! ! There is an issue with this procedure, but it's more related to MPI/IO ! ! functions than T-Flows. In cases a subdomain has no physical boundary ! ! cells, variable "nb_sub" turns out to be zero. This, per se, should not ! @@ -17,7 +11,17 @@ subroutine Form_Maps_For_Backup(Grid) ! length. But they don't. Therefore, I avoid allocation with zero size ! ! (max(nb_sub,1)) here and creation of new types with zero size in ! ! "Comm_Mod_Create_New_Types". It is a bit of a dirty trick :-( ! +! ! +! Another issue, also related to MPI, is that maps for saving must be in ! +! increasing order. If you are doing only MPI that is fine, but if you ! +! are renumbering cells for threading with OpenMP, things get cumbersome. ! !------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Grid_Type) :: Grid +!-----------------------------------[Locals]-----------------------------------! + integer :: c, cnt, reg +!==============================================================================! ! Initialize number of cells in subdomain Grid % Comm % nc_sub = Grid % n_cells - Grid % Comm % n_buff_cells @@ -99,6 +103,11 @@ subroutine Form_Maps_For_Backup(Grid) Grid % Comm % cell_map(c) = int(Grid % Comm % cell_glo(c)-1, SP) end do + ! Maps must be in increasing order + do c = 2, Grid % Comm % nc_sub + Assert(Grid % Comm % cell_map(c) .gt. Grid % Comm % cell_map(c-1)) + end do + !-----------------------! ! Boundary cell map ! !-----------------------! @@ -113,6 +122,11 @@ subroutine Form_Maps_For_Backup(Grid) end do end do ! region + ! Maps must be in increasing order + do c = 2, Grid % Comm % nb_sub + Assert(Grid % Comm % bnd_cell_map(c) .gt. Grid % Comm % bnd_cell_map(c-1)) + end do + ! If domain has zero boundary cells, make the only ! (fictitious) member in the map point it to zero. if(cnt .eq. 0) then diff --git a/Sources/Shared/Grid_Mod/Save_Vtu_Cells.f90 b/Sources/Shared/Grid_Mod/Save_Vtu_Cells.f90 index a95d38798..8a5151155 100644 --- a/Sources/Shared/Grid_Mod/Save_Vtu_Cells.f90 +++ b/Sources/Shared/Grid_Mod/Save_Vtu_Cells.f90 @@ -347,7 +347,7 @@ subroutine Save_Vtu_Cells(Grid, sub, n_nodes_sub, n_cells_sub) write(fu) data_size do c = 1, Grid % n_cells if(Grid % new_c(c) .ne. 0) then - write(fu) Grid % cell_thread(c) + write(fu) Grid % Vect % cell_thread(c) end if end do diff --git a/Sources/Shared/Grid_Mod/Sort_Cells_By_Thread.f90 b/Sources/Shared/Grid_Mod/Sort_Cells_By_Thread.f90 index ab9235782..a61c45d15 100644 --- a/Sources/Shared/Grid_Mod/Sort_Cells_By_Thread.f90 +++ b/Sources/Shared/Grid_Mod/Sort_Cells_By_Thread.f90 @@ -60,7 +60,7 @@ subroutine Sort_Cells_By_Thread(Grid) ! Set sorting criteria ! !--------------------------! do c = 1, Grid % n_cells - thread(c) = Grid % cell_thread(c) ! in buffers, should be > n_threads + thread(c) = Grid % Vect % cell_thread(c) ! in buffers, must be > n_threads cell (c) = c Grid % old_c(c) = c end do @@ -126,20 +126,20 @@ subroutine Sort_Cells_By_Thread(Grid) Grid % cells_c(1:mcc,Grid % new_c(c)) = old_cells(1:mcc, c) end do nc = Grid % n_cells ! abbreviate the syntax - call Sort % Real_By_Index(nc, Grid % xc (1), Grid % new_c(1)) - call Sort % Real_By_Index(nc, Grid % yc (1), Grid % new_c(1)) - call Sort % Real_By_Index(nc, Grid % zc (1), Grid % new_c(1)) - call Sort % Real_By_Index(nc, Grid % vol (1), Grid % new_c(1)) - call Sort % Real_By_Index(nc, Grid % ixx (1), Grid % new_c(1)) - call Sort % Real_By_Index(nc, Grid % iyy (1), Grid % new_c(1)) - call Sort % Real_By_Index(nc, Grid % izz (1), Grid % new_c(1)) - call Sort % Real_By_Index(nc, Grid % ixy (1), Grid % new_c(1)) - call Sort % Real_By_Index(nc, Grid % ixz (1), Grid % new_c(1)) - call Sort % Real_By_Index(nc, Grid % iyz (1), Grid % new_c(1)) - call Sort % Real_By_Index(nc, Grid % wall_dist (1), Grid % new_c(1)) - call Sort % Int_By_Index (nc, Grid % cell_thread (1), Grid % new_c(1)) - call Sort % Int_By_Index (nc, Grid % Comm % cell_glo (1), Grid % new_c(1)) - call Sort % Int_By_Index (nc, Grid % Comm % cell_proc(1), Grid % new_c(1)) + call Sort % Real_By_Index(nc, Grid % xc (1), Grid % new_c(1)) + call Sort % Real_By_Index(nc, Grid % yc (1), Grid % new_c(1)) + call Sort % Real_By_Index(nc, Grid % zc (1), Grid % new_c(1)) + call Sort % Real_By_Index(nc, Grid % vol (1), Grid % new_c(1)) + call Sort % Real_By_Index(nc, Grid % ixx (1), Grid % new_c(1)) + call Sort % Real_By_Index(nc, Grid % iyy (1), Grid % new_c(1)) + call Sort % Real_By_Index(nc, Grid % izz (1), Grid % new_c(1)) + call Sort % Real_By_Index(nc, Grid % ixy (1), Grid % new_c(1)) + call Sort % Real_By_Index(nc, Grid % ixz (1), Grid % new_c(1)) + call Sort % Real_By_Index(nc, Grid % iyz (1), Grid % new_c(1)) + call Sort % Real_By_Index(nc, Grid % wall_dist (1), Grid % new_c(1)) + call Sort % Int_By_Index (nc, Grid % Vect % cell_thread(1), Grid % new_c(1)) + call Sort % Int_By_Index (nc, Grid % Comm % cell_glo (1), Grid % new_c(1)) + call Sort % Int_By_Index (nc, Grid % Comm % cell_proc (1), Grid % new_c(1)) !-----------------------------! ! Check processor numbers ! diff --git a/Sources/Shared/Vect_Mod.f90 b/Sources/Shared/Vect_Mod.f90 new file mode 100644 index 000000000..bd20d0fef --- /dev/null +++ b/Sources/Shared/Vect_Mod.f90 @@ -0,0 +1,84 @@ +!==============================================================================! + module Vect_Mod +!------------------------------------------------------------------------------! +! Module for OpenMP functionality. ! +! ! +! Some OpenMP functions you get with Omp_Lib: ! +! ! +! - int omp_get_max_threads() ! +! Returns max possible (generally set by OMP_NUM_THREADS). ! +! ! +! - int omp_get_num_threads() ! +! Returns number of threads in current team. ! +! ! +! - int omp_get_thread_num() ! +! Gets current thread number. It is between 0 and omp_get_num_threads()-1 ! +! ! +! - int omp_set_num_threads(num_threads) ! +! Sets the number of threads overriding the OMP_NUM_THREADS. ! +! ! +! I will try to encapsulate those as it is done in Comm_Mod/Type ! +!------------------------------------------------------------------------------! +!----------------------------------[Modules]-----------------------------------! + use Omp_Lib ! for OpenMP functionality + use Region_Mod + use Assert_Mod +!------------------------------------------------------------------------------! + implicit none +!==============================================================================! + + !---------------! + ! Vect type ! + !---------------! + type Vect_Type ! used inside the Grid_Type + + ! Number of threads + integer :: n_threads + + ! Desired number of threads read from control file + integer :: d_threads + + type(Region_Type) :: region + + ! Thread i.d. defined for each cell + integer, allocatable :: cell_thread(:) + + contains + procedure :: Get_Max_Threads + procedure :: Set_Num_Threads + + end type + + contains + !==============================================================================! + integer function Get_Max_Threads(Vect) + !------------------------------------------------------------------------------! + implicit none + !------------------------------------------------------------------------------! + class(Vect_Type) :: Vect + !==============================================================================! + + Get_Max_Threads = 1 +# ifdef _OPENMP + Get_Max_Threads = omp_get_max_threads() +# endif + + end function + + !==============================================================================! + subroutine Set_Num_Threads(Vect, n) + !------------------------------------------------------------------------------! + implicit none + !------------------------------------------------------------------------------! + class(Vect_Type) :: Vect + integer, intent(in) :: n + !==============================================================================! + +# ifdef _OPENMP + call omp_set_num_threads(n) +# endif + + end subroutine + + + end module From 7e76fd980b4100bf50c728c1ce34bb554f48028e Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 16 Mar 2023 09:42:35 +0100 Subject: [PATCH 089/223] Simplified version of defining threads. On branch bojan_fixed_cell_ranges modified: Shared/Grid_Mod/Determine_Threads.f90 --- Sources/Shared/Grid_Mod/Determine_Threads.f90 | 78 +++++++++---------- 1 file changed, 38 insertions(+), 40 deletions(-) diff --git a/Sources/Shared/Grid_Mod/Determine_Threads.f90 b/Sources/Shared/Grid_Mod/Determine_Threads.f90 index cd7fda810..c2323bcaf 100644 --- a/Sources/Shared/Grid_Mod/Determine_Threads.f90 +++ b/Sources/Shared/Grid_Mod/Determine_Threads.f90 @@ -5,15 +5,19 @@ subroutine Determine_Threads(Grid) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Grid_Type), intent(inout) :: Grid + class(Grid_Type), target, intent(inout) :: Grid !------------------------------[Local parameters]------------------------------! logical, parameter :: DEBUG = .false. !-----------------------------------[Locals]-----------------------------------! - integer :: c, s - integer :: c_f, c_l, s_f, s_l ! first/last cell, first/last face - character(SL) :: st1, st2 + type(Vect_Type), pointer :: Vect + integer :: c, s + integer :: n_cells_in, in_region, n_remains, reg + integer, allocatable :: cells_in_region(:) + character(SL) :: st1, st2 !==============================================================================! + ! Take aliases + Vect => Grid % Vect !----------------------------! ! Find number of threads ! @@ -54,50 +58,44 @@ subroutine Determine_Threads(Grid) if(PROGRAM_NAME == "Process" .and. & Grid % Vect % n_threads > 1) then - ! Set the face range to the inside faces - s_f = Grid % region % f_face(Grid % n_regions) - s_l = Grid % region % l_face(Grid % n_regions) - - ! In case of parallel runs, you do not want the faces in buffers, - ! you want threads only in inside cells, not spreading to buffers - do s = Faces_In_Domain() - if(Grid % Comm % cell_proc(Grid % faces_c(2, s)) .ne. this_proc) then - s_l = s - 1 - exit - end if - end do - - ! Check 1 - do s = s_f, s_l - Assert(Grid % Comm % cell_proc(Grid % faces_c(1, s)) .eq. this_proc) - Assert(Grid % Comm % cell_proc(Grid % faces_c(2, s)) .eq. this_proc) - end do + allocate(Grid % Vect % region % f_cell(Grid % Vect % n_threads)) + allocate(Grid % Vect % region % l_cell(Grid % Vect % n_threads)) - ! Create METIS - call Metis % Create_Metis(s_f, s_l, Grid % faces_c, Grid % Vect % n_threads) + n_cells_in = Grid % region % l_cell(Grid % n_regions) - & + Grid % region % f_cell(Grid % n_regions) + 1 - ! Set some high value for threads everywhere. In calls which follow - ! cells which are not in buffers will be over-written by true threads - Grid % Vect % cell_thread(:) = Grid % Vect % n_threads * 10 + in_region = n_cells_in / Grid % Vect % n_threads + n_remains = mod(n_cells_in, Grid % Vect % n_threads) - ! Set the cell range to the inside of the domain, no buffer cells here - c_f = Grid % region % f_cell(Grid % n_regions) - c_l = Grid % region % l_cell(Grid % n_regions) + allocate(cells_in_region(Grid % Vect % n_threads)) + cells_in_region(:) = in_region - ! Call METIS to assign regions to inside cells (not in buffers). In - ! buffers, you should still have values you assigned a few lines above - call Metis % Call_Metis(Grid % Vect % n_threads, & - Grid % Vect % cell_thread(c_f:c_l)) + ! Add the remaining cells to the regions + do reg = 1, n_remains + cells_in_region(reg) = cells_in_region(reg) + 1 + end do - do c = Cells_In_Domain() - Assert(Grid % Vect % cell_thread(c) .le. Grid % Vect % n_threads) + ! Work out starts and ends of the regions + Vect % region % f_cell(1) = Grid % region % f_cell(Grid % n_regions) + Vect % region % l_cell(1) = Vect % region % f_cell(1) & + + cells_in_region(1) - 1 + do reg = 2, Grid % Vect % n_threads + Vect % region % f_cell(reg) = Vect % region % l_cell(reg-1) + 1 + Vect % region % l_cell(reg) = Vect % region % f_cell(reg) & + + cells_in_region(reg) - 1 end do - do c = Cells_In_Buffers() - Assert(Grid % Vect % cell_thread(c) .gt. Grid % Vect % n_threads) + + ! Assign cell threads (not sure if really needed) + do reg = 1, Vect % n_threads + do c = Vect % region % f_cell(reg), Vect % region % l_cell(reg) + Vect % cell_thread(c) = reg + end do end do - ! Now this is quite brave - call Grid % Sort_Cells_By_Thread() + ! Now this was good, but was having a hell of an impact + ! on communication patterns and backup files creation + ! call Grid % Sort_Cells_By_Thread() + call Grid % Save_Vtu_Faces() end if From 3afe8fa370cfbbf803e152a9ceb4b49a7ed075a5 Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 16 Mar 2023 11:11:18 +0100 Subject: [PATCH 090/223] Good: introduced an optional integer array to plot On branch bojan_fixed_cell_ranges modified: Shared/Grid_Mod/Save_Vtu_Faces.f90 --- Sources/Shared/Grid_Mod/Save_Vtu_Faces.f90 | 38 +++++++++++++++++----- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/Sources/Shared/Grid_Mod/Save_Vtu_Faces.f90 b/Sources/Shared/Grid_Mod/Save_Vtu_Faces.f90 index d2d6f3158..3c6f27aa3 100644 --- a/Sources/Shared/Grid_Mod/Save_Vtu_Faces.f90 +++ b/Sources/Shared/Grid_Mod/Save_Vtu_Faces.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Save_Vtu_Faces(Grid, plot_shadows, phi_f) + subroutine Save_Vtu_Faces(Grid, plot_shadows, real_phi_f, int_phi_f) !------------------------------------------------------------------------------! ! Writes boundary condition .faces.vtu or shadow .shadow.vtu file. ! !------------------------------------------------------------------------------! @@ -7,7 +7,8 @@ subroutine Save_Vtu_Faces(Grid, plot_shadows, phi_f) !---------------------------------[Arguments]----------------------------------! class(Grid_Type) :: Grid logical, optional :: plot_shadows ! plot shadow faces - real, optional :: phi_f(1:Grid % n_faces) + real, optional :: real_phi_f(1:Grid % n_faces) + integer, optional :: int_phi_f (1:Grid % n_faces) !-----------------------------------[Locals]-----------------------------------! integer(SP) :: data_size integer :: c2, n, s, s_f, s_l, cell_offset, data_offset, n_conns, fu @@ -134,17 +135,28 @@ subroutine Save_Vtu_Faces(Grid, plot_shadows, phi_f) write(fu) IN_4 // '' // LF data_offset = data_offset + SP + (s_l-s_f+1) * IP ! prepare for next - ! Optional face variable - if(present(phi_f)) then + ! Optional real face variable + if(present(real_phi_f)) then write(str1, '(i0.0)') data_offset write(fu) IN_4 // '' // LF write(fu) IN_4 // '' // LF data_offset = data_offset + SP + (s_l-s_f+1) * RP ! prepare for next end if + ! Optional integer face variable + if(present(int_phi_f)) then + write(str1, '(i0.0)') data_offset + write(fu) IN_4 // '' // LF + write(fu) IN_4 // '' // LF + data_offset = data_offset + SP + (s_l-s_f+1) * IP ! prepare for next + end if + ! Number of nodes write(str1, '(i0.0)') data_offset write(fu) IN_4 // ' 1) then - write(st1, '(i0.0)') Grid % Vect % n_threads + if(Vect % n_threads > 1) then + write(st1, '(i0.0)') Vect % n_threads call Message % Framed(48, 'NOTE from OpenMP!', & 'You are running a simulation on ' // & trim(st1) // ' threads.', one_proc=.true.) @@ -56,46 +56,54 @@ subroutine Determine_Threads(Grid) ! If there is more than one thread, decompose the mesh ! !----------------------------------------------------------! if(PROGRAM_NAME == "Process" .and. & - Grid % Vect % n_threads > 1) then + Vect % n_threads > 1) then - allocate(Grid % Vect % region % f_cell(Grid % Vect % n_threads)) - allocate(Grid % Vect % region % l_cell(Grid % Vect % n_threads)) + allocate(Vect % thread % f_cell(Vect % n_threads)) + allocate(Vect % thread % l_cell(Vect % n_threads)) n_cells_in = Grid % region % l_cell(Grid % n_regions) - & Grid % region % f_cell(Grid % n_regions) + 1 - in_region = n_cells_in / Grid % Vect % n_threads - n_remains = mod(n_cells_in, Grid % Vect % n_threads) + in_thread = n_cells_in / Vect % n_threads + n_remains = mod(n_cells_in, Vect % n_threads) - allocate(cells_in_region(Grid % Vect % n_threads)) - cells_in_region(:) = in_region + allocate(cells_in_thread(Vect % n_threads)) + cells_in_thread(:) = in_thread ! Add the remaining cells to the regions - do reg = 1, n_remains - cells_in_region(reg) = cells_in_region(reg) + 1 + do thr = 1, n_remains + cells_in_thread(thr) = cells_in_thread(thr) + 1 end do ! Work out starts and ends of the regions - Vect % region % f_cell(1) = Grid % region % f_cell(Grid % n_regions) - Vect % region % l_cell(1) = Vect % region % f_cell(1) & - + cells_in_region(1) - 1 - do reg = 2, Grid % Vect % n_threads - Vect % region % f_cell(reg) = Vect % region % l_cell(reg-1) + 1 - Vect % region % l_cell(reg) = Vect % region % f_cell(reg) & - + cells_in_region(reg) - 1 + Vect % thread % f_cell(1) = Grid % region % f_cell(Grid % n_regions) + Vect % thread % l_cell(1) = Vect % thread % f_cell(1) & + + cells_in_thread(1) - 1 + do thr = 2, Vect % n_threads + Vect % thread % f_cell(thr) = Vect % thread % l_cell(thr-1) + 1 + Vect % thread % l_cell(thr) = Vect % thread % f_cell(thr) & + + cells_in_thread(thr) - 1 end do ! Assign cell threads (not sure if really needed) - do reg = 1, Vect % n_threads - do c = Vect % region % f_cell(reg), Vect % region % l_cell(reg) - Vect % cell_thread(c) = reg + do thr = 1, Vect % n_threads + do c = Vect % thread % f_cell(thr), Vect % thread % l_cell(thr) + Vect % cell_thread(c) = thr end do end do + ! A plain copy of cell threads to face threads seems to work just fine + ! (For the time being, I am only treating inside faces. I am not even + ! sure if explcit parallelization of boundary regions makes sense) + do s = Faces_In_Domain() + c = Grid % faces_c(1, s) + Vect % face_thread(s) = Vect % cell_thread(c) + end do + call Grid % Save_Vtu_Faces(int_phi_f=Vect % face_thread) + ! Now this was good, but was having a hell of an impact ! on communication patterns and backup files creation ! call Grid % Sort_Cells_By_Thread() - call Grid % Save_Vtu_Faces() end if diff --git a/Sources/Shared/Vect_Mod.f90 b/Sources/Shared/Vect_Mod.f90 index bd20d0fef..b5071aac8 100644 --- a/Sources/Shared/Vect_Mod.f90 +++ b/Sources/Shared/Vect_Mod.f90 @@ -38,10 +38,11 @@ module Vect_Mod ! Desired number of threads read from control file integer :: d_threads - type(Region_Type) :: region + type(Region_Type) :: thread - ! Thread i.d. defined for each cell + ! Thread for each cell and face integer, allocatable :: cell_thread(:) + integer, allocatable :: face_thread(:) contains procedure :: Get_Max_Threads From 833282559132900b48947e4f84fb25992fb07bf4 Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 16 Mar 2023 12:57:28 +0100 Subject: [PATCH 092/223] First version which determines face threads. It seems to be running even when compiled with MPI and OpenMP On branch bojan_fixed_cell_ranges modified: Shared/Grid_Mod/Determine_Threads.f90 --- Sources/Shared/Grid_Mod/Determine_Threads.f90 | 124 ++++++++++++++++-- 1 file changed, 114 insertions(+), 10 deletions(-) diff --git a/Sources/Shared/Grid_Mod/Determine_Threads.f90 b/Sources/Shared/Grid_Mod/Determine_Threads.f90 index 80e26ea00..d5b134ebe 100644 --- a/Sources/Shared/Grid_Mod/Determine_Threads.f90 +++ b/Sources/Shared/Grid_Mod/Determine_Threads.f90 @@ -10,17 +10,30 @@ subroutine Determine_Threads(Grid) logical, parameter :: DEBUG = .false. !-----------------------------------[Locals]-----------------------------------! type(Vect_Type), pointer :: Vect - integer :: c, s, c1, c2 + integer :: c, s, c1, c2, m, i_fac integer :: n_cells_in, in_thread, n_remains, thr integer, allocatable :: cells_in_thread(:) character(SL) :: st1, st2 + integer :: f_s, l_s + integer, allocatable :: old_fc (:,:) + integer, allocatable :: old_nn (:) + integer, allocatable :: old_shad(:) + integer, allocatable :: old_nods(:,:) !==============================================================================! + m = size(Grid % faces_n, 1) + allocate(old_fc (2, Grid % n_faces)) ! old number of nodes + allocate(old_nn ( Grid % n_faces)) ! old number of nodes + allocate(old_shad( Grid % n_faces)) + allocate(old_nods(m, Grid % n_faces)) + ! Take aliases Vect => Grid % Vect !----------------------------! + ! ! ! Find number of threads ! + ! ! !- - - - - - - - - - - - - - +-----------------------! ! This is all a bit silly at this stage, it will ! ! make more sense when Vect_Mod matures a bit. ! @@ -52,30 +65,34 @@ subroutine Determine_Threads(Grid) trim(st1) // ' threads.', one_proc=.true.) end if - !----------------------------------------------------------! - ! If there is more than one thread, decompose the mesh ! - !----------------------------------------------------------! + !-------------------------------------------------------! + ! ! + ! If there is more than one thread, distribute them ! + ! ! + !-------------------------------------------------------! if(PROGRAM_NAME == "Process" .and. & Vect % n_threads > 1) then + !--------------------------! + ! Arrange cell threads ! + !--------------------------! allocate(Vect % thread % f_cell(Vect % n_threads)) allocate(Vect % thread % l_cell(Vect % n_threads)) n_cells_in = Grid % region % l_cell(Grid % n_regions) - & Grid % region % f_cell(Grid % n_regions) + 1 - in_thread = n_cells_in / Vect % n_threads n_remains = mod(n_cells_in, Vect % n_threads) allocate(cells_in_thread(Vect % n_threads)) cells_in_thread(:) = in_thread - ! Add the remaining cells to the regions + ! Add the remaining cells to the threads do thr = 1, n_remains cells_in_thread(thr) = cells_in_thread(thr) + 1 end do - ! Work out starts and ends of the regions + ! Work out starts and ends of the threads Vect % thread % f_cell(1) = Grid % region % f_cell(Grid % n_regions) Vect % thread % l_cell(1) = Vect % thread % f_cell(1) & + cells_in_thread(1) - 1 @@ -92,6 +109,10 @@ subroutine Determine_Threads(Grid) end do end do + !-------------------------! + ! Arange face threads ! + !-------------------------! + ! A plain copy of cell threads to face threads seems to work just fine ! (For the time being, I am only treating inside faces. I am not even ! sure if explcit parallelization of boundary regions makes sense) @@ -101,9 +122,92 @@ subroutine Determine_Threads(Grid) end do call Grid % Save_Vtu_Faces(int_phi_f=Vect % face_thread) - ! Now this was good, but was having a hell of an impact - ! on communication patterns and backup files creation - ! call Grid % Sort_Cells_By_Thread() + ! The problem with simple assignments above is that face threads + ! are not continous, they break at buffer faces which are sorted + ! by processors. This shouldn't be needed for parallel runs ... + do s = 1, Grid % n_faces + Grid % old_f(s) = s + end do + + ! ... hence, faces are sorted by threads + f_s = Grid % region % f_face(Grid % n_regions) + l_s = Grid % region % l_face(Grid % n_regions) + call Sort % Int_Carry_Int(Vect % face_thread(f_s:l_s), & + Grid % old_f(f_s:l_s)) + + ! Sort connectivity: faces_c, faces_n_nodes, faces_n and faces_s + do s = Faces_In_Domain() + old_fc (1:2,s) = Grid % faces_c (1:2, Grid % old_f(s)) + old_nn ( s) = Grid % faces_n_nodes( Grid % old_f(s)) + old_nods(1:m,s) = Grid % faces_n (1:m, Grid % old_f(s)) + old_shad( s) = Grid % faces_s ( Grid % old_f(s)) + end do + do s = Faces_In_Domain() + Grid % faces_c(1:2, s) = old_fc (1:2, s) + Grid % faces_n_nodes(s) = old_nn ( s) + Grid % faces_n(1:m, s) = old_nods(1:m, s) + Grid % faces_s (s) = old_shad( s) + Assert(Grid % faces_c(1,s) .lt. Grid % faces_c(2,s)) + end do + + ! Form the new face numbers from the old face numbers + do s = 1, Grid % n_faces + Grid % new_f(Grid % old_f(s)) = s + end do + + ! Do the sorting of geometrical quantities. All ... + ! ... which is read from .dim file should be here. + call Sort % Real_By_Index(Grid % n_faces, Grid % sx(1), Grid % new_f(1)) + call Sort % Real_By_Index(Grid % n_faces, Grid % sy(1), Grid % new_f(1)) + call Sort % Real_By_Index(Grid % n_faces, Grid % sz(1), Grid % new_f(1)) + call Sort % Real_By_Index(Grid % n_faces, Grid % dx(1), Grid % new_f(1)) + call Sort % Real_By_Index(Grid % n_faces, Grid % dy(1), Grid % new_f(1)) + call Sort % Real_By_Index(Grid % n_faces, Grid % dz(1), Grid % new_f(1)) + call Sort % Real_By_Index(Grid % n_faces, Grid % f (1), Grid % new_f(1)) + call Sort % Real_By_Index(Grid % n_faces, Grid % xf(1), Grid % new_f(1)) + call Sort % Real_By_Index(Grid % n_faces, Grid % yf(1), Grid % new_f(1)) + call Sort % Real_By_Index(Grid % n_faces, Grid % zf(1), Grid % new_f(1)) + call Sort % Real_By_Index(Grid % n_faces, Grid % rx(1), Grid % new_f(1)) + call Sort % Real_By_Index(Grid % n_faces, Grid % ry(1), Grid % new_f(1)) + call Sort % Real_By_Index(Grid % n_faces, Grid % rz(1), Grid % new_f(1)) + + ! Correct shadow faces + do s = Grid % n_faces + 1, Grid % n_faces + Grid % n_shadows + Grid % faces_s(s) = Grid % new_f(Grid % faces_s(s)) + end do + + ! Correct face indexes for cells + do c = -Grid % n_bnd_cells, Grid % n_cells + do i_fac = 1, Grid % cells_n_faces(c) + s = Grid % cells_f(i_fac, c) ! take the face's index + Grid % cells_f(i_fac, c) = Grid % new_f(s) + end do + end do + + ! Work out starts and ends of the threads + allocate(Vect % thread % f_face(Vect % n_threads)) + allocate(Vect % thread % l_face(Vect % n_threads)) + + do thr = 1, Vect % n_threads + Vect % thread % f_face(thr) = HUGE_INT + Vect % thread % l_face(thr) = -HUGE_INT + do s = Faces_In_Domain() + if(Vect % face_thread(s) .eq. thr) then + Vect % thread % f_face(thr) = min(Vect % thread % f_face(thr), s) + Vect % thread % l_face(thr) = max(Vect % thread % l_face(thr), s) + end if + end do + end do + + ! Perform some check + do thr = 1, Vect % n_threads + Assert(Vect % thread % f_face(thr) .le. Vect % thread % l_face(thr)) + end do + do thr = 2, Vect % n_threads + Assert(Vect % thread % f_face(thr) .ge. Vect % thread % f_face(thr-1)) + Assert(Vect % thread % l_face(thr) .ge. Vect % thread % l_face(thr-1)) + Assert(Vect % thread % f_face(thr) .ge. Vect % thread % l_face(thr-1)) + end do end if From adcfb125b87bc6a44b80aa68d1286e5b9b796443 Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 16 Mar 2023 12:58:28 +0100 Subject: [PATCH 093/223] Member procedures in separate files for Vect_Mod On branch bojan_fixed_cell_ranges modified: Shared/Vect_Mod.f90 new file: Shared/Vect_Mod/Get_Max_Threads.f90 new file: Shared/Vect_Mod/Set_Num_Threads.f90 --- Sources/Shared/Vect_Mod.f90 | 31 ++------------------- Sources/Shared/Vect_Mod/Get_Max_Threads.f90 | 15 ++++++++++ Sources/Shared/Vect_Mod/Set_Num_Threads.f90 | 15 ++++++++++ 3 files changed, 32 insertions(+), 29 deletions(-) create mode 100644 Sources/Shared/Vect_Mod/Get_Max_Threads.f90 create mode 100644 Sources/Shared/Vect_Mod/Set_Num_Threads.f90 diff --git a/Sources/Shared/Vect_Mod.f90 b/Sources/Shared/Vect_Mod.f90 index b5071aac8..6fff2f0b5 100644 --- a/Sources/Shared/Vect_Mod.f90 +++ b/Sources/Shared/Vect_Mod.f90 @@ -51,35 +51,8 @@ module Vect_Mod end type contains - !==============================================================================! - integer function Get_Max_Threads(Vect) - !------------------------------------------------------------------------------! - implicit none - !------------------------------------------------------------------------------! - class(Vect_Type) :: Vect - !==============================================================================! - - Get_Max_Threads = 1 -# ifdef _OPENMP - Get_Max_Threads = omp_get_max_threads() -# endif - - end function - - !==============================================================================! - subroutine Set_Num_Threads(Vect, n) - !------------------------------------------------------------------------------! - implicit none - !------------------------------------------------------------------------------! - class(Vect_Type) :: Vect - integer, intent(in) :: n - !==============================================================================! - -# ifdef _OPENMP - call omp_set_num_threads(n) -# endif - - end subroutine +# include "Vect_Mod/Get_Max_Threads.f90" +# include "Vect_Mod/Set_Num_Threads.f90" end module diff --git a/Sources/Shared/Vect_Mod/Get_Max_Threads.f90 b/Sources/Shared/Vect_Mod/Get_Max_Threads.f90 new file mode 100644 index 000000000..5dfee039e --- /dev/null +++ b/Sources/Shared/Vect_Mod/Get_Max_Threads.f90 @@ -0,0 +1,15 @@ +!==============================================================================! + integer function Get_Max_Threads(Vect) +!------------------------------------------------------------------------------! + implicit none +!------------------------------------------------------------------------------! + class(Vect_Type) :: Vect +!==============================================================================! + + Get_Max_Threads = 1 +# ifdef _OPENMP + Get_Max_Threads = omp_get_max_threads() +# endif + + end function + diff --git a/Sources/Shared/Vect_Mod/Set_Num_Threads.f90 b/Sources/Shared/Vect_Mod/Set_Num_Threads.f90 new file mode 100644 index 000000000..454b6a43d --- /dev/null +++ b/Sources/Shared/Vect_Mod/Set_Num_Threads.f90 @@ -0,0 +1,15 @@ +!==============================================================================! + subroutine Set_Num_Threads(Vect, n) +!------------------------------------------------------------------------------! + implicit none +!------------------------------------------------------------------------------! + class(Vect_Type) :: Vect + integer, intent(in) :: n +!==============================================================================! + +# ifdef _OPENMP + call omp_set_num_threads(n) +# endif + + end subroutine + From e3d11d9b14a48581f0fe57d9323b142af9eb749f Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 16 Mar 2023 16:31:32 +0100 Subject: [PATCH 094/223] Added a possibility to print used time in seconds. This is useful when timing very small fractions of code or some concepts such as OpenMP vectorization. In fact, it was introduced to time routines in the case which is going to be checked in next. On branch bojan_fixed_cell_ranges modified: Sources/Shared/Profiler_Mod/Statistics.f90 --- Sources/Shared/Profiler_Mod/Statistics.f90 | 25 ++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/Sources/Shared/Profiler_Mod/Statistics.f90 b/Sources/Shared/Profiler_Mod/Statistics.f90 index 7aff479d9..eb7ef971a 100644 --- a/Sources/Shared/Profiler_Mod/Statistics.f90 +++ b/Sources/Shared/Profiler_Mod/Statistics.f90 @@ -1,18 +1,26 @@ !==============================================================================! - subroutine Statistics(Profiler, indent) + subroutine Statistics(Profiler, indent, in_seconds) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Profiler_Type), target :: Profiler - integer, intent(in) :: indent ! 34 for Main_Pro, 1 for Main_con + class(Profiler_Type), target :: Profiler + integer, intent(in) :: indent ! 34 for Main_Pro, 1 for Main_con + logical, optional, intent(in) :: in_seconds !-----------------------------------[Locals]-----------------------------------! integer :: i_fun real :: total_time, t_temp, percent_time integer :: hours, minutes, seconds character(DL) :: line, n_temp - logical :: swap + logical :: swap, in_sec !==============================================================================! + in_sec = .false. + if(present(in_seconds)) then + if(in_seconds) then + in_sec = .true. + end if + end if + ! Compute average time spent in functions over all processors if(n_proc > 1) then do i_fun=1, Profiler % n_functions @@ -90,8 +98,13 @@ subroutine Statistics(Profiler, indent) = Profiler % funct_name(i_fun)(1:123) line(47+indent:47+indent) = '|' percent_time = Profiler % funct_time(i_fun) / total_time * 100.0 - write(line(52+indent:57+indent), '(f6.2)') percent_time - line(59+indent:59+indent) = '%' + if(in_sec) then + write(line(52+indent:57+indent), '(f6.2)') Profiler % funct_time(i_fun) + line(59+indent:61+indent) = '[s]' + else + write(line(52+indent:57+indent), '(f6.2)') percent_time + line(59+indent:59+indent) = '%' + end if if(percent_time > 0.01) then print '(a)', trim(line) end if From 7398ca434fc7511b8f953c53a39fc43d9388ea64 Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 16 Mar 2023 16:36:57 +0100 Subject: [PATCH 095/223] Added a case to test different OpenMP loops. Dissapointingly, it seems that explicit loops through face regions doesn't seem to offer any advantage. Maybe I am doing something wrong. On branch bojan_fixed_cell_ranges new file: Tests/Functionality/Omp/User_Mod/Beginning_Of_Simulation.f90 new file: Tests/Functionality/Omp/backstep_orthogonal.dom new file: Tests/Functionality/Omp/control new file: Tests/Functionality/Omp/generate.scr new file: Tests/Functionality/Omp/profile.dat --- .../Omp/User_Mod/Beginning_Of_Simulation.f90 | 130 +++++++++++ .../Functionality/Omp/backstep_orthogonal.dom | 112 +++++++++ Tests/Functionality/Omp/control | 86 +++++++ Tests/Functionality/Omp/generate.scr | 4 + Tests/Functionality/Omp/profile.dat | 212 ++++++++++++++++++ 5 files changed, 544 insertions(+) create mode 100644 Tests/Functionality/Omp/User_Mod/Beginning_Of_Simulation.f90 create mode 100644 Tests/Functionality/Omp/backstep_orthogonal.dom create mode 100644 Tests/Functionality/Omp/control create mode 100644 Tests/Functionality/Omp/generate.scr create mode 100644 Tests/Functionality/Omp/profile.dat diff --git a/Tests/Functionality/Omp/User_Mod/Beginning_Of_Simulation.f90 b/Tests/Functionality/Omp/User_Mod/Beginning_Of_Simulation.f90 new file mode 100644 index 000000000..9c226e334 --- /dev/null +++ b/Tests/Functionality/Omp/User_Mod/Beginning_Of_Simulation.f90 @@ -0,0 +1,130 @@ +!==============================================================================! + subroutine User_Mod_Beginning_Of_Simulation(Flow, Turb, Vof, Swarm, & + curr_dt, time) +!------------------------------------------------------------------------------! +! This function is called at the beginning of simulation. ! +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb + type(Vof_Type), target :: Vof + type(Swarm_Type), target :: Swarm + integer, intent(in) :: curr_dt ! time step + real, intent(in) :: time ! physical time +!------------------------------[Local parameters]------------------------------! + integer, parameter :: ITERS = 6000 +!-----------------------------------[Locals]-----------------------------------! + type(Grid_Type), pointer :: Grid + real, contiguous, pointer :: c_val1(:), c_val2(:) + real, contiguous, pointer :: f_val1(:), f_val2(:), f_val(:), sur(:) + integer, contiguous, pointer :: faces_c(:,:) + real :: tmp + integer :: c, c1, c2, s, i, thr + character(SL) :: st +!==============================================================================! + + call Profiler % Stop('Main') + + call Message % Framed(60, & + 'Greetings ...', '... from '//__FILE__, & + one_proc=.true.) + + !$omp parallel + print *, 'Hello from ', omp_get_thread_num()+1 + !$omp end parallel + + call Work % Connect_Real_Cell(c_val1, c_val2) + call Work % Connect_Real_Face(f_val1, f_val2, f_val) + + Grid => Flow % pnt_Grid + faces_c => Grid % faces_c + sur => Grid % s + + do c = 1, Grid % n_cells + call random_number(tmp); c_val1(c) = 10.0 * tmp + call random_number(tmp); c_val2(c) = 10.0 * tmp + end do + do s = 1, Grid % n_faces + c1 = Grid % faces_c(1, s) + c2 = Grid % faces_c(2, s) + f_val1(s) = c_val1(c1) + f_val2(s) = c_val2(c2) + end do + + !-----------------------------------! + ! Test implicit loop over faces ! + !-----------------------------------! + call Profiler % Start('Implicit Loop Over Faces') + do i = 1, ITERS + + !$omp parallel do & + !$omp private(s, c1, c2) & + !$omp shared (faces_c, sur, f_val, c_val1, c_val2) + do s = Faces_In_Domain() + c1 = faces_c(1, s) + c2 = faces_c(2, s) + f_val(s) = c_val1(c1) * sur(s) & + + c_val2(c2) * sur(s) + end do + !$omp end parallel do + end do + call Profiler % Stop('Implicit Loop Over Faces') + + !-----------------------------------! + ! Test explicit loop over faces ! + ! (Important: set thr private) ! + !-----------------------------------! + call Profiler % Start('Explicit Loop Over Faces') + do i = 1, ITERS + + !$omp parallel & + !$omp private(s, c1, c2, thr) & + !$omp shared (faces_c, sur, f_val, c_val1, c_val2) + thr = omp_get_thread_num() + 1 + do s = Grid % Vect % thread % f_face(thr), Grid % Vect % thread % l_face(thr) + c1 = faces_c(1, s) + c2 = faces_c(2, s) + f_val(s) = c_val1(c1) * sur(s) & + + c_val2(c2) * sur(s) + end do + !$omp end parallel + end do + call Profiler % Stop('Explicit Loop Over Faces') + + !------------------------------------! + ! Test unwrapped loop over faces ! + !------------------------------------! + call Profiler % Start('Unwrapped Loop Over Faces') + do i = 1, ITERS + + !$omp parallel do & + !$omp private(s, c1, c2) & + !$omp shared (faces_c, f_val1, f_val2, c_val1, c_val2) + do s = Faces_In_Domain() + c1 = faces_c(1, s) + c2 = faces_c(2, s) + f_val1(s) = c_val1(c1) + f_val2(s) = c_val2(c2) + end do + !$omp end parallel do + + !$omp parallel do private(s) shared (sur, f_val, f_val1, f_val2) + do s = Faces_In_Domain() + f_val(s) = f_val1(s) * sur(s) & + + f_val2(s) * sur(s) + end do + !$omp end parallel do + + end do + call Profiler % Stop('Unwrapped Loop Over Faces') + + call Work % Disconnect_Real_Cell(c_val1, c_val2) + call Work % Disconnect_Real_Face(f_val1, f_val2, f_val) + + call Profiler % Statistics(indent=34, in_seconds=.true.) + + call Comm_Mod_End + stop + + end subroutine diff --git a/Tests/Functionality/Omp/backstep_orthogonal.dom b/Tests/Functionality/Omp/backstep_orthogonal.dom new file mode 100644 index 000000000..3d77a9863 --- /dev/null +++ b/Tests/Functionality/Omp/backstep_orthogonal.dom @@ -0,0 +1,112 @@ +#-------------------------------------------# +# +# 7-----------8----------------------16 +# /| /| /| +# 5-----------6----------------------15 | +# | | (1) | | (2) | | +# | 3 - - - - | 4- - - - - - - - - - -|14 +# |/ |/| |/| +# 1-----------2----------------------13 | +# | | (3) | | +# |11---------------------|12 +# |/ |/ +# 9----------------------10 +# +#-------------------------------------------# +# Nodes (cells), boundary cells and sides # +#-------------------------------------------# + 4000000 1333333 12000000 + +#----------# +# Points # +#----------# +16 + 1 0.0 0.0 0.0 + 2 2.0 0.0 0.0 + 3 0.0 1.0 0.0 + 4 2.0 1.0 0.0 + 5 0.0 0.0 1.0 + 6 2.0 0.0 1.0 + 7 0.0 1.0 1.0 + 8 2.0 1.0 1.0 + 9 2.0 0.0 -1.0 + 10 13.0 0.0 -1.0 + 11 2.0 1.0 -1.0 + 12 13.0 1.0 -1.0 + 13 13.0 0.0 0.0 + 14 13.0 1.0 0.0 + 15 13.0 0.0 1.0 + 16 13.0 1.0 1.0 + +#----------# +# Blocks # +#----------# +3 + 1 161 12 81 + 1.0 1.0 1.0 + 1 2 3 4 5 6 7 8 + 2 681 12 81 + 0.6 1.0 1.0 + 2 13 4 14 6 15 8 16 + 3 681 12 81 + 0.6 1.0 1.0 + 9 10 11 12 2 13 4 14 + +#--------# +# # +#--------# + 0 + 0 + +#-----------------------# +# Boundary conditions # +#-----------------------# + 8 + +# low_wal in blocks 1-3 + 1 Kmin + 1 low_wall + 2 Kmin + 3 low_wall + 3 Imin + 3 low_wall +# top_wal in blocks 1-2 + 4 Kmax + 1 top_wall + 5 Kmax + 2 top_wall +# inflow + 6 Imin + 1 in +# outflow + 7 Imax + 2 out + 8 Imax + 3 out + +#-----------------------# +# Periodic boundaries # +#-----------------------# + 3 + 1 1 2 6 5 + 3 4 8 7 + 2 9 10 13 2 + 11 12 14 4 + 3 2 13 15 6 + 4 14 16 8 + +#-------------------# +# Copy boundaries # +#-------------------# + 0 + +#------------# +# Refinement # +#------------# + 0 + +#-----------# +# Smoothing # +#-----------# + 0 + diff --git a/Tests/Functionality/Omp/control b/Tests/Functionality/Omp/control new file mode 100644 index 000000000..43e1c6394 --- /dev/null +++ b/Tests/Functionality/Omp/control @@ -0,0 +1,86 @@ + MAX_THREADS 4 + +#---------- +# Prologue +#--------- + PROBLEM_NAME backstep_orthogonal + HEAT_TRANSFER no + + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 120 0 + RESULTS_SAVE_INTERVAL 30 + BACKUP_SAVE_INTERVAL 300 + SAVE_RESULTS_AT_BOUNDARIES no + +#LOAD_BACKUP_NAME backstep_orthogonal-ts000001.backup + +#------------------- +# Monitoring points +#------------------- + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 0.2 + + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + +#----------------- +# Physical models +#----------------- + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 1.0e-3 + HEAT_CAPACITY 1.0 + +TURBULENCE_MODEL none + +#---------------------- +# Numerical parameters +#---------------------- + + PRESSURE_MOMENTUM_COUPLING piso + + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 + + TIME_INTEGRATION_SCHEME linear + + ADVECTION_SCHEME_FOR_MOMENTUM minmod + + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + +#------------------------ +# Linear solver settings +#------------------------ + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + MIN_SIMPLE_ITERATIONS 1 + +#-------------------- +# Initial conditions +#-------------------- +# POTENTIAL_INITIALIZATION yes + +#--------------------- +# Boundary conditions +#--------------------- + BOUNDARY_CONDITION low_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 + + BOUNDARY_CONDITION top_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 + + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES z u + FILE profile.dat + + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 1.0 0.0 0.0 +INTERFACE_TRACKING no +PARTICLE_TRACKING no diff --git a/Tests/Functionality/Omp/generate.scr b/Tests/Functionality/Omp/generate.scr new file mode 100644 index 000000000..c83123bd6 --- /dev/null +++ b/Tests/Functionality/Omp/generate.scr @@ -0,0 +1,4 @@ +backstep_orthogonal +1 2 +skip +skip diff --git a/Tests/Functionality/Omp/profile.dat b/Tests/Functionality/Omp/profile.dat new file mode 100644 index 000000000..d27e467a3 --- /dev/null +++ b/Tests/Functionality/Omp/profile.dat @@ -0,0 +1,212 @@ +#==================# +# Number of points # +#==================# + 200 +#===========# +# Direction # +#===========# +# z +#==================# +# coordinate U V W # +#==================# + 0.000000 0.000000 + 0.005000 0.029850 + 0.010000 0.059400 + 0.015000 0.088650 + 0.020000 0.117600 + 0.025000 0.146250 + 0.030000 0.174600 + 0.035000 0.202650 + 0.040000 0.230400 + 0.045000 0.257850 + 0.050000 0.285000 + 0.055000 0.311850 + 0.060000 0.338400 + 0.065000 0.364650 + 0.070000 0.390600 + 0.075000 0.416250 + 0.080000 0.441600 + 0.085000 0.466650 + 0.090000 0.491400 + 0.095000 0.515850 + 0.100000 0.540000 + 0.105000 0.563850 + 0.110000 0.587400 + 0.115000 0.610650 + 0.120000 0.633600 + 0.125000 0.656250 + 0.130000 0.678600 + 0.135000 0.700650 + 0.140000 0.722400 + 0.145000 0.743850 + 0.150000 0.765000 + 0.155000 0.785850 + 0.160000 0.806400 + 0.165000 0.826650 + 0.170000 0.846600 + 0.175000 0.866250 + 0.180000 0.885600 + 0.185000 0.904650 + 0.190000 0.923400 + 0.195000 0.941850 + 0.200000 0.960000 + 0.205000 0.977850 + 0.210000 0.995400 + 0.215000 1.012650 + 0.220000 1.029600 + 0.225000 1.046250 + 0.230000 1.062600 + 0.235000 1.078650 + 0.240000 1.094400 + 0.245000 1.109850 + 0.250000 1.125000 + 0.255000 1.139850 + 0.260000 1.154400 + 0.265000 1.168650 + 0.270000 1.182600 + 0.275000 1.196250 + 0.280000 1.209600 + 0.285000 1.222650 + 0.290000 1.235400 + 0.295000 1.247850 + 0.300000 1.260000 + 0.305000 1.271850 + 0.310000 1.283400 + 0.315000 1.294650 + 0.320000 1.305600 + 0.325000 1.316250 + 0.330000 1.326600 + 0.335000 1.336650 + 0.340000 1.346400 + 0.345000 1.355850 + 0.350000 1.365000 + 0.355000 1.373850 + 0.360000 1.382400 + 0.365000 1.390650 + 0.370000 1.398600 + 0.375000 1.406250 + 0.380000 1.413600 + 0.385000 1.420650 + 0.390000 1.427400 + 0.395000 1.433850 + 0.400000 1.440000 + 0.405000 1.445850 + 0.410000 1.451400 + 0.415000 1.456650 + 0.420000 1.461600 + 0.425000 1.466250 + 0.430000 1.470600 + 0.435000 1.474650 + 0.440000 1.478400 + 0.445000 1.481850 + 0.450000 1.485000 + 0.455000 1.487850 + 0.460000 1.490400 + 0.465000 1.492650 + 0.470000 1.494600 + 0.475000 1.496250 + 0.480000 1.497600 + 0.485000 1.498650 + 0.490000 1.499400 + 0.495000 1.499850 + 0.500000 1.500000 + 0.505000 1.499850 + 0.510000 1.499400 + 0.515000 1.498650 + 0.520000 1.497600 + 0.525000 1.496250 + 0.530000 1.494600 + 0.535000 1.492650 + 0.540000 1.490400 + 0.545000 1.487850 + 0.550000 1.485000 + 0.555000 1.481850 + 0.560000 1.478400 + 0.565000 1.474650 + 0.570000 1.470600 + 0.575000 1.466250 + 0.580000 1.461600 + 0.585000 1.456650 + 0.590000 1.451400 + 0.595000 1.445850 + 0.600000 1.440000 + 0.605000 1.433850 + 0.610000 1.427400 + 0.615000 1.420650 + 0.620000 1.413600 + 0.625000 1.406250 + 0.630000 1.398600 + 0.635000 1.390650 + 0.640000 1.382400 + 0.645000 1.373850 + 0.650000 1.365000 + 0.655000 1.355850 + 0.660000 1.346400 + 0.665000 1.336650 + 0.670000 1.326600 + 0.675000 1.316250 + 0.680000 1.305600 + 0.685000 1.294650 + 0.690000 1.283400 + 0.695000 1.271850 + 0.700000 1.260000 + 0.705000 1.247850 + 0.710000 1.235400 + 0.715000 1.222650 + 0.720000 1.209600 + 0.725000 1.196250 + 0.730000 1.182600 + 0.735000 1.168650 + 0.740000 1.154400 + 0.745000 1.139850 + 0.750000 1.125000 + 0.755000 1.109850 + 0.760000 1.094400 + 0.765000 1.078650 + 0.770000 1.062600 + 0.775000 1.046250 + 0.780000 1.029600 + 0.785000 1.012650 + 0.790000 0.995400 + 0.795000 0.977850 + 0.800000 0.960000 + 0.805000 0.941850 + 0.810000 0.923400 + 0.815000 0.904650 + 0.820000 0.885600 + 0.825000 0.866250 + 0.830000 0.846600 + 0.835000 0.826650 + 0.840000 0.806400 + 0.845000 0.785850 + 0.850000 0.765000 + 0.855000 0.743850 + 0.860000 0.722400 + 0.865000 0.700650 + 0.870000 0.678600 + 0.875000 0.656250 + 0.880000 0.633600 + 0.885000 0.610650 + 0.890000 0.587400 + 0.895000 0.563850 + 0.900000 0.540000 + 0.905000 0.515850 + 0.910000 0.491400 + 0.915000 0.466650 + 0.920000 0.441600 + 0.925000 0.416250 + 0.930000 0.390600 + 0.935000 0.364650 + 0.940000 0.338400 + 0.945000 0.311850 + 0.950000 0.285000 + 0.955000 0.257850 + 0.960000 0.230400 + 0.965000 0.202650 + 0.970000 0.174600 + 0.975000 0.146250 + 0.980000 0.117600 + 0.985000 0.088650 + 0.990000 0.059400 + 0.995000 0.029850 + 1.000000 0.000000 From 460844f2eb944a502ee38caebbf2537cd0543ad3 Mon Sep 17 00:00:00 2001 From: Niceno Date: Fri, 17 Mar 2023 11:17:06 +0100 Subject: [PATCH 096/223] Removed compilation tests from here. They have been superseeded with: test_user_functions_compile.sh On branch bojan_fixed_cell_ranges modified: test_build.sh --- Tests/test_build.sh | 84 ++++++++------------------------------------- 1 file changed, 15 insertions(+), 69 deletions(-) diff --git a/Tests/test_build.sh b/Tests/test_build.sh index 8c3d11f08..57a54925a 100755 --- a/Tests/test_build.sh +++ b/Tests/test_build.sh @@ -110,39 +110,6 @@ HYB_CHANNEL_HR_UNIFORM_DIR=Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh # MULTDOM_HEAT_EXCHANGER_2_DIR=Laminar/Heat_Exchanger/2_Domains # MULTDOM_HEAT_EXCHANGER_3_DIR=Laminar/Heat_Exchanger/3_Domains -#---------------------------------------------------------------------------- -# All compilation tests including those with User_Mod/ -# (These are essentially most tests, but maybe not all of them -# have the User_Mod directory, so there is some redundancy here) -#---------------------------------------------------------------------------- -ALL_COMPILE_TESTS=( \ - "$LAMINAR_CAVITY_THERM_DRIVEN_106_DIR" \ - "$LAMINAR_CAVITY_THERM_DRIVEN_108_DIR" \ - "$LAMINAR_T_JUNCTION_DIR" \ - "$LAMINAR_CHANNEL_DIR" \ - "$RANS_BACKSTEP_05100_DIR" \ - "$RANS_BACKSTEP_28000_DIR" \ - "$RANS_CHANNEL_LR_LONG_DIR" \ - "$RANS_CHANNEL_LR_RSM_DIR" \ - "$RANS_CHANNEL_LR_STRETCHED_DIR" \ - "$RANS_CHANNEL_LR_UNIFORM_DIR" \ - "$RANS_FUEL_BUNDLE_DIR" \ - "$RANS_IMPINGING_JET_DIR" \ - "$MULTDOM_BACKSTEP_DIR" \ - "$MULTDOM_MEMBRANE_DIR" \ - "$SWARM_PERIODIC_CYL_DIR" \ - "$SWARM_ROD_BUNDLE_POLYHEDRAL_DIR" \ - "$VOF_RISING_BUBBLE_DIR" \ - "$SWARM_VOF_THREE_PHASE_DIR" \ - "$LES_CHANNEL_180_LONG_DIR" \ - "$LES_CHANNEL_180_PERIODIC_DIR" \ - "$LES_PIPE_DIR" \ - "$LES_RB_109_DIR" \ - "$HYB_CHANNEL_HR_UNIFORM_DIR" \ - "$HYB_CHANNEL_HR_STRETCHED_DIR" \ - ) -DONE_COMPILE_TESTS=0 - #-------------------------------------------------------------- # All directories to test Generate # (All the tests minus those which come with third party grid) @@ -1307,6 +1274,7 @@ function launch_matplotlib { fi time_in_seconds } + #------------------------------------------------------------------------------# # Individual process tests for compilation #------------------------------------------------------------------------------# @@ -1363,25 +1331,6 @@ function process_compilation_test { fi } -#------------------------------------------------------------------------------# -# All process compilation tests -#------------------------------------------------------------------------------# -function process_compilation_tests { - # $1 = dir with test - - elog "" - elog "#======================================================================" - elog "#" - elog "# Running Processor compilation tests" - elog "#" - elog "#----------------------------------------------------------------------" - echo "# Running Processor compilation tests" - - for CASE_DIR in ${ALL_COMPILE_TESTS[@]}; do - process_compilation_test $CASE_DIR - done -} - #------------------------------------------------------------------------------# # Individual process tests for full length #------------------------------------------------------------------------------# @@ -1680,46 +1629,44 @@ function chose_test { if [ $DONE_CONVERT_TESTS -eq 0 ]; then convert_tests; fi divide_tests fi - if [ $option -eq 4 ]; then process_compilation_tests; fi - if [ $option -eq 5 ]; then + if [ $option -eq 4 ]; then if [ $DONE_GENERATE_TESTS -eq 0 ]; then generate_tests; fi if [ $DONE_CONVERT_TESTS -eq 0 ]; then convert_tests; fi if [ $DONE_DIVIDE_TESTS -eq 0 ]; then divide_tests; fi process_backup_tests fi - if [ $option -eq 6 ]; then + if [ $option -eq 5 ]; then if [ $DONE_GENERATE_TESTS -eq 0 ]; then generate_tests; fi if [ $DONE_CONVERT_TESTS -eq 0 ]; then convert_tests; fi if [ $DONE_DIVIDE_TESTS -eq 0 ]; then divide_tests; fi process_save_exit_now_tests fi - if [ $option -eq 7 ]; then + if [ $option -eq 6 ]; then if [ $DONE_GENERATE_TESTS -eq 0 ]; then generate_tests; fi if [ $DONE_CONVERT_TESTS -eq 0 ]; then convert_tests; fi if [ $DONE_DIVIDE_TESTS -eq 0 ]; then divide_tests; fi process_full_length_tests fi - if [ $option -eq 8 ]; then + if [ $option -eq 7 ]; then process_accuracy_tests fi - if [ $option -eq 9 ]; then + if [ $option -eq 8 ]; then generate_tests convert_tests divide_tests - process_compilation_tests process_backup_tests process_save_exit_now_tests process_full_length_tests process_accuracy_tests fi - if [ $option -eq 10 ]; then + if [ $option -eq 9 ]; then git clean -dfx $TEST_DIR/.. make_clean $GENE_DIR make_clean $CONV_DIR make_clean $DIVI_DIR make_clean $PROC_DIR fi - if [ $option -eq 11 ]; then + if [ $option -eq 10 ]; then if [ $FORTRAN == "gnu" ]; then FORTRAN="intel" FCOMP="mpiifort" @@ -1786,14 +1733,13 @@ else echo " 1. Generate tests" echo " 2. Convert tests" echo " 3. Divide tests" - echo " 4. Processor compilation tests with User_Mod" - echo " 5. Processor backup tests" - echo " 6. Processor save_now/exit_now tests" - echo " 7. Processor full lenght tests" - echo " 8. Process accuracy test" - echo " 9. Perform all tests" - echo " 10. Clean all test directories" - echo " 11. Change the compiler" + echo " 4. Processor backup tests" + echo " 5. Processor save_now/exit_now tests" + echo " 6. Processor full lenght tests" + echo " 7. Process accuracy test" + echo " 8. Perform all tests" + echo " 9. Clean all test directories" + echo " 10. Change the compiler" echo "" read -p " Enter the desired type of test: " option chose_test $option From 718daea5b0d81a2fa402d6a1ac573d6c41538168 Mon Sep 17 00:00:00 2001 From: Niceno Date: Fri, 17 Mar 2023 19:31:46 +0100 Subject: [PATCH 097/223] IMPORTANT: Spud up native linear solvers by 14% This speed-up was measured on a system with half a million cells. It took me long enough. So, I removed the preconditioning matrix "D" and replaced it with two vectors: "d" and "d_inv" holding just the diagonal of the preconditioning matrix. The rationale was the following: The preconditioning matrix was originally introduced as a Matrix_Type in case I want to expand the preconditioning with more levels of fill-in. But, since the introduction of PETSc libraries, that hardly makes sense, it is highly likely that PETSc comes with such preconditioner and if it doesn't. there must be a good reason for that. All in all: addressing of a vector "d" should be faster than in- direct addressing of the matrix "D", plus the "d_inv" saves from a lot of divisions. On branch bojan_fixed_cell_ranges modified: Native_Mod.f90 modified: Native_Mod/Bicg.f90 modified: Native_Mod/Cg.f90 modified: Native_Mod/Create_Native.f90 modified: Native_Mod/Prec_Form.f90 modified: Native_Mod/Prec_Solve.f90 --- Sources/Process/Native_Mod.f90 | 3 -- Sources/Process/Native_Mod/Bicg.f90 | 13 +++--- Sources/Process/Native_Mod/Cg.f90 | 12 +++--- Sources/Process/Native_Mod/Create_Native.f90 | 1 - Sources/Process/Native_Mod/Prec_Form.f90 | 44 ++++++++++---------- Sources/Process/Native_Mod/Prec_Solve.f90 | 43 ++++++++++--------- 6 files changed, 57 insertions(+), 59 deletions(-) diff --git a/Sources/Process/Native_Mod.f90 b/Sources/Process/Native_Mod.f90 index fedb9f3d2..9fbedef75 100644 --- a/Sources/Process/Native_Mod.f90 +++ b/Sources/Process/Native_Mod.f90 @@ -25,9 +25,6 @@ module Native_Mod ! Matrix for discretized momentum equations type(Matrix_Type) :: M - ! Preconditioning matrix for all variables (used inside solvers only) - type(Matrix_Type), private :: D - ! Right-hand side for all variables ! (used in solvers and during discretization) type(Vector_Type) :: b diff --git a/Sources/Process/Native_Mod/Bicg.f90 b/Sources/Process/Native_Mod/Bicg.f90 index 9559bb812..60cfe31e1 100644 --- a/Sources/Process/Native_Mod/Bicg.f90 +++ b/Sources/Process/Native_Mod/Bicg.f90 @@ -17,7 +17,6 @@ subroutine Bicg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) real :: fin_res ! final residual real, optional :: norm ! normalization !-----------------------------------[Locals]-----------------------------------! - type(Matrix_Type), pointer :: D type(Grid_Type), pointer :: Grid integer :: nt, ni, nb real :: alfa, beta, rho, rho_old, bnrm2, res @@ -25,15 +24,15 @@ subroutine Bicg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) real :: sum_a, fn integer :: sum_n real, contiguous, pointer :: p1(:), q1(:), r1(:), p2(:), q2(:), r2(:) + real, contiguous, pointer :: d(:), d_inv(:) real, contiguous, pointer :: a_val(:) integer, contiguous, pointer :: a_col(:), a_row(:), a_dia(:) !==============================================================================! - call Work % Connect_Real_Cell(p1, q1, r1, p2, q2, r2) + call Work % Connect_Real_Cell(p1, q1, r1, p2, q2, r2, d, d_inv) ! Take some aliases Grid => Nat % pnt_grid - D => Nat % D a_val => A % val a_col => A % col a_row => A % row @@ -75,7 +74,7 @@ subroutine Bicg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) !---------------------! ! Preconditioning ! !---------------------! - call Nat % Prec_Form(ni, A, D, prec) + call Nat % Prec_Form(ni, A, d(1:nt), d_inv(1:nt), prec) !-----------------------------------! ! This is quite tricky point. ! @@ -128,8 +127,8 @@ subroutine Bicg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) ! solve M^T z~ = r~ ! don't have M^T!!! ! (q instead of z) ! !------------------------! - call Nat % Prec_Solve(ni, A, D, q1(1:nt), r1(1:nt), prec) - call Nat % Prec_Solve(ni, A, D, q2(1:nt), r2(1:nt), prec) + call Nat % Prec_Solve(ni, A, d(1:nt), d_inv(1:nt), q1(1:nt), r1(1:nt), prec) + call Nat % Prec_Solve(ni, A, d(1:nt), d_inv(1:nt), q2(1:nt), r2(1:nt), prec) !------------------! ! rho = (z,r~) ! @@ -241,6 +240,6 @@ subroutine Bicg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) fin_res = res niter = iter - call Work % Disconnect_Real_Cell(p1, q1, r1, p2, q2, r2) + call Work % Disconnect_Real_Cell(p1, q1, r1, p2, q2, r2, d, d_inv) end subroutine diff --git a/Sources/Process/Native_Mod/Cg.f90 b/Sources/Process/Native_Mod/Cg.f90 index f2312735c..b6bcb9430 100644 --- a/Sources/Process/Native_Mod/Cg.f90 +++ b/Sources/Process/Native_Mod/Cg.f90 @@ -17,23 +17,21 @@ subroutine Cg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) real :: fin_res ! final residual real, optional :: norm ! normalization !-----------------------------------[Locals]-----------------------------------! - type(Matrix_Type), pointer :: D type(Grid_Type), pointer :: Grid integer :: nt, ni, nb real :: alfa, beta, rho, rho_old, bnrm2, res integer :: i, j, k, iter real :: sum_a, fn integer :: sum_n - real, contiguous, pointer :: p1(:), q1(:), r1(:) + real, contiguous, pointer :: p1(:), q1(:), r1(:), d(:), d_inv(:) real, contiguous, pointer :: a_val(:) integer, contiguous, pointer :: a_col(:), a_row(:), a_dia(:) !==============================================================================! - call Work % Connect_Real_Cell(p1, q1, r1) + call Work % Connect_Real_Cell(p1, q1, r1, d, d_inv) ! Take some aliases Grid => Nat % pnt_grid - D => Nat % D a_val => A % val a_col => A % col a_row => A % row @@ -75,7 +73,7 @@ subroutine Cg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) !---------------------! ! Preconditioning ! !---------------------! - call Nat % Prec_Form(ni, A, D, prec) + call Nat % Prec_Form(ni, A, d(1:nt), d_inv(1:nt), prec) !-----------------------------------! ! This is quite tricky point. ! @@ -127,7 +125,7 @@ subroutine Cg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) ! solve Mz = r ! ! (q instead of z) ! !----------------------! - call Nat % Prec_Solve(ni, A, D, q1(1:nt), r1(1:nt), prec) + call Nat % Prec_Solve(ni, A, d(1:nt), d_inv(1:nt), q1(1:nt), r1(1:nt), prec) !-----------------! ! rho = (r,z) ! @@ -232,6 +230,6 @@ subroutine Cg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) fin_res = res niter = iter - call Work % Disconnect_Real_Cell(p1, q1, r1) + call Work % Disconnect_Real_Cell(p1, q1, r1, d, d_inv) end subroutine diff --git a/Sources/Process/Native_Mod/Create_Native.f90 b/Sources/Process/Native_Mod/Create_Native.f90 index 743e2aca0..2ed07a5b7 100644 --- a/Sources/Process/Native_Mod/Create_Native.f90 +++ b/Sources/Process/Native_Mod/Create_Native.f90 @@ -13,7 +13,6 @@ subroutine Create_Native(Nat, Grid) call Nat % A % Create_Matrix(Grid) call Nat % M % Create_Matrix(Grid) - call Nat % D % Create_Matrix(Grid) call Vector_Mod_Allocate(Nat % b, Grid) if(this_proc < 2) print *, '# Finished !' diff --git a/Sources/Process/Native_Mod/Prec_Form.f90 b/Sources/Process/Native_Mod/Prec_Form.f90 index 0aba1c2ee..e834b6b29 100644 --- a/Sources/Process/Native_Mod/Prec_Form.f90 +++ b/Sources/Process/Native_Mod/Prec_Form.f90 @@ -1,35 +1,36 @@ !==============================================================================! - subroutine Prec_Form(Native, ni, A, D, prec) + subroutine Prec_Form(Native, ni, A, d, d_inv, prec) !------------------------------------------------------------------------------! ! Forms preconditioning matrix "D" from provided matrix "A". ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Native_Type), intent(in) :: Native - integer, intent(in) :: ni - type(Matrix_Type), target, intent(in) :: A - type(Matrix_Type), target, intent(inout) :: D - character(SL), intent(in) :: prec ! preconditioner + class(Native_Type), intent(in) :: Native + integer, intent(in) :: ni + type(Matrix_Type), target, intent(in) :: A + real, intent(out) :: d(:) + real, intent(out) :: d_inv(:) + character(SL), intent(in) :: prec ! preconditioner !-----------------------------------[Locals]-----------------------------------! real :: sum1 integer :: i, j, k - real, contiguous, pointer :: a_val(:), d_val(:) - integer, contiguous, pointer :: a_dia(:), d_dia(:) + integer, contiguous, pointer :: a_col(:), a_row(:), a_dia(:) + real, contiguous, pointer :: a_val(:) !==============================================================================! ! Take some aliases - a_val => A % val + a_col => A % col + a_row => A % row a_dia => A % dia - d_val => D % val - d_dia => D % dia + a_val => A % val - !---------------------------------! + !---------------------------------! ! 1) diagonal preconditioning ! !---------------------------------! if(prec .eq. 'jacobi') then - !$omp parallel do private(i) shared (a_val, a_dia, d_val, d_dia) + !$omp parallel do private(i) shared (d, a_val, a_dia) do i = 1, ni - d_val(d_dia(i)) = a_val(a_dia(i)) + d(i) = a_val(a_dia(i)) end do !$omp end parallel do @@ -38,21 +39,22 @@ subroutine Prec_Form(Native, ni, A, D, prec) !--------------------------------------------! else if(prec .eq. 'icc') then do i = 1, ni - sum1 = A % val(A % dia(i)) ! take diaginal entry - do j = A % row(i), A % dia(i)-1 ! only lower traingular - k = A % col(j) - sum1 = sum1 - D % val(D % dia(k)) * A % val(j) * A % val(j) + sum1 = a_val(a_dia(i)) ! take diaginal entry + do j = a_row(i), a_dia(i) - 1 ! only lower traingular + k = a_col(j) + sum1 = sum1 - d(k) * a_val(j) * a_val(j) end do - D % val(D % dia(i)) = 1.0 / sum1 + d_inv(i) = sum1 + d(i) = 1.0 / sum1 end do !---------------------------! ! .) no preconditioning ! !---------------------------! else - !$omp parallel do private(i) shared (d_val, d_dia) + !$omp parallel do private(i) shared (d) do i = 1, ni - D % val(D % dia(i)) = 1.0 + d(i) = 1.0 end do !$omp end parallel do end if diff --git a/Sources/Process/Native_Mod/Prec_Solve.f90 b/Sources/Process/Native_Mod/Prec_Solve.f90 index 3ed5fcf35..861fd90fc 100644 --- a/Sources/Process/Native_Mod/Prec_Solve.f90 +++ b/Sources/Process/Native_Mod/Prec_Solve.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Prec_Solve(Native, ni, A, D, x, b, prec) + subroutine Prec_Solve(Native, ni, A, d, d_inv, x, b, prec) !------------------------------------------------------------------------------! ! Solves the preconditioning system [D]{x}={b} ! !------------------------------------------------------------------------------! @@ -16,28 +16,31 @@ subroutine Prec_Solve(Native, ni, A, D, x, b, prec) class(Native_Type), intent(in) :: Native integer, intent(in) :: ni type(Matrix_Type), target, intent(in) :: A - type(Matrix_Type), target, intent(in) :: D + real, intent(in) :: d(:) + real, intent(in) :: d_inv(:) real, intent(out) :: x(:) real, intent(in) :: b(:) character(SL), intent(in) :: prec ! preconditioner !-----------------------------------[Locals]-----------------------------------! integer :: i, j, k - real :: sum1 - real, contiguous, pointer :: d_val(:) - integer, contiguous, pointer :: d_dia(:) + real :: sum + integer, contiguous, pointer :: a_col(:), a_row(:), a_dia(:) + real, contiguous, pointer :: a_val(:) !==============================================================================! ! Take some aliases - d_val => D % val - d_dia => D % dia + a_col => A % col + a_row => A % row + a_dia => A % dia + a_val => A % val !---------------------------------! ! 1) diagonal preconditioning ! !---------------------------------! if(prec .eq. 'jacobi') then - !$omp parallel do private(i) shared (x, b, d_val, d_dia) + !$omp parallel do private(i) shared (x, b, d_inv) do i = 1, ni - x(i) = b(i) / d_val(d_dia(i)) + x(i) = b(i) * d_inv(i) end do !$omp end parallel do @@ -48,26 +51,26 @@ subroutine Prec_Solve(Native, ni, A, D, x, b, prec) ! Forward substitutionn do i = 1, ni - sum1 = b(i) - do j = A % row(i),A % dia(i)-1 ! only the lower triangular - k = A % col(j) - sum1 = sum1 - A % val(j)*x(k) + sum = b(i) + do j = a_row(i), a_dia(i) - 1 ! only the lower triangular + k = a_col(j) + sum = sum - a_val(j) * x(k) end do - x(i) = sum1 * D % val(D % dia(i)) ! BUG ? + x(i) = sum * d(i) end do do i = 1, ni - x(i) = x(i) / ( D % val(D % dia(i)) + TINY ) + x(i) = x(i) * d_inv(i) end do ! Backward substitution do i = ni, 1, -1 - sum1 = x(i) - do j = A % dia(i)+1, A % row(i+1)-1 ! upper triangular - k = A % col(j) - if(k <= ni) sum1 = sum1 - A % val(j)*x(k) ! avoid buffer entries + sum = x(i) + do j = a_dia(i) + 1, a_row(i+1) - 1 ! upper triangular + k = a_col(j) + if(k <= ni) sum = sum - a_val(j) * x(k) ! avoid buffer entries end do - x(i) = sum1* D % val(D % dia(i)) ! BUG ? + x(i) = sum * d(i) end do !---------------------------! From ddabd05aecfd58d61795254dce8754e5d207a3bc Mon Sep 17 00:00:00 2001 From: Niceno Date: Fri, 17 Mar 2023 21:06:06 +0100 Subject: [PATCH 098/223] Renamed a local variable to be like in Prec_Solve No impact on functionality whatsoever. On branch bojan_fixed_cell_ranges modified: Native_Mod/Prec_Form.f90 --- Sources/Process/Native_Mod/Prec_Form.f90 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Sources/Process/Native_Mod/Prec_Form.f90 b/Sources/Process/Native_Mod/Prec_Form.f90 index e834b6b29..0c589ef7d 100644 --- a/Sources/Process/Native_Mod/Prec_Form.f90 +++ b/Sources/Process/Native_Mod/Prec_Form.f90 @@ -12,7 +12,7 @@ subroutine Prec_Form(Native, ni, A, d, d_inv, prec) real, intent(out) :: d_inv(:) character(SL), intent(in) :: prec ! preconditioner !-----------------------------------[Locals]-----------------------------------! - real :: sum1 + real :: sum integer :: i, j, k integer, contiguous, pointer :: a_col(:), a_row(:), a_dia(:) real, contiguous, pointer :: a_val(:) @@ -39,13 +39,13 @@ subroutine Prec_Form(Native, ni, A, d, d_inv, prec) !--------------------------------------------! else if(prec .eq. 'icc') then do i = 1, ni - sum1 = a_val(a_dia(i)) ! take diaginal entry + sum = a_val(a_dia(i)) ! take diaginal entry do j = a_row(i), a_dia(i) - 1 ! only lower traingular k = a_col(j) - sum1 = sum1 - d(k) * a_val(j) * a_val(j) + sum = sum - d(k) * a_val(j) * a_val(j) end do - d_inv(i) = sum1 - d(i) = 1.0 / sum1 + d_inv(i) = sum + d(i) = 1.0 / sum end do !---------------------------! From e9616fa3834bde31882372b95413d9308f8e8b2a Mon Sep 17 00:00:00 2001 From: Niceno Date: Fri, 17 Mar 2023 21:07:11 +0100 Subject: [PATCH 099/223] Juiced a wee bit more performance here. On branch bojan_fixed_cell_ranges modified: Native_Mod/Prec_Solve.f90 --- Sources/Process/Native_Mod/Prec_Solve.f90 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Sources/Process/Native_Mod/Prec_Solve.f90 b/Sources/Process/Native_Mod/Prec_Solve.f90 index 861fd90fc..ce642eacb 100644 --- a/Sources/Process/Native_Mod/Prec_Solve.f90 +++ b/Sources/Process/Native_Mod/Prec_Solve.f90 @@ -59,9 +59,11 @@ subroutine Prec_Solve(Native, ni, A, d, d_inv, x, b, prec) x(i) = sum * d(i) end do + !$omp parallel do private(i) shared (x, d_inv) do i = 1, ni x(i) = x(i) * d_inv(i) end do + !$omp end parallel do ! Backward substitution do i = ni, 1, -1 From c36f7ee5c26c06ec31b9df85ab45b98782d9704e Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 18 Mar 2023 07:07:22 +0100 Subject: [PATCH 100/223] Improved declarations a bit. On branch bojan_fixed_cell_ranges modified: Native_Mod/Bicg.f90 modified: Native_Mod/Cg.f90 modified: Native_Mod/Create_Native.f90 modified: Native_Mod/Residual_Vector.f90 modified: Native_Mod/Root_Mean_Square.f90 modified: Native_Mod/Solve_Native.f90 --- Sources/Process/Native_Mod/Bicg.f90 | 24 ++++++++++--------- Sources/Process/Native_Mod/Cg.f90 | 22 ++++++++--------- Sources/Process/Native_Mod/Create_Native.f90 | 4 ++-- .../Process/Native_Mod/Residual_Vector.f90 | 13 +++++----- .../Process/Native_Mod/Root_Mean_Square.f90 | 6 ++--- Sources/Process/Native_Mod/Solve_Native.f90 | 24 +++++++++---------- 6 files changed, 47 insertions(+), 46 deletions(-) diff --git a/Sources/Process/Native_Mod/Bicg.f90 b/Sources/Process/Native_Mod/Bicg.f90 index 60cfe31e1..dfe25deb4 100644 --- a/Sources/Process/Native_Mod/Bicg.f90 +++ b/Sources/Process/Native_Mod/Bicg.f90 @@ -5,17 +5,17 @@ subroutine Bicg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Native_Type), target :: Nat - type(Matrix_Type), target :: A - real :: x(-Nat % pnt_grid % n_bnd_cells : & - Nat % pnt_grid % n_cells) - real :: b( Nat % pnt_grid % n_cells) - character(SL) :: prec ! preconditioner - integer :: miter ! maximum and actual ... - integer :: niter ! ... number of iterations - real :: tol ! tolerance - real :: fin_res ! final residual - real, optional :: norm ! normalization + class(Native_Type), target, intent(in) :: Nat + type(Matrix_Type), target, intent(in) :: A + real, intent(out) :: x(-Nat % pnt_grid % n_bnd_cells:& + Nat % pnt_grid % n_cells) + real, intent(inout) :: b( Nat % pnt_grid % n_cells) + character(SL), intent(in) :: prec ! preconditioner + integer, intent(in) :: miter ! maximum and actual ... + integer, intent(out) :: niter ! ... num. of iterations + real, intent(in) :: tol ! tolerance + real, intent(out) :: fin_res ! final residual + real, optional, intent(in) :: norm ! normalization !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid integer :: nt, ni, nb @@ -230,12 +230,14 @@ subroutine Bicg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) !-----------------------------! ! De-normalize the system ! !-----------------------------! + !$omp parallel do private(i, j) shared(a_row, a_val, b, fn) do i = 1, nt do j = a_row(i), a_row(i+1)-1 a_val(j) = a_val(j) / fn end do b(i) = b(i) / fn end do + !$omp end parallel do fin_res = res niter = iter diff --git a/Sources/Process/Native_Mod/Cg.f90 b/Sources/Process/Native_Mod/Cg.f90 index b6bcb9430..4ec82cd7b 100644 --- a/Sources/Process/Native_Mod/Cg.f90 +++ b/Sources/Process/Native_Mod/Cg.f90 @@ -5,17 +5,17 @@ subroutine Cg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Native_Type), target :: Nat - type(Matrix_Type), target :: A - real :: x(-Nat % pnt_grid % n_bnd_cells : & - Nat % pnt_grid % n_cells) - real :: b( Nat % pnt_grid % n_cells) - character(SL) :: prec ! preconditioner - integer :: miter ! maximum and actual ... - integer :: niter ! ... number of iterations - real :: tol ! tolerance - real :: fin_res ! final residual - real, optional :: norm ! normalization + class(Native_Type), target, intent(in) :: Nat + type(Matrix_Type), target, intent(in) :: A + real, intent(out) :: x(-Nat % pnt_grid % n_bnd_cells:& + Nat % pnt_grid % n_cells) + real, intent(inout) :: b( Nat % pnt_grid % n_cells) + character(SL), intent(in) :: prec ! preconditioner + integer, intent(in) :: miter ! maximum and actual ... + integer, intent(out) :: niter ! ... num. of iterations + real, intent(in) :: tol ! tolerance + real, intent(out) :: fin_res ! final residual + real, optional, intent(in) :: norm ! normalization !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid integer :: nt, ni, nb diff --git a/Sources/Process/Native_Mod/Create_Native.f90 b/Sources/Process/Native_Mod/Create_Native.f90 index 2ed07a5b7..e95669e3a 100644 --- a/Sources/Process/Native_Mod/Create_Native.f90 +++ b/Sources/Process/Native_Mod/Create_Native.f90 @@ -3,8 +3,8 @@ subroutine Create_Native(Nat, Grid) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Native_Type) :: Nat - type(Grid_Type), target :: Grid + class(Native_Type), intent(out) :: Nat + type(Grid_Type), target, intent(in) :: Grid !==============================================================================! Nat % pnt_grid => Grid diff --git a/Sources/Process/Native_Mod/Residual_Vector.f90 b/Sources/Process/Native_Mod/Residual_Vector.f90 index b1d3e280f..0d78a5924 100644 --- a/Sources/Process/Native_Mod/Residual_Vector.f90 +++ b/Sources/Process/Native_Mod/Residual_Vector.f90 @@ -5,12 +5,12 @@ subroutine Residual_Vector(Native, ni, r, b, A, x) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Native_Type) :: Native - integer :: ni - real :: r(:) ! this might be only for inner cells - real :: b(:) ! this might be only for inner cells - type(Matrix_Type) :: A - real :: x(:) ! this may incude buffer cells + class(Native_Type), intent(in) :: Native + integer, intent(in) :: ni + real, intent(out) :: r(:) ! this might be only for inner cells + real, intent(in) :: b(:) ! this might be only for inner cells + type(Matrix_Type), intent(in) :: A + real, intent(in) :: x(:) ! this may incude buffer cells !-----------------------------------[Locals]-----------------------------------! integer :: i, j, k !==============================================================================! @@ -18,7 +18,6 @@ subroutine Residual_Vector(Native, ni, r, b, A, x) !----------------! ! r = b - Ax ! !----------------! - ! Why not callig this: call exchange(x) ??? do i = 1, ni r(i) = b(i) do j = A % row(i), A % row(i+1) - 1 diff --git a/Sources/Process/Native_Mod/Root_Mean_Square.f90 b/Sources/Process/Native_Mod/Root_Mean_Square.f90 index 3788d9e21..d8cf798cd 100644 --- a/Sources/Process/Native_Mod/Root_Mean_Square.f90 +++ b/Sources/Process/Native_Mod/Root_Mean_Square.f90 @@ -6,9 +6,9 @@ real function Root_Mean_Square(Native, ni, r) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Native_Type) :: Native - integer :: ni - real :: r(:) ! this may be only in inner cells + class(Native_Type), intent(in) :: Native + integer, intent(in) :: ni + real, intent(in) :: r(:) ! this may be only in inner cells !-----------------------------------[Locals]-----------------------------------! real :: rms integer :: i diff --git a/Sources/Process/Native_Mod/Solve_Native.f90 b/Sources/Process/Native_Mod/Solve_Native.f90 index bda40067d..4308a8c02 100644 --- a/Sources/Process/Native_Mod/Solve_Native.f90 +++ b/Sources/Process/Native_Mod/Solve_Native.f90 @@ -8,18 +8,18 @@ subroutine Solve_Native(Nat, & !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Native_Type) :: Nat - character(*) :: solver ! solver - character(*) :: prec ! preconditioner - type(Matrix_Type) :: A - real :: x(-Nat % pnt_grid % n_bnd_cells : & - Nat % pnt_grid % n_cells) - real :: b( Nat % pnt_grid % n_cells) - integer :: miter ! maximum and actual ... - integer :: niter ! ... number of iterations - real :: tol ! tolerance - real :: fin_res ! final residual - real, optional :: norm ! normalization + class(Native_Type), intent(in) :: Nat + character(*), intent(in) :: solver ! solver + character(*), intent(in) :: prec ! preconditioner + type(Matrix_Type), intent(in) :: A + real, intent(out) :: x(-Nat % pnt_grid % n_bnd_cells : & + Nat % pnt_grid % n_cells) + real, intent(inout) :: b( Nat % pnt_grid % n_cells) + integer, intent(in) :: miter ! maximum and actual ... + integer, intent(out) :: niter ! ... number of iterations + real, intent(in) :: tol ! tolerance + real, intent(out) :: fin_res ! final residual + real, optional, intent(in) :: norm ! normalization !==============================================================================! ! Call the desired linear solver to solve the equations From 09d688ed1194f889e8d04ce2751fe372d6eb60da Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 18 Mar 2023 07:22:48 +0100 Subject: [PATCH 101/223] Juiced a fraction of percentage point in OMP speed On branch bojan_fixed_cell_ranges modified: Native_Mod/Bicg.f90 modified: Native_Mod/Cg.f90 modified: Native_Mod/Residual_Vector.f90 modified: Native_Mod/Root_Mean_Square.f90 --- Sources/Process/Native_Mod/Bicg.f90 | 7 ++++- Sources/Process/Native_Mod/Cg.f90 | 7 ++++- .../Process/Native_Mod/Residual_Vector.f90 | 29 ++++++++++++------- .../Process/Native_Mod/Root_Mean_Square.f90 | 2 ++ 4 files changed, 33 insertions(+), 12 deletions(-) diff --git a/Sources/Process/Native_Mod/Bicg.f90 b/Sources/Process/Native_Mod/Bicg.f90 index dfe25deb4..1a670e95e 100644 --- a/Sources/Process/Native_Mod/Bicg.f90 +++ b/Sources/Process/Native_Mod/Bicg.f90 @@ -133,7 +133,12 @@ subroutine Bicg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) !------------------! ! rho = (z,r~) ! !------------------! - rho = dot_product(q1(1:ni), r2(1:ni)) + rho = 0.0 + !$omp parallel do private(i) shared(q1, r2) reduction(+ : rho) + do i = 1, ni + rho = rho + q1(i) * r2(i) + end do + !$omp end parallel do call Comm_Mod_Global_Sum_Real(rho) if(iter .eq. 1) then diff --git a/Sources/Process/Native_Mod/Cg.f90 b/Sources/Process/Native_Mod/Cg.f90 index 4ec82cd7b..682107bb4 100644 --- a/Sources/Process/Native_Mod/Cg.f90 +++ b/Sources/Process/Native_Mod/Cg.f90 @@ -130,7 +130,12 @@ subroutine Cg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) !-----------------! ! rho = (r,z) ! !-----------------! - rho = dot_product(r1(1:ni), q1(1:ni)) + rho = 0.0 + !$omp parallel do private(i) shared(q1, r1) reduction(+ : rho) + do i = 1, ni + rho = rho + q1(i) * r1(i) + end do + !$omp end parallel do call Comm_Mod_Global_Sum_Real(rho) if(iter .eq. 1) then diff --git a/Sources/Process/Native_Mod/Residual_Vector.f90 b/Sources/Process/Native_Mod/Residual_Vector.f90 index 0d78a5924..85cd16939 100644 --- a/Sources/Process/Native_Mod/Residual_Vector.f90 +++ b/Sources/Process/Native_Mod/Residual_Vector.f90 @@ -5,25 +5,34 @@ subroutine Residual_Vector(Native, ni, r, b, A, x) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Native_Type), intent(in) :: Native - integer, intent(in) :: ni - real, intent(out) :: r(:) ! this might be only for inner cells - real, intent(in) :: b(:) ! this might be only for inner cells - type(Matrix_Type), intent(in) :: A - real, intent(in) :: x(:) ! this may incude buffer cells + class(Native_Type), intent(in) :: Native + integer, intent(in) :: ni + real, intent(out) :: r(:) ! only for inner cells + real, intent(in) :: b(:) ! only for inner cells + type(Matrix_Type), target, intent(in) :: A + real, intent(in) :: x(:) ! may incude buffer cells !-----------------------------------[Locals]-----------------------------------! - integer :: i, j, k + integer :: i, j, k + real, contiguous, pointer :: a_val(:) + integer, contiguous, pointer :: a_col(:), a_row(:) !==============================================================================! + ! Take some aliases + a_col => A % col + a_row => A % row + a_val => A % val + !----------------! ! r = b - Ax ! !----------------! + !$omp parallel do private(i, j) shared (r, b, x) do i = 1, ni r(i) = b(i) - do j = A % row(i), A % row(i+1) - 1 - k = A % col(j) - r(i) = r(i) - A % val(j) * x(k) + do j = a_row(i), a_row(i+1) - 1 + k = a_col(j) + r(i) = r(i) - a_val(j) * x(k) end do end do + !$omp end parallel do end subroutine diff --git a/Sources/Process/Native_Mod/Root_Mean_Square.f90 b/Sources/Process/Native_Mod/Root_Mean_Square.f90 index d8cf798cd..1053f84e3 100644 --- a/Sources/Process/Native_Mod/Root_Mean_Square.f90 +++ b/Sources/Process/Native_Mod/Root_Mean_Square.f90 @@ -16,9 +16,11 @@ real function Root_Mean_Square(Native, ni, r) ! Compute rms normalizing it with main diagonal in the system matrix rms = 0.0 + !$omp parallel do private(i) shared(r) reduction(+ : rms) do i = 1, ni rms = rms + r(i)**2 end do + !$omp end parallel do call Comm_Mod_Global_Sum_Real(rms) rms = sqrt(rms) From 504887730146d767648d9e97d3abada93dc98465 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 18 Mar 2023 08:29:28 +0100 Subject: [PATCH 102/223] Better alignment for reporting in seconds. On branch bojan_fixed_cell_ranges modified: ../Shared/Profiler_Mod/Statistics.f90 --- Sources/Shared/Profiler_Mod/Statistics.f90 | 32 ++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/Sources/Shared/Profiler_Mod/Statistics.f90 b/Sources/Shared/Profiler_Mod/Statistics.f90 index eb7ef971a..c5464a0a0 100644 --- a/Sources/Shared/Profiler_Mod/Statistics.f90 +++ b/Sources/Shared/Profiler_Mod/Statistics.f90 @@ -98,9 +98,37 @@ subroutine Statistics(Profiler, indent, in_seconds) = Profiler % funct_name(i_fun)(1:123) line(47+indent:47+indent) = '|' percent_time = Profiler % funct_time(i_fun) / total_time * 100.0 + + ! Write time in elapsed seconds if(in_sec) then - write(line(52+indent:57+indent), '(f6.2)') Profiler % funct_time(i_fun) - line(59+indent:61+indent) = '[s]' + ! I stick to kiss principle here: keep it simple and stupid + if(Profiler % funct_time(1) < 10) then + write(line(53+indent:56+indent), '(f4.2)') Profiler%funct_time(i_fun) + line(58+indent:60+indent) = '[s]' + else if(Profiler % funct_time(1) < 100) then + write(line(52+indent:56+indent), '(f5.2)') Profiler%funct_time(i_fun) + line(58+indent:60+indent) = '[s]' + else if(Profiler % funct_time(1) < 1000) then + write(line(51+indent:56+indent), '(f6.2)') Profiler%funct_time(i_fun) + line(58+indent:60+indent) = '[s]' + else if(Profiler % funct_time(1) < 10000) then + write(line(51+indent:57+indent), '(f7.2)') Profiler%funct_time(i_fun) + line(59+indent:61+indent) = '[s]' + else if(Profiler % funct_time(1) < 100000) then + write(line(50+indent:57+indent), '(f8.2)') Profiler%funct_time(i_fun) + line(59+indent:61+indent) = '[s]' + else if(Profiler % funct_time(1) < 1000000) then + write(line(50+indent:58+indent), '(f9.2)') Profiler%funct_time(i_fun) + line(60+indent:62+indent) = '[s]' + else if(Profiler % funct_time(1) < 10000000) then + write(line(49+indent:58+indent), '(f10.2)') Profiler%funct_time(i_fun) + line(60+indent:62+indent) = '[s]' + else if(Profiler % funct_time(1) < 100000000) then + write(line(49+indent:59+indent), '(f11.2)') Profiler%funct_time(i_fun) + line(61+indent:63+indent) = '[s]' + end if + + ! Write time in percentages else write(line(52+indent:57+indent), '(f6.2)') percent_time line(59+indent:59+indent) = '%' From c60408a208fc4e9498710131320f3305070eee2d Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 18 Mar 2023 20:02:45 +0100 Subject: [PATCH 103/223] Expanded makefiles with options for profiling If gfortan is used, options for gprof are set, and if Intel Fortran is used, options for vtune are passed. On branch bojan_fixed_cell_ranges modified: Convert/makefile modified: Divide/makefile modified: Generate/makefile modified: Process/makefile --- Sources/Convert/makefile | 56 +++++++++++++++++++++++++------------- Sources/Divide/makefile | 55 ++++++++++++++++++++++++------------- Sources/Generate/makefile | 55 ++++++++++++++++++++++++------------- Sources/Process/makefile | 57 +++++++++++++++++++++++++-------------- 4 files changed, 148 insertions(+), 75 deletions(-) diff --git a/Sources/Convert/makefile b/Sources/Convert/makefile index 2cfc15b95..c1e0a2ff3 100644 --- a/Sources/Convert/makefile +++ b/Sources/Convert/makefile @@ -8,8 +8,9 @@ # Default options for compilation #------------------------------------- FORTRAN ?= gnu -DEBUG ?= no ASSERT ?= yes +DEBUG ?= no +PROF ?= no REAL ?= double MPI ?= no OMP ?= yes @@ -45,12 +46,12 @@ else endif $(info #=======================================================================) -$(info # Compiling $(PROGRAM_NAME) with compiler $(FORTRAN)) +$(info # Compiling $(PROGRAM_NAME) with $(FORTRAN) compiler ) $(info #-----------------------------------------------------------------------) $(info # Usage: ) $(info # make ) $(info # ) -$(info # ) +$(info # ) $(info # ) $(info # Note: The first item, for each of the options above, is the default. ) $(info # ) @@ -71,11 +72,17 @@ ifeq ($(REAL), single) endif #------------------------------------------------------------------------- +# # Compiler and linker options +# #------------------------------------------------------------------------- # Note: Changes only when support to a new Fortran compiler is added. #------------------------------------------------------------------------- +#----------- +# Intel +#----------- + # Fortran == intel ifeq ($(FORTRAN), intel) ifeq ($(FCOMP),) @@ -83,19 +90,30 @@ ifeq ($(FORTRAN), intel) else FC = $(FCOMP) endif + OPT_F_COMP = -module $(DIR_MODULE) -cpp ifeq ($(DEBUG), yes) - OPT_F_COMP = -module $(DIR_MODULE) -O0 -g -warn -warn all,noexternal \ - -check all -debug all -fpe-all=0 -traceback -cpp + OPT_F_COMP += -O0 -g -traceback else - OPT_F_COMP = -module $(DIR_MODULE) -O3 -cpp + OPT_F_COMP += -O2 + endif + ifeq ($(PROF), yes) + OPT_F_COMP += -g -O2 -shared-intel -debug inline-debug-info \ + -D TBB_USE_THREADING_TOOLS endif ifeq ($(REAL), double) OPT_F_COMP += -r8 endif ifeq ($(OMP), yes) OPT_F_COMP += -qopenmp + ifeq ($(PROF), yes) + OPT_F_COMP += -qopenmp-link dynamic -parallel-source-info=2 + endif endif +#------------ +# Nvidia +#------------ + # Fortran == nvidia else ifeq ($(FORTRAN), nvidia) ifeq ($(FCOMP),) @@ -103,10 +121,11 @@ else ifeq ($(FORTRAN), nvidia) else FC = $(FCOMP) endif + OPT_F_COMP = -module $(DIR_MODULE) ifeq ($(DEBUG), yes) - OPT_F_COMP = -module $(DIR_MODULE) -O0 -g + OPT_F_COMP += -O0 -g else - OPT_F_COMP = -module $(DIR_MODULE) -O3 + OPT_F_COMP += -O3 endif ifeq ($(REAL), double) OPT_F_COMP += -r8 @@ -115,6 +134,10 @@ else ifeq ($(FORTRAN), nvidia) OPT_F_COMP += -mp endif +#--------- +# Gnu +#--------- + # Fortran == gnu else ifeq ($(FCOMP),) @@ -122,19 +145,14 @@ else else FC = $(FCOMP) endif + OPT_F_COMP = -J $(DIR_MODULE) -cpp -ffree-line-length-none ifeq ($(DEBUG), yes) - OPT_F_COMP = -J $(DIR_MODULE) -O0 -g -cpp \ - -ffree-line-length-none -fcheck=all -fwhole-file -fbacktrace \ - -ffpe-trap=invalid,zero,overflow -fimplicit-none \ - -Wall -Wextra -Waliasing -Wampersand -Warray-temporaries \ - -Wc-binding-type -Wcharacter-truncation -Wline-truncation \ - -Wconversion -finit-real=nan -Wintrinsics-std \ - -Wreal-q-constant -Wsurprising -Wtabs -Wunderflow \ - -Wintrinsic-shadow -Wunused-parameter -Walign-commons \ - -Wfunction-elimination -Wrealloc-lhs -Wrealloc-lhs-all \ - -Wtarget-lifetime -Wpedantic -fstack-check + OPT_F_COMP += -O0 -g -fcheck=all -Wunused-parameter -Wall else - OPT_F_COMP = -J $(DIR_MODULE) -O3 -cpp -ffree-line-length-none + OPT_F_COMP += -O3 + endif + ifeq ($(PROF), yes) + OPT_F_COMP += -pg -g endif ifeq ($(REAL), double) OPT_F_COMP += -fdefault-real-8 diff --git a/Sources/Divide/makefile b/Sources/Divide/makefile index 27069d6ab..7dbb0c5f2 100644 --- a/Sources/Divide/makefile +++ b/Sources/Divide/makefile @@ -8,8 +8,9 @@ # Default options for compilation #------------------------------------- FORTRAN ?= gnu -DEBUG ?= no ASSERT ?= yes +DEBUG ?= no +PROF ?= no REAL ?= double MPI ?= no OMP ?= no @@ -45,12 +46,12 @@ else endif $(info #=======================================================================) -$(info # Compiling $(PROGRAM_NAME) with compiler $(FORTRAN) ) +$(info # Compiling $(PROGRAM_NAME) with $(FORTRAN) compiler ) $(info #-----------------------------------------------------------------------) $(info # Usage: ) $(info # make ) $(info # ) -$(info # ) +$(info # ) $(info # ) $(info # Note: The first item, for each of the options above, is the default. ) $(info # ) @@ -70,11 +71,17 @@ ifeq ($(REAL), single) endif #------------------------------------------------------------------------- +# # Compiler and linker options +# #------------------------------------------------------------------------- # Note: Changes only when support to a new Fortran compiler is added. #------------------------------------------------------------------------- +#----------- +# Intel +#----------- + # Fortran == intel ifeq ($(FORTRAN), intel) ifeq ($(FCOMP),) @@ -82,18 +89,30 @@ ifeq ($(FORTRAN), intel) else FC = $(FCOMP) endif + OPT_F_COMP = -module $(DIR_MODULE) -cpp ifeq ($(DEBUG), yes) - OPT_F_COMP = -module $(DIR_MODULE) -O0 -g -traceback -cpp + OPT_F_COMP += -O0 -g -traceback else - OPT_F_COMP = -module $(DIR_MODULE) -O3 -cpp + OPT_F_COMP += -O2 + endif + ifeq ($(PROF), yes) + OPT_F_COMP += -g -O2 -shared-intel -debug inline-debug-info \ + -D TBB_USE_THREADING_TOOLS endif ifeq ($(REAL), double) OPT_F_COMP += -r8 endif ifeq ($(OMP), yes) OPT_F_COMP += -qopenmp + ifeq ($(PROF), yes) + OPT_F_COMP += -qopenmp-link dynamic -parallel-source-info=2 + endif endif +#------------ +# Nvidia +#------------ + # Fortran == nvidia else ifeq ($(FORTRAN), nvidia) ifeq ($(FCOMP),) @@ -101,10 +120,11 @@ else ifeq ($(FORTRAN), nvidia) else FC = $(FCOMP) endif + OPT_F_COMP = -module $(DIR_MODULE) ifeq ($(DEBUG), yes) - OPT_F_COMP = -module $(DIR_MODULE) -O0 -g + OPT_F_COMP += -O0 -g else - OPT_F_COMP = -module $(DIR_MODULE) -O3 + OPT_F_COMP += -O3 endif ifeq ($(REAL), double) OPT_F_COMP += -r8 @@ -113,6 +133,10 @@ else ifeq ($(FORTRAN), nvidia) OPT_F_COMP += -mp endif +#--------- +# Gnu +#--------- + # Fortran == gnu else ifeq ($(FCOMP),) @@ -120,19 +144,14 @@ else else FC = $(FCOMP) endif + OPT_F_COMP = -J $(DIR_MODULE) -cpp -ffree-line-length-none ifeq ($(DEBUG), yes) - OPT_F_COMP = -J $(DIR_MODULE) -O0 -g -cpp \ - -ffree-line-length-none -fcheck=all -fwhole-file -fbacktrace \ - -ffpe-trap=invalid,zero,overflow -fimplicit-none \ - -Wall -Wextra -Waliasing -Wampersand -Warray-temporaries \ - -Wc-binding-type -Wcharacter-truncation -Wline-truncation \ - -Wconversion -finit-real=nan -Wintrinsics-std \ - -Wreal-q-constant -Wsurprising -Wtabs -Wunderflow \ - -Wintrinsic-shadow -Wunused-parameter -Walign-commons \ - -Wfunction-elimination -Wrealloc-lhs -Wrealloc-lhs-all \ - -Wtarget-lifetime -Wpedantic -fstack-check + OPT_F_COMP += -O0 -g -fcheck=all -Wunused-parameter -Wall else - OPT_F_COMP = -J $(DIR_MODULE) -O3 -cpp -ffree-line-length-none + OPT_F_COMP += -O3 + endif + ifeq ($(PROF), yes) + OPT_F_COMP += -pg -g endif ifeq ($(REAL), double) OPT_F_COMP += -fdefault-real-8 diff --git a/Sources/Generate/makefile b/Sources/Generate/makefile index 3aa0db39a..eec637a4f 100644 --- a/Sources/Generate/makefile +++ b/Sources/Generate/makefile @@ -8,8 +8,9 @@ # Default options for compilation #------------------------------------- FORTRAN ?= gnu -DEBUG ?= no ASSERT ?= yes +DEBUG ?= no +PROF ?= no REAL ?= double MPI ?= no OMP ?= yes @@ -45,12 +46,12 @@ else endif $(info #=======================================================================) -$(info # Compiling $(PROGRAM_NAME) with compiler $(FORTRAN) ) +$(info # Compiling $(PROGRAM_NAME) with $(FORTRAN) compiler ) $(info #-----------------------------------------------------------------------) $(info # Usage: ) $(info # make ) $(info # ) -$(info # ) +$(info # ) $(info # ) $(info # Note: The first item, for each of the options above, is the default. ) $(info # ) @@ -71,11 +72,17 @@ ifeq ($(REAL), single) endif #------------------------------------------------------------------------- +# # Compiler and linker options +# #------------------------------------------------------------------------- # Note: Changes only when support to a new Fortran compiler is added. #------------------------------------------------------------------------- +#----------- +# Intel +#----------- + # Fortran == intel ifeq ($(FORTRAN), intel) ifeq ($(FCOMP),) @@ -83,18 +90,30 @@ ifeq ($(FORTRAN), intel) else FC = $(FCOMP) endif + OPT_F_COMP = -module $(DIR_MODULE) -cpp ifeq ($(DEBUG), yes) - OPT_F_COMP = -module $(DIR_MODULE) -O0 -g -traceback -cpp + OPT_F_COMP += -O0 -g -traceback else - OPT_F_COMP = -module $(DIR_MODULE) -O3 -cpp + OPT_F_COMP += -O2 + endif + ifeq ($(PROF), yes) + OPT_F_COMP += -g -O2 -shared-intel -debug inline-debug-info \ + -D TBB_USE_THREADING_TOOLS endif ifeq ($(REAL), double) OPT_F_COMP += -r8 endif ifeq ($(OMP), yes) OPT_F_COMP += -qopenmp + ifeq ($(PROF), yes) + OPT_F_COMP += -qopenmp-link dynamic -parallel-source-info=2 + endif endif +#------------ +# Nvidia +#------------ + # Fortran == nvidia else ifeq ($(FORTRAN), nvidia) ifeq ($(FCOMP),) @@ -102,10 +121,11 @@ else ifeq ($(FORTRAN), nvidia) else FC = $(FCOMP) endif + OPT_F_COMP = -module $(DIR_MODULE) ifeq ($(DEBUG), yes) - OPT_F_COMP = -module $(DIR_MODULE) -O0 -g + OPT_F_COMP += -O0 -g else - OPT_F_COMP = -module $(DIR_MODULE) -O3 + OPT_F_COMP += -O3 endif ifeq ($(REAL), double) OPT_F_COMP += -r8 @@ -114,6 +134,10 @@ else ifeq ($(FORTRAN), nvidia) OPT_F_COMP += -mp endif +#--------- +# Gnu +#--------- + # Fortran == gnu else ifeq ($(FCOMP),) @@ -121,19 +145,14 @@ else else FC = $(FCOMP) endif + OPT_F_COMP = -J $(DIR_MODULE) -cpp -ffree-line-length-none ifeq ($(DEBUG), yes) - OPT_F_COMP = -J $(DIR_MODULE) -O0 -g -cpp \ - -ffree-line-length-none -fcheck=all -fwhole-file -fbacktrace \ - -ffpe-trap=invalid,zero,overflow -fimplicit-none \ - -Wall -Wextra -Waliasing -Wampersand -Warray-temporaries \ - -Wc-binding-type -Wcharacter-truncation -Wline-truncation \ - -Wconversion -finit-real=nan -Wintrinsics-std \ - -Wreal-q-constant -Wsurprising -Wtabs -Wunderflow \ - -Wintrinsic-shadow -Wunused-parameter -Walign-commons \ - -Wfunction-elimination -Wrealloc-lhs -Wrealloc-lhs-all \ - -Wtarget-lifetime -Wpedantic -fstack-check + OPT_F_COMP += -O0 -g -fcheck=all -Wunused-parameter -Wall else - OPT_F_COMP = -J $(DIR_MODULE) -O3 -cpp -ffree-line-length-none + OPT_F_COMP += -O3 + endif + ifeq ($(PROF), yes) + OPT_F_COMP += -pg -g endif ifeq ($(REAL), double) OPT_F_COMP += -fdefault-real-8 diff --git a/Sources/Process/makefile b/Sources/Process/makefile index fa26d2a6a..150a86fe0 100644 --- a/Sources/Process/makefile +++ b/Sources/Process/makefile @@ -8,8 +8,9 @@ # Default options for compilation #------------------------------------- FORTRAN ?= gnu -DEBUG ?= no ASSERT ?= yes +DEBUG ?= no +PROF ?= no REAL ?= double MPI ?= no OMP ?= no @@ -19,11 +20,9 @@ DIR_BINARY = ../../Binaries DIR_SHARED = ../Shared DIR_MODULE = .Modules DIR_OBJECT = .Objects -DIR_TURBUL = Turb_Mod -DIR_SWARM = Swarm_Mod DIR_USER = User_Mod DIR_CASE = no -VPATH = $(DIR_SHARED):$(DIR_TURBUL):$(DIR_SWARM):. +VPATH = $(DIR_SHARED):. # Program name (This should hardly change) PROGRAM_NAME = Process @@ -55,7 +54,7 @@ $(info #-----------------------------------------------------------------------) $(info # Usage: ) $(info # make ) $(info # ) -$(info # ) +$(info # ) $(info # ) $(info # ) $(info # Notes: ) @@ -81,11 +80,17 @@ ifeq ($(REAL), single) endif #------------------------------------------------------------------------- +# # Compiler and linker options +# #------------------------------------------------------------------------- # Note: Changes only when support to a new Fortran compiler is added. #------------------------------------------------------------------------- +#----------- +# Intel +#----------- + # Fortran == intel ifeq ($(FORTRAN), intel) ifeq ($(FCOMP),) @@ -93,18 +98,30 @@ ifeq ($(FORTRAN), intel) else FC = $(FCOMP) endif + OPT_F_COMP = -module $(DIR_MODULE) -cpp ifeq ($(DEBUG), yes) - OPT_F_COMP = -module $(DIR_MODULE) -O0 -g -traceback -cpp + OPT_F_COMP += -O0 -g -traceback else - OPT_F_COMP = -module $(DIR_MODULE) -O3 -cpp + OPT_F_COMP += -O2 + endif + ifeq ($(PROF), yes) + OPT_F_COMP += -g -O2 -shared-intel -debug inline-debug-info \ + -D TBB_USE_THREADING_TOOLS endif ifeq ($(REAL), double) OPT_F_COMP += -r8 endif ifeq ($(OMP), yes) OPT_F_COMP += -qopenmp + ifeq ($(PROF), yes) + OPT_F_COMP += -qopenmp-link dynamic -parallel-source-info=2 + endif endif +#------------ +# Nvidia +#------------ + # Fortran == nvidia else ifeq ($(FORTRAN), nvidia) ifeq ($(FCOMP),) @@ -112,10 +129,11 @@ else ifeq ($(FORTRAN), nvidia) else FC = $(FCOMP) endif + OPT_F_COMP = -module $(DIR_MODULE) ifeq ($(DEBUG), yes) - OPT_F_COMP = -module $(DIR_MODULE) -O0 -g + OPT_F_COMP += -O0 -g else - OPT_F_COMP = -module $(DIR_MODULE) -O3 + OPT_F_COMP += -O3 endif ifeq ($(REAL), double) OPT_F_COMP += -r8 @@ -124,6 +142,10 @@ else ifeq ($(FORTRAN), nvidia) OPT_F_COMP += -mp endif +#--------- +# Gnu +#--------- + # Fortran == gnu else ifeq ($(FCOMP),) @@ -131,19 +153,14 @@ else else FC = $(FCOMP) endif + OPT_F_COMP = -J $(DIR_MODULE) -cpp -ffree-line-length-none ifeq ($(DEBUG), yes) - OPT_F_COMP = -J $(DIR_MODULE) -O0 -g -cpp \ - -ffree-line-length-none -fcheck=all -fwhole-file -fbacktrace \ - -ffpe-trap=invalid,zero,overflow -fimplicit-none \ - -Wall -Wextra -Waliasing -Wampersand -Warray-temporaries \ - -Wc-binding-type -Wcharacter-truncation -Wline-truncation \ - -Wconversion -finit-real=nan -Wintrinsics-std \ - -Wreal-q-constant -Wsurprising -Wtabs -Wunderflow \ - -Wintrinsic-shadow -Wunused-parameter -Walign-commons \ - -Wfunction-elimination -Wrealloc-lhs -Wrealloc-lhs-all \ - -Wtarget-lifetime -Wpedantic -fstack-check + OPT_F_COMP += -O0 -g -fcheck=all -Wunused-parameter -Wall else - OPT_F_COMP = -J $(DIR_MODULE) -O3 -cpp -ffree-line-length-none + OPT_F_COMP += -O3 + endif + ifeq ($(PROF), yes) + OPT_F_COMP += -pg -g endif ifeq ($(REAL), double) OPT_F_COMP += -fdefault-real-8 From 4992f5e5e6876b46ea5c91d4689b3e2a3e6ba91a Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 19 Mar 2023 15:16:23 +0100 Subject: [PATCH 104/223] Uses Message_Mod for error messages. On branch bojan_fixed_cell_ranges modified: Backup_Mod/Load.f90 modified: Native_Mod/Solve_Native.f90 modified: Numerics_Mod/Advection_Scheme_Code.f90 modified: Numerics_Mod/Gradient_Method_Code.f90 modified: Petsc_Mod/Fake/Solve_Petsc.f90 modified: User_Mod/Initialize_Variables.f90 --- Sources/Process/Backup_Mod/Load.f90 | 9 +++------ Sources/Process/Native_Mod/Solve_Native.f90 | 10 ++++++---- .../Numerics_Mod/Advection_Scheme_Code.f90 | 13 ++++++------- .../Numerics_Mod/Gradient_Method_Code.f90 | 14 +++++++------- .../Process/Petsc_Mod/Fake/Solve_Petsc.f90 | 15 +++++++-------- .../Process/User_Mod/Initialize_Variables.f90 | 19 +++++++------------ 6 files changed, 36 insertions(+), 44 deletions(-) diff --git a/Sources/Process/Backup_Mod/Load.f90 b/Sources/Process/Backup_Mod/Load.f90 index 38f7b0139..9929c46f4 100644 --- a/Sources/Process/Backup_Mod/Load.f90 +++ b/Sources/Process/Backup_Mod/Load.f90 @@ -44,12 +44,9 @@ subroutine Backup_Mod_Load(Fld, Tur, Vof, Swr, time, time_step, backup) inquire(file=trim(name_in), exist=present ) if(.not.present) then - if(this_proc < 2) then - print *, "# ERROR! Backup file ", trim(name_in), " was not found." - print *, "# Exiting!" - end if - call Comm_Mod_End - stop + call Message % Error(80, & + 'Backup file '//trim(name_in)//' was not found. Exiting!', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if ! Open backup file diff --git a/Sources/Process/Native_Mod/Solve_Native.f90 b/Sources/Process/Native_Mod/Solve_Native.f90 index 4308a8c02..f5fefd7d8 100644 --- a/Sources/Process/Native_Mod/Solve_Native.f90 +++ b/Sources/Process/Native_Mod/Solve_Native.f90 @@ -28,10 +28,12 @@ subroutine Solve_Native(Nat, & else if(solver .eq. 'cg') then call Nat % Cg (A, x, b, prec, miter, niter, tol, fin_res, norm) else - print *, '# ERROR: Unknown native solver: ', solver - print *, '# This error is critical, stopping!' - call Comm_Mod_End - stop + call Message % Error(64, 'Unknown native solver: '//trim(solver) // & + '. This error is critical, exiting! ' // & + 'Check the file: Documents/all_control' // & + '_keywords to see which solvers are ' // & + 'available.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine diff --git a/Sources/Process/Numerics_Mod/Advection_Scheme_Code.f90 b/Sources/Process/Numerics_Mod/Advection_Scheme_Code.f90 index 6dbd92c95..4102072e2 100644 --- a/Sources/Process/Numerics_Mod/Advection_Scheme_Code.f90 +++ b/Sources/Process/Numerics_Mod/Advection_Scheme_Code.f90 @@ -36,13 +36,12 @@ integer function Numerics_Mod_Advection_Scheme_Code(name) Numerics_Mod_Advection_Scheme_Code = STACS case default - if(this_proc < 2) then - print *, '# ERROR! Unknown advection scheme: ', trim(name) - print *, '# Exiting!' - end if - call Comm_Mod_End - stop - + call Message % Error(64, 'Unknown advection scheme: '//trim(name) // & + '. This error is critical, exiting! ' // & + 'Check the file: Documents/all_control' // & + '_keywords to see which advection schemes ' // & + 'are currently available in the code.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end select end function diff --git a/Sources/Process/Numerics_Mod/Gradient_Method_Code.f90 b/Sources/Process/Numerics_Mod/Gradient_Method_Code.f90 index 26fba3f94..6119985ec 100644 --- a/Sources/Process/Numerics_Mod/Gradient_Method_Code.f90 +++ b/Sources/Process/Numerics_Mod/Gradient_Method_Code.f90 @@ -16,13 +16,13 @@ integer function Numerics_Mod_Gradient_Method_Code(name) Numerics_Mod_Gradient_Method_Code = GAUSS_THEOREM case default - if(this_proc < 2) then - print *, '# ERROR! Unknown gradient computation method: ', trim(name) - print *, '# Exiting!' - end if - call Comm_Mod_End - stop - + call Message % Error(80, 'Unknown gradient calculation method: ' // & + trim(name)//'. This error is critical, ' // & + ' exiting! Check the file: ' // & + 'Documents/all_control_keywords to see ' // & + 'which gradient computation methods are ' // & + 'currently available in the code.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end select end function diff --git a/Sources/Process/Petsc_Mod/Fake/Solve_Petsc.f90 b/Sources/Process/Petsc_Mod/Fake/Solve_Petsc.f90 index d250d4ae0..c1145069a 100644 --- a/Sources/Process/Petsc_Mod/Fake/Solve_Petsc.f90 +++ b/Sources/Process/Petsc_Mod/Fake/Solve_Petsc.f90 @@ -27,14 +27,13 @@ subroutine Solve_Petsc(Pet, & niter = 0 fin_res = 0.0 - if(this_proc < 2) then - print '(a)', ' # This version was compiled without PETSc, ' // & - 'and yet they were specified in the control file.' - print '(a)', ' # This error is critical, exiting. Fix the control file.' - end if - - call Comm_Mod_End - stop + call Message % Error(60, & + 'This version was compiled without PETSc, and yet ' // & + 'they are specified in the control file. This error ' // & + 'is critical, exiting. Eithrt fix the control file ' // & + 'by setting LINEAR_SOLVERS to native, or install ' // & + 'PETSc on your system', & + file=__FILE__, line=__LINE__, one_proc=.true.) end subroutine diff --git a/Sources/Process/User_Mod/Initialize_Variables.f90 b/Sources/Process/User_Mod/Initialize_Variables.f90 index 74d1bf5ee..04bcfd307 100644 --- a/Sources/Process/User_Mod/Initialize_Variables.f90 +++ b/Sources/Process/User_Mod/Initialize_Variables.f90 @@ -20,18 +20,13 @@ subroutine User_Mod_Initialize_Variables(Flow, Turb, Vof, Swarm, Sol) ! Remove the following 12 lines in real Lagrangian tracking simulations if(Flow % with_interface .and. .not. Vof % init_stl) then - if(this_proc < 2) then - print '(a)','#======================================================' // & - '=======================================================' - print '(a)','# ERROR: You are running a Volume of Fluid simulation' // & - 'with the default version of Initialize_Variables.' - print '(a)','# You have probably forgotten to compile Process with ' // & - 'DIR_CASE= directive.' - print '(a)','#------------------------------------------------------' // & - '-------------------------------------------------------' - end if - call Comm_Mod_End - stop + call Message % Error(96, & + 'You are running a Volume of Fluid simulation with the ' // & + 'default version of Initialize_Variables, and you did ' // & + 'not provide an STL file for initialization. You might' // & + 'have forgotten to compile Process with ' // & + 'DIR_CASE= directive.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine From d20e402d73c28e00d24a2563ec84e8fb7676f245 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 19 Mar 2023 15:16:23 +0100 Subject: [PATCH 105/223] Uses Message_Mod for error messages. On branch bojan_fixed_cell_ranges modified: Backup_Mod/Load.f90 modified: Native_Mod/Solve_Native.f90 modified: Numerics_Mod/Advection_Scheme_Code.f90 modified: Numerics_Mod/Gradient_Method_Code.f90 modified: Petsc_Mod/Fake/Solve_Petsc.f90 modified: Solver_Mod/Linear_Solvers_Code.f90 modified: User_Mod/Initialize_Variables.f90 --- Sources/Process/Backup_Mod/Load.f90 | 9 +++------ Sources/Process/Native_Mod/Solve_Native.f90 | 10 ++++++---- .../Numerics_Mod/Advection_Scheme_Code.f90 | 13 ++++++------- .../Numerics_Mod/Gradient_Method_Code.f90 | 14 +++++++------- .../Process/Petsc_Mod/Fake/Solve_Petsc.f90 | 15 +++++++-------- .../Solver_Mod/Linear_Solvers_Code.f90 | 14 ++++++-------- .../Process/User_Mod/Initialize_Variables.f90 | 19 +++++++------------ 7 files changed, 42 insertions(+), 52 deletions(-) diff --git a/Sources/Process/Backup_Mod/Load.f90 b/Sources/Process/Backup_Mod/Load.f90 index 38f7b0139..9929c46f4 100644 --- a/Sources/Process/Backup_Mod/Load.f90 +++ b/Sources/Process/Backup_Mod/Load.f90 @@ -44,12 +44,9 @@ subroutine Backup_Mod_Load(Fld, Tur, Vof, Swr, time, time_step, backup) inquire(file=trim(name_in), exist=present ) if(.not.present) then - if(this_proc < 2) then - print *, "# ERROR! Backup file ", trim(name_in), " was not found." - print *, "# Exiting!" - end if - call Comm_Mod_End - stop + call Message % Error(80, & + 'Backup file '//trim(name_in)//' was not found. Exiting!', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if ! Open backup file diff --git a/Sources/Process/Native_Mod/Solve_Native.f90 b/Sources/Process/Native_Mod/Solve_Native.f90 index 4308a8c02..f5fefd7d8 100644 --- a/Sources/Process/Native_Mod/Solve_Native.f90 +++ b/Sources/Process/Native_Mod/Solve_Native.f90 @@ -28,10 +28,12 @@ subroutine Solve_Native(Nat, & else if(solver .eq. 'cg') then call Nat % Cg (A, x, b, prec, miter, niter, tol, fin_res, norm) else - print *, '# ERROR: Unknown native solver: ', solver - print *, '# This error is critical, stopping!' - call Comm_Mod_End - stop + call Message % Error(64, 'Unknown native solver: '//trim(solver) // & + '. This error is critical, exiting! ' // & + 'Check the file: Documents/all_control' // & + '_keywords to see which solvers are ' // & + 'available.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine diff --git a/Sources/Process/Numerics_Mod/Advection_Scheme_Code.f90 b/Sources/Process/Numerics_Mod/Advection_Scheme_Code.f90 index 6dbd92c95..4102072e2 100644 --- a/Sources/Process/Numerics_Mod/Advection_Scheme_Code.f90 +++ b/Sources/Process/Numerics_Mod/Advection_Scheme_Code.f90 @@ -36,13 +36,12 @@ integer function Numerics_Mod_Advection_Scheme_Code(name) Numerics_Mod_Advection_Scheme_Code = STACS case default - if(this_proc < 2) then - print *, '# ERROR! Unknown advection scheme: ', trim(name) - print *, '# Exiting!' - end if - call Comm_Mod_End - stop - + call Message % Error(64, 'Unknown advection scheme: '//trim(name) // & + '. This error is critical, exiting! ' // & + 'Check the file: Documents/all_control' // & + '_keywords to see which advection schemes ' // & + 'are currently available in the code.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end select end function diff --git a/Sources/Process/Numerics_Mod/Gradient_Method_Code.f90 b/Sources/Process/Numerics_Mod/Gradient_Method_Code.f90 index 26fba3f94..6119985ec 100644 --- a/Sources/Process/Numerics_Mod/Gradient_Method_Code.f90 +++ b/Sources/Process/Numerics_Mod/Gradient_Method_Code.f90 @@ -16,13 +16,13 @@ integer function Numerics_Mod_Gradient_Method_Code(name) Numerics_Mod_Gradient_Method_Code = GAUSS_THEOREM case default - if(this_proc < 2) then - print *, '# ERROR! Unknown gradient computation method: ', trim(name) - print *, '# Exiting!' - end if - call Comm_Mod_End - stop - + call Message % Error(80, 'Unknown gradient calculation method: ' // & + trim(name)//'. This error is critical, ' // & + ' exiting! Check the file: ' // & + 'Documents/all_control_keywords to see ' // & + 'which gradient computation methods are ' // & + 'currently available in the code.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end select end function diff --git a/Sources/Process/Petsc_Mod/Fake/Solve_Petsc.f90 b/Sources/Process/Petsc_Mod/Fake/Solve_Petsc.f90 index d250d4ae0..c1145069a 100644 --- a/Sources/Process/Petsc_Mod/Fake/Solve_Petsc.f90 +++ b/Sources/Process/Petsc_Mod/Fake/Solve_Petsc.f90 @@ -27,14 +27,13 @@ subroutine Solve_Petsc(Pet, & niter = 0 fin_res = 0.0 - if(this_proc < 2) then - print '(a)', ' # This version was compiled without PETSc, ' // & - 'and yet they were specified in the control file.' - print '(a)', ' # This error is critical, exiting. Fix the control file.' - end if - - call Comm_Mod_End - stop + call Message % Error(60, & + 'This version was compiled without PETSc, and yet ' // & + 'they are specified in the control file. This error ' // & + 'is critical, exiting. Eithrt fix the control file ' // & + 'by setting LINEAR_SOLVERS to native, or install ' // & + 'PETSc on your system', & + file=__FILE__, line=__LINE__, one_proc=.true.) end subroutine diff --git a/Sources/Process/Solver_Mod/Linear_Solvers_Code.f90 b/Sources/Process/Solver_Mod/Linear_Solvers_Code.f90 index 0a6ed2763..64c4c229c 100644 --- a/Sources/Process/Solver_Mod/Linear_Solvers_Code.f90 +++ b/Sources/Process/Solver_Mod/Linear_Solvers_Code.f90 @@ -15,14 +15,12 @@ integer function Solver_Mod_Linear_Solvers_Code(name) Solver_Mod_Linear_Solvers_Code = PETSC case default - if(this_proc < 2) then - print *, '# ERROR! Unknown linear solvers option: ', & - trim(name) - print *, '# Exiting!' - end if - call Comm_Mod_End - stop - + call Message % Error(80, 'Unknown linear solver option: '//trim(name)// & + '. This error is critical, exiting! ' // & + 'Check the file: Documents/all_control' // & + '_keywords to see which linear solvers are '// & + 'available. Probably just native and petsc.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end select end function diff --git a/Sources/Process/User_Mod/Initialize_Variables.f90 b/Sources/Process/User_Mod/Initialize_Variables.f90 index 74d1bf5ee..04bcfd307 100644 --- a/Sources/Process/User_Mod/Initialize_Variables.f90 +++ b/Sources/Process/User_Mod/Initialize_Variables.f90 @@ -20,18 +20,13 @@ subroutine User_Mod_Initialize_Variables(Flow, Turb, Vof, Swarm, Sol) ! Remove the following 12 lines in real Lagrangian tracking simulations if(Flow % with_interface .and. .not. Vof % init_stl) then - if(this_proc < 2) then - print '(a)','#======================================================' // & - '=======================================================' - print '(a)','# ERROR: You are running a Volume of Fluid simulation' // & - 'with the default version of Initialize_Variables.' - print '(a)','# You have probably forgotten to compile Process with ' // & - 'DIR_CASE= directive.' - print '(a)','#------------------------------------------------------' // & - '-------------------------------------------------------' - end if - call Comm_Mod_End - stop + call Message % Error(96, & + 'You are running a Volume of Fluid simulation with the ' // & + 'default version of Initialize_Variables, and you did ' // & + 'not provide an STL file for initialization. You might' // & + 'have forgotten to compile Process with ' // & + 'DIR_CASE= directive.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine From a23c275f58488a60974217a41070b6d5db1d1d2b Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 20 Mar 2023 08:08:45 +0100 Subject: [PATCH 106/223] Deleted unused local variables. On branch bojan_fixed_cell_ranges modified: Backup_Mod/Load.f90 modified: Backup_Mod/Save.f90 modified: Field_Mod/Gradients/Grad_Gauss_Variable.f90 modified: Results_Mod/Save_Results.f90 --- Sources/Process/Backup_Mod/Load.f90 | 4 ++-- Sources/Process/Backup_Mod/Save.f90 | 4 ++-- Sources/Process/Field_Mod/Gradients/Grad_Gauss_Variable.f90 | 2 +- Sources/Process/Results_Mod/Save_Results.f90 | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Sources/Process/Backup_Mod/Load.f90 b/Sources/Process/Backup_Mod/Load.f90 index 9929c46f4..6df3c41db 100644 --- a/Sources/Process/Backup_Mod/Load.f90 +++ b/Sources/Process/Backup_Mod/Load.f90 @@ -17,8 +17,8 @@ subroutine Backup_Mod_Load(Fld, Tur, Vof, Swr, time, time_step, backup) type(Grid_Type), pointer :: Grid type(Bulk_Type), pointer :: bulk type(Var_Type), pointer :: phi - character(SL) :: name_in, answer, name_mean, a_name - integer :: vc, sc, ua + character(SL) :: name_in, answer, name_mean + integer :: vc, sc integer(DP) :: d !==============================================================================! diff --git a/Sources/Process/Backup_Mod/Save.f90 b/Sources/Process/Backup_Mod/Save.f90 index 8d14ab23b..49135b40f 100644 --- a/Sources/Process/Backup_Mod/Save.f90 +++ b/Sources/Process/Backup_Mod/Save.f90 @@ -17,8 +17,8 @@ subroutine Backup_Mod_Save(Fld, Tur, Vof, Swr, time, time_step, domain) type(Grid_Type), pointer :: Grid type(Bulk_Type), pointer :: bulk type(Var_Type), pointer :: phi - character(SL) :: name_out, name_mean, a_name - integer :: vc, sc, ua + character(SL) :: name_out, name_mean + integer :: vc, sc integer(DP) :: d !==============================================================================! diff --git a/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Variable.f90 b/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Variable.f90 index 57e6321d2..7eba97e6f 100644 --- a/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Variable.f90 +++ b/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Variable.f90 @@ -15,7 +15,7 @@ subroutine Grad_Gauss_Variable(Flow, phi) type(Var_Type), target :: phi !----------------------------------[Locals]------------------------------------! type(Grid_Type), pointer :: Grid - integer :: s, c, c1, c2, iter + integer :: s, iter real :: res, norm real, contiguous, pointer :: phi_f_n(:), phi_f_o(:) !==============================================================================! diff --git a/Sources/Process/Results_Mod/Save_Results.f90 b/Sources/Process/Results_Mod/Save_Results.f90 index 38a15573b..37c77186c 100644 --- a/Sources/Process/Results_Mod/Save_Results.f90 +++ b/Sources/Process/Results_Mod/Save_Results.f90 @@ -23,7 +23,7 @@ subroutine Save_Results(Results, & integer :: s, n, n_conns, n_polyg, sc, f8, f9, ua, run integer :: s1, s2, c1, c2, c_f, c_l real :: dist1, dist2 - character(SL) :: name_out_8, name_out_9, name_mean, a_name + character(SL) :: name_out_8, name_out_9, name_mean character(SL) :: str1, str2 integer, pointer, contiguous :: int_save(:), type_save(:), offs_save(:) real, pointer, contiguous :: save_01(:), save_02(:), save_03(:) From 8c1af1ffa758600a09a276690036a6b163197430 Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 20 Mar 2023 08:45:22 +0100 Subject: [PATCH 107/223] Uses Message_Mod for error messages. On branch bojan_fixed_cell_ranges modified: Shared/Grid_Mod/Load_Cfn.f90 modified: Shared/Grid_Mod/Save_Cfn.f90 --- Sources/Shared/Grid_Mod/Load_Cfn.f90 | 94 ++++++++++++++++------------ Sources/Shared/Grid_Mod/Save_Cfn.f90 | 86 ++++++++++++++----------- 2 files changed, 102 insertions(+), 78 deletions(-) diff --git a/Sources/Shared/Grid_Mod/Load_Cfn.f90 b/Sources/Shared/Grid_Mod/Load_Cfn.f90 index b0914df6a..71f4fc839 100644 --- a/Sources/Shared/Grid_Mod/Load_Cfn.f90 +++ b/Sources/Shared/Grid_Mod/Load_Cfn.f90 @@ -10,7 +10,7 @@ subroutine Load_Cfn(Grid, this_proc, domain) integer, optional :: domain !-----------------------------------[Locals]-----------------------------------! integer :: c, c1, c2, s, n, ss, sr, fu, real_prec - character(SL) :: name_in + character(SL) :: name_in, str, str1, str2 !==============================================================================! !-------------------------------! @@ -97,10 +97,11 @@ subroutine Load_Cfn(Grid, this_proc, domain) do c = -Grid % n_bnd_cells, Grid % n_cells if(c .ne. 0) then if(Grid % cells_n_nodes(c) .eq. 0) then - print *, '# ERROR: Number of nodes is zero at cell:', c - print *, '# This error is critical. Exiting!' - call Comm_Mod_End - stop + write(str, '(i0.0)') c + call Message % Error(72, & + 'Number of nodes is zero at cell: '//trim(str)//'. '// & + 'This is critical. Exiting!', & + file=__FILE__, line=__LINE__) end if end if end do @@ -118,10 +119,11 @@ subroutine Load_Cfn(Grid, this_proc, domain) do c = -Grid % n_bnd_cells, Grid % n_cells do n = 1, abs(Grid % cells_n_nodes(c)) if(Grid % cells_n(n, c) .eq. 0) then - print *, '# ERROR: Node index is zero at cell:', c - print *, '# This error is critical. Exiting!' - call Comm_Mod_End - stop + write(str, '(i0.0)') c + call Message % Error(72, & + 'Node index is zero at cell: '//trim(str)//'. '// & + 'This error is critical. Exiting!', & + file=__FILE__, line=__LINE__) end if end do end do @@ -133,10 +135,11 @@ subroutine Load_Cfn(Grid, this_proc, domain) do c = -Grid % n_bnd_cells, Grid % n_cells if(c .ne. 0) then if(Grid % cells_n_faces(c) .eq. 0) then - print *, '# ERROR: Number of faces is zero at cell:', c - print *, '# This error is critical. Exiting!' - call Comm_Mod_End - stop + write(str, '(i0.0)') c + call Message % Error(72, & + 'Number of faces is zero at cell: '//trim(str)//'. '// & + 'This is critical. Exiting!', & + file=__FILE__, line=__LINE__) end if end if end do @@ -153,10 +156,11 @@ subroutine Load_Cfn(Grid, this_proc, domain) do c = -Grid % n_bnd_cells, Grid % n_cells do s = 1, Grid % cells_n_faces(c) if(Grid % cells_f(s, c) .eq. 0) then - print *, '# ERROR: Face index is zero at cell:', c - print *, '# This error is critical. Exiting!' - call Comm_Mod_End - stop + write(str, '(i0.0)') c + call Message % Error(72, & + 'Face index is zero at cell: '//trim(str)//'. '// & + 'This error is critical. Exiting!', & + file=__FILE__, line=__LINE__) end if end do end do @@ -177,10 +181,11 @@ subroutine Load_Cfn(Grid, this_proc, domain) ! Error trap for number of nodes for each face do s = 1, Grid % n_faces + Grid % n_shadows if(Grid % faces_n_nodes(s) .eq. 0) then - print *, '# ERROR: Number of nodes is zero at face:', s - print *, '# This error is critical. Exiting!' - call Comm_Mod_End - stop + write(str, '(i0.0)') s + call Message % Error(72, & + 'Number of nodes is zero at face: '//trim(str)//'. '// & + 'This is critical. Exiting!', & + file=__FILE__, line=__LINE__) end if end do @@ -196,10 +201,11 @@ subroutine Load_Cfn(Grid, this_proc, domain) do s = 1, Grid % n_faces + Grid % n_shadows do n = 1, Grid % faces_n_nodes(s) if(Grid % faces_n(n, s) .eq. 0) then - print *, '# ERROR: Node index is zero at face:', s - print *, '# This error is critical. Exiting!' - call Comm_Mod_End - stop + write(str, '(i0.0)') s + call Message % Error(72, & + 'Node index is zero at face: '//trim(str)//'. '// & + 'This error is critical. Exiting!', & + file=__FILE__, line=__LINE__) end if end do end do @@ -219,16 +225,22 @@ subroutine Load_Cfn(Grid, this_proc, domain) Grid % Comm % cell_proc(c2) .eq. this_proc) then if( .not. (c1.eq.0 .and. c2.eq.0) ) then if(Grid % faces_c(1, s) .eq. 0) then - print *, '# ERROR: Cell one is zero at face:', s, c1, c2 - print *, '# This error is critical. Exiting!' - call Comm_Mod_End - stop + write(str, '(i0.0)') s + write(str1, '(i0.0)') c1; write(str2, '(i0.0)') c2; + call Message % Error(72, & + 'Cell one is zero at face: '//trim(str)//' '// & + 'surrounded by cells '//trim(str1)//' and '//trim(str2) & + //'. \n This error is critical. Exiting!', & + file=__FILE__, line=__LINE__) end if if(Grid % faces_c(2, s) .eq. 0) then - print *, '# ERROR: Cell two is zero at face:', s - print *, '# This error is critical. Exiting!' - call Comm_Mod_End - stop + write(str, '(i0.0)') s + write(str1, '(i0.0)') c1; write(str2, '(i0.0)') c2; + call Message % Error(72, & + 'Cell two is zero at face: '//trim(str)//' '// & + 'surrounded by cells '//trim(str1)//' and '//trim(str2) & + //'. \n This error is critical. Exiting!', & + file=__FILE__, line=__LINE__) end if end if end if @@ -241,16 +253,16 @@ subroutine Load_Cfn(Grid, this_proc, domain) do ss = Grid % n_faces + 1, Grid % n_faces + Grid % n_shadows sr = Grid % faces_s(ss) ! real face from shadow data if(sr .eq. 0) then - print *, '# ERROR: Shadow faces points to zero face' - print *, '# This error is critical. Exiting!' - call Comm_Mod_End - stop + call Message % Error(72, & + 'Shadow face points to zero face. ' // & + 'This error is critical. Exiting!', & + file=__FILE__, line=__LINE__) end if if(Grid % faces_s(sr) .ne. ss) then - print *, '# ERROR: Real and shadow faces do not point to each other' - print *, '# This error is critical. Exiting!' - call Comm_Mod_End - stop + call Message % Error(60, & + 'Real and shadow face do not point to one another. ' // & + ' \n This error is critical. Exiting!', & + file=__FILE__, line=__LINE__) end if end do diff --git a/Sources/Shared/Grid_Mod/Save_Cfn.f90 b/Sources/Shared/Grid_Mod/Save_Cfn.f90 index 4680f69b3..2517256d8 100644 --- a/Sources/Shared/Grid_Mod/Save_Cfn.f90 +++ b/Sources/Shared/Grid_Mod/Save_Cfn.f90 @@ -16,7 +16,7 @@ subroutine Save_Cfn(Grid, & !-----------------------------------[Locals]-----------------------------------! integer :: c, n, i_nod, s, fu, c1, c2, ss, sr integer, allocatable :: faces_n(:) - character(SL) :: name_out + character(SL) :: name_out, str, str1, str2 !==============================================================================! call Profiler % Start('Save_Cfn') @@ -91,10 +91,11 @@ subroutine Save_Cfn(Grid, & if(Grid % old_c(c) .ne. 0 .or. c .eq. 0) then if(c .ne. 0) then if(Grid % cells_n_nodes(Grid % old_c(c)) .eq. 0) then - print *, '# ERROR: Number of nodes is zero at cell:', Grid % old_c(c) - print *, '# This error is critical. Exiting!' - call Comm_Mod_End - stop + write(str, '(i0.0)') Grid % old_c(c) + call Message % Error(72, & + 'Number of nodes is zero at cell: '//trim(str)//'. '// & + 'This is critical. Exiting!', & + file=__FILE__, line=__LINE__) end if end if end if @@ -114,10 +115,11 @@ subroutine Save_Cfn(Grid, & if(Grid % old_c(c) .ne. 0 .or. c .eq. 0) then do i_nod = 1, abs(Grid % cells_n_nodes(Grid % old_c(c))) if(Grid % new_n(Grid % cells_n(i_nod, Grid % old_c(c))) .eq. 0) then - print *, '# ERROR: Node index is zero at cell:', Grid % old_c(c) - print *, '# This error is critical. Exiting!' - call Comm_Mod_End - stop + write(str, '(i0.0)') Grid % old_c(c) + call Message % Error(72, & + 'Node index is zero at cell: '//trim(str)//'. '// & + 'This error is critical. Exiting!', & + file=__FILE__, line=__LINE__) end if end do end if @@ -135,10 +137,11 @@ subroutine Save_Cfn(Grid, & if(Grid % old_c(c) .ne. 0 .or. c .eq. 0) then if(c .ne. 0) then if(Grid % cells_n_faces(Grid % old_c(c)) .eq. 0) then - print *, '# ERROR: Number of faces is zero at cell:', Grid % old_c(c) - print *, '# This error is critical. Exiting!' - call Comm_Mod_End - stop + write(str, '(i0.0)') Grid % old_c(c) + call Message % Error(72, & + 'Number of faces is zero at cell: '//trim(str)//'. '// & + 'This is critical. Exiting!', & + file=__FILE__, line=__LINE__) end if end if end if @@ -158,10 +161,11 @@ subroutine Save_Cfn(Grid, & if(Grid % old_c(c) .ne. 0 .or. c .eq. 0) then do s = 1, Grid % cells_n_faces(Grid % old_c(c)) if(Grid % new_f(Grid % cells_f(s, Grid % old_c(c))) .eq. 0) then - print *, '# ERROR: Face index is zero at cell:', Grid % old_c(c) - print *, '# This error is critical. Exiting!' - call Comm_Mod_End - stop + write(str, '(i0.0)') Grid % old_c(c) + call Message % Error(72, & + 'Face index is zero at cell: '//trim(str)//'. '// & + 'This error is critical. Exiting!', & + file=__FILE__, line=__LINE__) end if end do end if @@ -196,10 +200,11 @@ subroutine Save_Cfn(Grid, & do s = 1, Grid % n_faces + Grid % n_shadows if(Grid % old_f(s) .ne. 0) then if(Grid % faces_n_nodes(Grid % old_f(s)) .eq. 0) then - print *, '# ERROR: Number of nodes is zero at face:', Grid % old_f(s) - print *, '# This error is critical. Exiting!' - call Comm_Mod_End - stop + write(str, '(i0.0)') Grid % old_f(s) + call Message % Error(72, & + 'Number of nodes is zero at face: '//trim(str)//'. '// & + 'This is critical. Exiting!', & + file=__FILE__, line=__LINE__) end if end if end do @@ -236,10 +241,11 @@ subroutine Save_Cfn(Grid, & if(Grid % old_f(s) .ne. 0) then do i_nod = 1, Grid % faces_n_nodes(Grid % old_f(s)) if(Grid % new_n(Grid % faces_n(i_nod, Grid % old_f(s))) .eq. 0) then - print *, '# ERROR: Node index is zero at face:', Grid % old_f(s) - print *, '# This error is critical. Exiting!' - call Comm_Mod_End - stop + write(str, '(i0.0)') Grid % old_f(s) + call Message % Error(72, & + 'Node index is zero at face: '//trim(str)//'. '// & + 'This error is critical. Exiting!', & + file=__FILE__, line=__LINE__) end if end do end if @@ -279,16 +285,22 @@ subroutine Save_Cfn(Grid, & if(Grid % Comm % cell_proc(c1) .eq. sub .or. & Grid % Comm % cell_proc(c2) .eq. sub) then if(Grid % new_c(c1) .eq. 0) then - print *, '# ERROR: Cell one is zero at face:', s - print *, '# This error is critical. Exiting!' - call Comm_Mod_End - stop + write(str, '(i0.0)') Grid % old_f(s) + write(str1, '(i0.0)') c1; write(str2, '(i0.0)') c2; + call Message % Error(72, & + 'Cell one is zero at face: '//trim(str)//' '// & + 'surrounded by cells '//trim(str1)//' and '//trim(str2) & + //'. \n This error is critical. Exiting!', & + file=__FILE__, line=__LINE__) end if if(Grid % new_c(c2) .eq. 0) then - print *, '# ERROR: Cell two is zero at face:', s - print *, '# This error is critical. Exiting!' - call Comm_Mod_End - stop + write(str, '(i0.0)') Grid % old_f(s) + write(str1, '(i0.0)') c1; write(str2, '(i0.0)') c2; + call Message % Error(72, & + 'Cell two is zero at face: '//trim(str)//' '// & + 'surrounded by cells '//trim(str1)//' and '//trim(str2) & + //'. \n This error is critical. Exiting!', & + file=__FILE__, line=__LINE__) end if end if end if @@ -314,10 +326,10 @@ subroutine Save_Cfn(Grid, & if(sr .ne. 0) then ! the saved face (sr) has a shadow (ss) write(fu) Grid % new_f(sr) else - print *, '# ERROR: Shadow faces points to zero face' - print *, '# This error is critical. Exiting!' - call Comm_Mod_End - stop + call Message % Error(72, & + 'Shadow face points to zero face. ' // & + 'This error is critical. Exiting!', & + file=__FILE__, line=__LINE__) end if end if end do From cba8069600e925d4a78396b04531a77f171f7fea Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 20 Mar 2023 19:40:55 +0100 Subject: [PATCH 108/223] A way to avoid too many warnings while compiling OK, so it is as follows. As a good object-oriented program design seeks, procedures should be link to the objects on whose data they operate on. Once this is implemented, the compilation issues too many warning, because each time a call like this is performed: call Object % Member_Procedure(arguments) Object is passed as the first argument to Member_Procedure. Yet, if the Object is not used, which is very often the case, the compiler throws a warning. Plenty of them. With this check in this is avoided by using the new macro called "Unused" which merely touches on arguments which are not used to avoid all the warnings explained above. User_Mod might need a special procedure, the above explained technique does not help the User_Mod much. On branch bojan_fixed_cell_ranges modified: Documentation/Template_Subroutine.f90 modified: Sources/Convert/Convert_Mod.f90 modified: Sources/Convert/Convert_Mod/Allocate_Memory.f90 modified: Sources/Convert/Convert_Mod/Calculate_Geometry.f90 modified: Sources/Convert/Convert_Mod/Find_Faces.f90 modified: Sources/Convert/Convert_Mod/Find_Parents.f90 modified: Sources/Convert/Convert_Mod/Grid_Topology.f90 modified: Sources/Convert/Convert_Mod/Guess_Format.f90 modified: Sources/Convert/Convert_Mod/Load_Fluent.f90 modified: Sources/Convert/Convert_Mod/Load_Forrest.f90 modified: Sources/Convert/Convert_Mod/Load_Gmsh.f90 modified: Sources/Convert/Convert_Mod/Load_Obj.f90 modified: Sources/Convert/Convert_Mod/Logo_Con.f90 modified: Sources/Convert/Convert_Mod/N_Bnd_Cells_In_Region.f90 modified: Sources/Convert/Convert_Mod/N_Edges_In_Region.f90 modified: Sources/Convert/Convert_Mod/N_Nodes_In_Region.f90 modified: Sources/Convert/Convert_Mod/N_Sharp_Corners.f90 modified: Sources/Convert/Convert_Mod/N_Sharp_Edges.f90 modified: Sources/Convert/Convert_Mod/Sort_Face_Nodes.f90 modified: Sources/Convert/Convert_Mod/Triangle_Area_Z.f90 modified: Sources/Convert/makefile modified: Sources/Convert/makefile_explicit_dependencies modified: Sources/Divide/Divide_Mod.f90 modified: Sources/Divide/Divide_Mod/Logo_Div.f90 modified: Sources/Divide/Divide_Mod/Save_Subdomains.f90 modified: Sources/Divide/makefile modified: Sources/Divide/makefile_explicit_dependencies modified: Sources/Generate/Generate_Mod.f90 modified: Sources/Generate/Generate_Mod/Calculate_Geometry.f90 modified: Sources/Generate/Generate_Mod/Load_Dom.f90 modified: Sources/Generate/Generate_Mod/Logo_Gen.f90 modified: Sources/Generate/Generate_Mod/Print_Generate_Statistics.f90 modified: Sources/Generate/makefile modified: Sources/Generate/makefile_explicit_dependencies modified: Sources/Process/Backup_Mod.f90 modified: Sources/Process/Field_Mod/Gradients/Grad_Gauss_Pressure.f90 modified: Sources/Process/Field_Mod/Utilities/Compute_Wall_Distance.f90 modified: Sources/Process/Front_Mod/Place_Front_At_Value.f90 modified: Sources/Process/Front_Mod/Save_Debug_Front_Vtu.f90 modified: Sources/Process/Main_Pro.f90 modified: Sources/Process/Native_Mod.f90 modified: Sources/Process/Native_Mod/Normalized_Root_Mean_Square.f90 modified: Sources/Process/Native_Mod/Prec_Form.f90 modified: Sources/Process/Native_Mod/Prec_Solve.f90 modified: Sources/Process/Native_Mod/Residual_Vector.f90 modified: Sources/Process/Native_Mod/Root_Mean_Square.f90 modified: Sources/Process/Petsc_Mod.f90 modified: Sources/Process/Petsc_Mod/Fake/Create_Petsc.f90 modified: Sources/Process/Petsc_Mod/Fake/Solve_Petsc.f90 modified: Sources/Process/Process_Mod.f90 modified: Sources/Process/Process_Mod/Balance_Volume.f90 modified: Sources/Process/Process_Mod/Compute_Energy.f90 modified: Sources/Process/Process_Mod/Compute_Momentum.f90 modified: Sources/Process/Process_Mod/Compute_Momentum_Explicit.f90 modified: Sources/Process/Process_Mod/Compute_Scalar.f90 modified: Sources/Process/Process_Mod/Convective_Outflow.f90 modified: Sources/Process/Process_Mod/Correct_Velocity.f90 modified: Sources/Process/Process_Mod/Initialize_Variables.f90 modified: Sources/Process/Process_Mod/Logo_Pro.f90 modified: Sources/Process/Process_Mod/Rhie_And_Chow.f90 modified: Sources/Process/Process_Mod/Update_Boundary_Values.f90 modified: Sources/Process/Read_Controls_Mod.f90 modified: Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 modified: Sources/Process/Read_Controls_Mod/Linear_Solvers.f90 modified: Sources/Process/Read_Controls_Mod/Native_Solvers.f90 modified: Sources/Process/Read_Controls_Mod/Numerical_Schemes.f90 modified: Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 modified: Sources/Process/Read_Controls_Mod/Physical_Models.f90 modified: Sources/Process/Read_Controls_Mod/Physical_Properties.f90 modified: Sources/Process/Results_Mod.f90 modified: Sources/Process/Results_Mod/Save_Front.f90 modified: Sources/Process/Results_Mod/Save_Results.f90 modified: Sources/Process/Results_Mod/Save_Scalar_Int.f90 modified: Sources/Process/Results_Mod/Save_Scalar_Real.f90 modified: Sources/Process/Results_Mod/Save_Surf.f90 modified: Sources/Process/Results_Mod/Save_Swarm.f90 modified: Sources/Process/Results_Mod/Save_Tensor_6_Real.f90 modified: Sources/Process/Results_Mod/Save_Tensor_9_Real.f90 modified: Sources/Process/Results_Mod/Save_Vector_Real.f90 modified: Sources/Process/Solver_Mod.f90 modified: Sources/Process/Solver_Mod/End.f90 modified: Sources/Process/Solver_Mod/Remove_Singular.f90 modified: Sources/Process/Swarm_Mod/Advance_Particles.f90 modified: Sources/Process/Swarm_Mod/Calculate_Mean.f90 modified: Sources/Process/Swarm_Mod/Grad_Modeled_Flow.f90 modified: Sources/Process/Swarm_Mod/Move_Particle.f90 modified: Sources/Process/Swarm_Mod/Move_Trapped.f90 modified: Sources/Process/Turb_Mod.f90 modified: Sources/Process/Turb_Mod/Calculate_Scalar_Flux.f90 modified: Sources/Process/Turb_Mod/Calculate_Stress.f90 modified: Sources/Process/Turb_Mod/Compute_F22.f90 modified: Sources/Process/Turb_Mod/Compute_Stress.f90 modified: Sources/Process/Turb_Mod/Const_Les.f90 modified: Sources/Process/Turb_Mod/Src_Eps_K_Eps.f90 modified: Sources/Process/Turb_Mod/Src_Eps_K_Eps_Zeta_F.f90 modified: Sources/Process/Turb_Mod/Tau_Wall_Log_Law.f90 modified: Sources/Process/Turb_Mod/U_Plus_Log_Law.f90 modified: Sources/Process/Turb_Mod/Vis_T_Hybrid_Les_Prandtl.f90 modified: Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 modified: Sources/Process/Turb_Mod/Y_Plus_Rough_Walls.f90 modified: Sources/Process/Vof_Mod.f90 modified: Sources/Process/Vof_Mod/Core/Initialize_From_Stl.f90 modified: Sources/Process/Vof_Mod/Curvature/Smooth_Scalar.f90 modified: Sources/Process/makefile modified: Sources/Process/makefile_explicit_dependencies modified: Sources/Shared/Browse.h90 modified: Sources/Shared/Comm_Mod.f90 modified: Sources/Shared/Comm_Mod/Parallel/Exchange_Int_Array.f90 modified: Sources/Shared/Comm_Mod/Parallel/Exchange_Log_Array.f90 modified: Sources/Shared/Comm_Mod/Parallel/Exchange_Real_Array.f90 modified: Sources/Shared/Comm_Mod/Parallel/Read_Int.f90 modified: Sources/Shared/Comm_Mod/Parallel/Read_Int_Array.f90 modified: Sources/Shared/Comm_Mod/Parallel/Read_Log.f90 modified: Sources/Shared/Comm_Mod/Parallel/Read_Log_Array.f90 modified: Sources/Shared/Comm_Mod/Parallel/Read_Real.f90 modified: Sources/Shared/Comm_Mod/Parallel/Read_Real_Array.f90 modified: Sources/Shared/Comm_Mod/Parallel/Read_Text.f90 modified: Sources/Shared/Comm_Mod/Parallel/Send_Int_Array.f90 modified: Sources/Shared/Comm_Mod/Parallel/Send_Log_Array.f90 modified: Sources/Shared/Comm_Mod/Parallel/Send_Real_Array.f90 modified: Sources/Shared/Comm_Mod/Parallel/Sendrecv_Int_Arrays.f90 modified: Sources/Shared/Comm_Mod/Parallel/Sendrecv_Log_Arrays.f90 modified: Sources/Shared/Comm_Mod/Parallel/Sendrecv_Real_Arrays.f90 modified: Sources/Shared/Comm_Mod/Parallel/Write_Int.f90 modified: Sources/Shared/Comm_Mod/Parallel/Write_Int_Array.f90 modified: Sources/Shared/Comm_Mod/Parallel/Write_Log.f90 modified: Sources/Shared/Comm_Mod/Parallel/Write_Log_Array.f90 modified: Sources/Shared/Comm_Mod/Parallel/Write_Real.f90 modified: Sources/Shared/Comm_Mod/Parallel/Write_Real_Array.f90 modified: Sources/Shared/Comm_Mod/Parallel/Write_Text.f90 modified: Sources/Shared/Comm_Mod/Sequential/Close_File.f90 modified: Sources/Shared/Comm_Mod/Sequential/Create_New_Types.f90 modified: Sources/Shared/Comm_Mod/Sequential/Exchange_Int_Array.f90 modified: Sources/Shared/Comm_Mod/Sequential/Exchange_Log_Array.f90 modified: Sources/Shared/Comm_Mod/Sequential/Exchange_Real_Array.f90 modified: Sources/Shared/Comm_Mod/Sequential/Global_Lor_Log.f90 modified: Sources/Shared/Comm_Mod/Sequential/Global_Lor_Log_Array.f90 modified: Sources/Shared/Comm_Mod/Sequential/Global_Max_Int.f90 modified: Sources/Shared/Comm_Mod/Sequential/Global_Max_Real.f90 modified: Sources/Shared/Comm_Mod/Sequential/Global_Min_Int.f90 modified: Sources/Shared/Comm_Mod/Sequential/Global_Min_Real.f90 modified: Sources/Shared/Comm_Mod/Sequential/Global_Sum_Int.f90 modified: Sources/Shared/Comm_Mod/Sequential/Global_Sum_Int_Array.f90 modified: Sources/Shared/Comm_Mod/Sequential/Global_Sum_Real.f90 modified: Sources/Shared/Comm_Mod/Sequential/Global_Sum_Real_Array.f90 modified: Sources/Shared/Comm_Mod/Sequential/Open_File_Read.f90 modified: Sources/Shared/Comm_Mod/Sequential/Open_File_Write.f90 modified: Sources/Shared/Comm_Mod/Sequential/Read_Int.f90 modified: Sources/Shared/Comm_Mod/Sequential/Read_Int_Array.f90 modified: Sources/Shared/Comm_Mod/Sequential/Read_Log.f90 modified: Sources/Shared/Comm_Mod/Sequential/Read_Log_Array.f90 modified: Sources/Shared/Comm_Mod/Sequential/Read_Real.f90 modified: Sources/Shared/Comm_Mod/Sequential/Read_Real_Array.f90 modified: Sources/Shared/Comm_Mod/Sequential/Read_Text.f90 modified: Sources/Shared/Comm_Mod/Sequential/Recv_Int_Array.f90 modified: Sources/Shared/Comm_Mod/Sequential/Recv_Log_Array.f90 modified: Sources/Shared/Comm_Mod/Sequential/Recv_Real_Array.f90 modified: Sources/Shared/Comm_Mod/Sequential/Send_Int_Array.f90 modified: Sources/Shared/Comm_Mod/Sequential/Send_Log_Array.f90 modified: Sources/Shared/Comm_Mod/Sequential/Send_Real_Array.f90 modified: Sources/Shared/Comm_Mod/Sequential/Sendrecv_Int_Arrays.f90 modified: Sources/Shared/Comm_Mod/Sequential/Sendrecv_Log_Arrays.f90 modified: Sources/Shared/Comm_Mod/Sequential/Sendrecv_Real_Arrays.f90 modified: Sources/Shared/Comm_Mod/Sequential/Wait.f90 modified: Sources/Shared/Comm_Mod/Sequential/Write_Int.f90 modified: Sources/Shared/Comm_Mod/Sequential/Write_Int_Array.f90 modified: Sources/Shared/Comm_Mod/Sequential/Write_Log.f90 modified: Sources/Shared/Comm_Mod/Sequential/Write_Log_Array.f90 modified: Sources/Shared/Comm_Mod/Sequential/Write_Real.f90 modified: Sources/Shared/Comm_Mod/Sequential/Write_Real_Array.f90 modified: Sources/Shared/Comm_Mod/Sequential/Write_Text.f90 modified: Sources/Shared/Control_Mod.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Similar_Warning.f90 modified: Sources/Shared/Control_Mod/Linear_Solvers.f90 modified: Sources/Shared/Control_Mod/Max_Threads.f90 modified: Sources/Shared/Control_Mod/Numerics/Pressure_Momentum_Coupling.f90 modified: Sources/Shared/File_Mod.f90 modified: Sources/Shared/File_Mod/Append_For_Writing_Ascii.f90 modified: Sources/Shared/File_Mod/Delete.f90 modified: Sources/Shared/File_Mod/Is_In_Unix_Format.f90 modified: Sources/Shared/File_Mod/Line_Length.f90 modified: Sources/Shared/File_Mod/Open_For_Reading_Ascii.f90 modified: Sources/Shared/File_Mod/Open_For_Reading_Binary.f90 modified: Sources/Shared/File_Mod/Open_For_Writing_Ascii.f90 modified: Sources/Shared/File_Mod/Open_For_Writing_Binary.f90 modified: Sources/Shared/File_Mod/Read_Binary_Int4_Array.f90 modified: Sources/Shared/File_Mod/Read_Binary_Int8_Array.f90 modified: Sources/Shared/File_Mod/Read_Binary_Real4_Array.f90 modified: Sources/Shared/File_Mod/Read_Binary_Real8_Array.f90 modified: Sources/Shared/File_Mod/Read_Line.f90 modified: Sources/Shared/File_Mod/Set_Name.f90 modified: Sources/Shared/Grid_Mod/Allocate_Regions.f90 modified: Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 modified: Sources/Shared/Grid_Mod/Calculate_Face_Surfaces.f90 modified: Sources/Shared/Grid_Mod/Determine_Threads.f90 modified: Sources/Shared/Grid_Mod/Sort_Cells_By_Thread.f90 modified: Sources/Shared/Isoap_Mod.f90 deleted: Sources/Shared/Isoap_Mod/Dim_Polyhedron.h modified: Sources/Shared/Isoap_Mod/Extract_Iso_Polygons.f90 modified: Sources/Shared/Isoap_Mod/Isopol.f90 modified: Sources/Shared/Isoap_Mod/Main_Isoap.f90 modified: Sources/Shared/Math_Mod.f90 modified: Sources/Shared/Math_Mod/Approx_Real.f90 modified: Sources/Shared/Math_Mod/Approx_String.f90 modified: Sources/Shared/Math_Mod/Cross_Product.f90 modified: Sources/Shared/Math_Mod/Distance.f90 modified: Sources/Shared/Math_Mod/Distance_Squared.f90 modified: Sources/Shared/Math_Mod/Fit_Exp_Three_Points.f90 modified: Sources/Shared/Math_Mod/Gaussian_Elimination.f90 modified: Sources/Shared/Math_Mod/Harmonic_Mean.f90 modified: Sources/Shared/Math_Mod/Invert_3x3_Matrix.f90 modified: Sources/Shared/Math_Mod/Rotate_Vector.f90 modified: Sources/Shared/Math_Mod/Set_Array_Range.f90 modified: Sources/Shared/Math_Mod/Signed_Lower_Limit.f90 modified: Sources/Shared/Math_Mod/Signed_Upper_Limit.f90 modified: Sources/Shared/Math_Mod/Smaller_Real.f90 modified: Sources/Shared/Math_Mod/Tet_Volume.f90 modified: Sources/Shared/Message_Mod.f90 modified: Sources/Shared/Message_Mod/Dashed_Line.f90 modified: Sources/Shared/Message_Mod/Error.f90 modified: Sources/Shared/Message_Mod/Frameless.f90 modified: Sources/Shared/Message_Mod/Thick_Line.f90 modified: Sources/Shared/Message_Mod/Thin_Line.f90 modified: Sources/Shared/Message_Mod/Warning.f90 modified: Sources/Shared/Polyhedron_Mod.f90 modified: Sources/Shared/Polyhedron_Mod/Create_Sdodecahedron.f90 modified: Sources/Shared/Polyhedron_Mod/Create_Sicosahedron.f90 modified: Sources/Shared/Polyhedron_Mod/Extract_From_Grid.f90 modified: Sources/Shared/Polyhedron_Mod/Func_1.f90 modified: Sources/Shared/Polyhedron_Mod/Func_2.f90 modified: Sources/Shared/Polyhedron_Mod/Func_3.f90 modified: Sources/Shared/Sort_Mod.f90 modified: Sources/Shared/Sort_Mod/Int_By_Index.f90 modified: Sources/Shared/Sort_Mod/Real_By_Index.f90 modified: Sources/Shared/Sort_Mod/Reverse_Order_Int.f90 modified: Sources/Shared/Sort_Mod/Reverse_Order_Real.f90 modified: Sources/Shared/Sort_Mod/Unique_Int.f90 modified: Sources/Shared/Stl_Mod/Read_Stl_Ascii.f90 modified: Sources/Shared/String_Mod.f90 modified: Sources/Shared/String_Mod/First_Upper.f90 modified: Sources/Shared/String_Mod/To_Lower_Case.f90 modified: Sources/Shared/String_Mod/To_Upper_Case.f90 new file: Sources/Shared/Unused.h90 modified: Sources/Shared/Vect_Mod.f90 modified: Sources/Shared/Vect_Mod/Get_Max_Threads.f90 modified: Sources/Shared/Vect_Mod/Set_Num_Threads.f90 modified: Sources/Utilities/Check_Isoap.f90 --- Documentation/Template_Subroutine.f90 | 1 + Sources/Convert/Convert_Mod.f90 | 1 + .../Convert/Convert_Mod/Allocate_Memory.f90 | 2 + .../Convert_Mod/Calculate_Geometry.f90 | 37 +- Sources/Convert/Convert_Mod/Find_Faces.f90 | 2 + Sources/Convert/Convert_Mod/Find_Parents.f90 | 2 + Sources/Convert/Convert_Mod/Grid_Topology.f90 | 2 + Sources/Convert/Convert_Mod/Guess_Format.f90 | 2 + Sources/Convert/Convert_Mod/Load_Fluent.f90 | 1 + Sources/Convert/Convert_Mod/Load_Forrest.f90 | 6 +- Sources/Convert/Convert_Mod/Load_Gmsh.f90 | 46 +- Sources/Convert/Convert_Mod/Load_Obj.f90 | 12 +- Sources/Convert/Convert_Mod/Logo_Con.f90 | 2 + .../Convert_Mod/N_Bnd_Cells_In_Region.f90 | 2 + .../Convert/Convert_Mod/N_Edges_In_Region.f90 | 2 + .../Convert/Convert_Mod/N_Nodes_In_Region.f90 | 2 + .../Convert/Convert_Mod/N_Sharp_Corners.f90 | 2 + Sources/Convert/Convert_Mod/N_Sharp_Edges.f90 | 2 + .../Convert/Convert_Mod/Sort_Face_Nodes.f90 | 2 + .../Convert/Convert_Mod/Triangle_Area_Z.f90 | 13 +- Sources/Convert/makefile | 20 +- .../Convert/makefile_explicit_dependencies | 290 ++++---- Sources/Divide/Divide_Mod.f90 | 1 + Sources/Divide/Divide_Mod/Logo_Div.f90 | 2 + Sources/Divide/Divide_Mod/Save_Subdomains.f90 | 3 + Sources/Divide/makefile | 20 +- Sources/Divide/makefile_explicit_dependencies | 280 +++---- Sources/Generate/Generate_Mod.f90 | 2 + .../Generate_Mod/Calculate_Geometry.f90 | 26 +- Sources/Generate/Generate_Mod/Load_Dom.f90 | 2 + Sources/Generate/Generate_Mod/Logo_Gen.f90 | 2 + .../Print_Generate_Statistics.f90 | 2 + Sources/Generate/makefile | 20 +- .../Generate/makefile_explicit_dependencies | 312 ++++---- Sources/Process/Backup_Mod.f90 | 8 +- .../Gradients/Grad_Gauss_Pressure.f90 | 1 - .../Utilities/Compute_Wall_Distance.f90 | 1 - .../Front_Mod/Place_Front_At_Value.f90 | 1 - .../Front_Mod/Save_Debug_Front_Vtu.f90 | 1 - Sources/Process/Main_Pro.f90 | 2 +- Sources/Process/Native_Mod.f90 | 2 + .../Normalized_Root_Mean_Square.f90 | 6 +- Sources/Process/Native_Mod/Prec_Form.f90 | 6 +- Sources/Process/Native_Mod/Prec_Solve.f90 | 6 +- .../Process/Native_Mod/Residual_Vector.f90 | 6 +- .../Process/Native_Mod/Root_Mean_Square.f90 | 6 +- Sources/Process/Petsc_Mod.f90 | 2 + .../Process/Petsc_Mod/Fake/Create_Petsc.f90 | 2 + .../Process/Petsc_Mod/Fake/Solve_Petsc.f90 | 13 + Sources/Process/Process_Mod.f90 | 1 + .../Process/Process_Mod/Balance_Volume.f90 | 2 + .../Process/Process_Mod/Compute_Energy.f90 | 2 + .../Process/Process_Mod/Compute_Momentum.f90 | 2 + .../Process_Mod/Compute_Momentum_Explicit.f90 | 2 + .../Process/Process_Mod/Compute_Scalar.f90 | 2 + .../Process_Mod/Convective_Outflow.f90 | 2 + .../Process/Process_Mod/Correct_Velocity.f90 | 2 + .../Process_Mod/Initialize_Variables.f90 | 2 + Sources/Process/Process_Mod/Logo_Pro.f90 | 2 + Sources/Process/Process_Mod/Rhie_And_Chow.f90 | 2 + .../Process_Mod/Update_Boundary_Values.f90 | 2 + Sources/Process/Read_Controls_Mod.f90 | 2 + .../Read_Controls_Mod/Boundary_Conditions.f90 | 2 + .../Read_Controls_Mod/Linear_Solvers.f90 | 2 +- .../Read_Controls_Mod/Native_Solvers.f90 | 5 +- .../Read_Controls_Mod/Numerical_Schemes.f90 | 5 +- .../Read_Controls_Mod/Petsc_Solvers.f90 | 2 + .../Read_Controls_Mod/Physical_Models.f90 | 2 + .../Read_Controls_Mod/Physical_Properties.f90 | 2 + Sources/Process/Results_Mod.f90 | 1 + Sources/Process/Results_Mod/Save_Front.f90 | 2 + Sources/Process/Results_Mod/Save_Results.f90 | 2 +- .../Process/Results_Mod/Save_Scalar_Int.f90 | 2 + .../Process/Results_Mod/Save_Scalar_Real.f90 | 2 + Sources/Process/Results_Mod/Save_Surf.f90 | 2 + Sources/Process/Results_Mod/Save_Swarm.f90 | 2 + .../Results_Mod/Save_Tensor_6_Real.f90 | 2 + .../Results_Mod/Save_Tensor_9_Real.f90 | 2 + .../Process/Results_Mod/Save_Vector_Real.f90 | 2 + Sources/Process/Solver_Mod.f90 | 2 + Sources/Process/Solver_Mod/End.f90 | 2 + .../Process/Solver_Mod/Remove_Singular.f90 | 2 + .../Process/Swarm_Mod/Advance_Particles.f90 | 4 +- Sources/Process/Swarm_Mod/Calculate_Mean.f90 | 3 +- .../Process/Swarm_Mod/Grad_Modeled_Flow.f90 | 3 +- Sources/Process/Swarm_Mod/Move_Particle.f90 | 2 +- Sources/Process/Swarm_Mod/Move_Trapped.f90 | 5 +- Sources/Process/Turb_Mod.f90 | 2 + .../Turb_Mod/Calculate_Scalar_Flux.f90 | 1 - Sources/Process/Turb_Mod/Calculate_Stress.f90 | 6 - Sources/Process/Turb_Mod/Compute_F22.f90 | 6 +- Sources/Process/Turb_Mod/Compute_Stress.f90 | 6 +- Sources/Process/Turb_Mod/Const_Les.f90 | 2 + Sources/Process/Turb_Mod/Src_Eps_K_Eps.f90 | 6 +- .../Process/Turb_Mod/Src_Eps_K_Eps_Zeta_F.f90 | 6 +- Sources/Process/Turb_Mod/Tau_Wall_Log_Law.f90 | 2 + Sources/Process/Turb_Mod/U_Plus_Log_Law.f90 | 2 + .../Turb_Mod/Vis_T_Hybrid_Les_Prandtl.f90 | 4 +- Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 | 4 +- .../Process/Turb_Mod/Y_Plus_Rough_Walls.f90 | 2 + Sources/Process/Vof_Mod.f90 | 1 + .../Vof_Mod/Core/Initialize_From_Stl.f90 | 4 +- .../Vof_Mod/Curvature/Smooth_Scalar.f90 | 2 + Sources/Process/makefile | 20 +- .../Process/makefile_explicit_dependencies | 694 +++++++++--------- Sources/Shared/Browse.h90 | 2 +- Sources/Shared/Comm_Mod.f90 | 2 + .../Comm_Mod/Parallel/Exchange_Int_Array.f90 | 2 + .../Comm_Mod/Parallel/Exchange_Log_Array.f90 | 2 + .../Comm_Mod/Parallel/Exchange_Real_Array.f90 | 2 + Sources/Shared/Comm_Mod/Parallel/Read_Int.f90 | 2 + .../Comm_Mod/Parallel/Read_Int_Array.f90 | 2 + Sources/Shared/Comm_Mod/Parallel/Read_Log.f90 | 2 + .../Comm_Mod/Parallel/Read_Log_Array.f90 | 2 + .../Shared/Comm_Mod/Parallel/Read_Real.f90 | 2 + .../Comm_Mod/Parallel/Read_Real_Array.f90 | 2 + .../Shared/Comm_Mod/Parallel/Read_Text.f90 | 2 + .../Comm_Mod/Parallel/Send_Int_Array.f90 | 2 + .../Comm_Mod/Parallel/Send_Log_Array.f90 | 2 + .../Comm_Mod/Parallel/Send_Real_Array.f90 | 2 + .../Comm_Mod/Parallel/Sendrecv_Int_Arrays.f90 | 2 + .../Comm_Mod/Parallel/Sendrecv_Log_Arrays.f90 | 2 + .../Parallel/Sendrecv_Real_Arrays.f90 | 2 + .../Shared/Comm_Mod/Parallel/Write_Int.f90 | 2 + .../Comm_Mod/Parallel/Write_Int_Array.f90 | 2 + .../Shared/Comm_Mod/Parallel/Write_Log.f90 | 2 + .../Comm_Mod/Parallel/Write_Log_Array.f90 | 2 + .../Shared/Comm_Mod/Parallel/Write_Real.f90 | 2 + .../Comm_Mod/Parallel/Write_Real_Array.f90 | 2 + .../Shared/Comm_Mod/Parallel/Write_Text.f90 | 2 + .../Shared/Comm_Mod/Sequential/Close_File.f90 | 2 + .../Comm_Mod/Sequential/Create_New_Types.f90 | 2 + .../Sequential/Exchange_Int_Array.f90 | 5 + .../Sequential/Exchange_Log_Array.f90 | 5 + .../Sequential/Exchange_Real_Array.f90 | 5 + .../Comm_Mod/Sequential/Global_Lor_Log.f90 | 2 + .../Sequential/Global_Lor_Log_Array.f90 | 3 + .../Comm_Mod/Sequential/Global_Max_Int.f90 | 2 + .../Comm_Mod/Sequential/Global_Max_Real.f90 | 4 +- .../Comm_Mod/Sequential/Global_Min_Int.f90 | 2 + .../Comm_Mod/Sequential/Global_Min_Real.f90 | 4 +- .../Comm_Mod/Sequential/Global_Sum_Int.f90 | 2 + .../Sequential/Global_Sum_Int_Array.f90 | 3 + .../Comm_Mod/Sequential/Global_Sum_Real.f90 | 2 + .../Sequential/Global_Sum_Real_Array.f90 | 3 + .../Comm_Mod/Sequential/Open_File_Read.f90 | 2 + .../Comm_Mod/Sequential/Open_File_Write.f90 | 2 + .../Shared/Comm_Mod/Sequential/Read_Int.f90 | 2 + .../Comm_Mod/Sequential/Read_Int_Array.f90 | 2 + .../Shared/Comm_Mod/Sequential/Read_Log.f90 | 2 + .../Comm_Mod/Sequential/Read_Log_Array.f90 | 2 + .../Shared/Comm_Mod/Sequential/Read_Real.f90 | 2 + .../Comm_Mod/Sequential/Read_Real_Array.f90 | 2 + .../Shared/Comm_Mod/Sequential/Read_Text.f90 | 2 + .../Comm_Mod/Sequential/Recv_Int_Array.f90 | 5 + .../Comm_Mod/Sequential/Recv_Log_Array.f90 | 5 + .../Comm_Mod/Sequential/Recv_Real_Array.f90 | 5 + .../Comm_Mod/Sequential/Send_Int_Array.f90 | 5 + .../Comm_Mod/Sequential/Send_Log_Array.f90 | 5 + .../Comm_Mod/Sequential/Send_Real_Array.f90 | 5 + .../Sequential/Sendrecv_Int_Arrays.f90 | 7 + .../Sequential/Sendrecv_Log_Arrays.f90 | 7 + .../Sequential/Sendrecv_Real_Arrays.f90 | 7 + Sources/Shared/Comm_Mod/Sequential/Wait.f90 | 2 +- .../Shared/Comm_Mod/Sequential/Write_Int.f90 | 2 + .../Comm_Mod/Sequential/Write_Int_Array.f90 | 2 + .../Shared/Comm_Mod/Sequential/Write_Log.f90 | 2 + .../Comm_Mod/Sequential/Write_Log_Array.f90 | 2 + .../Shared/Comm_Mod/Sequential/Write_Real.f90 | 2 + .../Comm_Mod/Sequential/Write_Real_Array.f90 | 2 + .../Shared/Comm_Mod/Sequential/Write_Text.f90 | 2 + Sources/Shared/Control_Mod.f90 | 3 + .../Basic_Functions/Similar_Warning.f90 | 3 +- Sources/Shared/Control_Mod/Linear_Solvers.f90 | 2 +- Sources/Shared/Control_Mod/Max_Threads.f90 | 1 + .../Numerics/Pressure_Momentum_Coupling.f90 | 2 +- Sources/Shared/File_Mod.f90 | 2 + .../File_Mod/Append_For_Writing_Ascii.f90 | 2 + Sources/Shared/File_Mod/Delete.f90 | 2 + Sources/Shared/File_Mod/Is_In_Unix_Format.f90 | 4 +- Sources/Shared/File_Mod/Line_Length.f90 | 2 + .../File_Mod/Open_For_Reading_Ascii.f90 | 2 + .../File_Mod/Open_For_Reading_Binary.f90 | 2 + .../File_Mod/Open_For_Writing_Ascii.f90 | 2 + .../File_Mod/Open_For_Writing_Binary.f90 | 2 + .../File_Mod/Read_Binary_Int4_Array.f90 | 2 + .../File_Mod/Read_Binary_Int8_Array.f90 | 2 + .../File_Mod/Read_Binary_Real4_Array.f90 | 2 + .../File_Mod/Read_Binary_Real8_Array.f90 | 2 + Sources/Shared/File_Mod/Read_Line.f90 | 8 +- Sources/Shared/File_Mod/Set_Name.f90 | 2 + Sources/Shared/Grid_Mod/Allocate_Regions.f90 | 2 - .../Grid_Mod/Calculate_Face_Geometry.f90 | 6 +- .../Grid_Mod/Calculate_Face_Surfaces.f90 | 1 - Sources/Shared/Grid_Mod/Determine_Threads.f90 | 4 +- .../Shared/Grid_Mod/Sort_Cells_By_Thread.f90 | 1 - Sources/Shared/Isoap_Mod.f90 | 3 + Sources/Shared/Isoap_Mod/Dim_Polyhedron.h | 1 - .../Shared/Isoap_Mod/Extract_Iso_Polygons.f90 | 3 - Sources/Shared/Isoap_Mod/Isopol.f90 | 4 +- Sources/Shared/Isoap_Mod/Main_Isoap.f90 | 2 - Sources/Shared/Math_Mod.f90 | 2 + Sources/Shared/Math_Mod/Approx_Real.f90 | 2 + Sources/Shared/Math_Mod/Approx_String.f90 | 2 + Sources/Shared/Math_Mod/Cross_Product.f90 | 2 + Sources/Shared/Math_Mod/Distance.f90 | 14 +- Sources/Shared/Math_Mod/Distance_Squared.f90 | 14 +- .../Shared/Math_Mod/Fit_Exp_Three_Points.f90 | 2 + .../Shared/Math_Mod/Gaussian_Elimination.f90 | 2 + Sources/Shared/Math_Mod/Harmonic_Mean.f90 | 2 + Sources/Shared/Math_Mod/Invert_3x3_Matrix.f90 | 2 + Sources/Shared/Math_Mod/Rotate_Vector.f90 | 2 + Sources/Shared/Math_Mod/Set_Array_Range.f90 | 2 + .../Shared/Math_Mod/Signed_Lower_Limit.f90 | 2 + .../Shared/Math_Mod/Signed_Upper_Limit.f90 | 2 + Sources/Shared/Math_Mod/Smaller_Real.f90 | 2 + Sources/Shared/Math_Mod/Tet_Volume.f90 | 14 +- Sources/Shared/Message_Mod.f90 | 1 + Sources/Shared/Message_Mod/Dashed_Line.f90 | 2 + Sources/Shared/Message_Mod/Error.f90 | 5 +- Sources/Shared/Message_Mod/Frameless.f90 | 2 + Sources/Shared/Message_Mod/Thick_Line.f90 | 2 + Sources/Shared/Message_Mod/Thin_Line.f90 | 2 + Sources/Shared/Message_Mod/Warning.f90 | 5 +- Sources/Shared/Polyhedron_Mod.f90 | 1 + .../Polyhedron_Mod/Create_Sdodecahedron.f90 | 2 +- .../Polyhedron_Mod/Create_Sicosahedron.f90 | 2 +- .../Polyhedron_Mod/Extract_From_Grid.f90 | 2 +- Sources/Shared/Polyhedron_Mod/Func_1.f90 | 2 + Sources/Shared/Polyhedron_Mod/Func_2.f90 | 2 + Sources/Shared/Polyhedron_Mod/Func_3.f90 | 2 + Sources/Shared/Sort_Mod.f90 | 2 + Sources/Shared/Sort_Mod/Int_By_Index.f90 | 2 + Sources/Shared/Sort_Mod/Real_By_Index.f90 | 2 + Sources/Shared/Sort_Mod/Reverse_Order_Int.f90 | 2 + .../Shared/Sort_Mod/Reverse_Order_Real.f90 | 2 + Sources/Shared/Sort_Mod/Unique_Int.f90 | 2 + Sources/Shared/Stl_Mod/Read_Stl_Ascii.f90 | 2 +- Sources/Shared/String_Mod.f90 | 2 + Sources/Shared/String_Mod/First_Upper.f90 | 2 + Sources/Shared/String_Mod/To_Lower_Case.f90 | 2 + Sources/Shared/String_Mod/To_Upper_Case.f90 | 2 + Sources/Shared/Unused.h90 | 9 + Sources/Shared/Vect_Mod.f90 | 2 + Sources/Shared/Vect_Mod/Get_Max_Threads.f90 | 2 + Sources/Shared/Vect_Mod/Set_Num_Threads.f90 | 4 + Sources/Utilities/Check_Isoap.f90 | 2 - 247 files changed, 1432 insertions(+), 1009 deletions(-) delete mode 100644 Sources/Shared/Isoap_Mod/Dim_Polyhedron.h create mode 100644 Sources/Shared/Unused.h90 diff --git a/Documentation/Template_Subroutine.f90 b/Documentation/Template_Subroutine.f90 index d8ca657b2..78d8cdce5 100644 --- a/Documentation/Template_Subroutine.f90 +++ b/Documentation/Template_Subroutine.f90 @@ -38,6 +38,7 @@ subroutine Template_Subroutine() integer :: i, j, k character(len=SL) :: name_in real, dimension(5,5) :: small_matrix +!------------------------[Avoid unused parent warning]-------------------------! !==============================================================================! !----------------------------------------------! diff --git a/Sources/Convert/Convert_Mod.f90 b/Sources/Convert/Convert_Mod.f90 index 86c4522d7..de1c501bf 100644 --- a/Sources/Convert/Convert_Mod.f90 +++ b/Sources/Convert/Convert_Mod.f90 @@ -1,5 +1,6 @@ #include "../Shared/Assert.h90" #include "../Shared/Browse.h90" +#include "../Shared/Unused.h90" !==============================================================================! module Convert_Mod diff --git a/Sources/Convert/Convert_Mod/Allocate_Memory.f90 b/Sources/Convert/Convert_Mod/Allocate_Memory.f90 index 8e69ab443..b530407d2 100644 --- a/Sources/Convert/Convert_Mod/Allocate_Memory.f90 +++ b/Sources/Convert/Convert_Mod/Allocate_Memory.f90 @@ -9,6 +9,8 @@ subroutine Allocate_Memory(Convert, Grid) type(Grid_Type) :: Grid !-----------------------------------[Locals]-----------------------------------! integer, parameter :: F = 3 ! workaround to allocate more memory for bnds +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Convert) !==============================================================================! ! Allocate memory diff --git a/Sources/Convert/Convert_Mod/Calculate_Geometry.f90 b/Sources/Convert/Convert_Mod/Calculate_Geometry.f90 index 351d095bb..00a06140b 100644 --- a/Sources/Convert/Convert_Mod/Calculate_Geometry.f90 +++ b/Sources/Convert/Convert_Mod/Calculate_Geometry.f90 @@ -10,24 +10,6 @@ subroutine Calculate_Geometry(Convert, Grid, ask) ! One of the most distinct differences is the treatment of periodicity. ! ! Here, periodic faces are created from existing (internal) ones, whereas ! ! in Generate_Mod, they are added to existing cells. ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Convert_Type) :: Convert - type(Grid_Type) :: Grid - integer, intent(in) :: ask -!-----------------------------------[Locals]-----------------------------------! - integer :: c, c1, c2, n, n1, n2, s, b, i, j - integer :: c11, c12, c21, c22, s1, s2, bou_cen, cnt_bnd, cnt_per - integer :: reg_per, n_per, number_faces - real :: xs2, ys2, zs2 - real :: t, tot_surf, dis, min_dis, max_dis - real :: v(3), k(3), v_o(3), v_r(3), theta ! for rotation - real, allocatable :: b_coor_1(:), b_coor_2(:), b_coor_3(:) - integer, allocatable :: b_face(:) - character(SL) :: answer - real :: factor, prod -!==============================================================================! ! ! ! n3 ! ! +---------------!---------------+ ! @@ -105,6 +87,25 @@ subroutine Calculate_Geometry(Convert, Grid, ask) ! t = ----------------------------------------------------------- ! ! rx*sx + ry*sy + rz*sz ! ! ! +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Convert_Type) :: Convert + type(Grid_Type) :: Grid + integer, intent(in) :: ask +!-----------------------------------[Locals]-----------------------------------! + integer :: c, c1, c2, n, n1, n2, s, b, i, j + integer :: c11, c12, c21, c22, s1, s2, bou_cen, cnt_bnd, cnt_per + integer :: reg_per, n_per, number_faces + real :: xs2, ys2, zs2 + real :: t, tot_surf, dis, min_dis, max_dis + real :: v(3), k(3), v_o(3), v_r(3), theta ! for rotation + real, allocatable :: b_coor_1(:), b_coor_2(:), b_coor_3(:) + integer, allocatable :: b_face(:) + character(SL) :: answer + real :: factor, prod +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Convert) !==============================================================================! call Profiler % Start('Calculate_Geometry') diff --git a/Sources/Convert/Convert_Mod/Find_Faces.f90 b/Sources/Convert/Convert_Mod/Find_Faces.f90 index ddf68c883..8a7916615 100644 --- a/Sources/Convert/Convert_Mod/Find_Faces.f90 +++ b/Sources/Convert/Convert_Mod/Find_Faces.f90 @@ -29,6 +29,8 @@ subroutine Find_Faces(Convert, Grid) integer, allocatable :: face_n2(:) integer, allocatable :: face_n3(:) integer, allocatable :: face_cell(:), starts(:), ends(:) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Convert) !==============================================================================! call Profiler % Start('Find_Faces') diff --git a/Sources/Convert/Convert_Mod/Find_Parents.f90 b/Sources/Convert/Convert_Mod/Find_Parents.f90 index 925874868..7436795a8 100644 --- a/Sources/Convert/Convert_Mod/Find_Parents.f90 +++ b/Sources/Convert/Convert_Mod/Find_Parents.f90 @@ -18,6 +18,8 @@ subroutine Find_Parents(Convert, Grid) logical, allocatable :: is_node_bnd(:) integer, allocatable :: cell_near_bnd(:) integer, allocatable :: cr1(:), cr2(:), cr3(:), w1(:), w2(:) ! for sorting +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Convert) !==============================================================================! call Profiler % Start('Find_Parents') diff --git a/Sources/Convert/Convert_Mod/Grid_Topology.f90 b/Sources/Convert/Convert_Mod/Grid_Topology.f90 index eac1fbd7e..6aac2b930 100644 --- a/Sources/Convert/Convert_Mod/Grid_Topology.f90 +++ b/Sources/Convert/Convert_Mod/Grid_Topology.f90 @@ -19,6 +19,8 @@ subroutine Grid_Topology(Convert, Grid) type(Grid_Type) :: Grid !-----------------------------------[Locals]-----------------------------------! integer :: i, j +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Convert) !==============================================================================! call Profiler % Start('Grid_Topology') diff --git a/Sources/Convert/Convert_Mod/Guess_Format.f90 b/Sources/Convert/Convert_Mod/Guess_Format.f90 index c824fc5d4..a49d10b7f 100644 --- a/Sources/Convert/Convert_Mod/Guess_Format.f90 +++ b/Sources/Convert/Convert_Mod/Guess_Format.f90 @@ -14,6 +14,8 @@ subroutine Guess_Format(Convert, file_name, file_format) character(SL), intent(out) :: file_format !-----------------------------------[Locals]-----------------------------------! integer :: l, fu +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Convert) !==============================================================================! !----------------------------! diff --git a/Sources/Convert/Convert_Mod/Load_Fluent.f90 b/Sources/Convert/Convert_Mod/Load_Fluent.f90 index 5bc78e49a..8869730fd 100644 --- a/Sources/Convert/Convert_Mod/Load_Fluent.f90 +++ b/Sources/Convert/Convert_Mod/Load_Fluent.f90 @@ -434,6 +434,7 @@ subroutine Load_Fluent(Convert, Grid, file_name) # ifdef __INTEL_COMPILER error = fseek(fu, offset, 0) # else + error = 0 call fseek(fu, offset, 0) # endif diff --git a/Sources/Convert/Convert_Mod/Load_Forrest.f90 b/Sources/Convert/Convert_Mod/Load_Forrest.f90 index adae84ece..2638e1ca1 100644 --- a/Sources/Convert/Convert_Mod/Load_Forrest.f90 +++ b/Sources/Convert/Convert_Mod/Load_Forrest.f90 @@ -10,12 +10,14 @@ subroutine Load_Forrest(Convert, Grid, file_name) character(SL) :: file_name !-----------------------------------[Locals]-----------------------------------! type(Stl_Type) :: Forrest - integer :: fu, s, i_nod, v, fac, attempts + integer :: s, i_nod, v, fac, attempts integer :: n_trees, t1, t2, t, n0, n1, n2 real :: f_min_x, f_max_x, f_min_y, f_max_y, f_min_z, f_max_z real :: n(3) real :: delta_x, delta_y, min_dist, tmp real, allocatable :: t_x(:), t_y(:) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Convert) !==============================================================================! call Profiler % Start('Load_Forrest') @@ -42,8 +44,6 @@ subroutine Load_Forrest(Convert, Grid, file_name) print '(a,2f9.3)', ' # Forrest span in y directon: ', f_min_y, f_max_y print '(a,2f9.3)', ' # Forrest span in z directon: ', f_min_z, f_max_z - close(fu) - ! Scale the single tree by forrest height Grid(1) % zn(:) = Grid(1) % zn - f_min_z Grid(1) % xn(:) = Grid(1) % xn * (f_max_z - f_min_z) diff --git a/Sources/Convert/Convert_Mod/Load_Gmsh.f90 b/Sources/Convert/Convert_Mod/Load_Gmsh.f90 index 14d9cc508..6ff35cb43 100644 --- a/Sources/Convert/Convert_Mod/Load_Gmsh.f90 +++ b/Sources/Convert/Convert_Mod/Load_Gmsh.f90 @@ -25,7 +25,6 @@ subroutine Load_Gmsh(Convert, Grid, file_name) character(SL), allocatable :: phys_names(:) logical :: ascii ! is file in ascii format? integer :: pos - integer :: pos_meshformat = 12 integer :: pos_physicalnames = -1 integer :: pos_entities = -1 integer :: pos_nodes = -1 @@ -137,6 +136,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) # ifdef __INTEL_COMPILER error = fseek(fu, pos_physicalnames, 0) # else + error = 0 call fseek(fu, pos_physicalnames, 0) # endif call File % Read_Line(fu) @@ -172,7 +172,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) read(Line % tokens(4), *) Grid % n_nodes ! 2 and 4 store number of nodes else call File % Read_Binary_Int8_Array(fu, 4) - Grid % n_nodes = int8_array(4) + Grid % n_nodes = int(int8_array(4)) end if print *,'# Number of nodes: ', Grid % n_nodes @@ -192,7 +192,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) read(Line % tokens(4), *) n_elem ! both 2 and 4 store number of elements else call File % Read_Binary_Int8_Array(fu, 4) - n_elem = int8_array(4) + n_elem = int(int8_array(4)) end if allocate(new(n_elem)) new(:) = 0 @@ -219,10 +219,10 @@ subroutine Load_Gmsh(Convert, Grid, file_name) read(Line % tokens(4), *) n_e_3d ! number of 3D entities (volumes) else call File % Read_Binary_Int8_Array(fu, 4) - n_e_0d = int8_array(1) ! number of 0D entities (points) - n_e_1d = int8_array(2) ! number of 1D entities (lines) - n_e_2d = int8_array(3) ! number of 2D entities (faces) - n_e_3d = int8_array(4) ! number of 3D entities (volumes) + n_e_0d = int(int8_array(1)) ! number of 0D entities (points) + n_e_1d = int(int8_array(2)) ! number of 1D entities (lines) + n_e_2d = int(int8_array(3)) ! number of 2D entities (faces) + n_e_3d = int(int8_array(4)) ! number of 3D entities (volumes) end if !--------------------------! @@ -286,14 +286,14 @@ subroutine Load_Gmsh(Convert, Grid, file_name) call File % Read_Binary_Real8_Array(fu, 6) ! Number of physical tags call File % Read_Binary_Int8_Array (fu, 1) - n_tags = int8_array(1) + n_tags = int(int8_array(1)) do j = 1, n_tags ! read the physical tags you have call File % Read_Binary_Int4_Array (fu, 1) p_tag = int4_array(1) end do ! Number of bounding curves call File % Read_Binary_Int8_Array (fu, 1) - n_crvs = int8_array(1) + n_crvs = int(int8_array(1)) ! Read the bounding curves call File % Read_Binary_Int4_Array (fu, n_crvs) end if @@ -337,7 +337,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) read(fu, *) n_grps else call File % Read_Binary_Int8_Array(fu, 4) - n_grps = int8_array(1) + n_grps = int(int8_array(1)) end if !-------------------------------------------------------------! @@ -354,11 +354,11 @@ subroutine Load_Gmsh(Convert, Grid, file_name) read(Line % tokens(4), *) n_memb ! number of members in the group else call File % Read_Binary_Int4_Array(fu, 3) - dim = int4_array(1) ! dimension of the element - s_tag = int4_array(2) ! element tag - type = int4_array(3) ! element type + dim = int4_array(1) ! dimension of the element + s_tag = int4_array(2) ! element tag + type = int4_array(3) ! element type call File % Read_Binary_Int8_Array(fu, 1) - n_memb = int8_array(1) ! number of members in the group + n_memb = int(int8_array(1)) ! number of members in the group end if ! Read cell number and cell's nodes <--= this is just to carry on @@ -368,7 +368,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) else ! Element tag call File % Read_Binary_Int8_Array(fu, 1) - c = int8_array(1) + c = int(int8_array(1)) ! Node tags if(type .eq. MSH_TRI) call File % Read_Binary_Int8_Array(fu, 3) if(type .eq. MSH_QUAD) call File % Read_Binary_Int8_Array(fu, 4) @@ -433,7 +433,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) read(fu, *) n_grps else call File % Read_Binary_Int8_Array(fu, 4) - n_grps = int8_array(1) + n_grps = int(int8_array(1)) end if !----------------------------------------------------------------! @@ -454,7 +454,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) s_tag = int4_array(2) ! element tag type = int4_array(3) ! element type call File % Read_Binary_Int8_Array(fu, 1) - n_memb = int8_array(1) ! number of members in the group + n_memb = int(int8_array(1)) ! number of members in the group end if ! Treat different cell types now @@ -482,13 +482,13 @@ subroutine Load_Gmsh(Convert, Grid, file_name) ! Element tag call File % Read_Binary_Int8_Array(fu, n_nods+1) - c = int8_array(1) ! fetch Gmsh cell number - c = new(c) ! use T-Flows numbering + c = int(int8_array(1)) ! fetch Gmsh cell number + c = new(c) ! use T-Flows numbering Grid % cells_n_nodes(c) = n_nods call Adjust_First_Dim(n_nods, Grid % cells_n) do k = 1, n_nods - Grid % cells_n(k, c) = int8_array(k+1) + Grid % cells_n(k, c) = int(int8_array(k+1)) end do end if @@ -524,7 +524,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) read(fu, *) n_grps else call File % Read_Binary_Int8_Array(fu, 4) - n_grps = int8_array(1) + n_grps = int(int8_array(1)) end if !-------------------------------------------------------! @@ -537,7 +537,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) else call File % Read_Binary_Int4_Array(fu, 3) call File % Read_Binary_Int8_Array(fu, 1) - n_memb = int8_array(1) + n_memb = int(int8_array(1)) end if allocate(n(n_memb)) @@ -549,7 +549,7 @@ subroutine Load_Gmsh(Convert, Grid, file_name) else do j = 1, n_memb ! fetch all node numbers call File % Read_Binary_Int8_Array(fu, 1) - n(j) = int8_array(1) + n(j) = int(int8_array(1)) end do end if diff --git a/Sources/Convert/Convert_Mod/Load_Obj.f90 b/Sources/Convert/Convert_Mod/Load_Obj.f90 index a05ae2019..65fbfb338 100644 --- a/Sources/Convert/Convert_Mod/Load_Obj.f90 +++ b/Sources/Convert/Convert_Mod/Load_Obj.f90 @@ -9,11 +9,13 @@ subroutine Load_Obj(Convert, Grid, file_name) type(Grid_Type) :: Grid character(SL) :: file_name !-----------------------------------[Locals]-----------------------------------! - character(SL) :: tok - integer :: fu, s, n, i, i_nod - logical :: the_end - real :: t_min_x, t_max_x, t_min_y, t_max_y, t_min_z, t_max_z - real :: x_o, y_o + character(SL) :: tok + integer :: fu, s, n, i, i_nod + logical :: the_end + real :: t_min_x, t_max_x, t_min_y, t_max_y, t_min_z, t_max_z + real :: x_o, y_o +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Convert) !==============================================================================! call Profiler % Start('Load_Obj') diff --git a/Sources/Convert/Convert_Mod/Logo_Con.f90 b/Sources/Convert/Convert_Mod/Logo_Con.f90 index 9f13857a6..c827b4068 100644 --- a/Sources/Convert/Convert_Mod/Logo_Con.f90 +++ b/Sources/Convert/Convert_Mod/Logo_Con.f90 @@ -2,6 +2,8 @@ subroutine Logo_Con(Convert) !---------------------------------[Arguments]----------------------------------! class(Convert_Type) :: Convert +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Convert) !==============================================================================! print *,'#===================================' // & diff --git a/Sources/Convert/Convert_Mod/N_Bnd_Cells_In_Region.f90 b/Sources/Convert/Convert_Mod/N_Bnd_Cells_In_Region.f90 index 90aa03360..8d2ae5645 100644 --- a/Sources/Convert/Convert_Mod/N_Bnd_Cells_In_Region.f90 +++ b/Sources/Convert/Convert_Mod/N_Bnd_Cells_In_Region.f90 @@ -11,6 +11,8 @@ integer function N_Bnd_Cells_In_Region(Convert, Grid, bc, cell_data) integer :: cell_data(-Grid % n_bnd_cells:Grid % n_cells) !-----------------------------------[Locals]-----------------------------------! integer :: c, cnt +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Convert) !==============================================================================! ! Nullify on entry diff --git a/Sources/Convert/Convert_Mod/N_Edges_In_Region.f90 b/Sources/Convert/Convert_Mod/N_Edges_In_Region.f90 index 1486eb2d1..b5d6bf17d 100644 --- a/Sources/Convert/Convert_Mod/N_Edges_In_Region.f90 +++ b/Sources/Convert/Convert_Mod/N_Edges_In_Region.f90 @@ -14,6 +14,8 @@ integer function N_Edges_In_Region(Convert, Grid, bc, edge_data) real :: norm_1(3), norm_2(3) real :: xs, ys, zs, xe, ye, ze real :: vec_ef(3) ! from edge to face mid-point +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Convert) !==============================================================================! ! Nullify on entry diff --git a/Sources/Convert/Convert_Mod/N_Nodes_In_Region.f90 b/Sources/Convert/Convert_Mod/N_Nodes_In_Region.f90 index c1fbf3d02..679c8f1e0 100644 --- a/Sources/Convert/Convert_Mod/N_Nodes_In_Region.f90 +++ b/Sources/Convert/Convert_Mod/N_Nodes_In_Region.f90 @@ -11,6 +11,8 @@ integer function N_Nodes_In_Region(Convert, Grid, bc, node_data) integer :: node_data(Grid % n_nodes) !-----------------------------------[Locals]-----------------------------------! integer :: c, i_nod, n, cnt +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Convert) !==============================================================================! ! Nullify on entry diff --git a/Sources/Convert/Convert_Mod/N_Sharp_Corners.f90 b/Sources/Convert/Convert_Mod/N_Sharp_Corners.f90 index c36713368..10ee25f55 100644 --- a/Sources/Convert/Convert_Mod/N_Sharp_Corners.f90 +++ b/Sources/Convert/Convert_Mod/N_Sharp_Corners.f90 @@ -11,6 +11,8 @@ integer function N_Sharp_Corners(Convert, Grid, sharp_corner) !-----------------------------------[Locals]-----------------------------------! integer :: e, cnt, s1, s2, n1, n2, n real :: norm_1(3), norm_2(3) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Convert) !==============================================================================! ! Nullify on entry diff --git a/Sources/Convert/Convert_Mod/N_Sharp_Edges.f90 b/Sources/Convert/Convert_Mod/N_Sharp_Edges.f90 index 59bab95f0..f1fc65480 100644 --- a/Sources/Convert/Convert_Mod/N_Sharp_Edges.f90 +++ b/Sources/Convert/Convert_Mod/N_Sharp_Edges.f90 @@ -14,6 +14,8 @@ integer function N_Sharp_Edges(Convert, Grid, edge_data) real :: norm_1(3), norm_2(3) real :: xs, ys, zs, xe, ye, ze real :: vec_ef(3) ! from edge to face mid-point +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Convert) !==============================================================================! ! Nullify on entry diff --git a/Sources/Convert/Convert_Mod/Sort_Face_Nodes.f90 b/Sources/Convert/Convert_Mod/Sort_Face_Nodes.f90 index c01e6e6fb..806728192 100644 --- a/Sources/Convert/Convert_Mod/Sort_Face_Nodes.f90 +++ b/Sources/Convert/Convert_Mod/Sort_Face_Nodes.f90 @@ -21,6 +21,8 @@ subroutine Sort_Face_Nodes(Convert, Grid, s, concave_link) integer, allocatable :: order(:) ! integer :: k, ni, nj, nk, min_loc ! real :: vec_ji(3), vec_jk(3), mag_ji, mag_jk, dot_prod +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Convert) !==============================================================================! ! Take alias diff --git a/Sources/Convert/Convert_Mod/Triangle_Area_Z.f90 b/Sources/Convert/Convert_Mod/Triangle_Area_Z.f90 index 222ae52d1..c5cf99e39 100644 --- a/Sources/Convert/Convert_Mod/Triangle_Area_Z.f90 +++ b/Sources/Convert/Convert_Mod/Triangle_Area_Z.f90 @@ -5,12 +5,6 @@ real function Triangle_Area_Z(Convert, & xc, yc) !------------------------------------------------------------------------------! ! Area of a tringle in xy plane defined with nodes "a", "b", "c" -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Convert_Type) :: Convert - real, intent(in) :: xa, ya, xb, yb, xc, yc -!==============================================================================! ! ! ! c ! ! / \ ! @@ -20,6 +14,13 @@ real function Triangle_Area_Z(Convert, & ! / \ ! ! a-----------b ! ! ! +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Convert_Type) :: Convert + real, intent(in) :: xa, ya, xb, yb, xc, yc +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Convert) !------------------------------------------------------------------------------! Triangle_Area_Z = abs(xa * (yb-yc) + xb * (yc-ya) + xc * (ya-yb)) * 0.5 diff --git a/Sources/Convert/makefile b/Sources/Convert/makefile index c1e0a2ff3..057df4a3d 100644 --- a/Sources/Convert/makefile +++ b/Sources/Convert/makefile @@ -34,8 +34,8 @@ PROGRAM_FILE = $(DIR_BINARY)/$(PROGRAM_NAME) PASS_ON = -DT_FLOWS_COMPILATION=1 #---------------------------------------------------------- -# It soon adds T_FLOWS_PROGRAM and T_FLOWS_ASSERT and -# later on it adds also T_FLOWS_MPI and T_FLOWS_PETSC +# Add T_FLOWS_PROGRAM, T_FLOWS_ASSERT and T_FLOWS_DEBUG +# and later on it add also T_FLOWS_MPI and T_FLOWS_PETSC #---------------------------------------------------------- PASS_ON += -DT_FLOWS_PROGRAM=3 @@ -45,6 +45,12 @@ else PASS_ON += -DT_FLOWS_ASSERT=0 endif +ifeq ($(DEBUG), yes) + PASS_ON += -DT_FLOWS_DEBUG=1 +else + PASS_ON += -DT_FLOWS_DEBUG=0 +endif + $(info #=======================================================================) $(info # Compiling $(PROGRAM_NAME) with $(FORTRAN) compiler ) $(info #-----------------------------------------------------------------------) @@ -147,7 +153,8 @@ else endif OPT_F_COMP = -J $(DIR_MODULE) -cpp -ffree-line-length-none ifeq ($(DEBUG), yes) - OPT_F_COMP += -O0 -g -fcheck=all -Wunused-parameter -Wall + OPT_F_COMP += -O0 -g -fcheck=all -Wunused-parameter -Wall \ + -Wno-integer-division else OPT_F_COMP += -O3 endif @@ -249,12 +256,7 @@ MOD = $(SRC_F_MOD_LOW:%.f90=$(DIR_MODULE)/%.mod) # Note: This doesn't need editing. #--------------------------------------------------------- -# Fortran modules -$(DIR_OBJECT)/%.o: %.f90 %/*.f90 - @echo $(FC) $< - @$(FC) $(OPT_F_COMP) $(PASS_ON) -c -o $@ $< - -# Fortran functions +# Fortran sources $(DIR_OBJECT)/%.o: %.f90 @echo $(FC) $< @$(FC) $(OPT_F_COMP) $(PASS_ON) -c -o $@ $< diff --git a/Sources/Convert/makefile_explicit_dependencies b/Sources/Convert/makefile_explicit_dependencies index 51556e814..08feeac80 100644 --- a/Sources/Convert/makefile_explicit_dependencies +++ b/Sources/Convert/makefile_explicit_dependencies @@ -11,7 +11,23 @@ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 \ +Convert_Mod/untitled.geo \ $(DIR_OBJECT)/Convert_Mod.o \ +Convert_Mod/foo.msh \ +Convert_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Convert_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Convert_Mod.o:\ +$(DIR_OBJECT)/Stl_Mod.o \ +$(DIR_SHARED)/Stl_Mod/*.f90 \ +$(DIR_OBJECT)/Profiler_Mod.o \ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +Convert_Mod/untitled.geo \ +Convert_Mod/foo.msh \ Convert_Mod/*.f90 #--------------------------------------------------- @@ -29,16 +45,9 @@ $(DIR_OBJECT)/Profiler_Mod.o \ $(DIR_SHARED)/Profiler_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Convert_Mod.f90 +# Dependencies for: ./Isoap_Mod/Isopol.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Convert_Mod.o:\ -$(DIR_OBJECT)/Stl_Mod.o \ -$(DIR_SHARED)/Stl_Mod/*.f90 \ -$(DIR_OBJECT)/Profiler_Mod.o \ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -Convert_Mod/*.f90 +$(DIR_OBJECT)/Isopol.o: #--------------------------------------------------- # Dependencies for: ./Isoap_Mod/Main_Isoap.f90 @@ -46,73 +55,50 @@ Convert_Mod/*.f90 $(DIR_OBJECT)/Main_Isoap.o: #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod/Isopol.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Isopol.o: - -#--------------------------------------------------- -# Dependencies for: ./Message_Mod.f90 +# Dependencies for: ./Gen_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Message_Mod.o:\ -$(DIR_OBJECT)/Tokenizer_Mod.o \ -$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ -$(DIR_SHARED)/Message_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Gen_Mod.o:\ +$(DIR_SHARED)/Gen_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod.f90 +# Dependencies for: ./Message_Mod/Thin_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Isoap_Mod.o:\ -$(DIR_OBJECT)/Polyhedron_Mod.o \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ -$(DIR_OBJECT)/Iso_Polygons_Mod.o \ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/readme \ -$(DIR_SHARED)/Isoap_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/Dim_Polyhedron.h +$(DIR_OBJECT)/Thin_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./File_Mod.f90 +# Dependencies for: ./Message_Mod/Thick_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/File_Mod.o:\ -$(DIR_OBJECT)/String_Mod.o \ -$(DIR_SHARED)/String_Mod/*.f90 \ -$(DIR_OBJECT)/Message_Mod.o \ -$(DIR_SHARED)/Message_Mod/*.f90 \ -$(DIR_SHARED)/File_Mod/*.f90 +$(DIR_OBJECT)/Thick_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Region_Mod.f90 +# Dependencies for: ./Message_Mod/Dashed_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Region_Mod.o:\ +$(DIR_OBJECT)/Dashed_Line.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Gen_Mod.f90 +# Dependencies for: ./Comm_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Gen_Mod.o:\ -$(DIR_SHARED)/Gen_Mod/*.f90 +$(DIR_OBJECT)/Comm_Mod.o:\ +$(DIR_OBJECT)/Const_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Sort_Mod.f90 +# Dependencies for: ./Metis_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Sort_Mod.o:\ -$(DIR_OBJECT)/Swap_Mod.o \ -$(DIR_SHARED)/Swap_Mod/*.f90 \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 +$(DIR_OBJECT)/Metis_Mod.o:\ +$(DIR_SHARED)/Metis_Mod/*.f90 \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Polyhedron_Mod.f90 +# Dependencies for: ./Math_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Polyhedron_Mod.o:\ -$(DIR_OBJECT)/Work_Mod.o \ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 +$(DIR_OBJECT)/Math_Mod.o:\ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- # Dependencies for: ./Control_Mod.f90 @@ -126,45 +112,45 @@ $(DIR_SHARED)/Control_Mod/*/*.f90 \ $(DIR_SHARED)/Control_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells.f90 +# Dependencies for: ./Vect_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells.o:\ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Vect_Mod.o:\ +$(DIR_SHARED)/Vect_Mod/*.f90 \ +$(DIR_OBJECT)/Region_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Dashed_Line.f90 +# Dependencies for: ./String_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Dashed_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/String_Mod.o:\ +$(DIR_SHARED)/String_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thin_Line.f90 +# Dependencies for: ./Profiler_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thin_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Profiler_Mod.o:\ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thick_Line.f90 +# Dependencies for: ./Assert_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thick_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Assert_Mod.o:\ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Work_Mod.f90 +# Dependencies for: ./Sort_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Work_Mod.o:\ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Sort_Mod.o:\ +$(DIR_OBJECT)/Swap_Mod.o \ +$(DIR_SHARED)/Swap_Mod/*.f90 \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Probe_1d_Nodes.f90 @@ -180,29 +166,6 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 -#--------------------------------------------------- -# Dependencies for: ./Vect_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Vect_Mod.o:\ -$(DIR_OBJECT)/Region_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Profiler_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Profiler_Mod.o:\ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Math_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Math_Mod.o:\ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o - #--------------------------------------------------- # Dependencies for: ./Swap_Mod.f90 #--------------------------------------------------- @@ -210,25 +173,15 @@ $(DIR_OBJECT)/Swap_Mod.o:\ $(DIR_SHARED)/Swap_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Assert_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Assert_Mod.o:\ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 \ -$(DIR_SHARED)/Assert_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./String_Mod.f90 +# Dependencies for: ./Region_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/String_Mod.o:\ -$(DIR_SHARED)/String_Mod/*.f90 +$(DIR_OBJECT)/Region_Mod.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +# Dependencies for: ./Probe_2d.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Probe_2d.o:\ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -237,6 +190,21 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 +#--------------------------------------------------- +# Dependencies for: ./Polyhedron_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Polyhedron_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Iso_Polygons_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 + #--------------------------------------------------- # Dependencies for: ./Grid_Mod.f90 #--------------------------------------------------- @@ -244,6 +212,7 @@ $(DIR_OBJECT)/Grid_Mod.o:\ $(DIR_OBJECT)/Vtk_Mod.o \ $(DIR_SHARED)/Vtk_Mod/*.f90 \ $(DIR_OBJECT)/Vect_Mod.o \ +$(DIR_SHARED)/Vect_Mod/*.f90 \ $(DIR_OBJECT)/Sort_Mod.o \ $(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Region_Mod.o \ @@ -257,26 +226,27 @@ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Stl_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Stl_Mod.o:\ -$(DIR_SHARED)/Stl_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Comm_Mod.f90 +# Dependencies for: ./Message_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Comm_Mod.o:\ +$(DIR_OBJECT)/Message_Mod.o:\ +$(DIR_OBJECT)/Tokenizer_Mod.o \ +$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ +$(DIR_SHARED)/Message_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Iso_Polygons_Mod.f90 +# Dependencies for: ./Isoap_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 +$(DIR_OBJECT)/Isoap_Mod.o:\ +$(DIR_OBJECT)/Polyhedron_Mod.o \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ +$(DIR_OBJECT)/Iso_Polygons_Mod.o \ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/readme \ +$(DIR_SHARED)/Isoap_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/Dim_Polyhedron.h #--------------------------------------------------- # Dependencies for: ./Vtk_Mod.f90 @@ -286,17 +256,30 @@ $(DIR_SHARED)/Vtk_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Metis_Mod.f90 +# Dependencies for: ./Stl_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Metis_Mod.o:\ -$(DIR_SHARED)/Metis_Mod/*.f90 \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Stl_Mod.o:\ +$(DIR_SHARED)/Stl_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_2d.f90 +# Dependencies for: ./Work_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_2d.o:\ +$(DIR_OBJECT)/Work_Mod.o:\ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -312,3 +295,26 @@ $(DIR_OBJECT)/Tokenizer_Mod.o:\ $(DIR_SHARED)/Tokenizer_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o +#--------------------------------------------------- +# Dependencies for: ./File_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/File_Mod.o:\ +$(DIR_OBJECT)/String_Mod.o \ +$(DIR_SHARED)/String_Mod/*.f90 \ +$(DIR_OBJECT)/Message_Mod.o \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_SHARED)/File_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Probe_1d_Cells.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Probe_1d_Cells.o:\ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o + diff --git a/Sources/Divide/Divide_Mod.f90 b/Sources/Divide/Divide_Mod.f90 index f0cc181dc..d570a5241 100644 --- a/Sources/Divide/Divide_Mod.f90 +++ b/Sources/Divide/Divide_Mod.f90 @@ -1,5 +1,6 @@ #include "../Shared/Assert.h90" #include "../Shared/Browse.h90" +#include "../Shared/Unused.h90" !==============================================================================! module Divide_Mod diff --git a/Sources/Divide/Divide_Mod/Logo_Div.f90 b/Sources/Divide/Divide_Mod/Logo_Div.f90 index cd5db7148..dbd2b340e 100644 --- a/Sources/Divide/Divide_Mod/Logo_Div.f90 +++ b/Sources/Divide/Divide_Mod/Logo_Div.f90 @@ -5,6 +5,8 @@ subroutine Logo_Div(Divide) use Const_Mod !---------------------------------[Arguments]----------------------------------! class(Divide_Type) :: Divide +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Divide) !==============================================================================! print *,'#===================================' // & diff --git a/Sources/Divide/Divide_Mod/Save_Subdomains.f90 b/Sources/Divide/Divide_Mod/Save_Subdomains.f90 index 3bdd639dd..264e9a22d 100644 --- a/Sources/Divide/Divide_Mod/Save_Subdomains.f90 +++ b/Sources/Divide/Divide_Mod/Save_Subdomains.f90 @@ -30,6 +30,9 @@ subroutine Save_Subdomains(Divide, Grid, n_buff_layers) integer :: nf_sub ! number of faces in the subdomain integer :: ns_sub ! number of shadow faces in subdomain integer :: nbc_sub ! number of boundary cells in subdomain +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Divide) + Unused(n_buff_layers) !==============================================================================! !-------------------------------! diff --git a/Sources/Divide/makefile b/Sources/Divide/makefile index 7dbb0c5f2..35225aac7 100644 --- a/Sources/Divide/makefile +++ b/Sources/Divide/makefile @@ -34,8 +34,8 @@ PROGRAM_FILE = $(DIR_BINARY)/$(PROGRAM_NAME) PASS_ON = -DT_FLOWS_COMPILATION=1 #---------------------------------------------------------- -# It soon adds T_FLOWS_PROGRAM and T_FLOWS_ASSERT and -# later on it adds also T_FLOWS_MPI and T_FLOWS_PETSC +# Add T_FLOWS_PROGRAM, T_FLOWS_ASSERT and T_FLOWS_DEBUG +# and later on it add also T_FLOWS_MPI and T_FLOWS_PETSC #---------------------------------------------------------- PASS_ON += -DT_FLOWS_PROGRAM=2 @@ -45,6 +45,12 @@ else PASS_ON += -DT_FLOWS_ASSERT=0 endif +ifeq ($(DEBUG), yes) + PASS_ON += -DT_FLOWS_DEBUG=1 +else + PASS_ON += -DT_FLOWS_DEBUG=0 +endif + $(info #=======================================================================) $(info # Compiling $(PROGRAM_NAME) with $(FORTRAN) compiler ) $(info #-----------------------------------------------------------------------) @@ -146,7 +152,8 @@ else endif OPT_F_COMP = -J $(DIR_MODULE) -cpp -ffree-line-length-none ifeq ($(DEBUG), yes) - OPT_F_COMP += -O0 -g -fcheck=all -Wunused-parameter -Wall + OPT_F_COMP += -O0 -g -fcheck=all -Wunused-parameter -Wall \ + -Wno-integer-division else OPT_F_COMP += -O3 endif @@ -246,12 +253,7 @@ MOD = $(SRC_F_MOD_LOW:%.f90=$(DIR_MODULE)/%.mod) # Note: This doesn't need editing. #--------------------------------------------------------- -# Fortran modules -$(DIR_OBJECT)/%.o: %.f90 %/*.f90 - @echo $(FC) $< - @$(FC) $(OPT_F_COMP) $(PASS_ON) -c -o $@ $< - -# Fortran functions +# Fortran sources $(DIR_OBJECT)/%.o: %.f90 @echo $(FC) $< @$(FC) $(OPT_F_COMP) $(PASS_ON) -c -o $@ $< diff --git a/Sources/Divide/makefile_explicit_dependencies b/Sources/Divide/makefile_explicit_dependencies index 40c9031ae..514cd8b44 100644 --- a/Sources/Divide/makefile_explicit_dependencies +++ b/Sources/Divide/makefile_explicit_dependencies @@ -1,10 +1,3 @@ -#--------------------------------------------------- -# Dependencies for: ./Main_Div.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Main_Div.o:\ -$(DIR_OBJECT)/Divide_Mod.o \ -Divide_Mod/*.f90 - #--------------------------------------------------- # Dependencies for: ./Divide_Mod.f90 #--------------------------------------------------- @@ -15,6 +8,13 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ Divide_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o +#--------------------------------------------------- +# Dependencies for: ./Main_Div.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Main_Div.o:\ +$(DIR_OBJECT)/Divide_Mod.o \ +Divide_Mod/*.f90 + #--------------------------------------------------- # Dependencies for: ./Divide_Mod/Logo_Div.f90 #--------------------------------------------------- @@ -22,78 +22,60 @@ $(DIR_OBJECT)/Logo_Div.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod/Main_Isoap.f90 +# Dependencies for: ./Isoap_Mod/Isopol.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Main_Isoap.o: +$(DIR_OBJECT)/Isopol.o: #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod/Isopol.f90 +# Dependencies for: ./Isoap_Mod/Main_Isoap.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Isopol.o: +$(DIR_OBJECT)/Main_Isoap.o: #--------------------------------------------------- -# Dependencies for: ./Message_Mod.f90 +# Dependencies for: ./Gen_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Message_Mod.o:\ -$(DIR_OBJECT)/Tokenizer_Mod.o \ -$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ -$(DIR_SHARED)/Message_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Gen_Mod.o:\ +$(DIR_SHARED)/Gen_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod.f90 +# Dependencies for: ./Message_Mod/Thin_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Isoap_Mod.o:\ -$(DIR_OBJECT)/Polyhedron_Mod.o \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ -$(DIR_OBJECT)/Iso_Polygons_Mod.o \ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/readme \ -$(DIR_SHARED)/Isoap_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/Dim_Polyhedron.h +$(DIR_OBJECT)/Thin_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./File_Mod.f90 +# Dependencies for: ./Message_Mod/Thick_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/File_Mod.o:\ -$(DIR_OBJECT)/String_Mod.o \ -$(DIR_SHARED)/String_Mod/*.f90 \ -$(DIR_OBJECT)/Message_Mod.o \ -$(DIR_SHARED)/Message_Mod/*.f90 \ -$(DIR_SHARED)/File_Mod/*.f90 +$(DIR_OBJECT)/Thick_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Region_Mod.f90 +# Dependencies for: ./Message_Mod/Dashed_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Region_Mod.o:\ +$(DIR_OBJECT)/Dashed_Line.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Gen_Mod.f90 +# Dependencies for: ./Comm_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Gen_Mod.o:\ -$(DIR_SHARED)/Gen_Mod/*.f90 +$(DIR_OBJECT)/Comm_Mod.o:\ +$(DIR_OBJECT)/Const_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Sort_Mod.f90 +# Dependencies for: ./Metis_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Sort_Mod.o:\ -$(DIR_OBJECT)/Swap_Mod.o \ -$(DIR_SHARED)/Swap_Mod/*.f90 \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 +$(DIR_OBJECT)/Metis_Mod.o:\ +$(DIR_SHARED)/Metis_Mod/*.f90 \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Polyhedron_Mod.f90 +# Dependencies for: ./Math_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Polyhedron_Mod.o:\ -$(DIR_OBJECT)/Work_Mod.o \ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 +$(DIR_OBJECT)/Math_Mod.o:\ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- # Dependencies for: ./Control_Mod.f90 @@ -107,45 +89,45 @@ $(DIR_SHARED)/Control_Mod/*/*.f90 \ $(DIR_SHARED)/Control_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells.f90 +# Dependencies for: ./Vect_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells.o:\ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Vect_Mod.o:\ +$(DIR_SHARED)/Vect_Mod/*.f90 \ +$(DIR_OBJECT)/Region_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Dashed_Line.f90 +# Dependencies for: ./String_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Dashed_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/String_Mod.o:\ +$(DIR_SHARED)/String_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thin_Line.f90 +# Dependencies for: ./Profiler_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thin_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Profiler_Mod.o:\ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thick_Line.f90 +# Dependencies for: ./Assert_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thick_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Assert_Mod.o:\ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Work_Mod.f90 +# Dependencies for: ./Sort_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Work_Mod.o:\ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Sort_Mod.o:\ +$(DIR_OBJECT)/Swap_Mod.o \ +$(DIR_SHARED)/Swap_Mod/*.f90 \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Probe_1d_Nodes.f90 @@ -161,29 +143,6 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 -#--------------------------------------------------- -# Dependencies for: ./Vect_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Vect_Mod.o:\ -$(DIR_OBJECT)/Region_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Profiler_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Profiler_Mod.o:\ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Math_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Math_Mod.o:\ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o - #--------------------------------------------------- # Dependencies for: ./Swap_Mod.f90 #--------------------------------------------------- @@ -191,25 +150,15 @@ $(DIR_OBJECT)/Swap_Mod.o:\ $(DIR_SHARED)/Swap_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Assert_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Assert_Mod.o:\ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 \ -$(DIR_SHARED)/Assert_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./String_Mod.f90 +# Dependencies for: ./Region_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/String_Mod.o:\ -$(DIR_SHARED)/String_Mod/*.f90 +$(DIR_OBJECT)/Region_Mod.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +# Dependencies for: ./Probe_2d.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Probe_2d.o:\ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -218,6 +167,21 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 +#--------------------------------------------------- +# Dependencies for: ./Polyhedron_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Polyhedron_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Iso_Polygons_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 + #--------------------------------------------------- # Dependencies for: ./Grid_Mod.f90 #--------------------------------------------------- @@ -225,6 +189,7 @@ $(DIR_OBJECT)/Grid_Mod.o:\ $(DIR_OBJECT)/Vtk_Mod.o \ $(DIR_SHARED)/Vtk_Mod/*.f90 \ $(DIR_OBJECT)/Vect_Mod.o \ +$(DIR_SHARED)/Vect_Mod/*.f90 \ $(DIR_OBJECT)/Sort_Mod.o \ $(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Region_Mod.o \ @@ -238,26 +203,27 @@ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Stl_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Stl_Mod.o:\ -$(DIR_SHARED)/Stl_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Comm_Mod.f90 +# Dependencies for: ./Message_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Comm_Mod.o:\ +$(DIR_OBJECT)/Message_Mod.o:\ +$(DIR_OBJECT)/Tokenizer_Mod.o \ +$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ +$(DIR_SHARED)/Message_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Iso_Polygons_Mod.f90 +# Dependencies for: ./Isoap_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 +$(DIR_OBJECT)/Isoap_Mod.o:\ +$(DIR_OBJECT)/Polyhedron_Mod.o \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ +$(DIR_OBJECT)/Iso_Polygons_Mod.o \ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/readme \ +$(DIR_SHARED)/Isoap_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/Dim_Polyhedron.h #--------------------------------------------------- # Dependencies for: ./Vtk_Mod.f90 @@ -267,17 +233,30 @@ $(DIR_SHARED)/Vtk_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Metis_Mod.f90 +# Dependencies for: ./Stl_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Metis_Mod.o:\ -$(DIR_SHARED)/Metis_Mod/*.f90 \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Stl_Mod.o:\ +$(DIR_SHARED)/Stl_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_2d.f90 +# Dependencies for: ./Work_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_2d.o:\ +$(DIR_OBJECT)/Work_Mod.o:\ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -293,3 +272,26 @@ $(DIR_OBJECT)/Tokenizer_Mod.o:\ $(DIR_SHARED)/Tokenizer_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o +#--------------------------------------------------- +# Dependencies for: ./File_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/File_Mod.o:\ +$(DIR_OBJECT)/String_Mod.o \ +$(DIR_SHARED)/String_Mod/*.f90 \ +$(DIR_OBJECT)/Message_Mod.o \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_SHARED)/File_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Probe_1d_Cells.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Probe_1d_Cells.o:\ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o + diff --git a/Sources/Generate/Generate_Mod.f90 b/Sources/Generate/Generate_Mod.f90 index 3070b693f..1472ce135 100644 --- a/Sources/Generate/Generate_Mod.f90 +++ b/Sources/Generate/Generate_Mod.f90 @@ -1,3 +1,5 @@ +# include "../Shared/Unused.h90" + !==============================================================================! module Generate_Mod !------------------------------------------------------------------------------! diff --git a/Sources/Generate/Generate_Mod/Calculate_Geometry.f90 b/Sources/Generate/Generate_Mod/Calculate_Geometry.f90 index 63297b1af..ca36de8bd 100644 --- a/Sources/Generate/Generate_Mod/Calculate_Geometry.f90 +++ b/Sources/Generate/Generate_Mod/Calculate_Geometry.f90 @@ -11,18 +11,6 @@ subroutine Calculate_Geometry(Generate, Grid, real_run) ! Here, periodic faces are added to the existing (internal) ones, whereas ! ! in Convert_Mod, existing faces are turned into periodic ones. ! !------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Generate_Type) :: Generate - type(Grid_Type) :: Grid - logical, intent(in) :: real_run -!-----------------------------------[Locals]-----------------------------------! - integer :: c, c1, c2, m, s, n_per, nn, nf - real :: xs2, ys2, zs2, t, tot_surf - integer :: fn(6,4) -!------------------------------------------------------------------------------! - include 'Block_Numbering.f90' -!==============================================================================! ! ! ! n3 ! ! +---------------!---------------+ ! @@ -100,6 +88,20 @@ subroutine Calculate_Geometry(Generate, Grid, real_run) ! t = ----------------------------------------------------------- ! ! rx*sx + ry*sy + rz*sz ! ! ! +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Generate_Type) :: Generate + type(Grid_Type) :: Grid + logical, intent(in) :: real_run +!-----------------------------------[Locals]-----------------------------------! + integer :: c, c1, c2, m, s, n_per, nn, nf + real :: xs2, ys2, zs2, t, tot_surf + integer :: fn(6,4) +!------------------------------------------------------------------------------! + include 'Block_Numbering.f90' +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Generate) !==============================================================================! call Profiler % Start('Calculate_Geometry') diff --git a/Sources/Generate/Generate_Mod/Load_Dom.f90 b/Sources/Generate/Generate_Mod/Load_Dom.f90 index 17d90e414..20e969574 100644 --- a/Sources/Generate/Generate_Mod/Load_Dom.f90 +++ b/Sources/Generate/Generate_Mod/Load_Dom.f90 @@ -21,6 +21,8 @@ subroutine Load_Dom(Generate, Dom, smr, ref, Grid) integer :: fn(6,4) !------------------------------------------------------------------------------! include 'Block_Numbering.f90' +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Generate) !==============================================================================! ! Copy face-node numbering for blocks diff --git a/Sources/Generate/Generate_Mod/Logo_Gen.f90 b/Sources/Generate/Generate_Mod/Logo_Gen.f90 index d82726ca5..d0d6bfdda 100644 --- a/Sources/Generate/Generate_Mod/Logo_Gen.f90 +++ b/Sources/Generate/Generate_Mod/Logo_Gen.f90 @@ -4,6 +4,8 @@ subroutine Logo_Gen(Generate) implicit none !---------------------------------[Arguments]----------------------------------! class(Generate_Type) :: Generate +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Generate) !==============================================================================! print *,'#===================================' // & diff --git a/Sources/Generate/Generate_Mod/Print_Generate_Statistics.f90 b/Sources/Generate/Generate_Mod/Print_Generate_Statistics.f90 index 4f58d0cfa..5973d284a 100644 --- a/Sources/Generate/Generate_Mod/Print_Generate_Statistics.f90 +++ b/Sources/Generate/Generate_Mod/Print_Generate_Statistics.f90 @@ -13,6 +13,8 @@ subroutine Print_Generate_Statistics(Generate, Grid) type(Grid_Type) :: Grid !-----------------------------------[Locals]-----------------------------------! integer :: i, j, k, numb, nonz, stencw +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Generate) !==============================================================================! print 1, '#================================================' diff --git a/Sources/Generate/makefile b/Sources/Generate/makefile index eec637a4f..d0e02f313 100644 --- a/Sources/Generate/makefile +++ b/Sources/Generate/makefile @@ -34,8 +34,8 @@ PROGRAM_FILE = $(DIR_BINARY)/$(PROGRAM_NAME) PASS_ON = -DT_FLOWS_COMPILATION=1 #---------------------------------------------------------- -# It soon adds T_FLOWS_PROGRAM and T_FLOWS_ASSERT and -# later on it adds also T_FLOWS_MPI and T_FLOWS_PETSC +# Add T_FLOWS_PROGRAM, T_FLOWS_ASSERT and T_FLOWS_DEBUG +# and later on it add also T_FLOWS_MPI and T_FLOWS_PETSC #---------------------------------------------------------- PASS_ON += -DT_FLOWS_PROGRAM=1 @@ -45,6 +45,12 @@ else PASS_ON += -DT_FLOWS_ASSERT=0 endif +ifeq ($(DEBUG), yes) + PASS_ON += -DT_FLOWS_DEBUG=1 +else + PASS_ON += -DT_FLOWS_DEBUG=0 +endif + $(info #=======================================================================) $(info # Compiling $(PROGRAM_NAME) with $(FORTRAN) compiler ) $(info #-----------------------------------------------------------------------) @@ -147,7 +153,8 @@ else endif OPT_F_COMP = -J $(DIR_MODULE) -cpp -ffree-line-length-none ifeq ($(DEBUG), yes) - OPT_F_COMP += -O0 -g -fcheck=all -Wunused-parameter -Wall + OPT_F_COMP += -O0 -g -fcheck=all -Wunused-parameter -Wall \ + -Wno-integer-division else OPT_F_COMP += -O3 endif @@ -256,12 +263,7 @@ MOD = $(SRC_F_MOD_LOW:%.f90=$(DIR_MODULE)/%.mod) # Note: This doesn't need editing. #--------------------------------------------------------- -# Fortran modules -$(DIR_OBJECT)/%.o: %.f90 %/*.f90 - @echo $(FC) $< - @$(FC) $(OPT_F_COMP) $(PASS_ON) -c -o $@ $< - -# Fortran functions +# Fortran sources $(DIR_OBJECT)/%.o: %.f90 @echo $(FC) $< @$(FC) $(OPT_F_COMP) $(PASS_ON) -c -o $@ $< diff --git a/Sources/Generate/makefile_explicit_dependencies b/Sources/Generate/makefile_explicit_dependencies index 7dd96e734..d39c0878a 100644 --- a/Sources/Generate/makefile_explicit_dependencies +++ b/Sources/Generate/makefile_explicit_dependencies @@ -25,6 +25,31 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/Gen_Mod.o \ $(DIR_SHARED)/Gen_Mod/*.f90 +#--------------------------------------------------- +# Dependencies for: ./Main_Gen.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Main_Gen.o:\ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/Generate_Mod.o \ +Generate_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Smooths_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Smooths_Mod.o:\ +Smooths_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 + #--------------------------------------------------- # Dependencies for: ./Generate_Mod.f90 #--------------------------------------------------- @@ -68,35 +93,15 @@ $(DIR_SHARED)/Gen_Mod/*.f90 $(DIR_OBJECT)/Range_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o -#--------------------------------------------------- -# Dependencies for: ./Main_Gen.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Main_Gen.o:\ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/Generate_Mod.o \ -Generate_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 - #--------------------------------------------------- # Dependencies for: ./Refines_Mod/Connectivity.f90 #--------------------------------------------------- $(DIR_OBJECT)/Connectivity.o: #--------------------------------------------------- -# Dependencies for: ./Smooths_Mod.f90 +# Dependencies for: ./Isoap_Mod/Isopol.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Smooths_Mod.o:\ -Smooths_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Isopol.o: #--------------------------------------------------- # Dependencies for: ./Isoap_Mod/Main_Isoap.f90 @@ -104,73 +109,50 @@ $(DIR_SHARED)/Grid_Mod/*.f90 $(DIR_OBJECT)/Main_Isoap.o: #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod/Isopol.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Isopol.o: - -#--------------------------------------------------- -# Dependencies for: ./Message_Mod.f90 +# Dependencies for: ./Gen_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Message_Mod.o:\ -$(DIR_OBJECT)/Tokenizer_Mod.o \ -$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ -$(DIR_SHARED)/Message_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Gen_Mod.o:\ +$(DIR_SHARED)/Gen_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod.f90 +# Dependencies for: ./Message_Mod/Thin_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Isoap_Mod.o:\ -$(DIR_OBJECT)/Polyhedron_Mod.o \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ -$(DIR_OBJECT)/Iso_Polygons_Mod.o \ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/readme \ -$(DIR_SHARED)/Isoap_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/Dim_Polyhedron.h +$(DIR_OBJECT)/Thin_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./File_Mod.f90 +# Dependencies for: ./Message_Mod/Thick_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/File_Mod.o:\ -$(DIR_OBJECT)/String_Mod.o \ -$(DIR_SHARED)/String_Mod/*.f90 \ -$(DIR_OBJECT)/Message_Mod.o \ -$(DIR_SHARED)/Message_Mod/*.f90 \ -$(DIR_SHARED)/File_Mod/*.f90 +$(DIR_OBJECT)/Thick_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Region_Mod.f90 +# Dependencies for: ./Message_Mod/Dashed_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Region_Mod.o:\ +$(DIR_OBJECT)/Dashed_Line.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Gen_Mod.f90 +# Dependencies for: ./Comm_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Gen_Mod.o:\ -$(DIR_SHARED)/Gen_Mod/*.f90 +$(DIR_OBJECT)/Comm_Mod.o:\ +$(DIR_OBJECT)/Const_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Sort_Mod.f90 +# Dependencies for: ./Metis_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Sort_Mod.o:\ -$(DIR_OBJECT)/Swap_Mod.o \ -$(DIR_SHARED)/Swap_Mod/*.f90 \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 +$(DIR_OBJECT)/Metis_Mod.o:\ +$(DIR_SHARED)/Metis_Mod/*.f90 \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Polyhedron_Mod.f90 +# Dependencies for: ./Math_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Polyhedron_Mod.o:\ -$(DIR_OBJECT)/Work_Mod.o \ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 +$(DIR_OBJECT)/Math_Mod.o:\ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- # Dependencies for: ./Control_Mod.f90 @@ -184,45 +166,45 @@ $(DIR_SHARED)/Control_Mod/*/*.f90 \ $(DIR_SHARED)/Control_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells.f90 +# Dependencies for: ./Vect_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells.o:\ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Vect_Mod.o:\ +$(DIR_SHARED)/Vect_Mod/*.f90 \ +$(DIR_OBJECT)/Region_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Dashed_Line.f90 +# Dependencies for: ./String_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Dashed_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/String_Mod.o:\ +$(DIR_SHARED)/String_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thin_Line.f90 +# Dependencies for: ./Profiler_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thin_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Profiler_Mod.o:\ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thick_Line.f90 +# Dependencies for: ./Assert_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thick_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Assert_Mod.o:\ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Work_Mod.f90 +# Dependencies for: ./Sort_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Work_Mod.o:\ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Sort_Mod.o:\ +$(DIR_OBJECT)/Swap_Mod.o \ +$(DIR_SHARED)/Swap_Mod/*.f90 \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Probe_1d_Nodes.f90 @@ -238,29 +220,6 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 -#--------------------------------------------------- -# Dependencies for: ./Vect_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Vect_Mod.o:\ -$(DIR_OBJECT)/Region_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Profiler_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Profiler_Mod.o:\ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Math_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Math_Mod.o:\ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o - #--------------------------------------------------- # Dependencies for: ./Swap_Mod.f90 #--------------------------------------------------- @@ -268,25 +227,15 @@ $(DIR_OBJECT)/Swap_Mod.o:\ $(DIR_SHARED)/Swap_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Assert_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Assert_Mod.o:\ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 \ -$(DIR_SHARED)/Assert_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./String_Mod.f90 +# Dependencies for: ./Region_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/String_Mod.o:\ -$(DIR_SHARED)/String_Mod/*.f90 +$(DIR_OBJECT)/Region_Mod.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +# Dependencies for: ./Probe_2d.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Probe_2d.o:\ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -295,6 +244,21 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 +#--------------------------------------------------- +# Dependencies for: ./Polyhedron_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Polyhedron_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Iso_Polygons_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 + #--------------------------------------------------- # Dependencies for: ./Grid_Mod.f90 #--------------------------------------------------- @@ -302,6 +266,7 @@ $(DIR_OBJECT)/Grid_Mod.o:\ $(DIR_OBJECT)/Vtk_Mod.o \ $(DIR_SHARED)/Vtk_Mod/*.f90 \ $(DIR_OBJECT)/Vect_Mod.o \ +$(DIR_SHARED)/Vect_Mod/*.f90 \ $(DIR_OBJECT)/Sort_Mod.o \ $(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Region_Mod.o \ @@ -315,26 +280,27 @@ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Stl_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Stl_Mod.o:\ -$(DIR_SHARED)/Stl_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Comm_Mod.f90 +# Dependencies for: ./Message_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Comm_Mod.o:\ +$(DIR_OBJECT)/Message_Mod.o:\ +$(DIR_OBJECT)/Tokenizer_Mod.o \ +$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ +$(DIR_SHARED)/Message_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Iso_Polygons_Mod.f90 +# Dependencies for: ./Isoap_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 +$(DIR_OBJECT)/Isoap_Mod.o:\ +$(DIR_OBJECT)/Polyhedron_Mod.o \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ +$(DIR_OBJECT)/Iso_Polygons_Mod.o \ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/readme \ +$(DIR_SHARED)/Isoap_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/Dim_Polyhedron.h #--------------------------------------------------- # Dependencies for: ./Vtk_Mod.f90 @@ -344,17 +310,30 @@ $(DIR_SHARED)/Vtk_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Metis_Mod.f90 +# Dependencies for: ./Stl_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Metis_Mod.o:\ -$(DIR_SHARED)/Metis_Mod/*.f90 \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Stl_Mod.o:\ +$(DIR_SHARED)/Stl_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_2d.f90 +# Dependencies for: ./Work_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_2d.o:\ +$(DIR_OBJECT)/Work_Mod.o:\ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -370,3 +349,26 @@ $(DIR_OBJECT)/Tokenizer_Mod.o:\ $(DIR_SHARED)/Tokenizer_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o +#--------------------------------------------------- +# Dependencies for: ./File_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/File_Mod.o:\ +$(DIR_OBJECT)/String_Mod.o \ +$(DIR_SHARED)/String_Mod/*.f90 \ +$(DIR_OBJECT)/Message_Mod.o \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_SHARED)/File_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Probe_1d_Cells.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Probe_1d_Cells.o:\ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o + diff --git a/Sources/Process/Backup_Mod.f90 b/Sources/Process/Backup_Mod.f90 index f0601be79..5854857cf 100644 --- a/Sources/Process/Backup_Mod.f90 +++ b/Sources/Process/Backup_Mod.f90 @@ -18,10 +18,10 @@ module Backup_Mod type(Backup_Type) :: backup # if T_FLOWS_MPI == 1 - type(Mpi_File) :: fh -#else - integer :: fh -#endif + type(Mpi_File) :: fh +# else + integer :: fh +# endif contains diff --git a/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Pressure.f90 b/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Pressure.f90 index 5d532b56d..9b0350b62 100644 --- a/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Pressure.f90 +++ b/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Pressure.f90 @@ -12,7 +12,6 @@ subroutine Grad_Gauss_Pressure(Flow, p) !----------------------------------[Locals]------------------------------------! type(Grid_Type), pointer :: Grid integer :: s, c, c1, c2, iter, reg - integer :: i_fac, c1_prim, c2_prim, s_prim integer, contiguous, pointer :: c_computed(:), c_visited(:), faces_c(:,:) real, contiguous, pointer :: p_x(:), p_y(:), p_z(:) !------------------------------[Local parameters]------------------------------! diff --git a/Sources/Process/Field_Mod/Utilities/Compute_Wall_Distance.f90 b/Sources/Process/Field_Mod/Utilities/Compute_Wall_Distance.f90 index 21e6cfdd2..831281f40 100644 --- a/Sources/Process/Field_Mod/Utilities/Compute_Wall_Distance.f90 +++ b/Sources/Process/Field_Mod/Utilities/Compute_Wall_Distance.f90 @@ -15,7 +15,6 @@ subroutine Compute_Wall_Distance(Flow, Sol) integer :: s, c, c1, c2, n real :: f_ex, f_im real :: phi_x_f, phi_y_f, phi_z_f - real :: vol_in_real, vol_in_fake, dist_min real, contiguous, pointer :: cross(:) !------------------------------[Local parameters]------------------------------! integer, parameter :: NDT = 24 ! number of false time steps diff --git a/Sources/Process/Front_Mod/Place_Front_At_Value.f90 b/Sources/Process/Front_Mod/Place_Front_At_Value.f90 index a6370e963..14a880265 100644 --- a/Sources/Process/Front_Mod/Place_Front_At_Value.f90 +++ b/Sources/Process/Front_Mod/Place_Front_At_Value.f90 @@ -18,7 +18,6 @@ subroutine Place_Front_At_Value(Front, sharp, verbose) type(Vert_Type), pointer :: Vert(:) type(Elem_Type), pointer :: Elem(:) integer, pointer :: nv, ne - integer :: nv_tot, ne_tot integer :: c, i, nb, nc, n, nn integer :: v, n_verts_in_buffers integer :: i_nod, i_ver, i_iso diff --git a/Sources/Process/Front_Mod/Save_Debug_Front_Vtu.f90 b/Sources/Process/Front_Mod/Save_Debug_Front_Vtu.f90 index aa6365835..964d3e615 100644 --- a/Sources/Process/Front_Mod/Save_Debug_Front_Vtu.f90 +++ b/Sources/Process/Front_Mod/Save_Debug_Front_Vtu.f90 @@ -15,7 +15,6 @@ subroutine Save_Debug_Front_Vtu(Front, time_step) integer :: offset, fu character(SL) :: name_out !-----------------------------[Local parameters]-------------------------------! - integer, parameter :: VTK_TRIANGLE = 5 ! cell shapes in VTK format character(len= 0) :: IN_0 = '' ! indentation levels character(len= 2) :: IN_1 = ' ' character(len= 4) :: IN_2 = ' ' diff --git a/Sources/Process/Main_Pro.f90 b/Sources/Process/Main_Pro.f90 index 3707f3f5d..1eb8d4cb4 100644 --- a/Sources/Process/Main_Pro.f90 +++ b/Sources/Process/Main_Pro.f90 @@ -137,7 +137,7 @@ program Process_Prog call Control_Mod_Switch_To_Domain(d) ! go back to local domain's control ! Read numerical models from control file (after the memory is allocated) - call Read_Control % Numerical_Schemes(Flow(d), Turb(d), Vof(d), Sol(d)) + call Read_Control % Numerical_Schemes(Flow(d), Turb(d), Vof(d)) call Read_Control % Linear_Solvers (Flow(d), Turb(d), Vof(d), Sol(d)) call Grid(d) % Find_Nodes_Cells() diff --git a/Sources/Process/Native_Mod.f90 b/Sources/Process/Native_Mod.f90 index 9fbedef75..7cfebf1d7 100644 --- a/Sources/Process/Native_Mod.f90 +++ b/Sources/Process/Native_Mod.f90 @@ -1,3 +1,5 @@ +#include "../Shared/Unused.h90" + !==============================================================================! module Native_Mod !------------------------------------------------------------------------------! diff --git a/Sources/Process/Native_Mod/Normalized_Root_Mean_Square.f90 b/Sources/Process/Native_Mod/Normalized_Root_Mean_Square.f90 index 080a8cc28..5eb94fcfe 100644 --- a/Sources/Process/Native_Mod/Normalized_Root_Mean_Square.f90 +++ b/Sources/Process/Native_Mod/Normalized_Root_Mean_Square.f90 @@ -1,12 +1,12 @@ !==============================================================================! - real function Normalized_Root_Mean_Square(Native, ni, r, A, x, norm) + real function Normalized_Root_Mean_Square(Nat, ni, r, A, x, norm) !------------------------------------------------------------------------------! ! Calculates root means square of vector r, normalizing it with entries ! ! in the system matrix (a), values of unknown (x) and optional norm. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Native_Type), intent(in) :: Native + class(Native_Type), intent(in) :: Nat integer, intent(in) :: ni real, intent(in) :: r(:) ! this may be in inner cells type(Matrix_Type), target, intent(in) :: A @@ -17,6 +17,8 @@ real function Normalized_Root_Mean_Square(Native, ni, r, A, x, norm) integer :: i real, contiguous, pointer :: a_val(:) integer, contiguous, pointer :: a_dia(:) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Nat) !==============================================================================! ! Take some aliases diff --git a/Sources/Process/Native_Mod/Prec_Form.f90 b/Sources/Process/Native_Mod/Prec_Form.f90 index 0c589ef7d..6be0b090b 100644 --- a/Sources/Process/Native_Mod/Prec_Form.f90 +++ b/Sources/Process/Native_Mod/Prec_Form.f90 @@ -1,11 +1,11 @@ !==============================================================================! - subroutine Prec_Form(Native, ni, A, d, d_inv, prec) + subroutine Prec_Form(Nat, ni, A, d, d_inv, prec) !------------------------------------------------------------------------------! ! Forms preconditioning matrix "D" from provided matrix "A". ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Native_Type), intent(in) :: Native + class(Native_Type), intent(in) :: Nat integer, intent(in) :: ni type(Matrix_Type), target, intent(in) :: A real, intent(out) :: d(:) @@ -16,6 +16,8 @@ subroutine Prec_Form(Native, ni, A, d, d_inv, prec) integer :: i, j, k integer, contiguous, pointer :: a_col(:), a_row(:), a_dia(:) real, contiguous, pointer :: a_val(:) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Nat) !==============================================================================! ! Take some aliases diff --git a/Sources/Process/Native_Mod/Prec_Solve.f90 b/Sources/Process/Native_Mod/Prec_Solve.f90 index ce642eacb..769a2ac22 100644 --- a/Sources/Process/Native_Mod/Prec_Solve.f90 +++ b/Sources/Process/Native_Mod/Prec_Solve.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Prec_Solve(Native, ni, A, d, d_inv, x, b, prec) + subroutine Prec_Solve(Nat, ni, A, d, d_inv, x, b, prec) !------------------------------------------------------------------------------! ! Solves the preconditioning system [D]{x}={b} ! !------------------------------------------------------------------------------! @@ -13,7 +13,7 @@ subroutine Prec_Solve(Native, ni, A, d, d_inv, x, b, prec) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Native_Type), intent(in) :: Native + class(Native_Type), intent(in) :: Nat integer, intent(in) :: ni type(Matrix_Type), target, intent(in) :: A real, intent(in) :: d(:) @@ -26,6 +26,8 @@ subroutine Prec_Solve(Native, ni, A, d, d_inv, x, b, prec) real :: sum integer, contiguous, pointer :: a_col(:), a_row(:), a_dia(:) real, contiguous, pointer :: a_val(:) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Nat) !==============================================================================! ! Take some aliases diff --git a/Sources/Process/Native_Mod/Residual_Vector.f90 b/Sources/Process/Native_Mod/Residual_Vector.f90 index 85cd16939..82be279d8 100644 --- a/Sources/Process/Native_Mod/Residual_Vector.f90 +++ b/Sources/Process/Native_Mod/Residual_Vector.f90 @@ -1,11 +1,11 @@ !==============================================================================! - subroutine Residual_Vector(Native, ni, r, b, A, x) + subroutine Residual_Vector(Nat, ni, r, b, A, x) !------------------------------------------------------------------------------! ! Calculates residual vector {r} = {b} - [A]{x} ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Native_Type), intent(in) :: Native + class(Native_Type), intent(in) :: Nat integer, intent(in) :: ni real, intent(out) :: r(:) ! only for inner cells real, intent(in) :: b(:) ! only for inner cells @@ -15,6 +15,8 @@ subroutine Residual_Vector(Native, ni, r, b, A, x) integer :: i, j, k real, contiguous, pointer :: a_val(:) integer, contiguous, pointer :: a_col(:), a_row(:) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Nat) !==============================================================================! ! Take some aliases diff --git a/Sources/Process/Native_Mod/Root_Mean_Square.f90 b/Sources/Process/Native_Mod/Root_Mean_Square.f90 index 1053f84e3..44635ee23 100644 --- a/Sources/Process/Native_Mod/Root_Mean_Square.f90 +++ b/Sources/Process/Native_Mod/Root_Mean_Square.f90 @@ -1,17 +1,19 @@ !==============================================================================! - real function Root_Mean_Square(Native, ni, r) + real function Root_Mean_Square(Nat, ni, r) !------------------------------------------------------------------------------! ! Calculates root means square of vector r without normalization. ! ! This non-normalized variant seems to be better option for ACM. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Native_Type), intent(in) :: Native + class(Native_Type), intent(in) :: Nat integer, intent(in) :: ni real, intent(in) :: r(:) ! this may be only in inner cells !-----------------------------------[Locals]-----------------------------------! real :: rms integer :: i +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Nat) !==============================================================================! ! Compute rms normalizing it with main diagonal in the system matrix diff --git a/Sources/Process/Petsc_Mod.f90 b/Sources/Process/Petsc_Mod.f90 index 2bd2c7949..4636ce051 100644 --- a/Sources/Process/Petsc_Mod.f90 +++ b/Sources/Process/Petsc_Mod.f90 @@ -1,3 +1,5 @@ +#include "../Shared/Unused.h90" + #if T_FLOWS_PETSC == 1 #include #include diff --git a/Sources/Process/Petsc_Mod/Fake/Create_Petsc.f90 b/Sources/Process/Petsc_Mod/Fake/Create_Petsc.f90 index 0b5252ea5..3395302a3 100644 --- a/Sources/Process/Petsc_Mod/Fake/Create_Petsc.f90 +++ b/Sources/Process/Petsc_Mod/Fake/Create_Petsc.f90 @@ -6,6 +6,8 @@ subroutine Create_Petsc(Pet, Nat, Grid) class(Petsc_Type) :: Pet type(Native_Type) :: Nat type(Grid_Type), target :: Grid +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Nat) !==============================================================================! Pet % pnt_grid => Grid diff --git a/Sources/Process/Petsc_Mod/Fake/Solve_Petsc.f90 b/Sources/Process/Petsc_Mod/Fake/Solve_Petsc.f90 index c1145069a..2a950eda4 100644 --- a/Sources/Process/Petsc_Mod/Fake/Solve_Petsc.f90 +++ b/Sources/Process/Petsc_Mod/Fake/Solve_Petsc.f90 @@ -21,6 +21,19 @@ subroutine Solve_Petsc(Pet, & real, intent(in) :: tol ! tolerance real, intent(out) :: fin_res ! final residual real, optional :: norm ! normalization +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Pet) + Unused(solver) + Unused(prec) + Unused(prec_opts) + Unused(A) + Unused(x) + Unused(b) + Unused(miter) + Unused(niter) + Unused(tol) + Unused(fin_res) + Unused(norm) !==============================================================================! ! Just to avoid compiler's warning diff --git a/Sources/Process/Process_Mod.f90 b/Sources/Process/Process_Mod.f90 index e776d4063..1015dff06 100644 --- a/Sources/Process/Process_Mod.f90 +++ b/Sources/Process/Process_Mod.f90 @@ -1,5 +1,6 @@ #include "../Shared/Assert.h90" #include "../Shared/Browse.h90" +#include "../Shared/Unused.h90" !==============================================================================! module Process_Mod diff --git a/Sources/Process/Process_Mod/Balance_Volume.f90 b/Sources/Process/Process_Mod/Balance_Volume.f90 index 44b916e38..89b78a4b2 100644 --- a/Sources/Process/Process_Mod/Balance_Volume.f90 +++ b/Sources/Process/Process_Mod/Balance_Volume.f90 @@ -28,6 +28,8 @@ subroutine Balance_Volume(Process, Flow, Vof) type(Face_Type), pointer :: v_flux integer :: s, c2, reg real :: fac, vol_outflow, area_outflow +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Process) !==============================================================================! call Profiler % Start('Balance_Volume') diff --git a/Sources/Process/Process_Mod/Compute_Energy.f90 b/Sources/Process/Process_Mod/Compute_Energy.f90 index b3b18d5fe..fbad51eb7 100644 --- a/Sources/Process/Process_Mod/Compute_Energy.f90 +++ b/Sources/Process/Process_Mod/Compute_Energy.f90 @@ -22,6 +22,8 @@ subroutine Compute_Energy(Process, Flow, Turb, Vof, Sol, curr_dt, ini) real :: a12, a21, con_eff, dt real :: f_ex, f_im, tx_f, ty_f, tz_f, t_stress, q_exp real, contiguous, pointer :: cap_dens(:), q_int(:), q_turb(:), cross(:) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Process) !------------------------------------------------------------------------------! ! ! The form of equations which are solved: diff --git a/Sources/Process/Process_Mod/Compute_Momentum.f90 b/Sources/Process/Process_Mod/Compute_Momentum.f90 index 99470ddd2..d6cac074d 100644 --- a/Sources/Process/Process_Mod/Compute_Momentum.f90 +++ b/Sources/Process/Process_Mod/Compute_Momentum.f90 @@ -32,6 +32,8 @@ subroutine Compute_Momentum(Process, Flow, Turb, Vof, Por, Sol, curr_dt, ini) real :: grav_i, p_drop_i real :: ui_si, ui_di real, contiguous, pointer :: cross(:) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Process) !------------------------------------------------------------------------------! ! ! ! Stress tensor on the face s: ! diff --git a/Sources/Process/Process_Mod/Compute_Momentum_Explicit.f90 b/Sources/Process/Process_Mod/Compute_Momentum_Explicit.f90 index 75c00896a..4046fccae 100644 --- a/Sources/Process/Process_Mod/Compute_Momentum_Explicit.f90 +++ b/Sources/Process/Process_Mod/Compute_Momentum_Explicit.f90 @@ -15,6 +15,8 @@ subroutine Compute_Momentum_Explicit(Process, Flow, ui, Nat) real, contiguous, pointer :: b(:) integer :: s, c, c1, c2 real, contiguous, pointer :: sum_neigh(:) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Process) !==============================================================================! call Profiler % Start('Compute_Momentum_Explicit') diff --git a/Sources/Process/Process_Mod/Compute_Scalar.f90 b/Sources/Process/Process_Mod/Compute_Scalar.f90 index 428362b79..9e7fa6ecc 100644 --- a/Sources/Process/Process_Mod/Compute_Scalar.f90 +++ b/Sources/Process/Process_Mod/Compute_Scalar.f90 @@ -27,6 +27,8 @@ subroutine Compute_Scalar(Process, Flow, Turb, Vof, Sol, curr_dt, ini, sc) real :: phi_stress, q_exp real :: phix_f, phiy_f, phiz_f real, contiguous, pointer :: q_turb(:), cross(:) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Process) !------------------------------------------------------------------------------! ! ! The form of equations which are solved: diff --git a/Sources/Process/Process_Mod/Convective_Outflow.f90 b/Sources/Process/Process_Mod/Convective_Outflow.f90 index 762d021b1..48d1150ed 100644 --- a/Sources/Process/Process_Mod/Convective_Outflow.f90 +++ b/Sources/Process/Process_Mod/Convective_Outflow.f90 @@ -21,6 +21,8 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) type(Face_Type), pointer :: v_flux integer :: c1, c2, s, sc, reg real :: nx, ny, nz, bulk_vel, phi_n, dt +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Process) !==============================================================================! ! Take aliases diff --git a/Sources/Process/Process_Mod/Correct_Velocity.f90 b/Sources/Process/Process_Mod/Correct_Velocity.f90 index 9e44e1921..b5b70886a 100644 --- a/Sources/Process/Process_Mod/Correct_Velocity.f90 +++ b/Sources/Process/Process_Mod/Correct_Velocity.f90 @@ -21,6 +21,8 @@ subroutine Correct_Velocity(Process, Flow, Vof, Sol, curr_dt, ini) real, contiguous, pointer :: b(:) integer :: c, c1, c2, s real :: cfl_t, pe_t, dens_f, visc_f, dt +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Process) !==============================================================================! call Profiler % Start('Correct_Velocity') diff --git a/Sources/Process/Process_Mod/Initialize_Variables.f90 b/Sources/Process/Process_Mod/Initialize_Variables.f90 index a94502d30..e356a28c4 100644 --- a/Sources/Process/Process_Mod/Initialize_Variables.f90 +++ b/Sources/Process/Process_Mod/Initialize_Variables.f90 @@ -56,6 +56,8 @@ subroutine Initialize_Variables(Process, Flow, Turb, Vof, Swarm, Sol) character(3) :: vis_def = '0.0', zeta_def = '0.0' character(3) :: uu_def = '0.0', vv_def = '0.0', ww_def = '0.0' character(3) :: uv_def = '0.0', uw_def = '0.0', vw_def = '0.0' +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Process) !==============================================================================! ! Take aliases diff --git a/Sources/Process/Process_Mod/Logo_Pro.f90 b/Sources/Process/Process_Mod/Logo_Pro.f90 index a13f9b191..ea603441e 100644 --- a/Sources/Process/Process_Mod/Logo_Pro.f90 +++ b/Sources/Process/Process_Mod/Logo_Pro.f90 @@ -6,6 +6,8 @@ subroutine Logo_Pro(Process) use Solver_Mod, only: PETSC_ACTIVE, this_proc !---------------------------------[Arguments]----------------------------------! class(Process_Type) :: Process +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Process) !==============================================================================! if(this_proc < 2) then diff --git a/Sources/Process/Process_Mod/Rhie_And_Chow.f90 b/Sources/Process/Process_Mod/Rhie_And_Chow.f90 index 755f538be..4ad174f71 100644 --- a/Sources/Process/Process_Mod/Rhie_And_Chow.f90 +++ b/Sources/Process/Process_Mod/Rhie_And_Chow.f90 @@ -32,6 +32,8 @@ subroutine Rhie_And_Chow(Process, Flow, Vof, Nat) real, contiguous, pointer :: u_c(:), v_c(:), w_c(:), v_m(:), t_m(:) real, contiguous, pointer :: pst_x(:), pst_y(:), pst_z(:), pst_d(:) real, contiguous, pointer :: u_f(:), v_f(:), w_f(:) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Process) !==============================================================================! call Profiler % Start('Rhie_And_Chow') diff --git a/Sources/Process/Process_Mod/Update_Boundary_Values.f90 b/Sources/Process/Process_Mod/Update_Boundary_Values.f90 index 6225062e7..4fe467720 100644 --- a/Sources/Process/Process_Mod/Update_Boundary_Values.f90 +++ b/Sources/Process/Process_Mod/Update_Boundary_Values.f90 @@ -34,6 +34,8 @@ subroutine Update_Boundary_Values(Process, Flow, Turb, Vof, update) type(Var_Type), pointer :: uu, vv, ww, uv, uw, vw integer :: c0, c1, c2, i_fac, s, s1, sc, reg real :: kin_vis, u_tau, dt_dn +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Process) !==============================================================================! call Profiler % Start('Update_Boundary_Values') diff --git a/Sources/Process/Read_Controls_Mod.f90 b/Sources/Process/Read_Controls_Mod.f90 index ecf8eaa96..e7bcc0f59 100644 --- a/Sources/Process/Read_Controls_Mod.f90 +++ b/Sources/Process/Read_Controls_Mod.f90 @@ -1,4 +1,6 @@ +#include "../Shared/Assert.h90" #include "../Shared/Browse.h90" +#include "../Shared/Unused.h90" !==============================================================================! module Read_Controls_Mod diff --git a/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 b/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 index ce0e18fda..99d84e36d 100644 --- a/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 +++ b/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 @@ -34,6 +34,8 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) real :: edd_r real :: edd_i logical :: found +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Rc) !==============================================================================! ! Take aliases diff --git a/Sources/Process/Read_Controls_Mod/Linear_Solvers.f90 b/Sources/Process/Read_Controls_Mod/Linear_Solvers.f90 index 8a3eb0f61..0d787c1be 100644 --- a/Sources/Process/Read_Controls_Mod/Linear_Solvers.f90 +++ b/Sources/Process/Read_Controls_Mod/Linear_Solvers.f90 @@ -19,7 +19,7 @@ subroutine Linear_Solvers(Rc, Flow, Turb, Vof, Sol) Sol % solvers = Solver_Mod_Linear_Solvers_Code(name) ! Read options for native solvers first ... - call Rc % Native_Solvers(Flow, Turb, Vof, Sol) + call Rc % Native_Solvers(Flow, Turb, Vof) ! ... and follow with options for PETSc call Rc % Petsc_Solvers(Flow, Turb, Vof, Sol) diff --git a/Sources/Process/Read_Controls_Mod/Native_Solvers.f90 b/Sources/Process/Read_Controls_Mod/Native_Solvers.f90 index 752631643..ed6c2de5a 100644 --- a/Sources/Process/Read_Controls_Mod/Native_Solvers.f90 +++ b/Sources/Process/Read_Controls_Mod/Native_Solvers.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Native_Solvers(Rc, Flow, Turb, Vof, Sol) + subroutine Native_Solvers(Rc, Flow, Turb, Vof) !------------------------------------------------------------------------------! ! Reads details about native solvers from control file. ! ! ! @@ -14,11 +14,12 @@ subroutine Native_Solvers(Rc, Flow, Turb, Vof, Sol) type(Field_Type), target :: Flow type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof - type(Solver_Type), target :: Sol !----------------------------------[Locals]------------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: tq, ui, phi integer :: i, sc +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Rc) !==============================================================================! ! Take alias diff --git a/Sources/Process/Read_Controls_Mod/Numerical_Schemes.f90 b/Sources/Process/Read_Controls_Mod/Numerical_Schemes.f90 index 6abf9e845..388a33913 100644 --- a/Sources/Process/Read_Controls_Mod/Numerical_Schemes.f90 +++ b/Sources/Process/Read_Controls_Mod/Numerical_Schemes.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Numerical_Schemes(Rc, Flow, Turb, Vof, Sol) + subroutine Numerical_Schemes(Rc, Flow, Turb, Vof) !------------------------------------------------------------------------------! ! Reads details about numerical schemes from control file. ! ! ! @@ -13,12 +13,13 @@ subroutine Numerical_Schemes(Rc, Flow, Turb, Vof, Sol) type(Field_Type), target :: Flow type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof - type(Solver_Type), target :: Sol !----------------------------------[Locals]------------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: tq, ui, phi character(SL) :: name integer :: i, sc +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Rc) !==============================================================================! ! Take alias diff --git a/Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 b/Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 index 1fd118e73..d1aea05d9 100644 --- a/Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 +++ b/Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 @@ -24,6 +24,8 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) character(SL) :: opts(MSI) integer :: i, n_opts, sc real :: tol +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Rc) !==============================================================================! ! If it wasn't compiled with PETSc, don't confuse a user with this diff --git a/Sources/Process/Read_Controls_Mod/Physical_Models.f90 b/Sources/Process/Read_Controls_Mod/Physical_Models.f90 index bd828d3fc..da0843ce6 100644 --- a/Sources/Process/Read_Controls_Mod/Physical_Models.f90 +++ b/Sources/Process/Read_Controls_Mod/Physical_Models.f90 @@ -18,6 +18,8 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) type(Bulk_Type), pointer :: bulk character(SL) :: name integer :: n_times, n_stat, n_stat_p +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Rc) !==============================================================================! ! Take aliases diff --git a/Sources/Process/Read_Controls_Mod/Physical_Properties.f90 b/Sources/Process/Read_Controls_Mod/Physical_Properties.f90 index 9bd53e2bf..0eb76a417 100644 --- a/Sources/Process/Read_Controls_Mod/Physical_Properties.f90 +++ b/Sources/Process/Read_Controls_Mod/Physical_Properties.f90 @@ -13,6 +13,8 @@ subroutine Physical_Properties(Rc, Flow, Vof, Swarm) type(Grid_Type), pointer :: Grid real :: dens_const, visc_const real :: capa_const, cond_const +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Rc) !==============================================================================! ! Take alias diff --git a/Sources/Process/Results_Mod.f90 b/Sources/Process/Results_Mod.f90 index be144f844..ff1684889 100644 --- a/Sources/Process/Results_Mod.f90 +++ b/Sources/Process/Results_Mod.f90 @@ -1,5 +1,6 @@ #include "../Shared/Assert.h90" #include "../Shared/Browse.h90" +#include "../Shared/Unused.h90" !==============================================================================! module Results_Mod diff --git a/Sources/Process/Results_Mod/Save_Front.f90 b/Sources/Process/Results_Mod/Save_Front.f90 index be3f1a8c5..d8318f9a1 100644 --- a/Sources/Process/Results_Mod/Save_Front.f90 +++ b/Sources/Process/Results_Mod/Save_Front.f90 @@ -21,6 +21,8 @@ subroutine Save_Front(Results, Front, time_step, domain) character(len= 6) :: IN_3 = ' ' character(len= 8) :: IN_4 = ' ' character(len=10) :: IN_5 = ' ' +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Results) !==============================================================================! ! Set precision for plotting (intp and floatp variables) diff --git a/Sources/Process/Results_Mod/Save_Results.f90 b/Sources/Process/Results_Mod/Save_Results.f90 index 37c77186c..1d7fb2d22 100644 --- a/Sources/Process/Results_Mod/Save_Results.f90 +++ b/Sources/Process/Results_Mod/Save_Results.f90 @@ -20,7 +20,7 @@ subroutine Save_Results(Results, & type(Var_Type), pointer :: phi integer(SP) :: data_size integer :: data_offset, cell_offset, i_fac, reg - integer :: s, n, n_conns, n_polyg, sc, f8, f9, ua, run + integer :: s, n, n_conns, n_polyg, sc, f8, f9, run integer :: s1, s2, c1, c2, c_f, c_l real :: dist1, dist2 character(SL) :: name_out_8, name_out_9, name_mean diff --git a/Sources/Process/Results_Mod/Save_Scalar_Int.f90 b/Sources/Process/Results_Mod/Save_Scalar_Int.f90 index f2d7345b1..955a94bb3 100644 --- a/Sources/Process/Results_Mod/Save_Scalar_Int.f90 +++ b/Sources/Process/Results_Mod/Save_Scalar_Int.f90 @@ -19,6 +19,8 @@ subroutine Save_Scalar_Int(Results, & integer(SP) :: data_size integer :: c1, c2, c_f, c_l character(SL) :: str1 +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Results) !==============================================================================! ! Set precision for plotting (intp and floatp variables) diff --git a/Sources/Process/Results_Mod/Save_Scalar_Real.f90 b/Sources/Process/Results_Mod/Save_Scalar_Real.f90 index 314696249..0147f0759 100644 --- a/Sources/Process/Results_Mod/Save_Scalar_Real.f90 +++ b/Sources/Process/Results_Mod/Save_Scalar_Real.f90 @@ -19,6 +19,8 @@ subroutine Save_Scalar_Real(Results, & integer(SP) :: data_size integer :: c1, c2, c_f, c_l character(SL) :: str1 +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Results) !==============================================================================! ! Set precision for plotting (intp and floatp variables) diff --git a/Sources/Process/Results_Mod/Save_Surf.f90 b/Sources/Process/Results_Mod/Save_Surf.f90 index 5eb8603f0..8d82d1e1d 100644 --- a/Sources/Process/Results_Mod/Save_Surf.f90 +++ b/Sources/Process/Results_Mod/Save_Surf.f90 @@ -21,6 +21,8 @@ subroutine Save_Surf(Results, surf, time_step) character(len= 6) :: IN_3 = ' ' character(len= 8) :: IN_4 = ' ' character(len=10) :: IN_5 = ' ' +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Results) !==============================================================================! ! Set precision for plotting (intp and floatp variables) diff --git a/Sources/Process/Results_Mod/Save_Swarm.f90 b/Sources/Process/Results_Mod/Save_Swarm.f90 index e0d66b8fc..e8ec47945 100644 --- a/Sources/Process/Results_Mod/Save_Swarm.f90 +++ b/Sources/Process/Results_Mod/Save_Swarm.f90 @@ -23,6 +23,8 @@ subroutine Save_Swarm(Results, Swarm, time_step, domain) character(len= 6) :: IN_3 = ' ' character(len= 8) :: IN_4 = ' ' character(len=10) :: IN_5 = ' ' +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Results) !==============================================================================! if(Swarm % n_particles < 1) return diff --git a/Sources/Process/Results_Mod/Save_Tensor_6_Real.f90 b/Sources/Process/Results_Mod/Save_Tensor_6_Real.f90 index ea18da02f..17bf19eb7 100644 --- a/Sources/Process/Results_Mod/Save_Tensor_6_Real.f90 +++ b/Sources/Process/Results_Mod/Save_Tensor_6_Real.f90 @@ -22,6 +22,8 @@ subroutine Save_Tensor_6_Real(Results, & integer(SP) :: data_size integer :: c1, c2, c_f, c_l character(SL) :: str1 +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Results) !==============================================================================! ! Set precision for plotting (intp and floatp variables) diff --git a/Sources/Process/Results_Mod/Save_Tensor_9_Real.f90 b/Sources/Process/Results_Mod/Save_Tensor_9_Real.f90 index 10b90a7c9..a87a0d4fe 100644 --- a/Sources/Process/Results_Mod/Save_Tensor_9_Real.f90 +++ b/Sources/Process/Results_Mod/Save_Tensor_9_Real.f90 @@ -24,6 +24,8 @@ subroutine Save_Tensor_9_Real(Results, & integer(SP) :: data_size integer :: c1, c2, c_f, c_l character(SL) :: str1 +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Results) !==============================================================================! ! Set precision for plotting (intp and floatp variables) diff --git a/Sources/Process/Results_Mod/Save_Vector_Real.f90 b/Sources/Process/Results_Mod/Save_Vector_Real.f90 index c61714520..06471e8b6 100644 --- a/Sources/Process/Results_Mod/Save_Vector_Real.f90 +++ b/Sources/Process/Results_Mod/Save_Vector_Real.f90 @@ -21,6 +21,8 @@ subroutine Save_Vector_Real(Results, & integer(SP) :: data_size integer :: c1, c2, c_f, c_l character(SL) :: str1 +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Results) !==============================================================================! ! Set precision for plotting (intp and floatp variables) diff --git a/Sources/Process/Solver_Mod.f90 b/Sources/Process/Solver_Mod.f90 index 20de990ec..1c53732c6 100644 --- a/Sources/Process/Solver_Mod.f90 +++ b/Sources/Process/Solver_Mod.f90 @@ -1,3 +1,5 @@ +#include "../Shared/Unused.h90" + !==============================================================================! module Solver_Mod !------------------------------------------------------------------------------! diff --git a/Sources/Process/Solver_Mod/End.f90 b/Sources/Process/Solver_Mod/End.f90 index 502f29243..89aabfea8 100644 --- a/Sources/Process/Solver_Mod/End.f90 +++ b/Sources/Process/Solver_Mod/End.f90 @@ -6,6 +6,8 @@ subroutine End(Sol) implicit none !---------------------------------[Arguments]----------------------------------! class(Solver_Type) :: Sol +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Sol) !==============================================================================! ! Call linear solver to solve the equations diff --git a/Sources/Process/Solver_Mod/Remove_Singular.f90 b/Sources/Process/Solver_Mod/Remove_Singular.f90 index 1ba68fe9b..9b947c1c7 100644 --- a/Sources/Process/Solver_Mod/Remove_Singular.f90 +++ b/Sources/Process/Solver_Mod/Remove_Singular.f90 @@ -5,6 +5,8 @@ subroutine Remove_Singular(Sol, A) !---------------------------------[Arguments]----------------------------------! class(Solver_Type) :: Sol type(Matrix_Type) :: A +!------------------------[Avoid unused parent warning]-------------------------! + Unused(A) !==============================================================================! ! Remove singularity information for PETSc diff --git a/Sources/Process/Swarm_Mod/Advance_Particles.f90 b/Sources/Process/Swarm_Mod/Advance_Particles.f90 index 75bd07fcb..4a5ed9e27 100644 --- a/Sources/Process/Swarm_Mod/Advance_Particles.f90 +++ b/Sources/Process/Swarm_Mod/Advance_Particles.f90 @@ -45,7 +45,7 @@ subroutine Swarm_Mod_Advance_Particles(Swarm, n, n_stat_p, first_dt_p) call Swarm_Mod_Particle_Time_Scale(Swarm) ! Store gradients for modeled Flow quantities for Swarm - call Swarm_Mod_Grad_Modeled_Flow(Swarm, k) + call Swarm_Mod_Grad_Modeled_Flow(Swarm) end if @@ -120,7 +120,7 @@ subroutine Swarm_Mod_Advance_Particles(Swarm, n, n_stat_p, first_dt_p) call Swarm % Check_Periodicity(k, n_parts_in_buffers) ! Gathering Swarm statistics - call Swarm_Mod_Calculate_Mean(Swarm, k, n, n_stat_p, ss) + call Swarm_Mod_Calculate_Mean(Swarm, k, n, n_stat_p) end if ! in this processor end if ! deposited or escaped diff --git a/Sources/Process/Swarm_Mod/Calculate_Mean.f90 b/Sources/Process/Swarm_Mod/Calculate_Mean.f90 index 9c4bf3b1c..6d6fdb740 100644 --- a/Sources/Process/Swarm_Mod/Calculate_Mean.f90 +++ b/Sources/Process/Swarm_Mod/Calculate_Mean.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Swarm_Mod_Calculate_Mean(Swarm, k, n, n_stat_p, ss) + subroutine Swarm_Mod_Calculate_Mean(Swarm, k, n, n_stat_p) !------------------------------------------------------------------------------! ! Calculates particle time averaged velocity ! !------------------------------------------------------------------------------! @@ -9,7 +9,6 @@ subroutine Swarm_Mod_Calculate_Mean(Swarm, k, n, n_stat_p, ss) integer, intent(in) :: k ! particle index integer, intent(in) :: n ! current time step (flow time step) integer, intent(in) :: n_stat_p ! starting time step for swarm statist. - integer, intent(in) :: ss ! sub steo !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Field_Type), pointer :: Flow diff --git a/Sources/Process/Swarm_Mod/Grad_Modeled_Flow.f90 b/Sources/Process/Swarm_Mod/Grad_Modeled_Flow.f90 index 17abb7c77..f3143145c 100644 --- a/Sources/Process/Swarm_Mod/Grad_Modeled_Flow.f90 +++ b/Sources/Process/Swarm_Mod/Grad_Modeled_Flow.f90 @@ -1,12 +1,11 @@ !==============================================================================! - subroutine Swarm_Mod_Grad_Modeled_Flow(Swarm, k) + subroutine Swarm_Mod_Grad_Modeled_Flow(Swarm) !------------------------------------------------------------------------------! ! Stores gradients of modeled Flow parameters for swarm SGS models ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! type(Swarm_Type), target :: Swarm - integer :: k !-----------------------------------[Locals]-----------------------------------! type(Field_Type), pointer :: Flow type(Grid_Type), pointer :: Grid diff --git a/Sources/Process/Swarm_Mod/Move_Particle.f90 b/Sources/Process/Swarm_Mod/Move_Particle.f90 index bde18fdc0..f26205729 100644 --- a/Sources/Process/Swarm_Mod/Move_Particle.f90 +++ b/Sources/Process/Swarm_Mod/Move_Particle.f90 @@ -28,7 +28,7 @@ subroutine Move_Particle(Swarm, k) real :: f_fx, f_fy, f_fz ! Brownian force components real :: fd_p ! particle damping funct. real :: v2_mod_xc, v2_mod_yc, v2_mod_zc - real :: u_mod, v_mod, w_mod + real :: w_mod ! , u_mod, v_mod !==============================================================================! ! Take aliases for Flow diff --git a/Sources/Process/Swarm_Mod/Move_Trapped.f90 b/Sources/Process/Swarm_Mod/Move_Trapped.f90 index 8ba62f31d..6cca3b267 100644 --- a/Sources/Process/Swarm_Mod/Move_Trapped.f90 +++ b/Sources/Process/Swarm_Mod/Move_Trapped.f90 @@ -14,9 +14,10 @@ subroutine Move_Trapped(Swarm, k) type(Field_Type), pointer :: Flow type(Particle_Type), pointer :: Part type(Var_Type), pointer :: u, v, w, smooth - integer :: ver, c, n_verts_in_buffers - real :: max_dis, rx, ry, rz, r, u_p, v_p, w_p + integer :: c + real :: max_dis, rx, ry, rz real :: nx, ny, nz, dm, smooth_m, smooth_p +! real :: r, u_p, v_p, w_p !==============================================================================! ! Take aliases diff --git a/Sources/Process/Turb_Mod.f90 b/Sources/Process/Turb_Mod.f90 index 121c32655..17e5e38c7 100644 --- a/Sources/Process/Turb_Mod.f90 +++ b/Sources/Process/Turb_Mod.f90 @@ -1,3 +1,5 @@ +#include "../Shared/Unused.h90" + !==============================================================================! module Turb_Mod !------------------------------------------------------------------------------! diff --git a/Sources/Process/Turb_Mod/Calculate_Scalar_Flux.f90 b/Sources/Process/Turb_Mod/Calculate_Scalar_Flux.f90 index 63cdda2c6..4ad7229a9 100644 --- a/Sources/Process/Turb_Mod/Calculate_Scalar_Flux.f90 +++ b/Sources/Process/Turb_Mod/Calculate_Scalar_Flux.f90 @@ -16,7 +16,6 @@ subroutine Calculate_Scalar_Flux(Turb, sc) integer :: c, k, c1, c2, s real :: uc_log_law, vc_log_law, wc_log_law real :: nx, ny, nz, ebf - real :: uc_new, vc_new, wc_new !==============================================================================! ! Take aliases diff --git a/Sources/Process/Turb_Mod/Calculate_Stress.f90 b/Sources/Process/Turb_Mod/Calculate_Stress.f90 index e08d52317..00aff3303 100644 --- a/Sources/Process/Turb_Mod/Calculate_Stress.f90 +++ b/Sources/Process/Turb_Mod/Calculate_Stress.f90 @@ -13,12 +13,8 @@ subroutine Calculate_Stress(Turb) type(Var_Type), pointer :: uu, vv, ww, uv, uw, vw type(Var_Type), pointer :: kin, eps, zeta, f22 integer :: c, nc, nb - real :: wd_m, u2, v2, w2 - real, contiguous, pointer :: wd_x(:), wd_y(:), wd_z(:) !==============================================================================! - call Work % Connect_Real_Cell(wd_x, wd_y, wd_z) - ! Take aliases Flow => Turb % pnt_flow Grid => Flow % pnt_grid @@ -78,6 +74,4 @@ subroutine Calculate_Stress(Turb) end do end if - call Work % Disconnect_Real_Cell(wd_x, wd_y, wd_z) - end subroutine diff --git a/Sources/Process/Turb_Mod/Compute_F22.f90 b/Sources/Process/Turb_Mod/Compute_F22.f90 index bc8768276..b0b92e382 100644 --- a/Sources/Process/Turb_Mod/Compute_F22.f90 +++ b/Sources/Process/Turb_Mod/Compute_F22.f90 @@ -20,7 +20,9 @@ subroutine Compute_F22(Turb, Sol, curr_dt, ini, phi) real :: a0, a12, a21 real :: phi_x_f, phi_y_f, phi_z_f real, contiguous, pointer :: cross(:) -!==============================================================================! +!------------------------[Avoid unused parent warning]-------------------------! + Unused(curr_dt) +!------------------------------------------------------------------------------! ! ! ! The form of equations which are solved: ! ! ! @@ -38,7 +40,7 @@ subroutine Compute_F22(Turb, Sol, curr_dt, ini, phi) ! ! ! f22 [1/s] ! ! Lsc [m] ! -!------------------------------------------------------------------------------! +!==============================================================================! call Profiler % Start('Compute_F22 (without solvers)') diff --git a/Sources/Process/Turb_Mod/Compute_Stress.f90 b/Sources/Process/Turb_Mod/Compute_Stress.f90 index 6c4e06e8e..719568b72 100644 --- a/Sources/Process/Turb_Mod/Compute_Stress.f90 +++ b/Sources/Process/Turb_Mod/Compute_Stress.f90 @@ -30,7 +30,9 @@ subroutine Compute_Stress(Turb, Sol, curr_dt, ini, phi) real, contiguous, pointer :: phi_x(:), phi_y(:), phi_z(:), cross(:) real, contiguous, pointer :: u1uj_phij(:), u2uj_phij(:), u3uj_phij(:) real, contiguous, pointer :: u1uj_phij_x(:), u2uj_phij_y(:), u3uj_phij_z(:) -!==============================================================================! +!------------------------[Avoid unused parent warning]-------------------------! + Unused(curr_dt) +!------------------------------------------------------------------------------! ! ! ! The form of equations which are being solved: ! ! ! @@ -40,7 +42,7 @@ subroutine Compute_Stress(Turb, Sol, curr_dt, ini, phi) ! | dt | | sigma | ! ! / / / / ! ! ! -!------------------------------------------------------------------------------! +!==============================================================================! call Profiler % Start('Compute_Stress (without solvers)') diff --git a/Sources/Process/Turb_Mod/Const_Les.f90 b/Sources/Process/Turb_Mod/Const_Les.f90 index 9d0b1b559..066892a3d 100644 --- a/Sources/Process/Turb_Mod/Const_Les.f90 +++ b/Sources/Process/Turb_Mod/Const_Les.f90 @@ -6,6 +6,8 @@ subroutine Const_Les(Turb) implicit none !---------------------------------[Arguments]----------------------------------! class(Turb_Type), target :: Turb +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Turb) !==============================================================================! c_mu = 0.09 diff --git a/Sources/Process/Turb_Mod/Src_Eps_K_Eps.f90 b/Sources/Process/Turb_Mod/Src_Eps_K_Eps.f90 index ba7b14c4f..e364fd537 100644 --- a/Sources/Process/Turb_Mod/Src_Eps_K_Eps.f90 +++ b/Sources/Process/Turb_Mod/Src_Eps_K_Eps.f90 @@ -24,10 +24,10 @@ subroutine Src_Eps_K_Eps(Turb, Sol) real, pointer :: b(:) integer :: s, c, c1, c2, j real :: u_tan, u_tau - real :: re_t, f_mu, u_tau_new, fa, kin_vis + real :: re_t, f_mu, fa, kin_vis real :: eps_wf, eps_int, y_star, dia_coef_tmp real :: p_kin_int, p_kin_wf, ebf, z_o -!==============================================================================! +!------------------------------------------------------------------------------! ! Dimensions: ! ! ! ! production p_kin [m^2/s^3] | rate-of-strain shear [1/s] ! @@ -39,7 +39,7 @@ subroutine Src_Eps_K_Eps(Turb, Sol) !------------------------------------------------------------------------------! ! p_kin = 2*vis_t / density S_ij S_ij ! ! shear = sqrt(2 S_ij S_ij) ! -!------------------------------------------------------------------------------! +!==============================================================================! ! Take aliases Flow => Turb % pnt_flow diff --git a/Sources/Process/Turb_Mod/Src_Eps_K_Eps_Zeta_F.f90 b/Sources/Process/Turb_Mod/Src_Eps_K_Eps_Zeta_F.f90 index 973a39d15..20d177261 100644 --- a/Sources/Process/Turb_Mod/Src_Eps_K_Eps_Zeta_F.f90 +++ b/Sources/Process/Turb_Mod/Src_Eps_K_Eps_Zeta_F.f90 @@ -19,9 +19,9 @@ subroutine Src_Eps_K_Eps_Zeta_F(Turb, Sol) real :: u_tan, u_tau real :: e_sor, c_11e, ebf real :: eps_wf, eps_int - real :: fa, u_tau_new, kin_vis, p_kin_int, p_kin_wf + real :: fa, kin_vis, p_kin_int, p_kin_wf real :: z_o, dia_coef_tmp -!==============================================================================! +!------------------------------------------------------------------------------! ! In dissipation of turbulent kinetic energy equation exist two ! ! source terms which have form: ! ! ! @@ -44,7 +44,7 @@ subroutine Src_Eps_K_Eps_Zeta_F(Turb, Sol) !------------------------------------------------------------------------------! ! p_kin = 2*vis_t / density S_ij S_ij ! ! shear = sqrt(2 S_ij S_ij) ! -!------------------------------------------------------------------------------! +!==============================================================================! ! Take aliases Flow => Turb % pnt_flow diff --git a/Sources/Process/Turb_Mod/Tau_Wall_Log_Law.f90 b/Sources/Process/Turb_Mod/Tau_Wall_Log_Law.f90 index e5113c457..df1ac1bc4 100644 --- a/Sources/Process/Turb_Mod/Tau_Wall_Log_Law.f90 +++ b/Sources/Process/Turb_Mod/Tau_Wall_Log_Law.f90 @@ -8,6 +8,8 @@ real function Tau_Wall_Log_Law(Turb, dens, u_tau, u_tan, wall_dist, & !---------------------------------[Arguments]----------------------------------! class(Turb_Type) :: Turb real :: dens, u_tau, u_tan, wall_dist, y_plus, z_o +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Turb) !==============================================================================! if(z_o > TINY) then diff --git a/Sources/Process/Turb_Mod/U_Plus_Log_Law.f90 b/Sources/Process/Turb_Mod/U_Plus_Log_Law.f90 index dab1b1679..0831cc237 100644 --- a/Sources/Process/Turb_Mod/U_Plus_Log_Law.f90 +++ b/Sources/Process/Turb_Mod/U_Plus_Log_Law.f90 @@ -7,6 +7,8 @@ real function U_Plus_Log_Law(Turb, wall_dist, y_plus, z_o) !---------------------------------[Arguments]----------------------------------! class(Turb_Type) :: Turb real :: y_plus, wall_dist, z_o +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Turb) !==============================================================================! if(z_o > TINY) then diff --git a/Sources/Process/Turb_Mod/Vis_T_Hybrid_Les_Prandtl.f90 b/Sources/Process/Turb_Mod/Vis_T_Hybrid_Les_Prandtl.f90 index 1cb19dd03..df1cb9a30 100644 --- a/Sources/Process/Turb_Mod/Vis_T_Hybrid_Les_Prandtl.f90 +++ b/Sources/Process/Turb_Mod/Vis_T_Hybrid_Les_Prandtl.f90 @@ -13,8 +13,8 @@ subroutine Vis_T_Hybrid_Les_Prandtl(Turb) !---------------------------------[Arguments]----------------------------------! class(Turb_Type), target :: Turb !------------------------------[Local parameters]------------------------------! - integer, parameter :: A_POW = 8.3 - integer, parameter :: B_POW = 1.0/7.0 + real, parameter :: A_POW = 8.3 + real, parameter :: B_POW = 1.0/7.0 !-----------------------------------[Locals]-----------------------------------! type(Field_Type), pointer :: Flow type(Grid_Type), pointer :: Grid diff --git a/Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 b/Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 index 2e6228bc6..d5a3777c2 100644 --- a/Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 +++ b/Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 @@ -11,8 +11,8 @@ subroutine Vis_T_Subgrid(Turb) !---------------------------------[Arguments]----------------------------------! class(Turb_Type), target :: Turb !------------------------------[Local parameters]------------------------------! - integer, parameter :: A_POW = 8.3 - integer, parameter :: B_POW = 1.0/7.0 + real, parameter :: A_POW = 8.3 + real, parameter :: B_POW = 1.0/7.0 !-----------------------------------[Locals]-----------------------------------! type(Field_Type), pointer :: Flow type(Grid_Type), pointer :: Grid diff --git a/Sources/Process/Turb_Mod/Y_Plus_Rough_Walls.f90 b/Sources/Process/Turb_Mod/Y_Plus_Rough_Walls.f90 index 8e2e72031..57427c33b 100644 --- a/Sources/Process/Turb_Mod/Y_Plus_Rough_Walls.f90 +++ b/Sources/Process/Turb_Mod/Y_Plus_Rough_Walls.f90 @@ -7,6 +7,8 @@ real function Y_Plus_Rough_Walls(Turb, u_tau, wall_dist, kin_vis, z_o) !---------------------------------[Arguments]----------------------------------! class(Turb_Type) :: Turb real :: u_tau, wall_dist, kin_vis, z_o +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Turb) !==============================================================================! Y_Plus_Rough_Walls = u_tau * (wall_dist + z_o) / kin_vis diff --git a/Sources/Process/Vof_Mod.f90 b/Sources/Process/Vof_Mod.f90 index 9a9dce3a4..d70a199c8 100644 --- a/Sources/Process/Vof_Mod.f90 +++ b/Sources/Process/Vof_Mod.f90 @@ -1,5 +1,6 @@ #include "../Shared/Assert.h90" #include "../Shared/Browse.h90" +#include "../Shared/Unused.h90" !==============================================================================! module Vof_Mod diff --git a/Sources/Process/Vof_Mod/Core/Initialize_From_Stl.f90 b/Sources/Process/Vof_Mod/Core/Initialize_From_Stl.f90 index b36b436db..b47de9124 100644 --- a/Sources/Process/Vof_Mod/Core/Initialize_From_Stl.f90 +++ b/Sources/Process/Vof_Mod/Core/Initialize_From_Stl.f90 @@ -24,12 +24,12 @@ subroutine Initialize_From_Stl(Vof) integer :: i_iso, i_ver, i_fac, fac, p, reg integer :: n_cut_facets, cut_facets(1024) real :: vol_1, vol_2, vol_3, vol_4, vol_5 - real :: cell_vol, cel0_vol, cel1_vol, d, d1, d2 + real :: cell_vol, cel0_vol, cel1_vol, d real :: p1(3), p2(3), p3(3), qc(3), qn(3) real :: f(3), n(3) integer :: ij_cut(MAX_ISOAP_VERTS, MAX_ISOAP_VERTS) integer :: new_faces_n_nodes, cnt_p, cnt_m - integer :: new_faces_n(MAX_ISOAP_VERTS), processed_cells + integer :: new_faces_n(MAX_ISOAP_VERTS) logical :: flooding !==============================================================================! diff --git a/Sources/Process/Vof_Mod/Curvature/Smooth_Scalar.f90 b/Sources/Process/Vof_Mod/Curvature/Smooth_Scalar.f90 index cb6d8643a..57b8c7453 100644 --- a/Sources/Process/Vof_Mod/Curvature/Smooth_Scalar.f90 +++ b/Sources/Process/Vof_Mod/Curvature/Smooth_Scalar.f90 @@ -15,6 +15,8 @@ subroutine Smooth_Scalar(Vof, Grid, var, smooth_var, n_conv) integer :: s, c, c1, c2, c_iter real :: fs, vol_face real, contiguous, pointer :: sum_vol_area(:), sum_area(:) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Vof) !==============================================================================! call Work % Connect_Real_Cell(sum_vol_area, sum_area) diff --git a/Sources/Process/makefile b/Sources/Process/makefile index 150a86fe0..0e0cd45f8 100644 --- a/Sources/Process/makefile +++ b/Sources/Process/makefile @@ -37,8 +37,8 @@ PROGRAM_FILE = $(DIR_BINARY)/$(PROGRAM_NAME) PASS_ON = -DT_FLOWS_COMPILATION=1 #---------------------------------------------------------- -# It soon adds T_FLOWS_PROGRAM and T_FLOWS_ASSERT and -# later on it adds also T_FLOWS_MPI and T_FLOWS_PETSC +# Add T_FLOWS_PROGRAM, T_FLOWS_ASSERT and T_FLOWS_DEBUG +# and later on it add also T_FLOWS_MPI and T_FLOWS_PETSC #---------------------------------------------------------- PASS_ON += -DT_FLOWS_PROGRAM=4 @@ -48,6 +48,12 @@ else PASS_ON += -DT_FLOWS_ASSERT=0 endif +ifeq ($(DEBUG), yes) + PASS_ON += -DT_FLOWS_DEBUG=1 +else + PASS_ON += -DT_FLOWS_DEBUG=0 +endif + $(info #=======================================================================) $(info # Compiling $(PROGRAM_NAME) with $(FORTRAN) compiler ) $(info #-----------------------------------------------------------------------) @@ -155,7 +161,8 @@ else endif OPT_F_COMP = -J $(DIR_MODULE) -cpp -ffree-line-length-none ifeq ($(DEBUG), yes) - OPT_F_COMP += -O0 -g -fcheck=all -Wunused-parameter -Wall + OPT_F_COMP += -O0 -g -fcheck=all -Wunused-parameter -Wall \ + -Wno-integer-division else OPT_F_COMP += -O3 endif @@ -356,12 +363,7 @@ MOD = $(SRC_F_MOD_LOW:%.f90=$(DIR_MODULE)/%.mod) # Note: This doesn't need editing. #--------------------------------------------------------- -# Fortran modules -$(DIR_OBJECT)/%.o: %.f90 %/*.f90 - @echo $(FC) $< - @$(FC) $(OPT_F_COMP) $(PASS_ON) -c -o $@ $< - -# Fortran functions +# Fortran sources $(DIR_OBJECT)/%.o: %.f90 @echo $(FC) $< @$(FC) $(OPT_F_COMP) $(PASS_ON) -c -o $@ $< diff --git a/Sources/Process/makefile_explicit_dependencies b/Sources/Process/makefile_explicit_dependencies index 0c410b9c0..513f2c417 100644 --- a/Sources/Process/makefile_explicit_dependencies +++ b/Sources/Process/makefile_explicit_dependencies @@ -1,27 +1,35 @@ #--------------------------------------------------- -# Dependencies for: ./Backup_Mod.f90 +# Dependencies for: ./Bulk_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Backup_Mod.o:\ -$(DIR_OBJECT)/User_Mod.o \ -User_Mod/*.f90 \ -Backup_Mod/*.f90 +$(DIR_OBJECT)/Bulk_Mod.o:\ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +Bulk_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Monitor_Mod.f90 +# Dependencies for: ./Eddies_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Monitor_Mod.o:\ -Monitor_Mod/*.f90 \ +$(DIR_OBJECT)/Eddies_Mod.o:\ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Field_Mod.o \ -Field_Mod/*/*.f90 +Field_Mod/*/*.f90 \ +Eddies_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Matrix_Mod.f90 +# Dependencies for: ./Porosity_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Matrix_Mod.o:\ -Matrix_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Porosity_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_OBJECT)/Stl_Mod.o \ +$(DIR_SHARED)/Stl_Mod/*.f90 \ +Porosity_Mod/*.f90 \ +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Particle_Mod.f90 @@ -32,99 +40,46 @@ Vof_Mod/*/*.f90 \ Particle_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Process_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Process_Mod.o:\ -$(DIR_OBJECT)/Vof_Mod.o \ -Vof_Mod/*/*.f90 \ -$(DIR_OBJECT)/User_Mod.o \ -User_Mod/*.f90 \ -$(DIR_OBJECT)/Turb_Mod.o \ -Turb_Mod/*.f90 \ -$(DIR_OBJECT)/Swarm_Mod.o \ -Swarm_Mod/*.f90 \ -$(DIR_OBJECT)/Solver_Mod.o \ -Solver_Mod/*.f90 \ -$(DIR_OBJECT)/Results_Mod.o \ -Results_Mod/*.f90 \ -$(DIR_OBJECT)/Read_Controls_Mod.o \ -Read_Controls_Mod/*.f90 \ -Process_Mod/*.f90 \ -$(DIR_OBJECT)/Numerics_Mod.o \ -Numerics_Mod/*.f90 \ -$(DIR_OBJECT)/Monitor_Mod.o \ -Monitor_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Field_Mod.o \ -Field_Mod/*/*.f90 \ -$(DIR_OBJECT)/Control_Mod.o \ -$(DIR_SHARED)/Control_Mod/*/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o \ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 \ -$(DIR_OBJECT)/Bulk_Mod.o \ -Bulk_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Vector_Mod.f90 +# Dependencies for: ./Vert_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Vector_Mod.o:\ -Vector_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Vert_Mod.o:\ +Vert_Mod/*.f90 \ +$(DIR_OBJECT)/Point_Mod.o \ +Point_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Results_Mod.f90 +# Dependencies for: ./Read_Controls_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Results_Mod.o:\ -Results_Mod/*.f90 \ -$(DIR_OBJECT)/Backup_Mod.o \ -Backup_Mod/*.f90 +$(DIR_OBJECT)/Read_Controls_Mod.o:\ +$(DIR_OBJECT)/Swarm_Mod.o \ +Swarm_Mod/*.f90 \ +Read_Controls_Mod/*.f90 \ +$(DIR_OBJECT)/Eddies_Mod.o \ +Eddies_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Native_Mod.f90 +# Dependencies for: ./Swarm_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Native_Mod.o:\ -$(DIR_OBJECT)/Work_Mod.o \ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_OBJECT)/Vector_Mod.o \ -Vector_Mod/*.f90 \ -Native_Mod/*.f90 \ -$(DIR_OBJECT)/Matrix_Mod.o \ -Matrix_Mod/*.f90 \ -$(DIR_OBJECT)/Control_Mod.o \ -$(DIR_SHARED)/Control_Mod/*/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 +$(DIR_OBJECT)/Swarm_Mod.o:\ +Swarm_Mod/*.f90 \ +$(DIR_OBJECT)/Particle_Mod.o \ +Particle_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Interface_Mod.f90 +# Dependencies for: ./Petsc_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Interface_Mod.o:\ -$(DIR_OBJECT)/Turb_Mod.o \ -Turb_Mod/*.f90 \ -$(DIR_OBJECT)/Profiler_Mod.o \ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -Interface_Mod/*.f90 \ -$(DIR_OBJECT)/Control_Mod.o \ -$(DIR_SHARED)/Control_Mod/*/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 +$(DIR_OBJECT)/Petsc_Mod.o:\ +Petsc_Mod/*/*.f90 \ +$(DIR_OBJECT)/Native_Mod.o \ +Native_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Read_Controls_Mod.f90 +# Dependencies for: ./Info_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Read_Controls_Mod.o:\ -$(DIR_OBJECT)/Swarm_Mod.o \ -Swarm_Mod/*.f90 \ -Read_Controls_Mod/*.f90 \ -$(DIR_OBJECT)/Eddies_Mod.o \ -Eddies_Mod/*.f90 +$(DIR_OBJECT)/Info_Mod.o:\ +Info_Mod/*.f90 \ +$(DIR_OBJECT)/Field_Mod.o \ +Field_Mod/*/*.f90 #--------------------------------------------------- # Dependencies for: ./Numerics_Mod.f90 @@ -140,33 +95,29 @@ $(DIR_OBJECT)/Matrix_Mod.o \ Matrix_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Main_Pro.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Main_Pro.o:\ -$(DIR_OBJECT)/Process_Mod.o \ -Process_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Vert_Mod.f90 +# Dependencies for: ./Vof_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Vert_Mod.o:\ -Vert_Mod/*.f90 \ -$(DIR_OBJECT)/Point_Mod.o \ -Point_Mod/*.f90 +$(DIR_OBJECT)/Vof_Mod.o:\ +Vof_Mod/*/*.f90 \ +$(DIR_OBJECT)/Turb_Mod.o \ +Turb_Mod/*.f90 \ +Surf_Mod/readme \ +$(DIR_OBJECT)/Surf_Mod.o \ +Surf_Mod/*.f90 \ +$(DIR_OBJECT)/Stl_Mod.o \ +$(DIR_SHARED)/Stl_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Porosity_Mod.f90 +# Dependencies for: ./User_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Porosity_Mod.o:\ -$(DIR_OBJECT)/Work_Mod.o \ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_OBJECT)/Stl_Mod.o \ -$(DIR_SHARED)/Stl_Mod/*.f90 \ +$(DIR_OBJECT)/User_Mod.o:\ +User_Mod/*.f90 \ +$(DIR_OBJECT)/Swarm_Mod.o \ +Swarm_Mod/*.f90 \ +$(DIR_OBJECT)/Porosity_Mod.o \ Porosity_Mod/*.f90 \ -$(DIR_OBJECT)/Control_Mod.o \ -$(DIR_SHARED)/Control_Mod/*/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 +$(DIR_OBJECT)/Interface_Mod.o \ +Interface_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Solver_Mod.f90 @@ -177,54 +128,66 @@ $(DIR_OBJECT)/Petsc_Mod.o \ Petsc_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Elem_Mod.f90 +# Dependencies for: ./Surf_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Elem_Mod.o:\ -Elem_Mod/*.f90 +$(DIR_OBJECT)/Surf_Mod.o:\ +Surf_Mod/readme \ +Surf_Mod/*.f90 \ +Front_Mod/readme \ +$(DIR_OBJECT)/Front_Mod.o \ +Front_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Eddies_Mod.f90 +# Dependencies for: ./Monitor_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Eddies_Mod.o:\ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Monitor_Mod.o:\ +Monitor_Mod/*.f90 \ $(DIR_OBJECT)/Field_Mod.o \ -Field_Mod/*/*.f90 \ -Eddies_Mod/*.f90 +Field_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./User_Mod.f90 +# Dependencies for: ./Main_Pro.f90 #--------------------------------------------------- -$(DIR_OBJECT)/User_Mod.o:\ -User_Mod/*.f90 \ -$(DIR_OBJECT)/Swarm_Mod.o \ -Swarm_Mod/*.f90 \ -$(DIR_OBJECT)/Porosity_Mod.o \ -Porosity_Mod/*.f90 \ -$(DIR_OBJECT)/Interface_Mod.o \ -Interface_Mod/*.f90 +$(DIR_OBJECT)/Main_Pro.o:\ +$(DIR_OBJECT)/Process_Mod.o \ +Process_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Petsc_Mod.f90 +# Dependencies for: ./Surf_Mod/Place_Surf_At_Value.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Petsc_Mod.o:\ -Petsc_Mod/*/*.f90 \ -$(DIR_OBJECT)/Native_Mod.o \ -Native_Mod/*.f90 +$(DIR_OBJECT)/Place_Surf_At_Value.o: #--------------------------------------------------- -# Dependencies for: ./Field_Mod.f90 +# Dependencies for: ./Vector_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Field_Mod.o:\ -$(DIR_OBJECT)/Solver_Mod.o \ -Solver_Mod/*.f90 \ -$(DIR_OBJECT)/Numerics_Mod.o \ -Numerics_Mod/*.f90 \ -Field_Mod/*/*.f90 \ -$(DIR_OBJECT)/Face_Mod.o \ -Face_Mod/*.f90 \ -$(DIR_OBJECT)/Bulk_Mod.o \ -Bulk_Mod/*.f90 +$(DIR_OBJECT)/Vector_Mod.o:\ +Vector_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Var_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Var_Mod.o:\ +Var_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Backup_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Backup_Mod.o:\ +$(DIR_OBJECT)/User_Mod.o \ +User_Mod/*.f90 \ +Backup_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Elem_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Elem_Mod.o:\ +Elem_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Front_Mod.f90 @@ -236,7 +199,6 @@ $(DIR_OBJECT)/Side_Mod.o \ $(DIR_SHARED)/Isoap_Mod/readme \ $(DIR_OBJECT)/Isoap_Mod.o \ $(DIR_SHARED)/Isoap_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/Dim_Polyhedron.h \ Front_Mod/readme \ Front_Mod/*.f90 \ $(DIR_OBJECT)/Field_Mod.o \ @@ -245,64 +207,59 @@ $(DIR_OBJECT)/Elem_Mod.o \ Elem_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Swarm_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Swarm_Mod.o:\ -Swarm_Mod/*.f90 \ -$(DIR_OBJECT)/Particle_Mod.o \ -Particle_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Turb_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Turb_Mod.o:\ -Turb_Mod/*.f90 \ -$(DIR_OBJECT)/Info_Mod.o \ -Info_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Bulk_Mod.f90 +# Dependencies for: ./Native_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Bulk_Mod.o:\ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -Bulk_Mod/*.f90 +$(DIR_OBJECT)/Native_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_OBJECT)/Vector_Mod.o \ +Vector_Mod/*.f90 \ +Native_Mod/*.f90 \ +$(DIR_OBJECT)/Matrix_Mod.o \ +Matrix_Mod/*.f90 \ +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Var_Mod.f90 +# Dependencies for: ./Point_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Var_Mod.o:\ -Var_Mod/*.f90 \ +$(DIR_OBJECT)/Point_Mod.o:\ +Point_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Info_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Info_Mod.o:\ -Info_Mod/*.f90 \ -$(DIR_OBJECT)/Field_Mod.o \ -Field_Mod/*/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Surf_Mod/Place_Surf_At_Value.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Place_Surf_At_Value.o: - -#--------------------------------------------------- -# Dependencies for: ./Vof_Mod.f90 +# Dependencies for: ./Process_Mod/Initialize_Variables.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Vof_Mod.o:\ +$(DIR_OBJECT)/Initialize_Variables.o:\ +$(DIR_OBJECT)/Vof_Mod.o \ Vof_Mod/*/*.f90 \ +$(DIR_OBJECT)/User_Mod.o \ +User_Mod/*.f90 \ $(DIR_OBJECT)/Turb_Mod.o \ Turb_Mod/*.f90 \ -Surf_Mod/readme \ -$(DIR_OBJECT)/Surf_Mod.o \ -Surf_Mod/*.f90 \ -$(DIR_OBJECT)/Stl_Mod.o \ -$(DIR_SHARED)/Stl_Mod/*.f90 +$(DIR_OBJECT)/Swarm_Mod.o \ +Swarm_Mod/*.f90 \ +$(DIR_OBJECT)/Numerics_Mod.o \ +Numerics_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_OBJECT)/Field_Mod.o \ +Field_Mod/*/*.f90 \ +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o \ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 \ +$(DIR_OBJECT)/Bulk_Mod.o \ +Bulk_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Process_Mod/Update_Boundary_Values.f90 @@ -325,9 +282,17 @@ $(DIR_OBJECT)/Comm_Mod.o \ $(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Process_Mod/Initialize_Variables.f90 +# Dependencies for: ./Process_Mod/Logo_Pro.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Initialize_Variables.o:\ +$(DIR_OBJECT)/Logo_Pro.o:\ +$(DIR_OBJECT)/Solver_Mod.o \ +Solver_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o + +#--------------------------------------------------- +# Dependencies for: ./Process_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Process_Mod.o:\ $(DIR_OBJECT)/Vof_Mod.o \ Vof_Mod/*/*.f90 \ $(DIR_OBJECT)/User_Mod.o \ @@ -336,8 +301,17 @@ $(DIR_OBJECT)/Turb_Mod.o \ Turb_Mod/*.f90 \ $(DIR_OBJECT)/Swarm_Mod.o \ Swarm_Mod/*.f90 \ +$(DIR_OBJECT)/Solver_Mod.o \ +Solver_Mod/*.f90 \ +$(DIR_OBJECT)/Results_Mod.o \ +Results_Mod/*.f90 \ +$(DIR_OBJECT)/Read_Controls_Mod.o \ +Read_Controls_Mod/*.f90 \ +Process_Mod/*.f90 \ $(DIR_OBJECT)/Numerics_Mod.o \ Numerics_Mod/*.f90 \ +$(DIR_OBJECT)/Monitor_Mod.o \ +Monitor_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ @@ -355,114 +329,111 @@ $(DIR_OBJECT)/Bulk_Mod.o \ Bulk_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Process_Mod/Logo_Pro.f90 +# Dependencies for: ./Turb_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Logo_Pro.o:\ -$(DIR_OBJECT)/Solver_Mod.o \ -Solver_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Turb_Mod.o:\ +Turb_Mod/*.f90 \ +$(DIR_OBJECT)/Info_Mod.o \ +Info_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Surf_Mod.f90 +# Dependencies for: ./Field_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Surf_Mod.o:\ -Surf_Mod/readme \ -Surf_Mod/*.f90 \ -Front_Mod/readme \ -$(DIR_OBJECT)/Front_Mod.o \ -Front_Mod/*.f90 +$(DIR_OBJECT)/Field_Mod.o:\ +$(DIR_OBJECT)/Solver_Mod.o \ +Solver_Mod/*.f90 \ +$(DIR_OBJECT)/Numerics_Mod.o \ +Numerics_Mod/*.f90 \ +Field_Mod/*/*.f90 \ +$(DIR_OBJECT)/Face_Mod.o \ +Face_Mod/*.f90 \ +$(DIR_OBJECT)/Bulk_Mod.o \ +Bulk_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Face_Mod.f90 +# Dependencies for: ./Interface_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Face_Mod.o:\ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -Face_Mod/*.f90 +$(DIR_OBJECT)/Interface_Mod.o:\ +$(DIR_OBJECT)/Turb_Mod.o \ +Turb_Mod/*.f90 \ +$(DIR_OBJECT)/Profiler_Mod.o \ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +Interface_Mod/*.f90 \ +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Point_Mod.f90 +# Dependencies for: ./Matrix_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Point_Mod.o:\ -Point_Mod/*.f90 \ +$(DIR_OBJECT)/Matrix_Mod.o:\ +Matrix_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod/Main_Isoap.f90 +# Dependencies for: ./Results_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Main_Isoap.o: +$(DIR_OBJECT)/Results_Mod.o:\ +Results_Mod/*.f90 \ +$(DIR_OBJECT)/Backup_Mod.o \ +Backup_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod/Isopol.f90 +# Dependencies for: ./Face_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Isopol.o: +$(DIR_OBJECT)/Face_Mod.o:\ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +Face_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod.f90 +# Dependencies for: ./Gen_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Message_Mod.o:\ -$(DIR_OBJECT)/Tokenizer_Mod.o \ -$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ -$(DIR_SHARED)/Message_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Gen_Mod.o:\ +$(DIR_SHARED)/Gen_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod.f90 +# Dependencies for: ./Message_Mod/Thin_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Isoap_Mod.o:\ -$(DIR_OBJECT)/Polyhedron_Mod.o \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ -$(DIR_OBJECT)/Iso_Polygons_Mod.o \ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/readme \ -$(DIR_SHARED)/Isoap_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/Dim_Polyhedron.h +$(DIR_OBJECT)/Thin_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./File_Mod.f90 +# Dependencies for: ./Message_Mod/Thick_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/File_Mod.o:\ -$(DIR_OBJECT)/String_Mod.o \ -$(DIR_SHARED)/String_Mod/*.f90 \ -$(DIR_OBJECT)/Message_Mod.o \ -$(DIR_SHARED)/Message_Mod/*.f90 \ -$(DIR_SHARED)/File_Mod/*.f90 +$(DIR_OBJECT)/Thick_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Region_Mod.f90 +# Dependencies for: ./Message_Mod/Dashed_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Region_Mod.o:\ +$(DIR_OBJECT)/Dashed_Line.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Gen_Mod.f90 +# Dependencies for: ./Comm_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Gen_Mod.o:\ -$(DIR_SHARED)/Gen_Mod/*.f90 +$(DIR_OBJECT)/Comm_Mod.o:\ +$(DIR_OBJECT)/Const_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Sort_Mod.f90 +# Dependencies for: ./Metis_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Sort_Mod.o:\ -$(DIR_OBJECT)/Swap_Mod.o \ -$(DIR_SHARED)/Swap_Mod/*.f90 \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 +$(DIR_OBJECT)/Metis_Mod.o:\ +$(DIR_SHARED)/Metis_Mod/*.f90 \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Polyhedron_Mod.f90 +# Dependencies for: ./Math_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Polyhedron_Mod.o:\ -$(DIR_OBJECT)/Work_Mod.o \ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 +$(DIR_OBJECT)/Math_Mod.o:\ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- # Dependencies for: ./Control_Mod.f90 @@ -476,45 +447,45 @@ $(DIR_SHARED)/Control_Mod/*/*.f90 \ $(DIR_SHARED)/Control_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells.f90 +# Dependencies for: ./Vect_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells.o:\ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Vect_Mod.o:\ +$(DIR_SHARED)/Vect_Mod/*.f90 \ +$(DIR_OBJECT)/Region_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Dashed_Line.f90 +# Dependencies for: ./String_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Dashed_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/String_Mod.o:\ +$(DIR_SHARED)/String_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thin_Line.f90 +# Dependencies for: ./Profiler_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thin_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Profiler_Mod.o:\ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thick_Line.f90 +# Dependencies for: ./Assert_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thick_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Assert_Mod.o:\ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Work_Mod.f90 +# Dependencies for: ./Sort_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Work_Mod.o:\ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Sort_Mod.o:\ +$(DIR_OBJECT)/Swap_Mod.o \ +$(DIR_SHARED)/Swap_Mod/*.f90 \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Probe_1d_Nodes.f90 @@ -530,29 +501,6 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 -#--------------------------------------------------- -# Dependencies for: ./Vect_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Vect_Mod.o:\ -$(DIR_OBJECT)/Region_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Profiler_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Profiler_Mod.o:\ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Math_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Math_Mod.o:\ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o - #--------------------------------------------------- # Dependencies for: ./Swap_Mod.f90 #--------------------------------------------------- @@ -560,25 +508,15 @@ $(DIR_OBJECT)/Swap_Mod.o:\ $(DIR_SHARED)/Swap_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Assert_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Assert_Mod.o:\ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 \ -$(DIR_SHARED)/Assert_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./String_Mod.f90 +# Dependencies for: ./Region_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/String_Mod.o:\ -$(DIR_SHARED)/String_Mod/*.f90 +$(DIR_OBJECT)/Region_Mod.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +# Dependencies for: ./Probe_2d.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Probe_2d.o:\ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -587,6 +525,21 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 +#--------------------------------------------------- +# Dependencies for: ./Polyhedron_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Polyhedron_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Iso_Polygons_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 + #--------------------------------------------------- # Dependencies for: ./Grid_Mod.f90 #--------------------------------------------------- @@ -594,6 +547,7 @@ $(DIR_OBJECT)/Grid_Mod.o:\ $(DIR_OBJECT)/Vtk_Mod.o \ $(DIR_SHARED)/Vtk_Mod/*.f90 \ $(DIR_OBJECT)/Vect_Mod.o \ +$(DIR_SHARED)/Vect_Mod/*.f90 \ $(DIR_OBJECT)/Sort_Mod.o \ $(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Region_Mod.o \ @@ -607,26 +561,26 @@ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Stl_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Stl_Mod.o:\ -$(DIR_SHARED)/Stl_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Comm_Mod.f90 +# Dependencies for: ./Message_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Comm_Mod.o:\ +$(DIR_OBJECT)/Message_Mod.o:\ +$(DIR_OBJECT)/Tokenizer_Mod.o \ +$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ +$(DIR_SHARED)/Message_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Iso_Polygons_Mod.f90 +# Dependencies for: ./Isoap_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 +$(DIR_OBJECT)/Isoap_Mod.o:\ +$(DIR_OBJECT)/Polyhedron_Mod.o \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ +$(DIR_OBJECT)/Iso_Polygons_Mod.o \ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/readme \ +$(DIR_SHARED)/Isoap_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Vtk_Mod.f90 @@ -636,17 +590,30 @@ $(DIR_SHARED)/Vtk_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Metis_Mod.f90 +# Dependencies for: ./Stl_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Metis_Mod.o:\ -$(DIR_SHARED)/Metis_Mod/*.f90 \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Stl_Mod.o:\ +$(DIR_SHARED)/Stl_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_2d.f90 +# Dependencies for: ./Work_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_2d.o:\ +$(DIR_OBJECT)/Work_Mod.o:\ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -662,3 +629,26 @@ $(DIR_OBJECT)/Tokenizer_Mod.o:\ $(DIR_SHARED)/Tokenizer_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o +#--------------------------------------------------- +# Dependencies for: ./File_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/File_Mod.o:\ +$(DIR_OBJECT)/String_Mod.o \ +$(DIR_SHARED)/String_Mod/*.f90 \ +$(DIR_OBJECT)/Message_Mod.o \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_SHARED)/File_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Probe_1d_Cells.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Probe_1d_Cells.o:\ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o + diff --git a/Sources/Shared/Browse.h90 b/Sources/Shared/Browse.h90 index 9f5af006f..7506370c1 100644 --- a/Sources/Shared/Browse.h90 +++ b/Sources/Shared/Browse.h90 @@ -1,5 +1,5 @@ !==============================================================================! -! Definition of potentially usefull macros in T-Flows. ! +! Definition of browsing macros in T-Flows. ! !------------------------------------------------------------------------------! # define Boundary_Regions() \ diff --git a/Sources/Shared/Comm_Mod.f90 b/Sources/Shared/Comm_Mod.f90 index 8f0371c18..d9c62ea1e 100644 --- a/Sources/Shared/Comm_Mod.f90 +++ b/Sources/Shared/Comm_Mod.f90 @@ -1,3 +1,5 @@ +#include "../Shared/Unused.h90" + !==============================================================================! module Comm_Mod !------------------------------------------------------------------------------! diff --git a/Sources/Shared/Comm_Mod/Parallel/Exchange_Int_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Exchange_Int_Array.f90 index 1ed1b2887..2aef1c647 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Exchange_Int_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Exchange_Int_Array.f90 @@ -14,6 +14,8 @@ subroutine Exchange_Int_Array(Comm, length, phi, dest) !-----------------------------------[Locals]-----------------------------------! integer :: rtag, stag, error type(Mpi_Status) :: status +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Form send and receive tags diff --git a/Sources/Shared/Comm_Mod/Parallel/Exchange_Log_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Exchange_Log_Array.f90 index 825c1b6a3..6c5dd19c9 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Exchange_Log_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Exchange_Log_Array.f90 @@ -14,6 +14,8 @@ subroutine Exchange_Log_Array(Comm, length, phi, dest) !-----------------------------------[Locals]-----------------------------------! integer :: rtag, stag, error type(Mpi_Status) :: status +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Form send and receive tags diff --git a/Sources/Shared/Comm_Mod/Parallel/Exchange_Real_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Exchange_Real_Array.f90 index f8c2defd2..f42a8fbe0 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Exchange_Real_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Exchange_Real_Array.f90 @@ -14,6 +14,8 @@ subroutine Exchange_Real_Array(Comm, length, phi, dest) !-----------------------------------[Locals]-----------------------------------! integer :: rtag, stag, error type(Mpi_Status) :: status +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Form send and receive tags diff --git a/Sources/Shared/Comm_Mod/Parallel/Read_Int.f90 b/Sources/Shared/Comm_Mod/Parallel/Read_Int.f90 index 05d410d21..548f065fd 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Read_Int.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Read_Int.f90 @@ -11,6 +11,8 @@ subroutine Read_Int(Comm, fh, num, disp) integer(DP) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: error = 0 +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Set it at position disp (same as in Write counterpart) diff --git a/Sources/Shared/Comm_Mod/Parallel/Read_Int_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Read_Int_Array.f90 index 60cf83fdd..4b95bfe49 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Read_Int_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Read_Int_Array.f90 @@ -12,6 +12,8 @@ subroutine Read_Int_Array(Comm, fh, arr, disp) !-----------------------------------[Locals]-----------------------------------! integer :: length integer :: error = 0 +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Get array's length diff --git a/Sources/Shared/Comm_Mod/Parallel/Read_Log.f90 b/Sources/Shared/Comm_Mod/Parallel/Read_Log.f90 index 2d2ee80a9..4dbc9703f 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Read_Log.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Read_Log.f90 @@ -11,6 +11,8 @@ subroutine Read_Log(Comm, fh, var, disp) integer(DP) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: error = 0 +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Set it at position disp (same as in Write counterpart) diff --git a/Sources/Shared/Comm_Mod/Parallel/Read_Log_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Read_Log_Array.f90 index c6f4c089f..59a496e77 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Read_Log_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Read_Log_Array.f90 @@ -12,6 +12,8 @@ subroutine Read_Log_Array(Comm, fh, arr, disp) !-----------------------------------[Locals]-----------------------------------! integer :: length integer :: error = 0 +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Get array's length diff --git a/Sources/Shared/Comm_Mod/Parallel/Read_Real.f90 b/Sources/Shared/Comm_Mod/Parallel/Read_Real.f90 index d2b806479..13c79fc22 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Read_Real.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Read_Real.f90 @@ -11,6 +11,8 @@ subroutine Read_Real(Comm, fh, num, disp) integer(DP) :: disp ! diplacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: error = 0 +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Set it at position disp (same as in Write counterpart) diff --git a/Sources/Shared/Comm_Mod/Parallel/Read_Real_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Read_Real_Array.f90 index 098fb86e0..39ed4858e 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Read_Real_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Read_Real_Array.f90 @@ -12,6 +12,8 @@ subroutine Read_Real_Array(Comm, fh, arr, disp) !-----------------------------------[Locals]-----------------------------------! integer :: length integer :: error = 0 +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Get array's length diff --git a/Sources/Shared/Comm_Mod/Parallel/Read_Text.f90 b/Sources/Shared/Comm_Mod/Parallel/Read_Text.f90 index bf94d07d0..380f75e1e 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Read_Text.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Read_Text.f90 @@ -12,6 +12,8 @@ subroutine Read_Text(Comm, fh, text_in, disp) !-----------------------------------[Locals]-----------------------------------! integer :: leng integer :: error = 0 +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! leng = len(text_in) diff --git a/Sources/Shared/Comm_Mod/Parallel/Send_Int_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Send_Int_Array.f90 index 69a7a532e..c4edd55a2 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Send_Int_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Send_Int_Array.f90 @@ -12,6 +12,8 @@ subroutine Send_Int_Array(Comm, len_s, phi_s, dest) !-----------------------------------[Locals]-----------------------------------! integer :: stag, error integer :: status(MPI_STATUS_SIZE) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Form send tag diff --git a/Sources/Shared/Comm_Mod/Parallel/Send_Log_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Send_Log_Array.f90 index f587a184f..2d29a9bef 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Send_Log_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Send_Log_Array.f90 @@ -12,6 +12,8 @@ subroutine Send_Log_Array(Comm, len_s, phi_s, dest) !-----------------------------------[Locals]-----------------------------------! integer :: stag, error integer :: status(MPI_STATUS_SIZE) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Form send tag diff --git a/Sources/Shared/Comm_Mod/Parallel/Send_Real_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Send_Real_Array.f90 index aa34b00a3..ec1b21a0d 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Send_Real_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Send_Real_Array.f90 @@ -12,6 +12,8 @@ subroutine Send_Real_Array(Comm, len_s, phi_s, dest) !-----------------------------------[Locals]-----------------------------------! integer :: stag, error integer :: status(MPI_STATUS_SIZE) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Form send tag diff --git a/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Int_Arrays.f90 b/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Int_Arrays.f90 index 6163443bf..093387dfb 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Int_Arrays.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Int_Arrays.f90 @@ -15,6 +15,8 @@ subroutine Sendrecv_Int_Arrays(Comm, len_s, phi_s, & !-----------------------------------[Locals]-----------------------------------! integer :: rtag, stag, error type(Mpi_Status) :: status +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Form send and receive tags diff --git a/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Log_Arrays.f90 b/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Log_Arrays.f90 index 2ecac5e0d..05b718bd8 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Log_Arrays.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Log_Arrays.f90 @@ -15,6 +15,8 @@ subroutine Sendrecv_Log_Arrays(Comm, len_s, phi_s, & !-----------------------------------[Locals]-----------------------------------! integer :: rtag, stag, error type(Mpi_Status) :: status +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Form send and receive tags diff --git a/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Real_Arrays.f90 b/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Real_Arrays.f90 index cadc3acdb..a682d2fcf 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Real_Arrays.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Real_Arrays.f90 @@ -15,6 +15,8 @@ subroutine Sendrecv_Real_Arrays(Comm, len_s, phi_s, & !-----------------------------------[Locals]-----------------------------------! integer :: rtag, stag, error type(Mpi_Status) :: status +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Form send and receive tags diff --git a/Sources/Shared/Comm_Mod/Parallel/Write_Int.f90 b/Sources/Shared/Comm_Mod/Parallel/Write_Int.f90 index f504ac2a2..e2617c5c0 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Write_Int.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Write_Int.f90 @@ -11,6 +11,8 @@ subroutine Write_Int(Comm, fh, num, disp) integer(DP) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: error = 0 +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Set it at position disp (same as in Read counterpart) diff --git a/Sources/Shared/Comm_Mod/Parallel/Write_Int_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Write_Int_Array.f90 index b9aca58aa..3bf261363 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Write_Int_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Write_Int_Array.f90 @@ -12,6 +12,8 @@ subroutine Write_Int_Array(Comm, fh, arr, disp) !-----------------------------------[Locals]-----------------------------------! integer :: length integer :: error = 0 +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Get array's length diff --git a/Sources/Shared/Comm_Mod/Parallel/Write_Log.f90 b/Sources/Shared/Comm_Mod/Parallel/Write_Log.f90 index 373648268..0c90caf3c 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Write_Log.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Write_Log.f90 @@ -11,6 +11,8 @@ subroutine Write_Log(Comm, fh, var, disp) integer(DP) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: error = 0 +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Set it at position disp (same as in Read counterpart) diff --git a/Sources/Shared/Comm_Mod/Parallel/Write_Log_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Write_Log_Array.f90 index a965a59d9..8a3284de0 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Write_Log_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Write_Log_Array.f90 @@ -12,6 +12,8 @@ subroutine Write_Log_Array(Comm, fh, arr, disp) !-----------------------------------[Locals]-----------------------------------! integer :: length integer :: error = 0 +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Get array's length diff --git a/Sources/Shared/Comm_Mod/Parallel/Write_Real.f90 b/Sources/Shared/Comm_Mod/Parallel/Write_Real.f90 index fe2e6901a..8d4b5af55 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Write_Real.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Write_Real.f90 @@ -11,6 +11,8 @@ subroutine Write_Real(Comm, fh, num, disp) integer(DP) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: error = 0 +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Set it at position disp (same as in Read counterpart) diff --git a/Sources/Shared/Comm_Mod/Parallel/Write_Real_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Write_Real_Array.f90 index 709d23965..12ae10d4e 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Write_Real_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Write_Real_Array.f90 @@ -12,6 +12,8 @@ subroutine Write_Real_Array(Comm, fh, arr, disp) !-----------------------------------[Locals]-----------------------------------! integer :: length integer :: error = 0 +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Get array's length diff --git a/Sources/Shared/Comm_Mod/Parallel/Write_Text.f90 b/Sources/Shared/Comm_Mod/Parallel/Write_Text.f90 index 0ae374dfc..8748041ad 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Write_Text.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Write_Text.f90 @@ -12,6 +12,8 @@ subroutine Write_Text(Comm, fh, text_out, disp) !-----------------------------------[Locals]-----------------------------------! integer :: leng integer :: error = 0 +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! leng = len(text_out) diff --git a/Sources/Shared/Comm_Mod/Sequential/Close_File.f90 b/Sources/Shared/Comm_Mod/Sequential/Close_File.f90 index c1dc27cd3..9ad6d8803 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Close_File.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Close_File.f90 @@ -7,6 +7,8 @@ subroutine Close_File(Comm, fh) !---------------------------------[Arguments]----------------------------------! class(Comm_Type) :: Comm integer :: fh ! file handle +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! close(fh) diff --git a/Sources/Shared/Comm_Mod/Sequential/Create_New_Types.f90 b/Sources/Shared/Comm_Mod/Sequential/Create_New_Types.f90 index d487947c8..a189141ab 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Create_New_Types.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Create_New_Types.f90 @@ -6,6 +6,8 @@ subroutine Create_New_Types(Comm) implicit none !---------------------------------[Arguments]----------------------------------! class(Comm_Type) :: Comm +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Exchange_Int_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Exchange_Int_Array.f90 index 117a6311e..28b07d485 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Exchange_Int_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Exchange_Int_Array.f90 @@ -9,6 +9,11 @@ subroutine Exchange_Int_Array(Comm, length, phi, dest) integer :: length integer :: phi(length) integer :: dest ! destination processor +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) + Unused(length) + Unused(phi) + Unused(dest) !==============================================================================! end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Exchange_Log_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Exchange_Log_Array.f90 index f9adf2460..e24f2f4ba 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Exchange_Log_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Exchange_Log_Array.f90 @@ -9,6 +9,11 @@ subroutine Exchange_Log_Array(Comm, length, phi, dest) integer :: length logical :: phi(length) integer :: dest ! destination processor +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) + Unused(length) + Unused(phi) + Unused(dest) !==============================================================================! end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Exchange_Real_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Exchange_Real_Array.f90 index 7be3aa257..66526bafa 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Exchange_Real_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Exchange_Real_Array.f90 @@ -9,6 +9,11 @@ subroutine Exchange_Real_Array(Comm, length, phi, dest) integer :: length real :: phi(length) integer :: dest ! destination processor +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) + Unused(length) + Unused(phi) + Unused(dest) !==============================================================================! end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Global_Lor_Log.f90 b/Sources/Shared/Comm_Mod/Sequential/Global_Lor_Log.f90 index 9dfbd9785..191bb03b7 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Global_Lor_Log.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Global_Lor_Log.f90 @@ -6,6 +6,8 @@ subroutine Comm_Mod_Global_Lor_Log(phi) implicit none !---------------------------------[Arguments]----------------------------------! logical :: phi +!------------------------[Avoid unused parent warning]-------------------------! + Unused(phi) !==============================================================================! end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Global_Lor_Log_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Global_Lor_Log_Array.f90 index b380c8e03..59ebbd1d7 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Global_Lor_Log_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Global_Lor_Log_Array.f90 @@ -7,6 +7,9 @@ subroutine Comm_Mod_Global_Lor_Log_Array(n, phi) !---------------------------------[Arguments]----------------------------------! integer :: n logical :: phi(n) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(n) + Unused(phi) !==============================================================================! end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Global_Max_Int.f90 b/Sources/Shared/Comm_Mod/Sequential/Global_Max_Int.f90 index fcece6c92..32a985a6d 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Global_Max_Int.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Global_Max_Int.f90 @@ -6,6 +6,8 @@ subroutine Comm_Mod_Global_Max_Int(phi) implicit none !---------------------------------[Arguments]----------------------------------! integer :: phi +!------------------------[Avoid unused parent warning]-------------------------! + Unused(phi) !==============================================================================! end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Global_Max_Real.f90 b/Sources/Shared/Comm_Mod/Sequential/Global_Max_Real.f90 index 4185c093b..83eefba74 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Global_Max_Real.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Global_Max_Real.f90 @@ -5,7 +5,9 @@ subroutine Comm_Mod_Global_Max_Real(phi) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real :: phi + real :: phi +!------------------------[Avoid unused parent warning]-------------------------! + Unused(phi) !==============================================================================! end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Global_Min_Int.f90 b/Sources/Shared/Comm_Mod/Sequential/Global_Min_Int.f90 index bed63d458..a28baa583 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Global_Min_Int.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Global_Min_Int.f90 @@ -6,6 +6,8 @@ subroutine Comm_Mod_Global_Min_Int(phi) implicit none !---------------------------------[Arguments]----------------------------------! integer :: phi +!------------------------[Avoid unused parent warning]-------------------------! + Unused(phi) !==============================================================================! end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Global_Min_Real.f90 b/Sources/Shared/Comm_Mod/Sequential/Global_Min_Real.f90 index 602437cc5..3fc32caea 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Global_Min_Real.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Global_Min_Real.f90 @@ -5,7 +5,9 @@ subroutine Comm_Mod_Global_Min_Real(phi) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real :: phi + real :: phi +!------------------------[Avoid unused parent warning]-------------------------! + Unused(phi) !==============================================================================! end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Int.f90 b/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Int.f90 index 471ca3909..547a32e31 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Int.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Int.f90 @@ -6,6 +6,8 @@ subroutine Comm_Mod_Global_Sum_Int(phi) implicit none !---------------------------------[Arguments]----------------------------------! integer :: phi +!------------------------[Avoid unused parent warning]-------------------------! + Unused(phi) !==============================================================================! end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Int_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Int_Array.f90 index ee6b61f51..0e95a9037 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Int_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Int_Array.f90 @@ -7,6 +7,9 @@ subroutine Comm_Mod_Global_Sum_Int_Array(n, phi) !---------------------------------[Arguments]----------------------------------! integer :: n integer :: phi(n) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(n) + Unused(phi) !==============================================================================! end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Real.f90 b/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Real.f90 index 46258d894..5a53406e4 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Real.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Real.f90 @@ -6,6 +6,8 @@ subroutine Comm_Mod_Global_Sum_Real(phi) implicit none !---------------------------------[Arguments]----------------------------------! real :: phi +!------------------------[Avoid unused parent warning]-------------------------! + Unused(phi) !==============================================================================! end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Real_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Real_Array.f90 index e15dadbdd..659f2f7de 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Real_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Real_Array.f90 @@ -7,6 +7,9 @@ subroutine Comm_Mod_Global_Sum_Real_Array(n, phi) !---------------------------------[Arguments]----------------------------------! integer :: n real :: phi(n) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(n) + Unused(phi) !==============================================================================! end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Open_File_Read.f90 b/Sources/Shared/Comm_Mod/Sequential/Open_File_Read.f90 index 4ed3e8615..fe4416189 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Open_File_Read.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Open_File_Read.f90 @@ -8,6 +8,8 @@ subroutine Open_File_Read(Comm, fh, file_name) class(Comm_Type) :: Comm integer :: fh ! file handle character :: file_name*(*) ! file name +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! fh = 9 diff --git a/Sources/Shared/Comm_Mod/Sequential/Open_File_Write.f90 b/Sources/Shared/Comm_Mod/Sequential/Open_File_Write.f90 index ac8f624cd..4ab5839fa 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Open_File_Write.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Open_File_Write.f90 @@ -8,6 +8,8 @@ subroutine Open_File_Write(Comm, fh, file_name) class(Comm_Type) :: Comm integer :: fh ! file handle character :: file_name*(*) ! file name +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! fh = 9 diff --git a/Sources/Shared/Comm_Mod/Sequential/Read_Int.f90 b/Sources/Shared/Comm_Mod/Sequential/Read_Int.f90 index 64ec7f47a..33642249a 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Read_Int.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Read_Int.f90 @@ -9,6 +9,8 @@ subroutine Read_Int(Comm, fh, num, disp) integer :: fh ! file handle integer :: num ! number to read integer(DP) :: disp ! displacement in bytes +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Position yourself at the right place inside the file diff --git a/Sources/Shared/Comm_Mod/Sequential/Read_Int_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Read_Int_Array.f90 index de19d6ed4..070c0fdef 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Read_Int_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Read_Int_Array.f90 @@ -11,6 +11,8 @@ subroutine Read_Int_Array(Comm, fh, arr, disp) integer(DP) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: length +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! length = size(arr) diff --git a/Sources/Shared/Comm_Mod/Sequential/Read_Log.f90 b/Sources/Shared/Comm_Mod/Sequential/Read_Log.f90 index 4342631af..757002e63 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Read_Log.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Read_Log.f90 @@ -9,6 +9,8 @@ subroutine Read_Log(Comm, fh, var, disp) integer :: fh ! file handle logical :: var ! variable to read integer(DP) :: disp ! displacement in bytes +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Position yourself at the right place inside the file diff --git a/Sources/Shared/Comm_Mod/Sequential/Read_Log_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Read_Log_Array.f90 index d3b3378b0..ac17e0055 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Read_Log_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Read_Log_Array.f90 @@ -11,6 +11,8 @@ subroutine Read_Log_Array(Comm, fh, arr, disp) integer(DP) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: length +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! length = size(arr) diff --git a/Sources/Shared/Comm_Mod/Sequential/Read_Real.f90 b/Sources/Shared/Comm_Mod/Sequential/Read_Real.f90 index 2bf3cb513..141af67fd 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Read_Real.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Read_Real.f90 @@ -9,6 +9,8 @@ subroutine Read_Real(Comm, fh, num, disp) integer :: fh ! file handle real :: num ! number to read integer(DP) :: disp ! displacement in bytes +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Position yourself at the right place inside the file diff --git a/Sources/Shared/Comm_Mod/Sequential/Read_Real_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Read_Real_Array.f90 index 42f3842d9..5d5051438 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Read_Real_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Read_Real_Array.f90 @@ -11,6 +11,8 @@ subroutine Read_Real_Array(Comm, fh, arr, disp) integer(DP) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: length +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! length = size(arr) diff --git a/Sources/Shared/Comm_Mod/Sequential/Read_Text.f90 b/Sources/Shared/Comm_Mod/Sequential/Read_Text.f90 index 0be485f06..0b1e5412d 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Read_Text.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Read_Text.f90 @@ -11,6 +11,8 @@ subroutine Read_Text(Comm, fh, text_in, disp) integer(DP) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: leng +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! leng = len(text_in) diff --git a/Sources/Shared/Comm_Mod/Sequential/Recv_Int_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Recv_Int_Array.f90 index 2ef1abe15..2018968b3 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Recv_Int_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Recv_Int_Array.f90 @@ -9,6 +9,11 @@ subroutine Recv_Int_Array(Comm, len_r, phi_r, dest) integer :: len_r ! receive length integer :: phi_r(len_r) ! receive buffer integer :: dest ! destination processor +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) + Unused(len_r) + Unused(phi_r) + Unused(dest) !==============================================================================! end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Recv_Log_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Recv_Log_Array.f90 index 871926c52..6ceaf2e6b 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Recv_Log_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Recv_Log_Array.f90 @@ -9,6 +9,11 @@ subroutine Recv_Log_Array(Comm, len_r, phi_r, dest) integer :: len_r ! receive length logical :: phi_r(len_r) ! receive buffer integer :: dest ! destination processor +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) + Unused(len_r) + Unused(phi_r) + Unused(dest) !==============================================================================! end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Recv_Real_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Recv_Real_Array.f90 index c1ffad399..019ffab51 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Recv_Real_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Recv_Real_Array.f90 @@ -9,6 +9,11 @@ subroutine Recv_Real_Array(Comm, len_r, phi_r, dest) integer :: len_r ! receive length real :: phi_r(len_r) ! receive buffer integer :: dest ! destination processor +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) + Unused(len_r) + Unused(phi_r) + Unused(dest) !==============================================================================! end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Send_Int_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Send_Int_Array.f90 index 5d5fe7b05..2089e1adc 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Send_Int_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Send_Int_Array.f90 @@ -9,6 +9,11 @@ subroutine Send_Int_Array(Comm, len_s, phi_s, dest) integer :: len_s ! send length integer :: phi_s(len_s) ! send buffer integer :: dest ! destination processor +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) + Unused(len_s) + Unused(phi_s) + Unused(dest) !==============================================================================! end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Send_Log_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Send_Log_Array.f90 index 03e8874a7..4d18dd50c 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Send_Log_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Send_Log_Array.f90 @@ -9,6 +9,11 @@ subroutine Send_Log_Array(Comm, len_s, phi_s, dest) integer :: len_s ! send length logical :: phi_s(len_s) ! send buffer integer :: dest ! destination processor +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) + Unused(len_s) + Unused(phi_s) + Unused(dest) !==============================================================================! end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Send_Real_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Send_Real_Array.f90 index 42889616c..0c052ce75 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Send_Real_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Send_Real_Array.f90 @@ -9,6 +9,11 @@ subroutine Send_Real_Array(Comm, len_s, phi_s, dest) integer :: len_s ! send length real :: phi_s(len_s) ! send buffer integer :: dest ! destination processor +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) + Unused(len_s) + Unused(phi_s) + Unused(dest) !==============================================================================! end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Int_Arrays.f90 b/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Int_Arrays.f90 index d124c1e29..0ec3c1ce1 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Int_Arrays.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Int_Arrays.f90 @@ -12,6 +12,13 @@ subroutine Sendrecv_Int_Arrays(Comm, len_s, phi_s, & integer :: len_r ! receive length integer :: phi_r(len_r) ! receive buffer integer :: dest ! destination processor +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) + Unused(len_s) + Unused(phi_s) + Unused(len_r) + Unused(phi_r) + Unused(dest) !==============================================================================! end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Log_Arrays.f90 b/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Log_Arrays.f90 index 241cd49e7..232673bbf 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Log_Arrays.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Log_Arrays.f90 @@ -12,6 +12,13 @@ subroutine Sendrecv_Log_Arrays(Comm, len_s, phi_s, & integer :: len_r ! receive length logical :: phi_r(len_r) ! receive buffer integer :: dest ! destination processor +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) + Unused(len_s) + Unused(phi_s) + Unused(len_r) + Unused(phi_r) + Unused(dest) !==============================================================================! end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Real_Arrays.f90 b/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Real_Arrays.f90 index 6e6a71251..7d787d044 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Real_Arrays.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Real_Arrays.f90 @@ -12,6 +12,13 @@ subroutine Sendrecv_Real_Arrays(Comm, len_s, phi_s, & integer :: len_r ! receive length real :: phi_r(len_r) ! receive buffer integer :: dest ! destination processor +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) + Unused(len_s) + Unused(phi_s) + Unused(len_r) + Unused(phi_r) + Unused(dest) !==============================================================================! end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Wait.f90 b/Sources/Shared/Comm_Mod/Sequential/Wait.f90 index ac1d51fa0..fdfd15b11 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Wait.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Wait.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Comm_Mod_Wait + subroutine Comm_Mod_Wait !------------------------------------------------------------------------------! ! Dummy function for sequential runs. ! !------------------------------------------------------------------------------! diff --git a/Sources/Shared/Comm_Mod/Sequential/Write_Int.f90 b/Sources/Shared/Comm_Mod/Sequential/Write_Int.f90 index 301f2ee72..724b3888f 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Write_Int.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Write_Int.f90 @@ -9,6 +9,8 @@ subroutine Write_Int(Comm, fh, num, disp) integer :: fh ! file handle integer :: num ! number to write out integer(DP) :: disp ! displacement in bytes +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! write(fh) num diff --git a/Sources/Shared/Comm_Mod/Sequential/Write_Int_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Write_Int_Array.f90 index 83350fb0f..f16f0cd4b 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Write_Int_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Write_Int_Array.f90 @@ -11,6 +11,8 @@ subroutine Write_Int_Array(Comm, fh, arr, disp) integer(DP) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: length +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Get array's length diff --git a/Sources/Shared/Comm_Mod/Sequential/Write_Log.f90 b/Sources/Shared/Comm_Mod/Sequential/Write_Log.f90 index 92df05fb2..382d615d0 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Write_Log.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Write_Log.f90 @@ -9,6 +9,8 @@ subroutine Write_Log(Comm, fh, var, disp) integer :: fh ! file handle logical :: var ! variable to write out integer(DP) :: disp ! displacement in bytes +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! write(fh) var diff --git a/Sources/Shared/Comm_Mod/Sequential/Write_Log_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Write_Log_Array.f90 index 665a5b991..ca8eb9420 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Write_Log_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Write_Log_Array.f90 @@ -11,6 +11,8 @@ subroutine Write_Log_Array(Comm, fh, arr, disp) integer(DP) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: length +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Get array's length diff --git a/Sources/Shared/Comm_Mod/Sequential/Write_Real.f90 b/Sources/Shared/Comm_Mod/Sequential/Write_Real.f90 index 4410768b4..dc0843545 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Write_Real.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Write_Real.f90 @@ -9,6 +9,8 @@ subroutine Write_Real(Comm, fh, num, disp) integer :: fh ! file handle real :: num ! number to write out integer(DP) :: disp ! displacement in bytes +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! write(fh) num diff --git a/Sources/Shared/Comm_Mod/Sequential/Write_Real_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Write_Real_Array.f90 index d2f376bf6..2c8138e14 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Write_Real_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Write_Real_Array.f90 @@ -11,6 +11,8 @@ subroutine Write_Real_Array(Comm, fh, arr, disp) integer(DP) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: length +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Get array's length diff --git a/Sources/Shared/Comm_Mod/Sequential/Write_Text.f90 b/Sources/Shared/Comm_Mod/Sequential/Write_Text.f90 index ce3896c63..852aed8b4 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Write_Text.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Write_Text.f90 @@ -11,6 +11,8 @@ subroutine Write_Text(Comm, fh, text_out, disp) integer(DP) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: leng +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! leng = len(text_out) diff --git a/Sources/Shared/Control_Mod.f90 b/Sources/Shared/Control_Mod.f90 index 750d61cb8..c7f28cf2e 100644 --- a/Sources/Shared/Control_Mod.f90 +++ b/Sources/Shared/Control_Mod.f90 @@ -1,3 +1,6 @@ +#include "../Shared/Assert.h90" +#include "../Shared/Unused.h90" + !==============================================================================! module Control_Mod !----------------------------------[Modules]-----------------------------------! diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Similar_Warning.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Similar_Warning.f90 index cb771e908..dafe5b88e 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Similar_Warning.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Similar_Warning.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Control_Mod_Similar_Warning(keyword, item, verbose, key_type) + subroutine Control_Mod_Similar_Warning(keyword, item, key_type) !------------------------------------------------------------------------------! ! Checks if item in the argument list is similar to a keyword. ! !------------------------------------------------------------------------------! @@ -7,7 +7,6 @@ subroutine Control_Mod_Similar_Warning(keyword, item, verbose, key_type) !---------------------------------[Arguments]----------------------------------! character(len=*) :: keyword character(len=*) :: item - logical, optional :: verbose character(len=*), optional :: key_type !-----------------------------------[Locals]-----------------------------------! integer :: n diff --git a/Sources/Shared/Control_Mod/Linear_Solvers.f90 b/Sources/Shared/Control_Mod/Linear_Solvers.f90 index bb1c981ca..ba3c15362 100644 --- a/Sources/Shared/Control_Mod/Linear_Solvers.f90 +++ b/Sources/Shared/Control_Mod/Linear_Solvers.f90 @@ -10,7 +10,7 @@ subroutine Control_Mod_Linear_Solvers(name, verbose) !==============================================================================! call Control_Mod_Read_Char_Item('LINEAR_SOLVERS', & - 'native', name, verbose = .true.) + 'native', name, verbose=verbose) call String % To_Upper_Case(name) end subroutine diff --git a/Sources/Shared/Control_Mod/Max_Threads.f90 b/Sources/Shared/Control_Mod/Max_Threads.f90 index 2867fca99..e82de8d8f 100644 --- a/Sources/Shared/Control_Mod/Max_Threads.f90 +++ b/Sources/Shared/Control_Mod/Max_Threads.f90 @@ -11,6 +11,7 @@ subroutine Control_Mod_Max_Threads(val, verbose) call Control_Mod_Read_Int_Item('MAX_THREADS', 2, val, verbose) # else val = 1 + Unused(verbose) # endif end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Pressure_Momentum_Coupling.f90 b/Sources/Shared/Control_Mod/Numerics/Pressure_Momentum_Coupling.f90 index ec8c95e0d..cca7eb04f 100644 --- a/Sources/Shared/Control_Mod/Numerics/Pressure_Momentum_Coupling.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Pressure_Momentum_Coupling.f90 @@ -10,7 +10,7 @@ subroutine Control_Mod_Pressure_Momentum_Coupling(name, verbose) !==============================================================================! call Control_Mod_Read_Char_Item('PRESSURE_MOMENTUM_COUPLING', & - 'simple', name, verbose = .true.) + 'simple', name, verbose=verbose) call String % To_Upper_Case(name) end subroutine diff --git a/Sources/Shared/File_Mod.f90 b/Sources/Shared/File_Mod.f90 index 56c3887f2..be7d59684 100644 --- a/Sources/Shared/File_Mod.f90 +++ b/Sources/Shared/File_Mod.f90 @@ -1,3 +1,5 @@ +#include "../Shared/Unused.h90" + !==============================================================================! module File_Mod !------------------------------------------------------------------------------! diff --git a/Sources/Shared/File_Mod/Append_For_Writing_Ascii.f90 b/Sources/Shared/File_Mod/Append_For_Writing_Ascii.f90 index aa9439882..2bc461340 100644 --- a/Sources/Shared/File_Mod/Append_For_Writing_Ascii.f90 +++ b/Sources/Shared/File_Mod/Append_For_Writing_Ascii.f90 @@ -12,6 +12,8 @@ subroutine Append_For_Writing_Ascii(File, name_o, file_unit, processor) !-----------------------------------[Locals]-----------------------------------! logical :: file_exists ! file exists? logical, save :: first_call = .true. ! first call? +!------------------------[Avoid unused parent warning]-------------------------! + Unused(File) !==============================================================================! inquire(file = trim(name_o), exist = file_exists) diff --git a/Sources/Shared/File_Mod/Delete.f90 b/Sources/Shared/File_Mod/Delete.f90 index c8e33dcef..e32440925 100644 --- a/Sources/Shared/File_Mod/Delete.f90 +++ b/Sources/Shared/File_Mod/Delete.f90 @@ -10,6 +10,8 @@ subroutine Delete(File, name_d) class(File_Type) :: File integer :: file_unit logical :: file_exists +!------------------------[Avoid unused parent warning]-------------------------! + Unused(File) !==============================================================================! ! First check if the file exists diff --git a/Sources/Shared/File_Mod/Is_In_Unix_Format.f90 b/Sources/Shared/File_Mod/Is_In_Unix_Format.f90 index aaff538a9..6c9c0bcb0 100644 --- a/Sources/Shared/File_Mod/Is_In_Unix_Format.f90 +++ b/Sources/Shared/File_Mod/Is_In_Unix_Format.f90 @@ -8,8 +8,8 @@ logical function Is_In_Unix_Format(File, file_name) class(File_Type) :: File character(len=*) :: file_name !-----------------------------------[Locals]-----------------------------------! - integer :: file_size, file_unit, i - integer(1) :: byte, next, cnt_13_10 + integer :: file_size, file_unit, cnt_13_10, i + integer(1) :: byte, next !==============================================================================! inquire(file=file_name, size=file_size) diff --git a/Sources/Shared/File_Mod/Line_Length.f90 b/Sources/Shared/File_Mod/Line_Length.f90 index cdcc5dc6d..a461dad09 100644 --- a/Sources/Shared/File_Mod/Line_Length.f90 +++ b/Sources/Shared/File_Mod/Line_Length.f90 @@ -10,6 +10,8 @@ integer function Line_Length(File, file_unit) !-----------------------------------[Locals]-----------------------------------! integer :: length integer(1) :: byte +!------------------------[Avoid unused parent warning]-------------------------! + Unused(File) !==============================================================================! length = 0 diff --git a/Sources/Shared/File_Mod/Open_For_Reading_Ascii.f90 b/Sources/Shared/File_Mod/Open_For_Reading_Ascii.f90 index f92105f82..92c3bdb20 100644 --- a/Sources/Shared/File_Mod/Open_For_Reading_Ascii.f90 +++ b/Sources/Shared/File_Mod/Open_For_Reading_Ascii.f90 @@ -11,6 +11,8 @@ subroutine Open_For_Reading_Ascii(File, name_i, file_unit, processor) integer, optional :: processor !-----------------------------------[Locals]-----------------------------------! logical :: file_exists +!------------------------[Avoid unused parent warning]-------------------------! + Unused(File) !==============================================================================! ! First check if the file exists diff --git a/Sources/Shared/File_Mod/Open_For_Reading_Binary.f90 b/Sources/Shared/File_Mod/Open_For_Reading_Binary.f90 index c1b54315a..84cd1a53f 100644 --- a/Sources/Shared/File_Mod/Open_For_Reading_Binary.f90 +++ b/Sources/Shared/File_Mod/Open_For_Reading_Binary.f90 @@ -14,6 +14,8 @@ subroutine Open_For_Reading_Binary(File, name_i, file_unit, & !-----------------------------------[Locals]-----------------------------------! logical :: file_exists logical :: verb = .true. +!------------------------[Avoid unused parent warning]-------------------------! + Unused(File) !==============================================================================! if(present(verbose)) verb = verbose diff --git a/Sources/Shared/File_Mod/Open_For_Writing_Ascii.f90 b/Sources/Shared/File_Mod/Open_For_Writing_Ascii.f90 index 9d15ce930..a8b2e6a28 100644 --- a/Sources/Shared/File_Mod/Open_For_Writing_Ascii.f90 +++ b/Sources/Shared/File_Mod/Open_For_Writing_Ascii.f90 @@ -9,6 +9,8 @@ subroutine Open_For_Writing_Ascii(File, name_o, file_unit, processor) character(len=*) :: name_o integer :: file_unit integer, optional :: processor +!------------------------[Avoid unused parent warning]-------------------------! + Unused(File) !==============================================================================! open(newunit = file_unit, file = trim(name_o), status = 'replace') diff --git a/Sources/Shared/File_Mod/Open_For_Writing_Binary.f90 b/Sources/Shared/File_Mod/Open_For_Writing_Binary.f90 index 461344449..dd3b33781 100644 --- a/Sources/Shared/File_Mod/Open_For_Writing_Binary.f90 +++ b/Sources/Shared/File_Mod/Open_For_Writing_Binary.f90 @@ -9,6 +9,8 @@ subroutine Open_For_Writing_Binary(File, name_o, file_unit, processor) character(len=*) :: name_o integer :: file_unit integer, optional :: processor +!------------------------[Avoid unused parent warning]-------------------------! + Unused(File) !==============================================================================! open(newunit = file_unit, & diff --git a/Sources/Shared/File_Mod/Read_Binary_Int4_Array.f90 b/Sources/Shared/File_Mod/Read_Binary_Int4_Array.f90 index ef928131f..1974e43ee 100644 --- a/Sources/Shared/File_Mod/Read_Binary_Int4_Array.f90 +++ b/Sources/Shared/File_Mod/Read_Binary_Int4_Array.f90 @@ -11,6 +11,8 @@ subroutine Read_Binary_Int4_Array(File, un, n, reached_end) logical, optional :: reached_end !-----------------------------------[Locals]-----------------------------------! integer :: i +!------------------------[Avoid unused parent warning]-------------------------! + Unused(File) !==============================================================================! ! If present, assumed the end of file has not been reached diff --git a/Sources/Shared/File_Mod/Read_Binary_Int8_Array.f90 b/Sources/Shared/File_Mod/Read_Binary_Int8_Array.f90 index 2c14915fc..743c7b4e2 100644 --- a/Sources/Shared/File_Mod/Read_Binary_Int8_Array.f90 +++ b/Sources/Shared/File_Mod/Read_Binary_Int8_Array.f90 @@ -11,6 +11,8 @@ subroutine Read_Binary_Int8_Array(File, un, n, reached_end) logical, optional :: reached_end !-----------------------------------[Locals]-----------------------------------! integer :: i +!------------------------[Avoid unused parent warning]-------------------------! + Unused(File) !==============================================================================! ! If present, assumed the end of file has not been reached diff --git a/Sources/Shared/File_Mod/Read_Binary_Real4_Array.f90 b/Sources/Shared/File_Mod/Read_Binary_Real4_Array.f90 index 7eab59b2c..8d85aa4fd 100644 --- a/Sources/Shared/File_Mod/Read_Binary_Real4_Array.f90 +++ b/Sources/Shared/File_Mod/Read_Binary_Real4_Array.f90 @@ -11,6 +11,8 @@ subroutine Read_Binary_Real4_Array(File, un, n, reached_end) logical, optional :: reached_end !-----------------------------------[Locals]-----------------------------------! integer :: i +!------------------------[Avoid unused parent warning]-------------------------! + Unused(File) !==============================================================================! ! If present, assumed the end of file has not been reached diff --git a/Sources/Shared/File_Mod/Read_Binary_Real8_Array.f90 b/Sources/Shared/File_Mod/Read_Binary_Real8_Array.f90 index f35046500..c89cbe681 100644 --- a/Sources/Shared/File_Mod/Read_Binary_Real8_Array.f90 +++ b/Sources/Shared/File_Mod/Read_Binary_Real8_Array.f90 @@ -11,6 +11,8 @@ subroutine Read_Binary_Real8_Array(File, un, n, reached_end) logical, optional :: reached_end !-----------------------------------[Locals]-----------------------------------! integer :: i +!------------------------[Avoid unused parent warning]-------------------------! + Unused(File) !==============================================================================! ! If present, assumed the end of file has not been reached diff --git a/Sources/Shared/File_Mod/Read_Line.f90 b/Sources/Shared/File_Mod/Read_Line.f90 index 2eaaa0a76..8f3854ef3 100644 --- a/Sources/Shared/File_Mod/Read_Line.f90 +++ b/Sources/Shared/File_Mod/Read_Line.f90 @@ -3,6 +3,9 @@ subroutine Read_Line(File, un, reached_end, remove) !------------------------------------------------------------------------------! ! Reads a Line from a file unit un and discards if it is comment. ! ! In addition, it breaks the line in tokens (individual strings). ! +! ! +! A comment is each line which begins with "!", "#" or "%". ! +! Input line must not exceed MAX_TOKENS*2 characters in length ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -15,10 +18,9 @@ subroutine Read_Line(File, un, reached_end, remove) integer(1) :: byte character(7) :: format = '(a0000)' character(SL) :: fmtd +!------------------------[Avoid unused parent warning]-------------------------! + Unused(File) !==============================================================================! -! A comment is each line which begins with "!", "#" or "%". ! -! Input line must not exceed MAX_TOKENS*2 characters in length ! -!------------------------------------------------------------------------------! ! If present, assumed the end of file has not been reached if(present(reached_end)) then diff --git a/Sources/Shared/File_Mod/Set_Name.f90 b/Sources/Shared/File_Mod/Set_Name.f90 index 412608bc4..639c47f0e 100644 --- a/Sources/Shared/File_Mod/Set_Name.f90 +++ b/Sources/Shared/File_Mod/Set_Name.f90 @@ -22,6 +22,8 @@ subroutine Set_Name(File, & integer :: last_pos integer :: ldir, lnam, lext, lapp character(SL) :: rel_path, sys_comm +!------------------------[Avoid unused parent warning]-------------------------! + Unused(File) !==============================================================================! !-------------------------------------------! diff --git a/Sources/Shared/Grid_Mod/Allocate_Regions.f90 b/Sources/Shared/Grid_Mod/Allocate_Regions.f90 index 4d7802625..552b488a7 100644 --- a/Sources/Shared/Grid_Mod/Allocate_Regions.f90 +++ b/Sources/Shared/Grid_Mod/Allocate_Regions.f90 @@ -20,8 +20,6 @@ subroutine Allocate_Regions(Grid, nbr) !---------------------------------[Arguments]----------------------------------! class(Grid_Type) :: Grid integer, intent(in) :: nbr ! number of boundary regions -!-----------------------------------[Locals]-----------------------------------! - integer :: n !==============================================================================! ! Store the number of boundary regions for the grid diff --git a/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 b/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 index 819d58569..a3375d12e 100644 --- a/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 +++ b/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 @@ -17,10 +17,10 @@ subroutine Calculate_Face_Geometry(Grid) !------------------------------[Local parameters]------------------------------! logical, parameter :: DEBUG = .false. !-----------------------------------[Locals]-----------------------------------! - integer :: c, i_fac, c1, c2, s, sh, m, n, pnt_to, pnt_from, fail_count + integer :: c1, c2, s, sh, n, pnt_to, pnt_from, fail_count real :: xc1, yc1, zc1, xc2, yc2, zc2 - real :: d_s, min_d, max_d, dx, dy, dz, sx, sy, sz - real :: vec1(3), vec2(3), prod(3), dist(3), surf(3) + real :: d_s, min_d, max_d, sx, sy, sz + real :: dist(3), surf(3) !==============================================================================! if(this_proc < 2) print '(a)', ' # Checking the integrity of cell faces ...' diff --git a/Sources/Shared/Grid_Mod/Calculate_Face_Surfaces.f90 b/Sources/Shared/Grid_Mod/Calculate_Face_Surfaces.f90 index 73863bdcc..df55fe536 100644 --- a/Sources/Shared/Grid_Mod/Calculate_Face_Surfaces.f90 +++ b/Sources/Shared/Grid_Mod/Calculate_Face_Surfaces.f90 @@ -8,7 +8,6 @@ subroutine Calculate_Face_Surfaces(Grid) class(Grid_Type) :: Grid !-----------------------------------[Locals]-----------------------------------! integer :: s, i_nod, j_nod, m, n - real :: dx, dy, dz real, allocatable :: xf(:), yf(:), zf(:) !==============================================================================! diff --git a/Sources/Shared/Grid_Mod/Determine_Threads.f90 b/Sources/Shared/Grid_Mod/Determine_Threads.f90 index d5b134ebe..e3042dbc9 100644 --- a/Sources/Shared/Grid_Mod/Determine_Threads.f90 +++ b/Sources/Shared/Grid_Mod/Determine_Threads.f90 @@ -6,11 +6,9 @@ subroutine Determine_Threads(Grid) implicit none !---------------------------------[Arguments]----------------------------------! class(Grid_Type), target, intent(inout) :: Grid -!------------------------------[Local parameters]------------------------------! - logical, parameter :: DEBUG = .false. !-----------------------------------[Locals]-----------------------------------! type(Vect_Type), pointer :: Vect - integer :: c, s, c1, c2, m, i_fac + integer :: c, s, m, i_fac integer :: n_cells_in, in_thread, n_remains, thr integer, allocatable :: cells_in_thread(:) character(SL) :: st1, st2 diff --git a/Sources/Shared/Grid_Mod/Sort_Cells_By_Thread.f90 b/Sources/Shared/Grid_Mod/Sort_Cells_By_Thread.f90 index a61c45d15..84987e641 100644 --- a/Sources/Shared/Grid_Mod/Sort_Cells_By_Thread.f90 +++ b/Sources/Shared/Grid_Mod/Sort_Cells_By_Thread.f90 @@ -13,7 +13,6 @@ subroutine Sort_Cells_By_Thread(Grid) !-----------------------------------[Locals]-----------------------------------! integer :: s, c, c1, c2, n, nc integer :: mcc, mcn, mcf - integer :: max_diff_1, max_diff_2, c1_s1, c2_s1, c1_s2, c2_s2 integer, allocatable :: old_nn (:) ! old number of nodes (per cell) integer, allocatable :: old_nodes(:,:) ! old nodes list per cell integer, allocatable :: old_nc (:) ! old number of cells (per cell) diff --git a/Sources/Shared/Isoap_Mod.f90 b/Sources/Shared/Isoap_Mod.f90 index 8c105cbad..54753d5b1 100644 --- a/Sources/Shared/Isoap_Mod.f90 +++ b/Sources/Shared/Isoap_Mod.f90 @@ -17,6 +17,9 @@ module Isoap_Mod implicit none !==============================================================================! + ! Parameters used inside the module + integer, parameter :: NS=200, NV=240 + !----------------! ! Isoap type ! !----------------! diff --git a/Sources/Shared/Isoap_Mod/Dim_Polyhedron.h b/Sources/Shared/Isoap_Mod/Dim_Polyhedron.h deleted file mode 100644 index 07c662f31..000000000 --- a/Sources/Shared/Isoap_Mod/Dim_Polyhedron.h +++ /dev/null @@ -1 +0,0 @@ - integer, parameter :: NS=200, NV=240 diff --git a/Sources/Shared/Isoap_Mod/Extract_Iso_Polygons.f90 b/Sources/Shared/Isoap_Mod/Extract_Iso_Polygons.f90 index 604bd823b..1bdfc3858 100644 --- a/Sources/Shared/Isoap_Mod/Extract_Iso_Polygons.f90 +++ b/Sources/Shared/Isoap_Mod/Extract_Iso_Polygons.f90 @@ -11,9 +11,6 @@ subroutine Extract_Iso_Polygons(Isoap, Grid, cell, phi_n) logical, parameter :: DEBUG = .false. ! if true, a lot of files are created !-----------------------------------[Locals]-----------------------------------! integer, pointer, contiguous :: glo(:) - integer :: local_face_nodes(MAX_ISOAP_VERTS) - integer :: i_nod, i_fac, i_ver, i_iso, l_nod - integer :: s, n, faces_n_nodes !==============================================================================! ! Take alias for global cell numbers diff --git a/Sources/Shared/Isoap_Mod/Isopol.f90 b/Sources/Shared/Isoap_Mod/Isopol.f90 index 84bb5027b..5b55bdca2 100644 --- a/Sources/Shared/Isoap_Mod/Isopol.f90 +++ b/Sources/Shared/Isoap_Mod/Isopol.f90 @@ -35,8 +35,6 @@ SUBROUTINE ISOPOL(ISOAP, & NTS) !---------------------------------------------------------------------! IMPLICIT NONE -!---------------------------------------------------------------------! - INCLUDE "Isoap_Mod/Dim_Polyhedron.h" ! holds NS and NV !---------------------------------------------------------------------! CLASS(ISOAP_TYPE) :: ISOAP INTEGER, INTENT(IN) :: IA(NV) @@ -57,6 +55,8 @@ SUBROUTINE ISOPOL(ISOAP, & IPINI,IPISE(NV,2),IPMARK(NV),IPNEW,IS,IS1,ISCUT(NS), & ISE(NS,NV),ISNEW,ITYPE,IV,IV1,IVISE(NS,NV),IVNEW,IVNEWT, & NEDGE(NS),NINT,NIPNEW,NISCUT,NIV,NIVNEW +!* Avoid unused warning + ASSOCIATE(ISOAP => ISOAP); END ASSOCIATE !* Determination of the faces intersected by the isosurface NISCUT=0 !* NEDGE(IS) = Number of intersected edges of the face IS diff --git a/Sources/Shared/Isoap_Mod/Main_Isoap.f90 b/Sources/Shared/Isoap_Mod/Main_Isoap.f90 index baea95ce3..9040726d4 100644 --- a/Sources/Shared/Isoap_Mod/Main_Isoap.f90 +++ b/Sources/Shared/Isoap_Mod/Main_Isoap.f90 @@ -25,8 +25,6 @@ SUBROUTINE MAIN_ISOAP(ISOAP, POLYHEDRON, ISO_POLYGONS) !---------------------------------------------------------------------! IMPLICIT NONE -!---------------------------------------------------------------------! - INCLUDE "Isoap_Mod/Dim_Polyhedron.h" ! holds NS and NV !---------------------------------------------------------------------! CLASS(ISOAP_TYPE) :: ISOAP TYPE(POLYHEDRON_TYPE), TARGET :: POLYHEDRON diff --git a/Sources/Shared/Math_Mod.f90 b/Sources/Shared/Math_Mod.f90 index 4e1b47079..c31b75228 100644 --- a/Sources/Shared/Math_Mod.f90 +++ b/Sources/Shared/Math_Mod.f90 @@ -1,3 +1,5 @@ +#include "../Shared/Unused.h90" + !==============================================================================! module Math_Mod !------------------------------------------------------------------------------! diff --git a/Sources/Shared/Math_Mod/Approx_Real.f90 b/Sources/Shared/Math_Mod/Approx_Real.f90 index a04f2cf48..af43c26d4 100644 --- a/Sources/Shared/Math_Mod/Approx_Real.f90 +++ b/Sources/Shared/Math_Mod/Approx_Real.f90 @@ -13,6 +13,8 @@ pure logical function Approx_Real(Math, a, b, tol) real, optional, intent(in) :: tol !-----------------------------------[Locals]-----------------------------------! real :: tolerance +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Math) !==============================================================================! if( .not. present(tol) ) then diff --git a/Sources/Shared/Math_Mod/Approx_String.f90 b/Sources/Shared/Math_Mod/Approx_String.f90 index f9cd78095..063bbd6dc 100644 --- a/Sources/Shared/Math_Mod/Approx_String.f90 +++ b/Sources/Shared/Math_Mod/Approx_String.f90 @@ -14,6 +14,8 @@ pure logical function Approx_String(Math, s, t, tol) !-----------------------------------[Locals]-----------------------------------! integer :: i, j, m, n, cost, tolerance integer, allocatable :: d(:,:) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Math) !==============================================================================! if( .not. present(tol) ) then diff --git a/Sources/Shared/Math_Mod/Cross_Product.f90 b/Sources/Shared/Math_Mod/Cross_Product.f90 index 8c1ae12ed..b2cf357de 100644 --- a/Sources/Shared/Math_Mod/Cross_Product.f90 +++ b/Sources/Shared/Math_Mod/Cross_Product.f90 @@ -9,6 +9,8 @@ pure function Cross_Product(Math, a, b) class(Math_Type), intent(in) :: Math real, dimension(3) :: Cross_Product real, dimension(3), intent(in) :: a, b +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Math) !==============================================================================! Cross_Product(1) = a(2) * b(3) - a(3) * b(2) diff --git a/Sources/Shared/Math_Mod/Distance.f90 b/Sources/Shared/Math_Mod/Distance.f90 index d3e787d76..61994656d 100644 --- a/Sources/Shared/Math_Mod/Distance.f90 +++ b/Sources/Shared/Math_Mod/Distance.f90 @@ -1,14 +1,16 @@ -!======================================================================! +!==============================================================================! pure real function Distance(Math, x_a, y_a, z_a, & x_b, y_b, z_b) -!----------------------------------------------------------------------! -! Calculates distance between two points in three-dimensional space. ! -!----------------------------------------------------------------------! +!------------------------------------------------------------------------------! +! Calculates distance between two points in three-dimensional space. ! +!------------------------------------------------------------------------------! implicit none -!-----------------------------[Arguments]------------------------------! +!---------------------------------[Arguments]----------------------------------! class(Math_Type), intent(in) :: Math real, intent(in) :: x_a, y_a, z_a, x_b, y_b, z_b -!======================================================================! +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Math) +!==============================================================================! Distance = sqrt( (x_a-x_b)*(x_a-x_b) & + (y_a-y_b)*(y_a-y_b) & diff --git a/Sources/Shared/Math_Mod/Distance_Squared.f90 b/Sources/Shared/Math_Mod/Distance_Squared.f90 index ca937cdd0..eb6e0b214 100644 --- a/Sources/Shared/Math_Mod/Distance_Squared.f90 +++ b/Sources/Shared/Math_Mod/Distance_Squared.f90 @@ -1,14 +1,16 @@ -!======================================================================! +!==============================================================================! pure real function Distance_Squared(Math, x_a, y_a, z_a, & x_b, y_b, z_b) -!----------------------------------------------------------------------! -! Calculates squared distance between two points in three-dimensions. ! -!----------------------------------------------------------------------! +!------------------------------------------------------------------------------! +! Calculates squared distance between two points in three-dimensions. ! +!------------------------------------------------------------------------------! implicit none -!-----------------------------[Arguments]------------------------------! +!---------------------------------[Arguments]----------------------------------! class(Math_Type), intent(in) :: Math real, intent(in) :: x_a, y_a, z_a, x_b, y_b, z_b -!======================================================================! +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Math) +!==============================================================================! Distance_Squared = (x_a-x_b)*(x_a-x_b) & + (y_a-y_b)*(y_a-y_b) & diff --git a/Sources/Shared/Math_Mod/Fit_Exp_Three_Points.f90 b/Sources/Shared/Math_Mod/Fit_Exp_Three_Points.f90 index ef1a1056a..96c9f258f 100644 --- a/Sources/Shared/Math_Mod/Fit_Exp_Three_Points.f90 +++ b/Sources/Shared/Math_Mod/Fit_Exp_Three_Points.f90 @@ -63,6 +63,8 @@ subroutine Fit_Exp_Three_Points(Math, & !-----------------------------------[Locals]-----------------------------------! integer :: i, j, k real :: a, b, c, d, b_array(N_SAMPLES), e_array(N_SAMPLES) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(x0) ! x0 is kept for symmetry with sister procedure !==============================================================================! !-----------------------------! diff --git a/Sources/Shared/Math_Mod/Gaussian_Elimination.f90 b/Sources/Shared/Math_Mod/Gaussian_Elimination.f90 index 56b5a4f26..a7782779d 100644 --- a/Sources/Shared/Math_Mod/Gaussian_Elimination.f90 +++ b/Sources/Shared/Math_Mod/Gaussian_Elimination.f90 @@ -23,6 +23,8 @@ pure subroutine Gaussian_Elimination(Math, n, a, b, x, invertible) integer, allocatable :: p(:) real :: r, rmax, smax, sum, z integer :: i, k, j, pk +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Math) !==============================================================================! allocate(s(n)) diff --git a/Sources/Shared/Math_Mod/Harmonic_Mean.f90 b/Sources/Shared/Math_Mod/Harmonic_Mean.f90 index aea41c309..dd8af6cb2 100644 --- a/Sources/Shared/Math_Mod/Harmonic_Mean.f90 +++ b/Sources/Shared/Math_Mod/Harmonic_Mean.f90 @@ -7,6 +7,8 @@ pure real function Harmonic_Mean(Math, a, b) !---------------------------------[Arguments]----------------------------------! class(Math_Type), intent(in) :: Math real, intent(in) :: a, b +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Math) !==============================================================================! Harmonic_Mean = 2.0 / (1.0 / a + 1.0 / b) diff --git a/Sources/Shared/Math_Mod/Invert_3x3_Matrix.f90 b/Sources/Shared/Math_Mod/Invert_3x3_Matrix.f90 index c8afe90e5..979985c20 100644 --- a/Sources/Shared/Math_Mod/Invert_3x3_Matrix.f90 +++ b/Sources/Shared/Math_Mod/Invert_3x3_Matrix.f90 @@ -11,6 +11,8 @@ pure subroutine Invert_3x3_Matrix(Math, a, det) !-----------------------------------[Locals]-----------------------------------! real :: b(3,3) integer :: i +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Math) !==============================================================================! det = a(1,1)*(a(2,2)*a(3,3)-a(2,3)*a(3,2)) & diff --git a/Sources/Shared/Math_Mod/Rotate_Vector.f90 b/Sources/Shared/Math_Mod/Rotate_Vector.f90 index a9f28abc3..db82ce2a1 100644 --- a/Sources/Shared/Math_Mod/Rotate_Vector.f90 +++ b/Sources/Shared/Math_Mod/Rotate_Vector.f90 @@ -13,6 +13,8 @@ pure function Rotate_Vector(Math, v, k, theta) !-----------------------------------[Locals]-----------------------------------! real :: k_dot_v real :: k_vec_v(3) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Math) !==============================================================================! k_dot_v = dot_product(k(1:3), v(1:3)) diff --git a/Sources/Shared/Math_Mod/Set_Array_Range.f90 b/Sources/Shared/Math_Mod/Set_Array_Range.f90 index f1470a33e..e35ecfc17 100644 --- a/Sources/Shared/Math_Mod/Set_Array_Range.f90 +++ b/Sources/Shared/Math_Mod/Set_Array_Range.f90 @@ -10,6 +10,8 @@ pure subroutine Set_Array_Range(Math, n, minv, maxv, array) !-----------------------------------[Locals]-----------------------------------! integer :: i real :: delta +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Math) !==============================================================================! array(1) = minv diff --git a/Sources/Shared/Math_Mod/Signed_Lower_Limit.f90 b/Sources/Shared/Math_Mod/Signed_Lower_Limit.f90 index be2db3914..983cc7d6a 100644 --- a/Sources/Shared/Math_Mod/Signed_Lower_Limit.f90 +++ b/Sources/Shared/Math_Mod/Signed_Lower_Limit.f90 @@ -8,6 +8,8 @@ pure real function Signed_Lower_Limit(Math, a, limit) class(Math_Type), intent(in) :: Math real, intent(in) :: a real, intent(in) :: limit ! lower limit, usually a small number +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Math) !==============================================================================! ! Assume it won't change diff --git a/Sources/Shared/Math_Mod/Signed_Upper_Limit.f90 b/Sources/Shared/Math_Mod/Signed_Upper_Limit.f90 index d565e4334..d246a74f0 100644 --- a/Sources/Shared/Math_Mod/Signed_Upper_Limit.f90 +++ b/Sources/Shared/Math_Mod/Signed_Upper_Limit.f90 @@ -8,6 +8,8 @@ pure real function Signed_Upper_Limit(Math, a, limit) class(Math_Type), intent(in) :: Math real, intent(in) :: a real, intent(in) :: limit ! upper limit, usually a big number +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Math) !==============================================================================! ! Assume it won't change diff --git a/Sources/Shared/Math_Mod/Smaller_Real.f90 b/Sources/Shared/Math_Mod/Smaller_Real.f90 index e5f9631ff..b171fe777 100644 --- a/Sources/Shared/Math_Mod/Smaller_Real.f90 +++ b/Sources/Shared/Math_Mod/Smaller_Real.f90 @@ -13,6 +13,8 @@ pure logical function Smaller_Real(Math, a, b, tol) real, optional, intent(in) :: tol !-----------------------------------[Locals]-----------------------------------! real :: tolerance +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Math) !==============================================================================! if( .not. present(tol) ) then diff --git a/Sources/Shared/Math_Mod/Tet_Volume.f90 b/Sources/Shared/Math_Mod/Tet_Volume.f90 index dfd5f15a0..47166dfc0 100644 --- a/Sources/Shared/Math_Mod/Tet_Volume.f90 +++ b/Sources/Shared/Math_Mod/Tet_Volume.f90 @@ -6,12 +6,7 @@ pure real function Tet_Volume(Math, & x4, y4, z4) !------------------------------------------------------------------------------! ! Returns the volume of tethraedra spanned with nodes 1 to 4 ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Math_Type), intent(in) :: Math - real, intent(in) :: x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4 -!==============================================================================! +! ! ! The order of nodes matters here, so you should either be very careful to ! ! send the nodes in the right order (which is a bit of a nuissance) or ! ! use the absolute value of the volume computed here (that is mostly done). ! @@ -25,6 +20,13 @@ pure real function Tet_Volume(Math, & ! 1-----------2 ! ! ! !------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Math_Type), intent(in) :: Math + real, intent(in) :: x1, y1, z1, x2, y2, z2, x3, y3, z3, x4, y4, z4 +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Math) +!==============================================================================! Tet_Volume = ( ( (y2-y1)*(z3-z1) - (y3-y1)*(z2-z1) ) * (x4-x1) + & ( (x3-x1)*(z2-z1) - (x2-x1)*(z3-z1) ) * (y4-y1) + & diff --git a/Sources/Shared/Message_Mod.f90 b/Sources/Shared/Message_Mod.f90 index d484887b1..43995c604 100644 --- a/Sources/Shared/Message_Mod.f90 +++ b/Sources/Shared/Message_Mod.f90 @@ -1,4 +1,5 @@ #include "../Shared/Assert.h90" +#include "../Shared/Unused.h90" !==============================================================================! module Message_Mod diff --git a/Sources/Shared/Message_Mod/Dashed_Line.f90 b/Sources/Shared/Message_Mod/Dashed_Line.f90 index 88cb7a02c..483ff750f 100644 --- a/Sources/Shared/Message_Mod/Dashed_Line.f90 +++ b/Sources/Shared/Message_Mod/Dashed_Line.f90 @@ -10,6 +10,8 @@ subroutine Dashed_Line(Msg, w) !-----------------------------------[Locals]-----------------------------------! integer :: i character(DL) :: line +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Msg) !==============================================================================! ! _assert_(w <= DL) diff --git a/Sources/Shared/Message_Mod/Error.f90 b/Sources/Shared/Message_Mod/Error.f90 index 1dc02a086..9a7b9468b 100644 --- a/Sources/Shared/Message_Mod/Error.f90 +++ b/Sources/Shared/Message_Mod/Error.f90 @@ -10,9 +10,8 @@ subroutine Error(Msg, width, message_text, file, line, one_proc) integer, intent(in), optional :: line logical, optional :: one_proc ! print from one processor only !-----------------------------------[Locals]-----------------------------------! - type(Tokenizer_Type) :: Tok - integer :: w - character(DL) :: header_text + integer :: w + character(DL) :: header_text !==============================================================================! !-------------------------------! diff --git a/Sources/Shared/Message_Mod/Frameless.f90 b/Sources/Shared/Message_Mod/Frameless.f90 index 4a9d67110..9067ae8d7 100644 --- a/Sources/Shared/Message_Mod/Frameless.f90 +++ b/Sources/Shared/Message_Mod/Frameless.f90 @@ -9,6 +9,8 @@ subroutine Frameless(Msg, width, message_text) integer :: i integer :: cur_p, nex_p character(DL) :: line +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Msg) !==============================================================================! !---------------------------------------------------! diff --git a/Sources/Shared/Message_Mod/Thick_Line.f90 b/Sources/Shared/Message_Mod/Thick_Line.f90 index 84a1b7568..849a5ee6d 100644 --- a/Sources/Shared/Message_Mod/Thick_Line.f90 +++ b/Sources/Shared/Message_Mod/Thick_Line.f90 @@ -10,6 +10,8 @@ subroutine Thick_Line(Msg, w) !-----------------------------------[Locals]-----------------------------------! integer :: i character(DL) :: line +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Msg) !==============================================================================! ! _assert_(w <= DL) diff --git a/Sources/Shared/Message_Mod/Thin_Line.f90 b/Sources/Shared/Message_Mod/Thin_Line.f90 index 01805eb26..dca35dfce 100644 --- a/Sources/Shared/Message_Mod/Thin_Line.f90 +++ b/Sources/Shared/Message_Mod/Thin_Line.f90 @@ -10,6 +10,8 @@ subroutine Thin_Line(Msg, w) !-----------------------------------[Locals]-----------------------------------! integer :: i character(DL) :: line +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Msg) !==============================================================================! ! _assert_(w <= DL) diff --git a/Sources/Shared/Message_Mod/Warning.f90 b/Sources/Shared/Message_Mod/Warning.f90 index 214cf5167..a5530f191 100644 --- a/Sources/Shared/Message_Mod/Warning.f90 +++ b/Sources/Shared/Message_Mod/Warning.f90 @@ -10,9 +10,8 @@ subroutine Warning(Msg, width, message_text, file, line, one_proc) integer, intent(in), optional :: line logical, optional :: one_proc ! print from one processor only !-----------------------------------[Locals]-----------------------------------! - type(Tokenizer_Type) :: Tok - integer :: w - character(DL) :: header_text + integer :: w + character(DL) :: header_text !==============================================================================! !-------------------------------! diff --git a/Sources/Shared/Polyhedron_Mod.f90 b/Sources/Shared/Polyhedron_Mod.f90 index 189b60ae3..2689a25be 100644 --- a/Sources/Shared/Polyhedron_Mod.f90 +++ b/Sources/Shared/Polyhedron_Mod.f90 @@ -1,4 +1,5 @@ #include "../Shared/Assert.h90" +#include "../Shared/Unused.h90" !==============================================================================! module Polyhedron_Mod diff --git a/Sources/Shared/Polyhedron_Mod/Create_Sdodecahedron.f90 b/Sources/Shared/Polyhedron_Mod/Create_Sdodecahedron.f90 index 66d0b3dd3..922779f7d 100644 --- a/Sources/Shared/Polyhedron_Mod/Create_Sdodecahedron.f90 +++ b/Sources/Shared/Polyhedron_Mod/Create_Sdodecahedron.f90 @@ -27,7 +27,7 @@ subroutine Create_Sdodecahedron(Pol) xn = yv1*zv2-zv1*yv2 yn = zv1*xv2-xv1*zv2 zn = xv1*yv2-yv1*xv2 - dmod = (xn**2.0d0+yn**2.0d0+zn**2.0d0)**0.5d0 + dmod = (xn**2.0+yn**2.0+zn**2.0)**0.5 xns(is) = xn/dmod yns(is) = yn/dmod zns(is) = zn/dmod diff --git a/Sources/Shared/Polyhedron_Mod/Create_Sicosahedron.f90 b/Sources/Shared/Polyhedron_Mod/Create_Sicosahedron.f90 index 496310792..d3b89325d 100644 --- a/Sources/Shared/Polyhedron_Mod/Create_Sicosahedron.f90 +++ b/Sources/Shared/Polyhedron_Mod/Create_Sicosahedron.f90 @@ -27,7 +27,7 @@ subroutine Create_Sicosahedron(Pol) xn = yv1*zv2-zv1*yv2 yn = zv1*xv2-xv1*zv2 zn = xv1*yv2-yv1*xv2 - dmod = (xn**2.0d0+yn**2.0d0+zn**2.0d0)**0.5d0 + dmod = (xn**2.0+yn**2.0+zn**2.0)**0.5 xns(is) = xn/dmod yns(is) = yn/dmod zns(is) = zn/dmod diff --git a/Sources/Shared/Polyhedron_Mod/Extract_From_Grid.f90 b/Sources/Shared/Polyhedron_Mod/Extract_From_Grid.f90 index 859b04283..0944f23fa 100644 --- a/Sources/Shared/Polyhedron_Mod/Extract_From_Grid.f90 +++ b/Sources/Shared/Polyhedron_Mod/Extract_From_Grid.f90 @@ -13,7 +13,7 @@ subroutine Extract_From_Grid(Pol, Grid, cell, phi_n) integer, pointer, contiguous :: glo(:) integer, pointer, contiguous :: local_node(:) ! local to polyhedron integer :: local_face_nodes(MAX_ISOAP_VERTS) - integer :: i_nod, i_fac, i_ver, i_iso, l_nod + integer :: i_nod, i_fac, l_nod integer :: s, n, faces_n_nodes real :: dx, dy, dz, sx, sy, sz !==============================================================================! diff --git a/Sources/Shared/Polyhedron_Mod/Func_1.f90 b/Sources/Shared/Polyhedron_Mod/Func_1.f90 index 84858c939..5e92a83dc 100644 --- a/Sources/Shared/Polyhedron_Mod/Func_1.f90 +++ b/Sources/Shared/Polyhedron_Mod/Func_1.f90 @@ -9,6 +9,8 @@ function Func_1(Pol, x, y, z) class(Polyhedron_Type) :: Pol real :: Func_1 real :: x, y, z +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Pol) !==============================================================================! Func_1=-1.0*((x-0.5)**2+(y-0.5)**2+(z-0.5)**2-0.325**2) diff --git a/Sources/Shared/Polyhedron_Mod/Func_2.f90 b/Sources/Shared/Polyhedron_Mod/Func_2.f90 index 7ec0ba316..c7cc0d396 100644 --- a/Sources/Shared/Polyhedron_Mod/Func_2.f90 +++ b/Sources/Shared/Polyhedron_Mod/Func_2.f90 @@ -9,6 +9,8 @@ function Func_2(Pol, x, y, z) class(Polyhedron_Type) :: Pol real :: Func_2 real :: x, y, z +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Pol) !==============================================================================! Func_2=(0.1)**2-((0.2)-((x-0.5)**2+(z-0.5)**2)**0.5)**2- & diff --git a/Sources/Shared/Polyhedron_Mod/Func_3.f90 b/Sources/Shared/Polyhedron_Mod/Func_3.f90 index d1620ac64..623464ad5 100644 --- a/Sources/Shared/Polyhedron_Mod/Func_3.f90 +++ b/Sources/Shared/Polyhedron_Mod/Func_3.f90 @@ -9,6 +9,8 @@ function Func_3(Pol, x, y, z) class(Polyhedron_Type) :: Pol real :: Func_3 real :: x, y, z +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Pol) !==============================================================================! x=x-1.25 diff --git a/Sources/Shared/Sort_Mod.f90 b/Sources/Shared/Sort_Mod.f90 index f840e3244..e54b3c020 100644 --- a/Sources/Shared/Sort_Mod.f90 +++ b/Sources/Shared/Sort_Mod.f90 @@ -1,3 +1,5 @@ +#include "../Shared/Unused.h90" + !==============================================================================! module Sort_Mod !------------------------------------------------------------------------------! diff --git a/Sources/Shared/Sort_Mod/Int_By_Index.f90 b/Sources/Shared/Sort_Mod/Int_By_Index.f90 index 455d87030..6a9af0c25 100644 --- a/Sources/Shared/Sort_Mod/Int_By_Index.f90 +++ b/Sources/Shared/Sort_Mod/Int_By_Index.f90 @@ -12,6 +12,8 @@ pure subroutine Int_By_Index(Sort, n, x, indx) !-----------------------------------[Locals]-----------------------------------! integer :: i integer, allocatable :: work(:) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Sort) !==============================================================================! allocate(work(n)); work = 0 diff --git a/Sources/Shared/Sort_Mod/Real_By_Index.f90 b/Sources/Shared/Sort_Mod/Real_By_Index.f90 index 5ba63b7fd..5b4a6f695 100644 --- a/Sources/Shared/Sort_Mod/Real_By_Index.f90 +++ b/Sources/Shared/Sort_Mod/Real_By_Index.f90 @@ -12,6 +12,8 @@ pure subroutine Real_By_Index(Sort, n, x, indx) !-----------------------------------[Locals]-----------------------------------! integer :: i real, allocatable :: work(:) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Sort) !==============================================================================! allocate(work(n)); work = 0.0 diff --git a/Sources/Shared/Sort_Mod/Reverse_Order_Int.f90 b/Sources/Shared/Sort_Mod/Reverse_Order_Int.f90 index bd77e91a1..81a60cf26 100644 --- a/Sources/Shared/Sort_Mod/Reverse_Order_Int.f90 +++ b/Sources/Shared/Sort_Mod/Reverse_Order_Int.f90 @@ -9,6 +9,8 @@ pure subroutine Reverse_Order_Int(Sort, a) integer, intent(inout) :: a(:) !-----------------------------------[Locals]-----------------------------------! integer :: i, j, n +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Sort) !==============================================================================! n = size(a, 1) diff --git a/Sources/Shared/Sort_Mod/Reverse_Order_Real.f90 b/Sources/Shared/Sort_Mod/Reverse_Order_Real.f90 index 12566cf73..3f7f6cd7c 100644 --- a/Sources/Shared/Sort_Mod/Reverse_Order_Real.f90 +++ b/Sources/Shared/Sort_Mod/Reverse_Order_Real.f90 @@ -9,6 +9,8 @@ pure subroutine Reverse_Order_Real(Sort, a) real, intent(inout) :: a(:) !-----------------------------------[Locals]-----------------------------------! integer :: i, j, n +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Sort) !==============================================================================! n = size(a, 1) diff --git a/Sources/Shared/Sort_Mod/Unique_Int.f90 b/Sources/Shared/Sort_Mod/Unique_Int.f90 index 3c5717543..aeb7ee342 100644 --- a/Sources/Shared/Sort_Mod/Unique_Int.f90 +++ b/Sources/Shared/Sort_Mod/Unique_Int.f90 @@ -13,6 +13,8 @@ pure subroutine Unique_Int(Sort, values, nu) !-----------------------------------[Locals]-----------------------------------! integer :: i, min_val, max_val integer, allocatable :: unique(:) +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Sort) !==============================================================================! ! Set initial size of unique list ... diff --git a/Sources/Shared/Stl_Mod/Read_Stl_Ascii.f90 b/Sources/Shared/Stl_Mod/Read_Stl_Ascii.f90 index 2f21805c1..dfb9a2e00 100644 --- a/Sources/Shared/Stl_Mod/Read_Stl_Ascii.f90 +++ b/Sources/Shared/Stl_Mod/Read_Stl_Ascii.f90 @@ -7,7 +7,7 @@ subroutine Read_Stl_Ascii(Stl) !---------------------------------[Arguments]----------------------------------! class(Stl_Type) :: Stl !-----------------------------------[Locals]-----------------------------------! - integer :: fu, v, f, i_ver, n + integer :: fu, v, f, i_ver !==============================================================================! call File % Open_For_Reading_Ascii(Stl % name, fu) diff --git a/Sources/Shared/String_Mod.f90 b/Sources/Shared/String_Mod.f90 index 28e1a688e..ccc76db85 100644 --- a/Sources/Shared/String_Mod.f90 +++ b/Sources/Shared/String_Mod.f90 @@ -1,3 +1,5 @@ +#include "../Shared/Unused.h90" + !==============================================================================! module String_Mod !------------------------------------------------------------------------------! diff --git a/Sources/Shared/String_Mod/First_Upper.f90 b/Sources/Shared/String_Mod/First_Upper.f90 index 1bf3b1fe8..2f9ff6b78 100644 --- a/Sources/Shared/String_Mod/First_Upper.f90 +++ b/Sources/Shared/String_Mod/First_Upper.f90 @@ -10,6 +10,8 @@ pure function First_Upper(String, char_array) result(char_manip) character(:), allocatable :: char_manip !-----------------------------------[Locals]-----------------------------------! integer :: i, value +!------------------------[Avoid unused parent warning]-------------------------! + Unused(String) !==============================================================================! ! Copy the string from the argument to the local which you will manipulate diff --git a/Sources/Shared/String_Mod/To_Lower_Case.f90 b/Sources/Shared/String_Mod/To_Lower_Case.f90 index dc5a01247..fe72b3a2d 100644 --- a/Sources/Shared/String_Mod/To_Lower_Case.f90 +++ b/Sources/Shared/String_Mod/To_Lower_Case.f90 @@ -9,6 +9,8 @@ pure subroutine To_Lower_Case(String, char_array) character(len=*), intent(inout) :: char_array !-----------------------------------[Locals]-----------------------------------! integer :: i, value +!------------------------[Avoid unused parent warning]-------------------------! + Unused(String) !==============================================================================! do i = 1, len_trim(char_array) diff --git a/Sources/Shared/String_Mod/To_Upper_Case.f90 b/Sources/Shared/String_Mod/To_Upper_Case.f90 index 1703339b9..d3c8c440b 100644 --- a/Sources/Shared/String_Mod/To_Upper_Case.f90 +++ b/Sources/Shared/String_Mod/To_Upper_Case.f90 @@ -9,6 +9,8 @@ subroutine To_Upper_Case(String, char_array) character(len=*), intent(inout) :: char_array !-----------------------------------[Locals]-----------------------------------! integer :: i, value +!------------------------[Avoid unused parent warning]-------------------------! + Unused(String) !==============================================================================! do i = 1, len_trim(char_array) diff --git a/Sources/Shared/Unused.h90 b/Sources/Shared/Unused.h90 new file mode 100644 index 000000000..29e94e7fd --- /dev/null +++ b/Sources/Shared/Unused.h90 @@ -0,0 +1,9 @@ +!==============================================================================! +! Definition of the macro which avoids too many workings while compiling. ! +!------------------------------------------------------------------------------! + +# if T_FLOWS_DEBUG == 1 +# define Unused(p) associate(p => p); end associate +# else +# define Unused(p) +# endif diff --git a/Sources/Shared/Vect_Mod.f90 b/Sources/Shared/Vect_Mod.f90 index 6fff2f0b5..7da50d52b 100644 --- a/Sources/Shared/Vect_Mod.f90 +++ b/Sources/Shared/Vect_Mod.f90 @@ -1,3 +1,5 @@ +#include "../Shared/Unused.h90" + !==============================================================================! module Vect_Mod !------------------------------------------------------------------------------! diff --git a/Sources/Shared/Vect_Mod/Get_Max_Threads.f90 b/Sources/Shared/Vect_Mod/Get_Max_Threads.f90 index 5dfee039e..431338835 100644 --- a/Sources/Shared/Vect_Mod/Get_Max_Threads.f90 +++ b/Sources/Shared/Vect_Mod/Get_Max_Threads.f90 @@ -4,6 +4,8 @@ integer function Get_Max_Threads(Vect) implicit none !------------------------------------------------------------------------------! class(Vect_Type) :: Vect +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Vect) !==============================================================================! Get_Max_Threads = 1 diff --git a/Sources/Shared/Vect_Mod/Set_Num_Threads.f90 b/Sources/Shared/Vect_Mod/Set_Num_Threads.f90 index 454b6a43d..9ec8a86a9 100644 --- a/Sources/Shared/Vect_Mod/Set_Num_Threads.f90 +++ b/Sources/Shared/Vect_Mod/Set_Num_Threads.f90 @@ -5,10 +5,14 @@ subroutine Set_Num_Threads(Vect, n) !------------------------------------------------------------------------------! class(Vect_Type) :: Vect integer, intent(in) :: n +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Vect) !==============================================================================! # ifdef _OPENMP call omp_set_num_threads(n) +# else + Unused(n) # endif end subroutine diff --git a/Sources/Utilities/Check_Isoap.f90 b/Sources/Utilities/Check_Isoap.f90 index 3b45eb31b..59b164280 100644 --- a/Sources/Utilities/Check_Isoap.f90 +++ b/Sources/Utilities/Check_Isoap.f90 @@ -9,8 +9,6 @@ program Test !------------------------------------------------------------------------------! type(Polyhedron_Type) :: Pol type(Iso_Polygons_Type) :: Iso -!------------------------------[Local parameters]------------------------------! - integer, parameter :: NS = 200, NV = 240 !-----------------------------------[Locals]-----------------------------------! integer :: icellgeom, ifunc, ifile character(80) :: arg From 6ad8496ec6fb2a3e4e6cfbdc81629657d9775c4b Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 21 Mar 2023 03:20:54 +0100 Subject: [PATCH 109/223] Makes use of some local variables. On branch bojan_fixed_cell_ranges modified: User_Mod/Beginning_Of_Compute_Vof.f90 modified: User_Mod/End_Of_Compute_Vof.f90 modified: Vof_Mod/Core/Main_Vof.f90 --- Sources/Process/User_Mod/Beginning_Of_Compute_Vof.f90 | 6 ++++++ Sources/Process/User_Mod/End_Of_Compute_Vof.f90 | 6 ++++++ Sources/Process/Vof_Mod/Core/Main_Vof.f90 | 2 ++ 3 files changed, 14 insertions(+) diff --git a/Sources/Process/User_Mod/Beginning_Of_Compute_Vof.f90 b/Sources/Process/User_Mod/Beginning_Of_Compute_Vof.f90 index 5baf9b35c..a350d3e4c 100644 --- a/Sources/Process/User_Mod/Beginning_Of_Compute_Vof.f90 +++ b/Sources/Process/User_Mod/Beginning_Of_Compute_Vof.f90 @@ -19,5 +19,11 @@ subroutine User_Mod_Beginning_Of_Compute_Vof(Vof, Sol, curr_dt) Flow => Vof % pnt_flow Grid => Flow % pnt_grid fun => Vof % fun + A => Sol % Nat % A + + if(curr_dt > 120) then + ! Do something + + end if end subroutine diff --git a/Sources/Process/User_Mod/End_Of_Compute_Vof.f90 b/Sources/Process/User_Mod/End_Of_Compute_Vof.f90 index 898e9ae5f..d26300a2f 100644 --- a/Sources/Process/User_Mod/End_Of_Compute_Vof.f90 +++ b/Sources/Process/User_Mod/End_Of_Compute_Vof.f90 @@ -19,5 +19,11 @@ subroutine User_Mod_End_Of_Compute_Vof(Vof, Sol, curr_dt) Flow => Vof % pnt_flow Grid => Flow % pnt_grid fun => Vof % fun + A => Sol % Nat % A + + if(curr_dt > 120) then + ! Do something + + end if end subroutine diff --git a/Sources/Process/Vof_Mod/Core/Main_Vof.f90 b/Sources/Process/Vof_Mod/Core/Main_Vof.f90 index ee43b0356..06acb7266 100644 --- a/Sources/Process/Vof_Mod/Core/Main_Vof.f90 +++ b/Sources/Process/Vof_Mod/Core/Main_Vof.f90 @@ -10,6 +10,8 @@ subroutine Main_Vof(Vof, Flow, Turb, Sol, curr_dt) type(Turb_Type), target :: Turb type(Solver_Type) :: Sol integer, intent(in) :: curr_dt ! time step +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Turb) !==============================================================================! if(Flow % with_interface) then From f00f2601dba51f405a1782094fe7e985ea9d152e Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 21 Mar 2023 03:35:51 +0100 Subject: [PATCH 110/223] Corrected an error in makefile_explicit_depen... --- Sources/Convert/makefile_explicit_dependencies | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/Sources/Convert/makefile_explicit_dependencies b/Sources/Convert/makefile_explicit_dependencies index 08feeac80..48ac46159 100644 --- a/Sources/Convert/makefile_explicit_dependencies +++ b/Sources/Convert/makefile_explicit_dependencies @@ -11,7 +11,6 @@ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 \ -Convert_Mod/untitled.geo \ $(DIR_OBJECT)/Convert_Mod.o \ Convert_Mod/foo.msh \ Convert_Mod/*.f90 @@ -26,7 +25,6 @@ $(DIR_OBJECT)/Profiler_Mod.o \ $(DIR_SHARED)/Profiler_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 \ -Convert_Mod/untitled.geo \ Convert_Mod/foo.msh \ Convert_Mod/*.f90 @@ -44,16 +42,6 @@ $(DIR_OBJECT)/Find_Parents.o:\ $(DIR_OBJECT)/Profiler_Mod.o \ $(DIR_SHARED)/Profiler_Mod/*.f90 -#--------------------------------------------------- -# Dependencies for: ./Isoap_Mod/Isopol.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Isopol.o: - -#--------------------------------------------------- -# Dependencies for: ./Isoap_Mod/Main_Isoap.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Main_Isoap.o: - #--------------------------------------------------- # Dependencies for: ./Gen_Mod.f90 #--------------------------------------------------- @@ -245,8 +233,7 @@ $(DIR_SHARED)/Polyhedron_Mod/*.f90 \ $(DIR_OBJECT)/Iso_Polygons_Mod.o \ $(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ $(DIR_SHARED)/Isoap_Mod/readme \ -$(DIR_SHARED)/Isoap_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/Dim_Polyhedron.h +$(DIR_SHARED)/Isoap_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Vtk_Mod.f90 From bf8e045c75446fbf61e48f490e847179050a5f5f Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 21 Mar 2023 03:40:25 +0100 Subject: [PATCH 111/223] This is an amendment to previous check in, reading cba8069600e925d4a78396b04531a77f171f7fea Still avoiding excessive warning messages On branch bojan_fixed_cell_ranges modified: Shared/Comm_Mod/Parallel/Close_File.f90 modified: Shared/Comm_Mod/Parallel/Open_File_Read.f90 modified: Shared/Comm_Mod/Parallel/Open_File_Write.f90 --- Sources/Shared/Comm_Mod/Parallel/Close_File.f90 | 2 ++ Sources/Shared/Comm_Mod/Parallel/Open_File_Read.f90 | 2 ++ Sources/Shared/Comm_Mod/Parallel/Open_File_Write.f90 | 2 ++ 3 files changed, 6 insertions(+) diff --git a/Sources/Shared/Comm_Mod/Parallel/Close_File.f90 b/Sources/Shared/Comm_Mod/Parallel/Close_File.f90 index b5527ed38..0abac663c 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Close_File.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Close_File.f90 @@ -9,6 +9,8 @@ subroutine Close_File(Comm, fh) type(Mpi_File) :: fh ! file handle !-----------------------------------[Locals]-----------------------------------! integer :: error +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Close the file diff --git a/Sources/Shared/Comm_Mod/Parallel/Open_File_Read.f90 b/Sources/Shared/Comm_Mod/Parallel/Open_File_Read.f90 index 476a7ae45..8237ae907 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Open_File_Read.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Open_File_Read.f90 @@ -10,6 +10,8 @@ subroutine Open_File_Read(Comm, fh, file_name) character :: file_name*(*) ! file name !-----------------------------------[Locals]-----------------------------------! integer :: error = 0 +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Open file with MPI diff --git a/Sources/Shared/Comm_Mod/Parallel/Open_File_Write.f90 b/Sources/Shared/Comm_Mod/Parallel/Open_File_Write.f90 index ebb826b0f..d0ed1717c 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Open_File_Write.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Open_File_Write.f90 @@ -10,6 +10,8 @@ subroutine Open_File_Write(Comm, fh, file_name) character :: file_name*(*) ! file name !-----------------------------------[Locals]-----------------------------------! integer :: error = 0 +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Comm) !==============================================================================! ! Open file with MPI From e19b23914df023f115cd7b819722ec940e7b09a2 Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 21 Mar 2023 03:43:10 +0100 Subject: [PATCH 112/223] FINALLY: imposed separate options for User_Mod In addition to that, which was indeed long coming, I also removed some obsolete and unused sections in all makefiles On branch bojan_fixed_cell_ranges modified: Convert/makefile modified: Divide/makefile modified: Generate/makefile modified: Process/makefile --- Sources/Convert/makefile | 10 ---------- Sources/Divide/makefile | 10 ---------- Sources/Generate/makefile | 10 ---------- Sources/Process/makefile | 26 ++++++++++++++------------ 4 files changed, 14 insertions(+), 42 deletions(-) diff --git a/Sources/Convert/makefile b/Sources/Convert/makefile index 057df4a3d..612f33df5 100644 --- a/Sources/Convert/makefile +++ b/Sources/Convert/makefile @@ -190,8 +190,6 @@ endif #------------------------------------------------------ # Modules' order must obey their dependency # This list should therefore be written "by hand". -# Note: Modules written in lower case -# letters are candidates for deletion. #------------------------------------------------------ #------------- @@ -242,14 +240,6 @@ OBJ_F_MOD = $(SRC_F_MOD:%.f90=$(DIR_OBJECT)/%.o) OBJ_F_FUN = $(SRC_F_FUN:%.f90=$(DIR_OBJECT)/%.o) OBJ = $(OBJ_F_MOD) $(OBJ_F_FUN) -#------------------------------------------------------- -# List of modules currently used for target "clean" -#------------------------------------------------------- -# Note: This doesn't need editing. -#------------------------------------------------------- -SRC_F_MOD_LOW = $(shell echo $(SRC_F_MOD) | tr A-Z a-z) -MOD = $(SRC_F_MOD_LOW:%.f90=$(DIR_MODULE)/%.mod) - #--------------------------------------------------------- # Default rule to build Fortran modules and functions #--------------------------------------------------------- diff --git a/Sources/Divide/makefile b/Sources/Divide/makefile index 35225aac7..fcdf804b4 100644 --- a/Sources/Divide/makefile +++ b/Sources/Divide/makefile @@ -189,8 +189,6 @@ endif #------------------------------------------------------ # Modules' order must obey their dependency # This list should therefore be written "by hand". -# Note: Modules written in lower case -# letters are candidates for deletion. #------------------------------------------------------ #------------- @@ -239,14 +237,6 @@ OBJ_F_MOD = $(SRC_F_MOD:%.f90=$(DIR_OBJECT)/%.o) OBJ_F_FUN = $(SRC_F_FUN:%.f90=$(DIR_OBJECT)/%.o) OBJ = $(OBJ_F_MOD) $(OBJ_F_FUN) -#------------------------------------------------------- -# List of modules currently used for target "clean" -#------------------------------------------------------- -# Note: This doesn't need editing. -#------------------------------------------------------- -SRC_F_MOD_LOW = $(shell echo $(SRC_F_MOD) | tr A-Z a-z) -MOD = $(SRC_F_MOD_LOW:%.f90=$(DIR_MODULE)/%.mod) - #--------------------------------------------------------- # Default rule to build Fortran modules and functions #--------------------------------------------------------- diff --git a/Sources/Generate/makefile b/Sources/Generate/makefile index d0e02f313..ccfc80bc9 100644 --- a/Sources/Generate/makefile +++ b/Sources/Generate/makefile @@ -190,8 +190,6 @@ endif #------------------------------------------------------ # Modules' order must obey their dependency # This list should therefore be written "by hand". -# Note: Modules written in lower case -# letters are candidates for deletion. #------------------------------------------------------ #------------- @@ -249,14 +247,6 @@ OBJ_F_MOD = $(SRC_F_MOD:%.f90=$(DIR_OBJECT)/%.o) OBJ_F_FUN = $(SRC_F_FUN:%.f90=$(DIR_OBJECT)/%.o) OBJ = $(OBJ_F_MOD) $(OBJ_F_FUN) -#------------------------------------------------------- -# List of modules currently used for target "clean" -#------------------------------------------------------- -# Note: This doesn't need editing. -#------------------------------------------------------- -SRC_F_MOD_LOW = $(shell echo $(SRC_F_MOD) | tr A-Z a-z) -MOD = $(SRC_F_MOD_LOW:%.f90=$(DIR_MODULE)/%.mod) - #--------------------------------------------------------- # Default rule to build Fortran modules and functions #--------------------------------------------------------- diff --git a/Sources/Process/makefile b/Sources/Process/makefile index 0e0cd45f8..c91187a56 100644 --- a/Sources/Process/makefile +++ b/Sources/Process/makefile @@ -123,6 +123,7 @@ ifeq ($(FORTRAN), intel) OPT_F_COMP += -qopenmp-link dynamic -parallel-source-info=2 endif endif + OPT_F_COMP_USER = $(OPT_F_COMP) #------------ # Nvidia @@ -147,6 +148,7 @@ else ifeq ($(FORTRAN), nvidia) ifeq ($(OMP), yes) OPT_F_COMP += -mp endif + OPT_F_COMP_USER = $(OPT_F_COMP) #--------- # Gnu @@ -161,8 +163,7 @@ else endif OPT_F_COMP = -J $(DIR_MODULE) -cpp -ffree-line-length-none ifeq ($(DEBUG), yes) - OPT_F_COMP += -O0 -g -fcheck=all -Wunused-parameter -Wall \ - -Wno-integer-division + OPT_F_COMP += -O0 -g -fcheck=all -Wall -Wno-integer-division else OPT_F_COMP += -O3 endif @@ -175,6 +176,10 @@ else ifeq ($(OMP), yes) OPT_F_COMP += -fopenmp endif + OPT_F_COMP_USER = $(OPT_F_COMP) + OPT_F_COMP_USER += -Wno-unused-dummy-argument + OPT_F_COMP_USER += -Wno-unused-variable + endif # Set initial options for C compiler - this is probably not needed @@ -229,8 +234,6 @@ endif #------------------------------------------------------ # Modules' order must obey their dependency # This list should therefore be written "by hand". -# Note: Modules written in lower case -# letters are candidates for deletion. #------------------------------------------------------ #-------------------- @@ -349,14 +352,6 @@ OBJ_F_FUN = $(SRC_F_FUN:%.f90=$(DIR_OBJECT)/%.o) OBJ_C_FUN = $(SRC_C_FUN:%.c=$(DIR_OBJECT)/%.o) OBJ = $(OBJ_F_MOD) $(OBJ_F_FUN) $(OBJ_C_FUN) -#------------------------------------------------------- -# List of modules currently used for target "clean" -#------------------------------------------------------- -# Note: This doesn't need editing. -#------------------------------------------------------- -SRC_F_MOD_LOW = $(shell echo $(SRC_F_MOD) | tr A-Z a-z) -MOD = $(SRC_F_MOD_LOW:%.f90=$(DIR_MODULE)/%.mod) - #--------------------------------------------------------- # Default rule to build Fortran modules and functions #--------------------------------------------------------- @@ -373,6 +368,13 @@ $(DIR_OBJECT)/%.o: %.c @echo $(CC) $< @$(CC) $(OPT_C_COMP) $(PASS_ON) -c -o $@ $< +#---------------------------------------- +# Special rule to build User_Mod.f90 +#---------------------------------------- +$(DIR_OBJECT)/User%Mod.o: User%Mod.f90 + @echo $(FC) $< + @$(FC) $(OPT_F_COMP_USER) $(PASS_ON) -c -o $@ $< + #----------------------------------- # Rule to build main program #----------------------------------- From 28e9fdb887136ab0dae29162a5004b88a20e160f Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 21 Mar 2023 17:15:52 +0100 Subject: [PATCH 113/223] PROGRAM_NAME is now parameter in Const_Mod. Sources/Shared/Program_Name.h90 has been deleted. On branch bojan_fixed_cell_ranges modified: Sources/Shared/Const_Mod.f90 modified: Sources/Shared/Grid_Mod.f90 deleted: Sources/Shared/Program_Name.h90 --- Sources/Shared/Const_Mod.f90 | 14 ++++++++++++++ Sources/Shared/Grid_Mod.f90 | 1 - Sources/Shared/Program_Name.h90 | 13 ------------- 3 files changed, 14 insertions(+), 14 deletions(-) delete mode 100644 Sources/Shared/Program_Name.h90 diff --git a/Sources/Shared/Const_Mod.f90 b/Sources/Shared/Const_Mod.f90 index 387c0b703..5228f2034 100644 --- a/Sources/Shared/Const_Mod.f90 +++ b/Sources/Shared/Const_Mod.f90 @@ -2,10 +2,24 @@ module Const_Mod !------------------------------------------------------------------------------! ! Constants definitions for all other modules. ! +! ! +! Program name (T_FLOWS_PROGRAM) is passed from makefile of each program ! !------------------------------------------------------------------------------! implicit none !==============================================================================! +# if T_FLOWS_PROGRAM == 1 + character(8), parameter :: PROGRAM_NAME = "Generate" +# elif T_FLOWS_PROGRAM == 2 + character(6), parameter :: PROGRAM_NAME = "Divide" +# elif T_FLOWS_PROGRAM == 3 + character(7), parameter :: PROGRAM_NAME = "Convert" +# elif T_FLOWS_PROGRAM == 4 + character(7), parameter :: PROGRAM_NAME = "Process" +# else + character(9), parameter :: PROGRAM_NAME = "Undefined" +# endif + ! Standard string length integer, parameter :: VL = 4 ! variable name length integer, parameter :: SL = 80 ! standard string length diff --git a/Sources/Shared/Grid_Mod.f90 b/Sources/Shared/Grid_Mod.f90 index 6224f6f16..a7d5ffb41 100644 --- a/Sources/Shared/Grid_Mod.f90 +++ b/Sources/Shared/Grid_Mod.f90 @@ -1,6 +1,5 @@ #include "../Shared/Assert.h90" #include "../Shared/Browse.h90" -#include "../Shared/Program_Name.h90" !==============================================================================! module Grid_Mod diff --git a/Sources/Shared/Program_Name.h90 b/Sources/Shared/Program_Name.h90 deleted file mode 100644 index 7d5c99605..000000000 --- a/Sources/Shared/Program_Name.h90 +++ /dev/null @@ -1,13 +0,0 @@ -!==============================================================================! -! Definition of program name in T-Flows -!------------------------------------------------------------------------------! - -# if T_FLOWS_PROGRAM == 1 -# define PROGRAM_NAME "Generate" -# elif T_FLOWS_PROGRAM == 2 -# define PROGRAM_NAME "Divide" -# elif T_FLOWS_PROGRAM == 3 -# define PROGRAM_NAME "Convert" -# else -# define PROGRAM_NAME "Process" -# endif From 370e91b61fdc02663fb8e634532eaa9df5bec4d3 Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 21 Mar 2023 17:19:40 +0100 Subject: [PATCH 114/223] Profiler_Mod reads control file for PROFILER_INFO This variable can be set to "percents" (default) or "seconds", which is sometimes useful when profiling. On branch bojan_fixed_cell_ranges modified: Documentation/all_control_keywords modified: Sources/Convert/makefile modified: Sources/Convert/makefile_explicit_dependencies modified: Sources/Divide/makefile modified: Sources/Divide/makefile_explicit_dependencies modified: Sources/Generate/makefile modified: Sources/Generate/makefile_explicit_dependencies modified: Sources/Process/makefile modified: Sources/Process/makefile_explicit_dependencies modified: Sources/Shared/Control_Mod.f90 modified: Sources/Shared/Profiler_Mod.f90 modified: Sources/Shared/Profiler_Mod/Statistics.f90 --- Documentation/all_control_keywords | 1 + Sources/Convert/makefile | 1 + .../Convert/makefile_explicit_dependencies | 285 +++---- Sources/Divide/makefile | 1 + Sources/Divide/makefile_explicit_dependencies | 284 ++++--- Sources/Generate/makefile | 1 + .../Generate/makefile_explicit_dependencies | 312 ++++---- Sources/Process/makefile | 2 +- .../Process/makefile_explicit_dependencies | 699 +++++++++--------- Sources/Shared/Control_Mod.f90 | 3 + Sources/Shared/Profiler_Mod.f90 | 1 + Sources/Shared/Profiler_Mod/Statistics.f90 | 10 +- 12 files changed, 799 insertions(+), 801 deletions(-) diff --git a/Documentation/all_control_keywords b/Documentation/all_control_keywords index 1b271b5c6..1a211ed79 100644 --- a/Documentation/all_control_keywords +++ b/Documentation/all_control_keywords @@ -16,6 +16,7 @@ SAVE_RESULTS_AT_BOUNDARIES | yes | no SWARM_SAVE_INTERVAL | 60 | any integer > 0 WALL_TIME_MAX_HOURS | 168.0 | any number + PROFILER_INFO | percents | seconds ======================================================================================================================== Numerics ------------------------------------------------------------------------------------------------------------------------ diff --git a/Sources/Convert/makefile b/Sources/Convert/makefile index 612f33df5..fc83abefd 100644 --- a/Sources/Convert/makefile +++ b/Sources/Convert/makefile @@ -205,6 +205,7 @@ SRC_F_MOD = Const_Mod.f90 \ Assert_Mod.f90 \ Message_Mod.f90 \ Vect_Mod.f90 \ + Control_Mod.f90 \ Profiler_Mod.f90 \ Math_Mod.f90 \ File_Mod.f90 \ diff --git a/Sources/Convert/makefile_explicit_dependencies b/Sources/Convert/makefile_explicit_dependencies index 48ac46159..742245d82 100644 --- a/Sources/Convert/makefile_explicit_dependencies +++ b/Sources/Convert/makefile_explicit_dependencies @@ -12,20 +12,6 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 \ $(DIR_OBJECT)/Convert_Mod.o \ -Convert_Mod/foo.msh \ -Convert_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Convert_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Convert_Mod.o:\ -$(DIR_OBJECT)/Stl_Mod.o \ -$(DIR_SHARED)/Stl_Mod/*.f90 \ -$(DIR_OBJECT)/Profiler_Mod.o \ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -Convert_Mod/foo.msh \ Convert_Mod/*.f90 #--------------------------------------------------- @@ -43,50 +29,79 @@ $(DIR_OBJECT)/Profiler_Mod.o \ $(DIR_SHARED)/Profiler_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Gen_Mod.f90 +# Dependencies for: ./Convert_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Gen_Mod.o:\ -$(DIR_SHARED)/Gen_Mod/*.f90 +$(DIR_OBJECT)/Convert_Mod.o:\ +$(DIR_OBJECT)/Stl_Mod.o \ +$(DIR_SHARED)/Stl_Mod/*.f90 \ +$(DIR_OBJECT)/Profiler_Mod.o \ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +Convert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thin_Line.f90 +# Dependencies for: ./Message_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thin_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Message_Mod.o:\ +$(DIR_OBJECT)/Tokenizer_Mod.o \ +$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thick_Line.f90 +# Dependencies for: ./Isoap_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thick_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Isoap_Mod.o:\ +$(DIR_OBJECT)/Polyhedron_Mod.o \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ +$(DIR_OBJECT)/Iso_Polygons_Mod.o \ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/readme \ +$(DIR_SHARED)/Isoap_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Dashed_Line.f90 +# Dependencies for: ./File_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Dashed_Line.o:\ +$(DIR_OBJECT)/File_Mod.o:\ +$(DIR_OBJECT)/String_Mod.o \ +$(DIR_SHARED)/String_Mod/*.f90 \ +$(DIR_OBJECT)/Message_Mod.o \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_SHARED)/File_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Region_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Region_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Comm_Mod.f90 +# Dependencies for: ./Gen_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Comm_Mod.o:\ -$(DIR_OBJECT)/Const_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 +$(DIR_OBJECT)/Gen_Mod.o:\ +$(DIR_SHARED)/Gen_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Metis_Mod.f90 +# Dependencies for: ./Sort_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Metis_Mod.o:\ -$(DIR_SHARED)/Metis_Mod/*.f90 \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Sort_Mod.o:\ +$(DIR_OBJECT)/Swap_Mod.o \ +$(DIR_SHARED)/Swap_Mod/*.f90 \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Math_Mod.f90 +# Dependencies for: ./Polyhedron_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Math_Mod.o:\ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Polyhedron_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Control_Mod.f90 @@ -100,45 +115,45 @@ $(DIR_SHARED)/Control_Mod/*/*.f90 \ $(DIR_SHARED)/Control_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Vect_Mod.f90 +# Dependencies for: ./Probe_1d_Cells.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Vect_Mod.o:\ -$(DIR_SHARED)/Vect_Mod/*.f90 \ -$(DIR_OBJECT)/Region_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Probe_1d_Cells.o:\ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./String_Mod.f90 +# Dependencies for: ./Message_Mod/Dashed_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/String_Mod.o:\ -$(DIR_SHARED)/String_Mod/*.f90 +$(DIR_OBJECT)/Dashed_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Profiler_Mod.f90 +# Dependencies for: ./Message_Mod/Thin_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Profiler_Mod.o:\ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 +$(DIR_OBJECT)/Thin_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Assert_Mod.f90 +# Dependencies for: ./Message_Mod/Thick_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Assert_Mod.o:\ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Thick_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Sort_Mod.f90 +# Dependencies for: ./Work_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Sort_Mod.o:\ -$(DIR_OBJECT)/Swap_Mod.o \ -$(DIR_SHARED)/Swap_Mod/*.f90 \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 +$(DIR_OBJECT)/Work_Mod.o:\ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Probe_1d_Nodes.f90 @@ -154,6 +169,33 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 +#--------------------------------------------------- +# Dependencies for: ./Vect_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Vect_Mod.o:\ +$(DIR_SHARED)/Vect_Mod/*.f90 \ +$(DIR_OBJECT)/Region_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Profiler_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Profiler_Mod.o:\ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 \ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Math_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Math_Mod.o:\ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o + #--------------------------------------------------- # Dependencies for: ./Swap_Mod.f90 #--------------------------------------------------- @@ -161,15 +203,25 @@ $(DIR_OBJECT)/Swap_Mod.o:\ $(DIR_SHARED)/Swap_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Region_Mod.f90 +# Dependencies for: ./Assert_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Region_Mod.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Assert_Mod.o:\ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_2d.f90 +# Dependencies for: ./String_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_2d.o:\ +$(DIR_OBJECT)/String_Mod.o:\ +$(DIR_SHARED)/String_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -178,21 +230,6 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 -#--------------------------------------------------- -# Dependencies for: ./Polyhedron_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Polyhedron_Mod.o:\ -$(DIR_OBJECT)/Work_Mod.o \ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Iso_Polygons_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 - #--------------------------------------------------- # Dependencies for: ./Grid_Mod.f90 #--------------------------------------------------- @@ -214,26 +251,26 @@ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod.f90 +# Dependencies for: ./Stl_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Message_Mod.o:\ -$(DIR_OBJECT)/Tokenizer_Mod.o \ -$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ -$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/Stl_Mod.o:\ +$(DIR_SHARED)/Stl_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Comm_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Comm_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod.f90 +# Dependencies for: ./Iso_Polygons_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Isoap_Mod.o:\ -$(DIR_OBJECT)/Polyhedron_Mod.o \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ -$(DIR_OBJECT)/Iso_Polygons_Mod.o \ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/readme \ -$(DIR_SHARED)/Isoap_Mod/*.f90 +$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Vtk_Mod.f90 @@ -243,30 +280,17 @@ $(DIR_SHARED)/Vtk_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Stl_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Stl_Mod.o:\ -$(DIR_SHARED)/Stl_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Work_Mod.f90 +# Dependencies for: ./Metis_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Work_Mod.o:\ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Metis_Mod.o:\ +$(DIR_SHARED)/Metis_Mod/*.f90 \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +# Dependencies for: ./Probe_2d.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Probe_2d.o:\ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -282,26 +306,3 @@ $(DIR_OBJECT)/Tokenizer_Mod.o:\ $(DIR_SHARED)/Tokenizer_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o -#--------------------------------------------------- -# Dependencies for: ./File_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/File_Mod.o:\ -$(DIR_OBJECT)/String_Mod.o \ -$(DIR_SHARED)/String_Mod/*.f90 \ -$(DIR_OBJECT)/Message_Mod.o \ -$(DIR_SHARED)/Message_Mod/*.f90 \ -$(DIR_SHARED)/File_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells.o:\ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o - diff --git a/Sources/Divide/makefile b/Sources/Divide/makefile index fcdf804b4..7c0e08483 100644 --- a/Sources/Divide/makefile +++ b/Sources/Divide/makefile @@ -204,6 +204,7 @@ SRC_F_MOD = Const_Mod.f90 \ Assert_Mod.f90 \ Message_Mod.f90 \ Vect_Mod.f90 \ + Control_Mod.f90 \ Profiler_Mod.f90 \ Math_Mod.f90 \ File_Mod.f90 \ diff --git a/Sources/Divide/makefile_explicit_dependencies b/Sources/Divide/makefile_explicit_dependencies index 514cd8b44..d4b6c4c93 100644 --- a/Sources/Divide/makefile_explicit_dependencies +++ b/Sources/Divide/makefile_explicit_dependencies @@ -1,3 +1,10 @@ +#--------------------------------------------------- +# Dependencies for: ./Main_Div.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Main_Div.o:\ +$(DIR_OBJECT)/Divide_Mod.o \ +Divide_Mod/*.f90 + #--------------------------------------------------- # Dependencies for: ./Divide_Mod.f90 #--------------------------------------------------- @@ -8,13 +15,6 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ Divide_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o -#--------------------------------------------------- -# Dependencies for: ./Main_Div.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Main_Div.o:\ -$(DIR_OBJECT)/Divide_Mod.o \ -Divide_Mod/*.f90 - #--------------------------------------------------- # Dependencies for: ./Divide_Mod/Logo_Div.f90 #--------------------------------------------------- @@ -22,60 +22,67 @@ $(DIR_OBJECT)/Logo_Div.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod/Isopol.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Isopol.o: - -#--------------------------------------------------- -# Dependencies for: ./Isoap_Mod/Main_Isoap.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Main_Isoap.o: - -#--------------------------------------------------- -# Dependencies for: ./Gen_Mod.f90 +# Dependencies for: ./Message_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Gen_Mod.o:\ -$(DIR_SHARED)/Gen_Mod/*.f90 +$(DIR_OBJECT)/Message_Mod.o:\ +$(DIR_OBJECT)/Tokenizer_Mod.o \ +$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thin_Line.f90 +# Dependencies for: ./Isoap_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thin_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Isoap_Mod.o:\ +$(DIR_OBJECT)/Polyhedron_Mod.o \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ +$(DIR_OBJECT)/Iso_Polygons_Mod.o \ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/readme \ +$(DIR_SHARED)/Isoap_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thick_Line.f90 +# Dependencies for: ./File_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thick_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/File_Mod.o:\ +$(DIR_OBJECT)/String_Mod.o \ +$(DIR_SHARED)/String_Mod/*.f90 \ +$(DIR_OBJECT)/Message_Mod.o \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Dashed_Line.f90 +# Dependencies for: ./Region_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Dashed_Line.o:\ +$(DIR_OBJECT)/Region_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Comm_Mod.f90 +# Dependencies for: ./Gen_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Comm_Mod.o:\ -$(DIR_OBJECT)/Const_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 +$(DIR_OBJECT)/Gen_Mod.o:\ +$(DIR_SHARED)/Gen_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Metis_Mod.f90 +# Dependencies for: ./Sort_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Metis_Mod.o:\ -$(DIR_SHARED)/Metis_Mod/*.f90 \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Sort_Mod.o:\ +$(DIR_OBJECT)/Swap_Mod.o \ +$(DIR_SHARED)/Swap_Mod/*.f90 \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Math_Mod.f90 +# Dependencies for: ./Polyhedron_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Math_Mod.o:\ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Polyhedron_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Control_Mod.f90 @@ -89,45 +96,45 @@ $(DIR_SHARED)/Control_Mod/*/*.f90 \ $(DIR_SHARED)/Control_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Vect_Mod.f90 +# Dependencies for: ./Probe_1d_Cells.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Vect_Mod.o:\ -$(DIR_SHARED)/Vect_Mod/*.f90 \ -$(DIR_OBJECT)/Region_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Probe_1d_Cells.o:\ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./String_Mod.f90 +# Dependencies for: ./Message_Mod/Dashed_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/String_Mod.o:\ -$(DIR_SHARED)/String_Mod/*.f90 +$(DIR_OBJECT)/Dashed_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Profiler_Mod.f90 +# Dependencies for: ./Message_Mod/Thin_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Profiler_Mod.o:\ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 +$(DIR_OBJECT)/Thin_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Assert_Mod.f90 +# Dependencies for: ./Message_Mod/Thick_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Assert_Mod.o:\ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Thick_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Sort_Mod.f90 +# Dependencies for: ./Work_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Sort_Mod.o:\ -$(DIR_OBJECT)/Swap_Mod.o \ -$(DIR_SHARED)/Swap_Mod/*.f90 \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 +$(DIR_OBJECT)/Work_Mod.o:\ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Probe_1d_Nodes.f90 @@ -143,6 +150,33 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 +#--------------------------------------------------- +# Dependencies for: ./Vect_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Vect_Mod.o:\ +$(DIR_SHARED)/Vect_Mod/*.f90 \ +$(DIR_OBJECT)/Region_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Profiler_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Profiler_Mod.o:\ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 \ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Math_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Math_Mod.o:\ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o + #--------------------------------------------------- # Dependencies for: ./Swap_Mod.f90 #--------------------------------------------------- @@ -150,15 +184,25 @@ $(DIR_OBJECT)/Swap_Mod.o:\ $(DIR_SHARED)/Swap_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Region_Mod.f90 +# Dependencies for: ./Assert_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Region_Mod.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Assert_Mod.o:\ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_2d.f90 +# Dependencies for: ./String_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_2d.o:\ +$(DIR_OBJECT)/String_Mod.o:\ +$(DIR_SHARED)/String_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -167,21 +211,6 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 -#--------------------------------------------------- -# Dependencies for: ./Polyhedron_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Polyhedron_Mod.o:\ -$(DIR_OBJECT)/Work_Mod.o \ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Iso_Polygons_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 - #--------------------------------------------------- # Dependencies for: ./Grid_Mod.f90 #--------------------------------------------------- @@ -203,27 +232,26 @@ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod.f90 +# Dependencies for: ./Stl_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Message_Mod.o:\ -$(DIR_OBJECT)/Tokenizer_Mod.o \ -$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ -$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/Stl_Mod.o:\ +$(DIR_SHARED)/Stl_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Comm_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Comm_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod.f90 +# Dependencies for: ./Iso_Polygons_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Isoap_Mod.o:\ -$(DIR_OBJECT)/Polyhedron_Mod.o \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ -$(DIR_OBJECT)/Iso_Polygons_Mod.o \ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/readme \ -$(DIR_SHARED)/Isoap_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/Dim_Polyhedron.h +$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Vtk_Mod.f90 @@ -233,30 +261,17 @@ $(DIR_SHARED)/Vtk_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Stl_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Stl_Mod.o:\ -$(DIR_SHARED)/Stl_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Work_Mod.f90 +# Dependencies for: ./Metis_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Work_Mod.o:\ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Metis_Mod.o:\ +$(DIR_SHARED)/Metis_Mod/*.f90 \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +# Dependencies for: ./Probe_2d.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Probe_2d.o:\ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -272,26 +287,3 @@ $(DIR_OBJECT)/Tokenizer_Mod.o:\ $(DIR_SHARED)/Tokenizer_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o -#--------------------------------------------------- -# Dependencies for: ./File_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/File_Mod.o:\ -$(DIR_OBJECT)/String_Mod.o \ -$(DIR_SHARED)/String_Mod/*.f90 \ -$(DIR_OBJECT)/Message_Mod.o \ -$(DIR_SHARED)/Message_Mod/*.f90 \ -$(DIR_SHARED)/File_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells.o:\ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o - diff --git a/Sources/Generate/makefile b/Sources/Generate/makefile index ccfc80bc9..d05f7733e 100644 --- a/Sources/Generate/makefile +++ b/Sources/Generate/makefile @@ -205,6 +205,7 @@ SRC_F_MOD = Const_Mod.f90 \ Assert_Mod.f90 \ Message_Mod.f90 \ Vect_Mod.f90 \ + Control_Mod.f90 \ Profiler_Mod.f90 \ Math_Mod.f90 \ File_Mod.f90 \ diff --git a/Sources/Generate/makefile_explicit_dependencies b/Sources/Generate/makefile_explicit_dependencies index d39c0878a..a86860ba6 100644 --- a/Sources/Generate/makefile_explicit_dependencies +++ b/Sources/Generate/makefile_explicit_dependencies @@ -25,31 +25,6 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/Gen_Mod.o \ $(DIR_SHARED)/Gen_Mod/*.f90 -#--------------------------------------------------- -# Dependencies for: ./Main_Gen.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Main_Gen.o:\ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/Generate_Mod.o \ -Generate_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Smooths_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Smooths_Mod.o:\ -Smooths_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 - #--------------------------------------------------- # Dependencies for: ./Generate_Mod.f90 #--------------------------------------------------- @@ -94,65 +69,97 @@ $(DIR_OBJECT)/Range_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Refines_Mod/Connectivity.f90 +# Dependencies for: ./Main_Gen.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Connectivity.o: +$(DIR_OBJECT)/Main_Gen.o:\ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/Generate_Mod.o \ +Generate_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod/Isopol.f90 +# Dependencies for: ./Refines_Mod/Connectivity.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Isopol.o: +$(DIR_OBJECT)/Connectivity.o: #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod/Main_Isoap.f90 +# Dependencies for: ./Smooths_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Main_Isoap.o: +$(DIR_OBJECT)/Smooths_Mod.o:\ +Smooths_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Gen_Mod.f90 +# Dependencies for: ./Message_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Gen_Mod.o:\ -$(DIR_SHARED)/Gen_Mod/*.f90 +$(DIR_OBJECT)/Message_Mod.o:\ +$(DIR_OBJECT)/Tokenizer_Mod.o \ +$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thin_Line.f90 +# Dependencies for: ./Isoap_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thin_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Isoap_Mod.o:\ +$(DIR_OBJECT)/Polyhedron_Mod.o \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ +$(DIR_OBJECT)/Iso_Polygons_Mod.o \ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/readme \ +$(DIR_SHARED)/Isoap_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thick_Line.f90 +# Dependencies for: ./File_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thick_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/File_Mod.o:\ +$(DIR_OBJECT)/String_Mod.o \ +$(DIR_SHARED)/String_Mod/*.f90 \ +$(DIR_OBJECT)/Message_Mod.o \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Dashed_Line.f90 +# Dependencies for: ./Region_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Dashed_Line.o:\ +$(DIR_OBJECT)/Region_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Comm_Mod.f90 +# Dependencies for: ./Gen_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Comm_Mod.o:\ -$(DIR_OBJECT)/Const_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 +$(DIR_OBJECT)/Gen_Mod.o:\ +$(DIR_SHARED)/Gen_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Metis_Mod.f90 +# Dependencies for: ./Sort_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Metis_Mod.o:\ -$(DIR_SHARED)/Metis_Mod/*.f90 \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Sort_Mod.o:\ +$(DIR_OBJECT)/Swap_Mod.o \ +$(DIR_SHARED)/Swap_Mod/*.f90 \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Math_Mod.f90 +# Dependencies for: ./Polyhedron_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Math_Mod.o:\ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Polyhedron_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Control_Mod.f90 @@ -166,45 +173,45 @@ $(DIR_SHARED)/Control_Mod/*/*.f90 \ $(DIR_SHARED)/Control_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Vect_Mod.f90 +# Dependencies for: ./Probe_1d_Cells.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Vect_Mod.o:\ -$(DIR_SHARED)/Vect_Mod/*.f90 \ -$(DIR_OBJECT)/Region_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Probe_1d_Cells.o:\ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./String_Mod.f90 +# Dependencies for: ./Message_Mod/Dashed_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/String_Mod.o:\ -$(DIR_SHARED)/String_Mod/*.f90 +$(DIR_OBJECT)/Dashed_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Profiler_Mod.f90 +# Dependencies for: ./Message_Mod/Thin_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Profiler_Mod.o:\ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 +$(DIR_OBJECT)/Thin_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Assert_Mod.f90 +# Dependencies for: ./Message_Mod/Thick_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Assert_Mod.o:\ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Thick_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Sort_Mod.f90 +# Dependencies for: ./Work_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Sort_Mod.o:\ -$(DIR_OBJECT)/Swap_Mod.o \ -$(DIR_SHARED)/Swap_Mod/*.f90 \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 +$(DIR_OBJECT)/Work_Mod.o:\ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Probe_1d_Nodes.f90 @@ -220,6 +227,33 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 +#--------------------------------------------------- +# Dependencies for: ./Vect_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Vect_Mod.o:\ +$(DIR_SHARED)/Vect_Mod/*.f90 \ +$(DIR_OBJECT)/Region_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Profiler_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Profiler_Mod.o:\ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 \ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Math_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Math_Mod.o:\ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o + #--------------------------------------------------- # Dependencies for: ./Swap_Mod.f90 #--------------------------------------------------- @@ -227,15 +261,25 @@ $(DIR_OBJECT)/Swap_Mod.o:\ $(DIR_SHARED)/Swap_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Region_Mod.f90 +# Dependencies for: ./Assert_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Region_Mod.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Assert_Mod.o:\ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_2d.f90 +# Dependencies for: ./String_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_2d.o:\ +$(DIR_OBJECT)/String_Mod.o:\ +$(DIR_SHARED)/String_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -244,21 +288,6 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 -#--------------------------------------------------- -# Dependencies for: ./Polyhedron_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Polyhedron_Mod.o:\ -$(DIR_OBJECT)/Work_Mod.o \ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Iso_Polygons_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 - #--------------------------------------------------- # Dependencies for: ./Grid_Mod.f90 #--------------------------------------------------- @@ -280,27 +309,26 @@ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod.f90 +# Dependencies for: ./Stl_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Message_Mod.o:\ -$(DIR_OBJECT)/Tokenizer_Mod.o \ -$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ -$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/Stl_Mod.o:\ +$(DIR_SHARED)/Stl_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Comm_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Comm_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod.f90 +# Dependencies for: ./Iso_Polygons_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Isoap_Mod.o:\ -$(DIR_OBJECT)/Polyhedron_Mod.o \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ -$(DIR_OBJECT)/Iso_Polygons_Mod.o \ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/readme \ -$(DIR_SHARED)/Isoap_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/Dim_Polyhedron.h +$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Vtk_Mod.f90 @@ -310,30 +338,17 @@ $(DIR_SHARED)/Vtk_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Stl_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Stl_Mod.o:\ -$(DIR_SHARED)/Stl_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Work_Mod.f90 +# Dependencies for: ./Metis_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Work_Mod.o:\ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Metis_Mod.o:\ +$(DIR_SHARED)/Metis_Mod/*.f90 \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +# Dependencies for: ./Probe_2d.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Probe_2d.o:\ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -349,26 +364,3 @@ $(DIR_OBJECT)/Tokenizer_Mod.o:\ $(DIR_SHARED)/Tokenizer_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o -#--------------------------------------------------- -# Dependencies for: ./File_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/File_Mod.o:\ -$(DIR_OBJECT)/String_Mod.o \ -$(DIR_SHARED)/String_Mod/*.f90 \ -$(DIR_OBJECT)/Message_Mod.o \ -$(DIR_SHARED)/Message_Mod/*.f90 \ -$(DIR_SHARED)/File_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells.o:\ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o - diff --git a/Sources/Process/makefile b/Sources/Process/makefile index c91187a56..4f9e847f1 100644 --- a/Sources/Process/makefile +++ b/Sources/Process/makefile @@ -282,12 +282,12 @@ SRC_F_MOD = Const_Mod.f90 \ Tokenizer_Mod.f90 \ Message_Mod.f90 \ Vect_Mod.f90 \ - Profiler_Mod.f90 \ Math_Mod.f90 \ Swap_Mod.f90 \ Sort_Mod.f90 \ File_Mod.f90 \ Control_Mod.f90 \ + Profiler_Mod.f90 \ Vtk_Mod.f90 \ Metis_Mod.f90 \ Grid_Mod.f90 \ diff --git a/Sources/Process/makefile_explicit_dependencies b/Sources/Process/makefile_explicit_dependencies index 513f2c417..fdf9b829f 100644 --- a/Sources/Process/makefile_explicit_dependencies +++ b/Sources/Process/makefile_explicit_dependencies @@ -1,35 +1,27 @@ #--------------------------------------------------- -# Dependencies for: ./Bulk_Mod.f90 +# Dependencies for: ./Backup_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Bulk_Mod.o:\ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -Bulk_Mod/*.f90 +$(DIR_OBJECT)/Backup_Mod.o:\ +$(DIR_OBJECT)/User_Mod.o \ +User_Mod/*.f90 \ +Backup_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Eddies_Mod.f90 +# Dependencies for: ./Monitor_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Eddies_Mod.o:\ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Monitor_Mod.o:\ +Monitor_Mod/*.f90 \ $(DIR_OBJECT)/Field_Mod.o \ -Field_Mod/*/*.f90 \ -Eddies_Mod/*.f90 +Field_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Porosity_Mod.f90 +# Dependencies for: ./Matrix_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Porosity_Mod.o:\ -$(DIR_OBJECT)/Work_Mod.o \ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_OBJECT)/Stl_Mod.o \ -$(DIR_SHARED)/Stl_Mod/*.f90 \ -Porosity_Mod/*.f90 \ -$(DIR_OBJECT)/Control_Mod.o \ -$(DIR_SHARED)/Control_Mod/*/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 +$(DIR_OBJECT)/Matrix_Mod.o:\ +Matrix_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Particle_Mod.f90 @@ -40,46 +32,99 @@ Vof_Mod/*/*.f90 \ Particle_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Vert_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Vert_Mod.o:\ -Vert_Mod/*.f90 \ -$(DIR_OBJECT)/Point_Mod.o \ -Point_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Read_Controls_Mod.f90 +# Dependencies for: ./Process_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Read_Controls_Mod.o:\ +$(DIR_OBJECT)/Process_Mod.o:\ +$(DIR_OBJECT)/Vof_Mod.o \ +Vof_Mod/*/*.f90 \ +$(DIR_OBJECT)/User_Mod.o \ +User_Mod/*.f90 \ +$(DIR_OBJECT)/Turb_Mod.o \ +Turb_Mod/*.f90 \ $(DIR_OBJECT)/Swarm_Mod.o \ Swarm_Mod/*.f90 \ +$(DIR_OBJECT)/Solver_Mod.o \ +Solver_Mod/*.f90 \ +$(DIR_OBJECT)/Results_Mod.o \ +Results_Mod/*.f90 \ +$(DIR_OBJECT)/Read_Controls_Mod.o \ Read_Controls_Mod/*.f90 \ -$(DIR_OBJECT)/Eddies_Mod.o \ -Eddies_Mod/*.f90 +Process_Mod/*.f90 \ +$(DIR_OBJECT)/Numerics_Mod.o \ +Numerics_Mod/*.f90 \ +$(DIR_OBJECT)/Monitor_Mod.o \ +Monitor_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_OBJECT)/Field_Mod.o \ +Field_Mod/*/*.f90 \ +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o \ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 \ +$(DIR_OBJECT)/Bulk_Mod.o \ +Bulk_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Swarm_Mod.f90 +# Dependencies for: ./Vector_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Swarm_Mod.o:\ -Swarm_Mod/*.f90 \ -$(DIR_OBJECT)/Particle_Mod.o \ -Particle_Mod/*.f90 +$(DIR_OBJECT)/Vector_Mod.o:\ +Vector_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Petsc_Mod.f90 +# Dependencies for: ./Results_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Petsc_Mod.o:\ -Petsc_Mod/*/*.f90 \ -$(DIR_OBJECT)/Native_Mod.o \ -Native_Mod/*.f90 +$(DIR_OBJECT)/Results_Mod.o:\ +Results_Mod/*.f90 \ +$(DIR_OBJECT)/Backup_Mod.o \ +Backup_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Info_Mod.f90 +# Dependencies for: ./Native_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Info_Mod.o:\ -Info_Mod/*.f90 \ -$(DIR_OBJECT)/Field_Mod.o \ -Field_Mod/*/*.f90 +$(DIR_OBJECT)/Native_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_OBJECT)/Vector_Mod.o \ +Vector_Mod/*.f90 \ +Native_Mod/*.f90 \ +$(DIR_OBJECT)/Matrix_Mod.o \ +Matrix_Mod/*.f90 \ +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Interface_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Interface_Mod.o:\ +$(DIR_OBJECT)/Turb_Mod.o \ +Turb_Mod/*.f90 \ +$(DIR_OBJECT)/Profiler_Mod.o \ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +Interface_Mod/*.f90 \ +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Read_Controls_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Read_Controls_Mod.o:\ +$(DIR_OBJECT)/Swarm_Mod.o \ +Swarm_Mod/*.f90 \ +Read_Controls_Mod/*.f90 \ +$(DIR_OBJECT)/Eddies_Mod.o \ +Eddies_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Numerics_Mod.f90 @@ -95,29 +140,33 @@ $(DIR_OBJECT)/Matrix_Mod.o \ Matrix_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Vof_Mod.f90 +# Dependencies for: ./Main_Pro.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Vof_Mod.o:\ -Vof_Mod/*/*.f90 \ -$(DIR_OBJECT)/Turb_Mod.o \ -Turb_Mod/*.f90 \ -Surf_Mod/readme \ -$(DIR_OBJECT)/Surf_Mod.o \ -Surf_Mod/*.f90 \ -$(DIR_OBJECT)/Stl_Mod.o \ -$(DIR_SHARED)/Stl_Mod/*.f90 +$(DIR_OBJECT)/Main_Pro.o:\ +$(DIR_OBJECT)/Process_Mod.o \ +Process_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./User_Mod.f90 +# Dependencies for: ./Vert_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/User_Mod.o:\ -User_Mod/*.f90 \ -$(DIR_OBJECT)/Swarm_Mod.o \ -Swarm_Mod/*.f90 \ -$(DIR_OBJECT)/Porosity_Mod.o \ +$(DIR_OBJECT)/Vert_Mod.o:\ +Vert_Mod/*.f90 \ +$(DIR_OBJECT)/Point_Mod.o \ +Point_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Porosity_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Porosity_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_OBJECT)/Stl_Mod.o \ +$(DIR_SHARED)/Stl_Mod/*.f90 \ Porosity_Mod/*.f90 \ -$(DIR_OBJECT)/Interface_Mod.o \ -Interface_Mod/*.f90 +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Solver_Mod.f90 @@ -128,66 +177,54 @@ $(DIR_OBJECT)/Petsc_Mod.o \ Petsc_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Surf_Mod.f90 +# Dependencies for: ./Elem_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Surf_Mod.o:\ -Surf_Mod/readme \ -Surf_Mod/*.f90 \ -Front_Mod/readme \ -$(DIR_OBJECT)/Front_Mod.o \ -Front_Mod/*.f90 +$(DIR_OBJECT)/Elem_Mod.o:\ +Elem_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Monitor_Mod.f90 +# Dependencies for: ./Eddies_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Monitor_Mod.o:\ -Monitor_Mod/*.f90 \ +$(DIR_OBJECT)/Eddies_Mod.o:\ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Field_Mod.o \ -Field_Mod/*/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Main_Pro.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Main_Pro.o:\ -$(DIR_OBJECT)/Process_Mod.o \ -Process_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Surf_Mod/Place_Surf_At_Value.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Place_Surf_At_Value.o: - -#--------------------------------------------------- -# Dependencies for: ./Vector_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Vector_Mod.o:\ -Vector_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +Field_Mod/*/*.f90 \ +Eddies_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Var_Mod.f90 +# Dependencies for: ./User_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Var_Mod.o:\ -Var_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/User_Mod.o:\ +User_Mod/*.f90 \ +$(DIR_OBJECT)/Swarm_Mod.o \ +Swarm_Mod/*.f90 \ +$(DIR_OBJECT)/Porosity_Mod.o \ +Porosity_Mod/*.f90 \ +$(DIR_OBJECT)/Interface_Mod.o \ +Interface_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Backup_Mod.f90 +# Dependencies for: ./Petsc_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Backup_Mod.o:\ -$(DIR_OBJECT)/User_Mod.o \ -User_Mod/*.f90 \ -Backup_Mod/*.f90 +$(DIR_OBJECT)/Petsc_Mod.o:\ +Petsc_Mod/*/*.f90 \ +$(DIR_OBJECT)/Native_Mod.o \ +Native_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Elem_Mod.f90 +# Dependencies for: ./Field_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Elem_Mod.o:\ -Elem_Mod/*.f90 +$(DIR_OBJECT)/Field_Mod.o:\ +$(DIR_OBJECT)/Solver_Mod.o \ +Solver_Mod/*.f90 \ +$(DIR_OBJECT)/Numerics_Mod.o \ +Numerics_Mod/*.f90 \ +Field_Mod/*/*.f90 \ +$(DIR_OBJECT)/Face_Mod.o \ +Face_Mod/*.f90 \ +$(DIR_OBJECT)/Bulk_Mod.o \ +Bulk_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Front_Mod.f90 @@ -207,59 +244,64 @@ $(DIR_OBJECT)/Elem_Mod.o \ Elem_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Native_Mod.f90 +# Dependencies for: ./Swarm_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Native_Mod.o:\ -$(DIR_OBJECT)/Work_Mod.o \ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_OBJECT)/Vector_Mod.o \ -Vector_Mod/*.f90 \ -Native_Mod/*.f90 \ -$(DIR_OBJECT)/Matrix_Mod.o \ -Matrix_Mod/*.f90 \ -$(DIR_OBJECT)/Control_Mod.o \ -$(DIR_SHARED)/Control_Mod/*/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 +$(DIR_OBJECT)/Swarm_Mod.o:\ +Swarm_Mod/*.f90 \ +$(DIR_OBJECT)/Particle_Mod.o \ +Particle_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Point_Mod.f90 +# Dependencies for: ./Turb_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Point_Mod.o:\ -Point_Mod/*.f90 \ +$(DIR_OBJECT)/Turb_Mod.o:\ +Turb_Mod/*.f90 \ +$(DIR_OBJECT)/Info_Mod.o \ +Info_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Bulk_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Bulk_Mod.o:\ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +Bulk_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Var_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Var_Mod.o:\ +Var_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Process_Mod/Initialize_Variables.f90 +# Dependencies for: ./Info_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Initialize_Variables.o:\ -$(DIR_OBJECT)/Vof_Mod.o \ +$(DIR_OBJECT)/Info_Mod.o:\ +Info_Mod/*.f90 \ +$(DIR_OBJECT)/Field_Mod.o \ +Field_Mod/*/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Surf_Mod/Place_Surf_At_Value.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Place_Surf_At_Value.o: + +#--------------------------------------------------- +# Dependencies for: ./Vof_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Vof_Mod.o:\ Vof_Mod/*/*.f90 \ -$(DIR_OBJECT)/User_Mod.o \ -User_Mod/*.f90 \ $(DIR_OBJECT)/Turb_Mod.o \ Turb_Mod/*.f90 \ -$(DIR_OBJECT)/Swarm_Mod.o \ -Swarm_Mod/*.f90 \ -$(DIR_OBJECT)/Numerics_Mod.o \ -Numerics_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Field_Mod.o \ -Field_Mod/*/*.f90 \ -$(DIR_OBJECT)/Control_Mod.o \ -$(DIR_SHARED)/Control_Mod/*/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o \ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 \ -$(DIR_OBJECT)/Bulk_Mod.o \ -Bulk_Mod/*.f90 +Surf_Mod/readme \ +$(DIR_OBJECT)/Surf_Mod.o \ +Surf_Mod/*.f90 \ +$(DIR_OBJECT)/Stl_Mod.o \ +$(DIR_SHARED)/Stl_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Process_Mod/Update_Boundary_Values.f90 @@ -282,17 +324,9 @@ $(DIR_OBJECT)/Comm_Mod.o \ $(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Process_Mod/Logo_Pro.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Logo_Pro.o:\ -$(DIR_OBJECT)/Solver_Mod.o \ -Solver_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o - -#--------------------------------------------------- -# Dependencies for: ./Process_Mod.f90 +# Dependencies for: ./Process_Mod/Initialize_Variables.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Process_Mod.o:\ +$(DIR_OBJECT)/Initialize_Variables.o:\ $(DIR_OBJECT)/Vof_Mod.o \ Vof_Mod/*/*.f90 \ $(DIR_OBJECT)/User_Mod.o \ @@ -301,17 +335,8 @@ $(DIR_OBJECT)/Turb_Mod.o \ Turb_Mod/*.f90 \ $(DIR_OBJECT)/Swarm_Mod.o \ Swarm_Mod/*.f90 \ -$(DIR_OBJECT)/Solver_Mod.o \ -Solver_Mod/*.f90 \ -$(DIR_OBJECT)/Results_Mod.o \ -Results_Mod/*.f90 \ -$(DIR_OBJECT)/Read_Controls_Mod.o \ -Read_Controls_Mod/*.f90 \ -Process_Mod/*.f90 \ $(DIR_OBJECT)/Numerics_Mod.o \ Numerics_Mod/*.f90 \ -$(DIR_OBJECT)/Monitor_Mod.o \ -Monitor_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ @@ -329,65 +354,78 @@ $(DIR_OBJECT)/Bulk_Mod.o \ Bulk_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Turb_Mod.f90 +# Dependencies for: ./Process_Mod/Logo_Pro.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Turb_Mod.o:\ -Turb_Mod/*.f90 \ -$(DIR_OBJECT)/Info_Mod.o \ -Info_Mod/*.f90 +$(DIR_OBJECT)/Logo_Pro.o:\ +$(DIR_OBJECT)/Solver_Mod.o \ +Solver_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Field_Mod.f90 +# Dependencies for: ./Surf_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Field_Mod.o:\ -$(DIR_OBJECT)/Solver_Mod.o \ -Solver_Mod/*.f90 \ -$(DIR_OBJECT)/Numerics_Mod.o \ -Numerics_Mod/*.f90 \ -Field_Mod/*/*.f90 \ -$(DIR_OBJECT)/Face_Mod.o \ -Face_Mod/*.f90 \ -$(DIR_OBJECT)/Bulk_Mod.o \ -Bulk_Mod/*.f90 +$(DIR_OBJECT)/Surf_Mod.o:\ +Surf_Mod/readme \ +Surf_Mod/*.f90 \ +Front_Mod/readme \ +$(DIR_OBJECT)/Front_Mod.o \ +Front_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Interface_Mod.f90 +# Dependencies for: ./Face_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Interface_Mod.o:\ -$(DIR_OBJECT)/Turb_Mod.o \ -Turb_Mod/*.f90 \ -$(DIR_OBJECT)/Profiler_Mod.o \ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -Interface_Mod/*.f90 \ -$(DIR_OBJECT)/Control_Mod.o \ -$(DIR_SHARED)/Control_Mod/*/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 +$(DIR_OBJECT)/Face_Mod.o:\ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +Face_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Matrix_Mod.f90 +# Dependencies for: ./Point_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Matrix_Mod.o:\ -Matrix_Mod/*.f90 \ +$(DIR_OBJECT)/Point_Mod.o:\ +Point_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Results_Mod.f90 +# Dependencies for: ./Message_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Message_Mod.o:\ +$(DIR_OBJECT)/Tokenizer_Mod.o \ +$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Isoap_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Isoap_Mod.o:\ +$(DIR_OBJECT)/Polyhedron_Mod.o \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ +$(DIR_OBJECT)/Iso_Polygons_Mod.o \ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/readme \ +$(DIR_SHARED)/Isoap_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./File_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Results_Mod.o:\ -Results_Mod/*.f90 \ -$(DIR_OBJECT)/Backup_Mod.o \ -Backup_Mod/*.f90 +$(DIR_OBJECT)/File_Mod.o:\ +$(DIR_OBJECT)/String_Mod.o \ +$(DIR_SHARED)/String_Mod/*.f90 \ +$(DIR_OBJECT)/Message_Mod.o \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Face_Mod.f90 +# Dependencies for: ./Region_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Face_Mod.o:\ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -Face_Mod/*.f90 +$(DIR_OBJECT)/Region_Mod.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- # Dependencies for: ./Gen_Mod.f90 @@ -396,15 +434,46 @@ $(DIR_OBJECT)/Gen_Mod.o:\ $(DIR_SHARED)/Gen_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thin_Line.f90 +# Dependencies for: ./Sort_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thin_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Sort_Mod.o:\ +$(DIR_OBJECT)/Swap_Mod.o \ +$(DIR_SHARED)/Swap_Mod/*.f90 \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thick_Line.f90 +# Dependencies for: ./Polyhedron_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thick_Line.o:\ +$(DIR_OBJECT)/Polyhedron_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Control_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Control_Mod.o:\ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Probe_1d_Cells.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Probe_1d_Cells.o:\ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- @@ -414,37 +483,40 @@ $(DIR_OBJECT)/Dashed_Line.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Comm_Mod.f90 +# Dependencies for: ./Message_Mod/Thin_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Comm_Mod.o:\ -$(DIR_OBJECT)/Const_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 +$(DIR_OBJECT)/Thin_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Metis_Mod.f90 +# Dependencies for: ./Message_Mod/Thick_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Metis_Mod.o:\ -$(DIR_SHARED)/Metis_Mod/*.f90 \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Thick_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Math_Mod.f90 +# Dependencies for: ./Work_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Math_Mod.o:\ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Work_Mod.o:\ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Control_Mod.f90 +# Dependencies for: ./Probe_1d_Nodes.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Control_Mod.o:\ +$(DIR_OBJECT)/Probe_1d_Nodes.o:\ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_SHARED)/Control_Mod/*/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 +$(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Vect_Mod.f90 @@ -455,51 +527,23 @@ $(DIR_OBJECT)/Region_Mod.o \ $(DIR_OBJECT)/Assert_Mod.o \ $(DIR_SHARED)/Assert_Mod/*.f90 -#--------------------------------------------------- -# Dependencies for: ./String_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/String_Mod.o:\ -$(DIR_SHARED)/String_Mod/*.f90 - #--------------------------------------------------- # Dependencies for: ./Profiler_Mod.f90 #--------------------------------------------------- $(DIR_OBJECT)/Profiler_Mod.o:\ $(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 \ $(DIR_OBJECT)/Comm_Mod.o \ $(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Assert_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Assert_Mod.o:\ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 \ -$(DIR_SHARED)/Assert_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Sort_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Sort_Mod.o:\ -$(DIR_OBJECT)/Swap_Mod.o \ -$(DIR_SHARED)/Swap_Mod/*.f90 \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Probe_1d_Nodes.f90 +# Dependencies for: ./Math_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Nodes.o:\ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_OBJECT)/Math_Mod.o:\ $(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- # Dependencies for: ./Swap_Mod.f90 @@ -508,15 +552,25 @@ $(DIR_OBJECT)/Swap_Mod.o:\ $(DIR_SHARED)/Swap_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Region_Mod.f90 +# Dependencies for: ./Assert_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Region_Mod.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Assert_Mod.o:\ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_2d.f90 +# Dependencies for: ./String_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_2d.o:\ +$(DIR_OBJECT)/String_Mod.o:\ +$(DIR_SHARED)/String_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -525,21 +579,6 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 -#--------------------------------------------------- -# Dependencies for: ./Polyhedron_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Polyhedron_Mod.o:\ -$(DIR_OBJECT)/Work_Mod.o \ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Iso_Polygons_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 - #--------------------------------------------------- # Dependencies for: ./Grid_Mod.f90 #--------------------------------------------------- @@ -561,26 +600,26 @@ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod.f90 +# Dependencies for: ./Stl_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Message_Mod.o:\ -$(DIR_OBJECT)/Tokenizer_Mod.o \ -$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ -$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/Stl_Mod.o:\ +$(DIR_SHARED)/Stl_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Comm_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Comm_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod.f90 +# Dependencies for: ./Iso_Polygons_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Isoap_Mod.o:\ -$(DIR_OBJECT)/Polyhedron_Mod.o \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ -$(DIR_OBJECT)/Iso_Polygons_Mod.o \ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/readme \ -$(DIR_SHARED)/Isoap_Mod/*.f90 +$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Vtk_Mod.f90 @@ -590,30 +629,17 @@ $(DIR_SHARED)/Vtk_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Stl_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Stl_Mod.o:\ -$(DIR_SHARED)/Stl_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Work_Mod.f90 +# Dependencies for: ./Metis_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Work_Mod.o:\ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Metis_Mod.o:\ +$(DIR_SHARED)/Metis_Mod/*.f90 \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +# Dependencies for: ./Probe_2d.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Probe_2d.o:\ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -629,26 +655,3 @@ $(DIR_OBJECT)/Tokenizer_Mod.o:\ $(DIR_SHARED)/Tokenizer_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o -#--------------------------------------------------- -# Dependencies for: ./File_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/File_Mod.o:\ -$(DIR_OBJECT)/String_Mod.o \ -$(DIR_SHARED)/String_Mod/*.f90 \ -$(DIR_OBJECT)/Message_Mod.o \ -$(DIR_SHARED)/Message_Mod/*.f90 \ -$(DIR_SHARED)/File_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells.o:\ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o - diff --git a/Sources/Shared/Control_Mod.f90 b/Sources/Shared/Control_Mod.f90 index c7f28cf2e..088272277 100644 --- a/Sources/Shared/Control_Mod.f90 +++ b/Sources/Shared/Control_Mod.f90 @@ -62,6 +62,9 @@ module Control_Mod # include "Control_Mod/Input_Output/Results_Save_Interval.f90" # include "Control_Mod/Input_Output/Swarm_Save_Interval.f90" + ! Profiler +# include "Control_Mod/Input_Output/Profiler_Info.f90" + !--------------------! ! Linear solvers ! (native (from T-Flows) or PETSc) !--------------------! diff --git a/Sources/Shared/Profiler_Mod.f90 b/Sources/Shared/Profiler_Mod.f90 index 61bedb762..4456966db 100644 --- a/Sources/Shared/Profiler_Mod.f90 +++ b/Sources/Shared/Profiler_Mod.f90 @@ -2,6 +2,7 @@ module Profiler_Mod !----------------------------------[Modules]-----------------------------------! use Comm_Mod + use Control_Mod !------------------------------------------------------------------------------! implicit none !==============================================================================! diff --git a/Sources/Shared/Profiler_Mod/Statistics.f90 b/Sources/Shared/Profiler_Mod/Statistics.f90 index c5464a0a0..1e9739f46 100644 --- a/Sources/Shared/Profiler_Mod/Statistics.f90 +++ b/Sources/Shared/Profiler_Mod/Statistics.f90 @@ -1,22 +1,24 @@ !==============================================================================! - subroutine Statistics(Profiler, indent, in_seconds) + subroutine Statistics(Profiler, indent) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! class(Profiler_Type), target :: Profiler integer, intent(in) :: indent ! 34 for Main_Pro, 1 for Main_con - logical, optional, intent(in) :: in_seconds !-----------------------------------[Locals]-----------------------------------! integer :: i_fun real :: total_time, t_temp, percent_time integer :: hours, minutes, seconds character(DL) :: line, n_temp + character(SL) :: pinfo logical :: swap, in_sec !==============================================================================! + ! Only Process has a control file in_sec = .false. - if(present(in_seconds)) then - if(in_seconds) then + if(PROGRAM_NAME .eq. 'Process') then + call Control_Mod_Profiler_Info(pinfo, verbose=.false.) + if(pinfo == 'SECONDS') then in_sec = .true. end if end if From 132fb95de4751e25308cf430058790bc425dac37 Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 21 Mar 2023 17:19:40 +0100 Subject: [PATCH 115/223] Profiler_Mod reads control file for PROFILER_INFO This variable can be set to "percents" (default) or "seconds", which is sometimes useful when profiling. On branch bojan_fixed_cell_ranges new file: Sources/Shared/Control_Mod/Input_Output/Profiler_Info.f90 modified: Documentation/all_control_keywords modified: Sources/Convert/makefile modified: Sources/Convert/makefile_explicit_dependencies modified: Sources/Divide/makefile modified: Sources/Divide/makefile_explicit_dependencies modified: Sources/Generate/makefile modified: Sources/Generate/makefile_explicit_dependencies modified: Sources/Process/makefile modified: Sources/Process/makefile_explicit_dependencies modified: Sources/Shared/Control_Mod.f90 modified: Sources/Shared/Profiler_Mod.f90 modified: Sources/Shared/Profiler_Mod/Statistics.f90 --- Documentation/all_control_keywords | 1 + Sources/Convert/makefile | 1 + .../Convert/makefile_explicit_dependencies | 285 +++---- Sources/Divide/makefile | 1 + Sources/Divide/makefile_explicit_dependencies | 284 ++++--- Sources/Generate/makefile | 1 + .../Generate/makefile_explicit_dependencies | 312 ++++---- Sources/Process/makefile | 2 +- .../Process/makefile_explicit_dependencies | 699 +++++++++--------- Sources/Shared/Control_Mod.f90 | 3 + .../Input_Output/Profiler_Info.f90 | 14 + Sources/Shared/Profiler_Mod.f90 | 1 + Sources/Shared/Profiler_Mod/Statistics.f90 | 10 +- 13 files changed, 813 insertions(+), 801 deletions(-) create mode 100644 Sources/Shared/Control_Mod/Input_Output/Profiler_Info.f90 diff --git a/Documentation/all_control_keywords b/Documentation/all_control_keywords index 1b271b5c6..1a211ed79 100644 --- a/Documentation/all_control_keywords +++ b/Documentation/all_control_keywords @@ -16,6 +16,7 @@ SAVE_RESULTS_AT_BOUNDARIES | yes | no SWARM_SAVE_INTERVAL | 60 | any integer > 0 WALL_TIME_MAX_HOURS | 168.0 | any number + PROFILER_INFO | percents | seconds ======================================================================================================================== Numerics ------------------------------------------------------------------------------------------------------------------------ diff --git a/Sources/Convert/makefile b/Sources/Convert/makefile index 612f33df5..fc83abefd 100644 --- a/Sources/Convert/makefile +++ b/Sources/Convert/makefile @@ -205,6 +205,7 @@ SRC_F_MOD = Const_Mod.f90 \ Assert_Mod.f90 \ Message_Mod.f90 \ Vect_Mod.f90 \ + Control_Mod.f90 \ Profiler_Mod.f90 \ Math_Mod.f90 \ File_Mod.f90 \ diff --git a/Sources/Convert/makefile_explicit_dependencies b/Sources/Convert/makefile_explicit_dependencies index 48ac46159..742245d82 100644 --- a/Sources/Convert/makefile_explicit_dependencies +++ b/Sources/Convert/makefile_explicit_dependencies @@ -12,20 +12,6 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 \ $(DIR_OBJECT)/Convert_Mod.o \ -Convert_Mod/foo.msh \ -Convert_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Convert_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Convert_Mod.o:\ -$(DIR_OBJECT)/Stl_Mod.o \ -$(DIR_SHARED)/Stl_Mod/*.f90 \ -$(DIR_OBJECT)/Profiler_Mod.o \ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -Convert_Mod/foo.msh \ Convert_Mod/*.f90 #--------------------------------------------------- @@ -43,50 +29,79 @@ $(DIR_OBJECT)/Profiler_Mod.o \ $(DIR_SHARED)/Profiler_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Gen_Mod.f90 +# Dependencies for: ./Convert_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Gen_Mod.o:\ -$(DIR_SHARED)/Gen_Mod/*.f90 +$(DIR_OBJECT)/Convert_Mod.o:\ +$(DIR_OBJECT)/Stl_Mod.o \ +$(DIR_SHARED)/Stl_Mod/*.f90 \ +$(DIR_OBJECT)/Profiler_Mod.o \ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +Convert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thin_Line.f90 +# Dependencies for: ./Message_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thin_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Message_Mod.o:\ +$(DIR_OBJECT)/Tokenizer_Mod.o \ +$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thick_Line.f90 +# Dependencies for: ./Isoap_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thick_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Isoap_Mod.o:\ +$(DIR_OBJECT)/Polyhedron_Mod.o \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ +$(DIR_OBJECT)/Iso_Polygons_Mod.o \ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/readme \ +$(DIR_SHARED)/Isoap_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Dashed_Line.f90 +# Dependencies for: ./File_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Dashed_Line.o:\ +$(DIR_OBJECT)/File_Mod.o:\ +$(DIR_OBJECT)/String_Mod.o \ +$(DIR_SHARED)/String_Mod/*.f90 \ +$(DIR_OBJECT)/Message_Mod.o \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_SHARED)/File_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Region_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Region_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Comm_Mod.f90 +# Dependencies for: ./Gen_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Comm_Mod.o:\ -$(DIR_OBJECT)/Const_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 +$(DIR_OBJECT)/Gen_Mod.o:\ +$(DIR_SHARED)/Gen_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Metis_Mod.f90 +# Dependencies for: ./Sort_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Metis_Mod.o:\ -$(DIR_SHARED)/Metis_Mod/*.f90 \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Sort_Mod.o:\ +$(DIR_OBJECT)/Swap_Mod.o \ +$(DIR_SHARED)/Swap_Mod/*.f90 \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Math_Mod.f90 +# Dependencies for: ./Polyhedron_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Math_Mod.o:\ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Polyhedron_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Control_Mod.f90 @@ -100,45 +115,45 @@ $(DIR_SHARED)/Control_Mod/*/*.f90 \ $(DIR_SHARED)/Control_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Vect_Mod.f90 +# Dependencies for: ./Probe_1d_Cells.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Vect_Mod.o:\ -$(DIR_SHARED)/Vect_Mod/*.f90 \ -$(DIR_OBJECT)/Region_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Probe_1d_Cells.o:\ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./String_Mod.f90 +# Dependencies for: ./Message_Mod/Dashed_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/String_Mod.o:\ -$(DIR_SHARED)/String_Mod/*.f90 +$(DIR_OBJECT)/Dashed_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Profiler_Mod.f90 +# Dependencies for: ./Message_Mod/Thin_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Profiler_Mod.o:\ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 +$(DIR_OBJECT)/Thin_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Assert_Mod.f90 +# Dependencies for: ./Message_Mod/Thick_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Assert_Mod.o:\ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Thick_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Sort_Mod.f90 +# Dependencies for: ./Work_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Sort_Mod.o:\ -$(DIR_OBJECT)/Swap_Mod.o \ -$(DIR_SHARED)/Swap_Mod/*.f90 \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 +$(DIR_OBJECT)/Work_Mod.o:\ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Probe_1d_Nodes.f90 @@ -154,6 +169,33 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 +#--------------------------------------------------- +# Dependencies for: ./Vect_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Vect_Mod.o:\ +$(DIR_SHARED)/Vect_Mod/*.f90 \ +$(DIR_OBJECT)/Region_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Profiler_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Profiler_Mod.o:\ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 \ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Math_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Math_Mod.o:\ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o + #--------------------------------------------------- # Dependencies for: ./Swap_Mod.f90 #--------------------------------------------------- @@ -161,15 +203,25 @@ $(DIR_OBJECT)/Swap_Mod.o:\ $(DIR_SHARED)/Swap_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Region_Mod.f90 +# Dependencies for: ./Assert_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Region_Mod.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Assert_Mod.o:\ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_2d.f90 +# Dependencies for: ./String_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_2d.o:\ +$(DIR_OBJECT)/String_Mod.o:\ +$(DIR_SHARED)/String_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -178,21 +230,6 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 -#--------------------------------------------------- -# Dependencies for: ./Polyhedron_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Polyhedron_Mod.o:\ -$(DIR_OBJECT)/Work_Mod.o \ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Iso_Polygons_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 - #--------------------------------------------------- # Dependencies for: ./Grid_Mod.f90 #--------------------------------------------------- @@ -214,26 +251,26 @@ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod.f90 +# Dependencies for: ./Stl_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Message_Mod.o:\ -$(DIR_OBJECT)/Tokenizer_Mod.o \ -$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ -$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/Stl_Mod.o:\ +$(DIR_SHARED)/Stl_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Comm_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Comm_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod.f90 +# Dependencies for: ./Iso_Polygons_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Isoap_Mod.o:\ -$(DIR_OBJECT)/Polyhedron_Mod.o \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ -$(DIR_OBJECT)/Iso_Polygons_Mod.o \ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/readme \ -$(DIR_SHARED)/Isoap_Mod/*.f90 +$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Vtk_Mod.f90 @@ -243,30 +280,17 @@ $(DIR_SHARED)/Vtk_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Stl_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Stl_Mod.o:\ -$(DIR_SHARED)/Stl_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Work_Mod.f90 +# Dependencies for: ./Metis_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Work_Mod.o:\ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Metis_Mod.o:\ +$(DIR_SHARED)/Metis_Mod/*.f90 \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +# Dependencies for: ./Probe_2d.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Probe_2d.o:\ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -282,26 +306,3 @@ $(DIR_OBJECT)/Tokenizer_Mod.o:\ $(DIR_SHARED)/Tokenizer_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o -#--------------------------------------------------- -# Dependencies for: ./File_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/File_Mod.o:\ -$(DIR_OBJECT)/String_Mod.o \ -$(DIR_SHARED)/String_Mod/*.f90 \ -$(DIR_OBJECT)/Message_Mod.o \ -$(DIR_SHARED)/Message_Mod/*.f90 \ -$(DIR_SHARED)/File_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells.o:\ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o - diff --git a/Sources/Divide/makefile b/Sources/Divide/makefile index fcdf804b4..7c0e08483 100644 --- a/Sources/Divide/makefile +++ b/Sources/Divide/makefile @@ -204,6 +204,7 @@ SRC_F_MOD = Const_Mod.f90 \ Assert_Mod.f90 \ Message_Mod.f90 \ Vect_Mod.f90 \ + Control_Mod.f90 \ Profiler_Mod.f90 \ Math_Mod.f90 \ File_Mod.f90 \ diff --git a/Sources/Divide/makefile_explicit_dependencies b/Sources/Divide/makefile_explicit_dependencies index 514cd8b44..d4b6c4c93 100644 --- a/Sources/Divide/makefile_explicit_dependencies +++ b/Sources/Divide/makefile_explicit_dependencies @@ -1,3 +1,10 @@ +#--------------------------------------------------- +# Dependencies for: ./Main_Div.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Main_Div.o:\ +$(DIR_OBJECT)/Divide_Mod.o \ +Divide_Mod/*.f90 + #--------------------------------------------------- # Dependencies for: ./Divide_Mod.f90 #--------------------------------------------------- @@ -8,13 +15,6 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ Divide_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o -#--------------------------------------------------- -# Dependencies for: ./Main_Div.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Main_Div.o:\ -$(DIR_OBJECT)/Divide_Mod.o \ -Divide_Mod/*.f90 - #--------------------------------------------------- # Dependencies for: ./Divide_Mod/Logo_Div.f90 #--------------------------------------------------- @@ -22,60 +22,67 @@ $(DIR_OBJECT)/Logo_Div.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod/Isopol.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Isopol.o: - -#--------------------------------------------------- -# Dependencies for: ./Isoap_Mod/Main_Isoap.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Main_Isoap.o: - -#--------------------------------------------------- -# Dependencies for: ./Gen_Mod.f90 +# Dependencies for: ./Message_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Gen_Mod.o:\ -$(DIR_SHARED)/Gen_Mod/*.f90 +$(DIR_OBJECT)/Message_Mod.o:\ +$(DIR_OBJECT)/Tokenizer_Mod.o \ +$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thin_Line.f90 +# Dependencies for: ./Isoap_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thin_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Isoap_Mod.o:\ +$(DIR_OBJECT)/Polyhedron_Mod.o \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ +$(DIR_OBJECT)/Iso_Polygons_Mod.o \ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/readme \ +$(DIR_SHARED)/Isoap_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thick_Line.f90 +# Dependencies for: ./File_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thick_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/File_Mod.o:\ +$(DIR_OBJECT)/String_Mod.o \ +$(DIR_SHARED)/String_Mod/*.f90 \ +$(DIR_OBJECT)/Message_Mod.o \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Dashed_Line.f90 +# Dependencies for: ./Region_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Dashed_Line.o:\ +$(DIR_OBJECT)/Region_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Comm_Mod.f90 +# Dependencies for: ./Gen_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Comm_Mod.o:\ -$(DIR_OBJECT)/Const_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 +$(DIR_OBJECT)/Gen_Mod.o:\ +$(DIR_SHARED)/Gen_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Metis_Mod.f90 +# Dependencies for: ./Sort_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Metis_Mod.o:\ -$(DIR_SHARED)/Metis_Mod/*.f90 \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Sort_Mod.o:\ +$(DIR_OBJECT)/Swap_Mod.o \ +$(DIR_SHARED)/Swap_Mod/*.f90 \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Math_Mod.f90 +# Dependencies for: ./Polyhedron_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Math_Mod.o:\ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Polyhedron_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Control_Mod.f90 @@ -89,45 +96,45 @@ $(DIR_SHARED)/Control_Mod/*/*.f90 \ $(DIR_SHARED)/Control_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Vect_Mod.f90 +# Dependencies for: ./Probe_1d_Cells.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Vect_Mod.o:\ -$(DIR_SHARED)/Vect_Mod/*.f90 \ -$(DIR_OBJECT)/Region_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Probe_1d_Cells.o:\ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./String_Mod.f90 +# Dependencies for: ./Message_Mod/Dashed_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/String_Mod.o:\ -$(DIR_SHARED)/String_Mod/*.f90 +$(DIR_OBJECT)/Dashed_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Profiler_Mod.f90 +# Dependencies for: ./Message_Mod/Thin_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Profiler_Mod.o:\ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 +$(DIR_OBJECT)/Thin_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Assert_Mod.f90 +# Dependencies for: ./Message_Mod/Thick_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Assert_Mod.o:\ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Thick_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Sort_Mod.f90 +# Dependencies for: ./Work_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Sort_Mod.o:\ -$(DIR_OBJECT)/Swap_Mod.o \ -$(DIR_SHARED)/Swap_Mod/*.f90 \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 +$(DIR_OBJECT)/Work_Mod.o:\ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Probe_1d_Nodes.f90 @@ -143,6 +150,33 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 +#--------------------------------------------------- +# Dependencies for: ./Vect_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Vect_Mod.o:\ +$(DIR_SHARED)/Vect_Mod/*.f90 \ +$(DIR_OBJECT)/Region_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Profiler_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Profiler_Mod.o:\ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 \ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Math_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Math_Mod.o:\ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o + #--------------------------------------------------- # Dependencies for: ./Swap_Mod.f90 #--------------------------------------------------- @@ -150,15 +184,25 @@ $(DIR_OBJECT)/Swap_Mod.o:\ $(DIR_SHARED)/Swap_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Region_Mod.f90 +# Dependencies for: ./Assert_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Region_Mod.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Assert_Mod.o:\ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_2d.f90 +# Dependencies for: ./String_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_2d.o:\ +$(DIR_OBJECT)/String_Mod.o:\ +$(DIR_SHARED)/String_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -167,21 +211,6 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 -#--------------------------------------------------- -# Dependencies for: ./Polyhedron_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Polyhedron_Mod.o:\ -$(DIR_OBJECT)/Work_Mod.o \ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Iso_Polygons_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 - #--------------------------------------------------- # Dependencies for: ./Grid_Mod.f90 #--------------------------------------------------- @@ -203,27 +232,26 @@ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod.f90 +# Dependencies for: ./Stl_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Message_Mod.o:\ -$(DIR_OBJECT)/Tokenizer_Mod.o \ -$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ -$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/Stl_Mod.o:\ +$(DIR_SHARED)/Stl_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Comm_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Comm_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod.f90 +# Dependencies for: ./Iso_Polygons_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Isoap_Mod.o:\ -$(DIR_OBJECT)/Polyhedron_Mod.o \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ -$(DIR_OBJECT)/Iso_Polygons_Mod.o \ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/readme \ -$(DIR_SHARED)/Isoap_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/Dim_Polyhedron.h +$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Vtk_Mod.f90 @@ -233,30 +261,17 @@ $(DIR_SHARED)/Vtk_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Stl_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Stl_Mod.o:\ -$(DIR_SHARED)/Stl_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Work_Mod.f90 +# Dependencies for: ./Metis_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Work_Mod.o:\ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Metis_Mod.o:\ +$(DIR_SHARED)/Metis_Mod/*.f90 \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +# Dependencies for: ./Probe_2d.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Probe_2d.o:\ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -272,26 +287,3 @@ $(DIR_OBJECT)/Tokenizer_Mod.o:\ $(DIR_SHARED)/Tokenizer_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o -#--------------------------------------------------- -# Dependencies for: ./File_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/File_Mod.o:\ -$(DIR_OBJECT)/String_Mod.o \ -$(DIR_SHARED)/String_Mod/*.f90 \ -$(DIR_OBJECT)/Message_Mod.o \ -$(DIR_SHARED)/Message_Mod/*.f90 \ -$(DIR_SHARED)/File_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells.o:\ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o - diff --git a/Sources/Generate/makefile b/Sources/Generate/makefile index ccfc80bc9..d05f7733e 100644 --- a/Sources/Generate/makefile +++ b/Sources/Generate/makefile @@ -205,6 +205,7 @@ SRC_F_MOD = Const_Mod.f90 \ Assert_Mod.f90 \ Message_Mod.f90 \ Vect_Mod.f90 \ + Control_Mod.f90 \ Profiler_Mod.f90 \ Math_Mod.f90 \ File_Mod.f90 \ diff --git a/Sources/Generate/makefile_explicit_dependencies b/Sources/Generate/makefile_explicit_dependencies index d39c0878a..a86860ba6 100644 --- a/Sources/Generate/makefile_explicit_dependencies +++ b/Sources/Generate/makefile_explicit_dependencies @@ -25,31 +25,6 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/Gen_Mod.o \ $(DIR_SHARED)/Gen_Mod/*.f90 -#--------------------------------------------------- -# Dependencies for: ./Main_Gen.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Main_Gen.o:\ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/Generate_Mod.o \ -Generate_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Smooths_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Smooths_Mod.o:\ -Smooths_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 - #--------------------------------------------------- # Dependencies for: ./Generate_Mod.f90 #--------------------------------------------------- @@ -94,65 +69,97 @@ $(DIR_OBJECT)/Range_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Refines_Mod/Connectivity.f90 +# Dependencies for: ./Main_Gen.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Connectivity.o: +$(DIR_OBJECT)/Main_Gen.o:\ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/Generate_Mod.o \ +Generate_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod/Isopol.f90 +# Dependencies for: ./Refines_Mod/Connectivity.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Isopol.o: +$(DIR_OBJECT)/Connectivity.o: #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod/Main_Isoap.f90 +# Dependencies for: ./Smooths_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Main_Isoap.o: +$(DIR_OBJECT)/Smooths_Mod.o:\ +Smooths_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Gen_Mod.f90 +# Dependencies for: ./Message_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Gen_Mod.o:\ -$(DIR_SHARED)/Gen_Mod/*.f90 +$(DIR_OBJECT)/Message_Mod.o:\ +$(DIR_OBJECT)/Tokenizer_Mod.o \ +$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thin_Line.f90 +# Dependencies for: ./Isoap_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thin_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Isoap_Mod.o:\ +$(DIR_OBJECT)/Polyhedron_Mod.o \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ +$(DIR_OBJECT)/Iso_Polygons_Mod.o \ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/readme \ +$(DIR_SHARED)/Isoap_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thick_Line.f90 +# Dependencies for: ./File_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thick_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/File_Mod.o:\ +$(DIR_OBJECT)/String_Mod.o \ +$(DIR_SHARED)/String_Mod/*.f90 \ +$(DIR_OBJECT)/Message_Mod.o \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Dashed_Line.f90 +# Dependencies for: ./Region_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Dashed_Line.o:\ +$(DIR_OBJECT)/Region_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Comm_Mod.f90 +# Dependencies for: ./Gen_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Comm_Mod.o:\ -$(DIR_OBJECT)/Const_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 +$(DIR_OBJECT)/Gen_Mod.o:\ +$(DIR_SHARED)/Gen_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Metis_Mod.f90 +# Dependencies for: ./Sort_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Metis_Mod.o:\ -$(DIR_SHARED)/Metis_Mod/*.f90 \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Sort_Mod.o:\ +$(DIR_OBJECT)/Swap_Mod.o \ +$(DIR_SHARED)/Swap_Mod/*.f90 \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Math_Mod.f90 +# Dependencies for: ./Polyhedron_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Math_Mod.o:\ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Polyhedron_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Control_Mod.f90 @@ -166,45 +173,45 @@ $(DIR_SHARED)/Control_Mod/*/*.f90 \ $(DIR_SHARED)/Control_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Vect_Mod.f90 +# Dependencies for: ./Probe_1d_Cells.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Vect_Mod.o:\ -$(DIR_SHARED)/Vect_Mod/*.f90 \ -$(DIR_OBJECT)/Region_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Probe_1d_Cells.o:\ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./String_Mod.f90 +# Dependencies for: ./Message_Mod/Dashed_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/String_Mod.o:\ -$(DIR_SHARED)/String_Mod/*.f90 +$(DIR_OBJECT)/Dashed_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Profiler_Mod.f90 +# Dependencies for: ./Message_Mod/Thin_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Profiler_Mod.o:\ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 +$(DIR_OBJECT)/Thin_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Assert_Mod.f90 +# Dependencies for: ./Message_Mod/Thick_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Assert_Mod.o:\ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Thick_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Sort_Mod.f90 +# Dependencies for: ./Work_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Sort_Mod.o:\ -$(DIR_OBJECT)/Swap_Mod.o \ -$(DIR_SHARED)/Swap_Mod/*.f90 \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 +$(DIR_OBJECT)/Work_Mod.o:\ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Probe_1d_Nodes.f90 @@ -220,6 +227,33 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 +#--------------------------------------------------- +# Dependencies for: ./Vect_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Vect_Mod.o:\ +$(DIR_SHARED)/Vect_Mod/*.f90 \ +$(DIR_OBJECT)/Region_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Profiler_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Profiler_Mod.o:\ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 \ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Math_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Math_Mod.o:\ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o + #--------------------------------------------------- # Dependencies for: ./Swap_Mod.f90 #--------------------------------------------------- @@ -227,15 +261,25 @@ $(DIR_OBJECT)/Swap_Mod.o:\ $(DIR_SHARED)/Swap_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Region_Mod.f90 +# Dependencies for: ./Assert_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Region_Mod.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Assert_Mod.o:\ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_2d.f90 +# Dependencies for: ./String_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_2d.o:\ +$(DIR_OBJECT)/String_Mod.o:\ +$(DIR_SHARED)/String_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -244,21 +288,6 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 -#--------------------------------------------------- -# Dependencies for: ./Polyhedron_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Polyhedron_Mod.o:\ -$(DIR_OBJECT)/Work_Mod.o \ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Iso_Polygons_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 - #--------------------------------------------------- # Dependencies for: ./Grid_Mod.f90 #--------------------------------------------------- @@ -280,27 +309,26 @@ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod.f90 +# Dependencies for: ./Stl_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Message_Mod.o:\ -$(DIR_OBJECT)/Tokenizer_Mod.o \ -$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ -$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/Stl_Mod.o:\ +$(DIR_SHARED)/Stl_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Comm_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Comm_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod.f90 +# Dependencies for: ./Iso_Polygons_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Isoap_Mod.o:\ -$(DIR_OBJECT)/Polyhedron_Mod.o \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ -$(DIR_OBJECT)/Iso_Polygons_Mod.o \ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/readme \ -$(DIR_SHARED)/Isoap_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/Dim_Polyhedron.h +$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Vtk_Mod.f90 @@ -310,30 +338,17 @@ $(DIR_SHARED)/Vtk_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Stl_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Stl_Mod.o:\ -$(DIR_SHARED)/Stl_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Work_Mod.f90 +# Dependencies for: ./Metis_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Work_Mod.o:\ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Metis_Mod.o:\ +$(DIR_SHARED)/Metis_Mod/*.f90 \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +# Dependencies for: ./Probe_2d.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Probe_2d.o:\ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -349,26 +364,3 @@ $(DIR_OBJECT)/Tokenizer_Mod.o:\ $(DIR_SHARED)/Tokenizer_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o -#--------------------------------------------------- -# Dependencies for: ./File_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/File_Mod.o:\ -$(DIR_OBJECT)/String_Mod.o \ -$(DIR_SHARED)/String_Mod/*.f90 \ -$(DIR_OBJECT)/Message_Mod.o \ -$(DIR_SHARED)/Message_Mod/*.f90 \ -$(DIR_SHARED)/File_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells.o:\ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o - diff --git a/Sources/Process/makefile b/Sources/Process/makefile index c91187a56..4f9e847f1 100644 --- a/Sources/Process/makefile +++ b/Sources/Process/makefile @@ -282,12 +282,12 @@ SRC_F_MOD = Const_Mod.f90 \ Tokenizer_Mod.f90 \ Message_Mod.f90 \ Vect_Mod.f90 \ - Profiler_Mod.f90 \ Math_Mod.f90 \ Swap_Mod.f90 \ Sort_Mod.f90 \ File_Mod.f90 \ Control_Mod.f90 \ + Profiler_Mod.f90 \ Vtk_Mod.f90 \ Metis_Mod.f90 \ Grid_Mod.f90 \ diff --git a/Sources/Process/makefile_explicit_dependencies b/Sources/Process/makefile_explicit_dependencies index 513f2c417..fdf9b829f 100644 --- a/Sources/Process/makefile_explicit_dependencies +++ b/Sources/Process/makefile_explicit_dependencies @@ -1,35 +1,27 @@ #--------------------------------------------------- -# Dependencies for: ./Bulk_Mod.f90 +# Dependencies for: ./Backup_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Bulk_Mod.o:\ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -Bulk_Mod/*.f90 +$(DIR_OBJECT)/Backup_Mod.o:\ +$(DIR_OBJECT)/User_Mod.o \ +User_Mod/*.f90 \ +Backup_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Eddies_Mod.f90 +# Dependencies for: ./Monitor_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Eddies_Mod.o:\ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Monitor_Mod.o:\ +Monitor_Mod/*.f90 \ $(DIR_OBJECT)/Field_Mod.o \ -Field_Mod/*/*.f90 \ -Eddies_Mod/*.f90 +Field_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Porosity_Mod.f90 +# Dependencies for: ./Matrix_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Porosity_Mod.o:\ -$(DIR_OBJECT)/Work_Mod.o \ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_OBJECT)/Stl_Mod.o \ -$(DIR_SHARED)/Stl_Mod/*.f90 \ -Porosity_Mod/*.f90 \ -$(DIR_OBJECT)/Control_Mod.o \ -$(DIR_SHARED)/Control_Mod/*/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 +$(DIR_OBJECT)/Matrix_Mod.o:\ +Matrix_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Particle_Mod.f90 @@ -40,46 +32,99 @@ Vof_Mod/*/*.f90 \ Particle_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Vert_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Vert_Mod.o:\ -Vert_Mod/*.f90 \ -$(DIR_OBJECT)/Point_Mod.o \ -Point_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Read_Controls_Mod.f90 +# Dependencies for: ./Process_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Read_Controls_Mod.o:\ +$(DIR_OBJECT)/Process_Mod.o:\ +$(DIR_OBJECT)/Vof_Mod.o \ +Vof_Mod/*/*.f90 \ +$(DIR_OBJECT)/User_Mod.o \ +User_Mod/*.f90 \ +$(DIR_OBJECT)/Turb_Mod.o \ +Turb_Mod/*.f90 \ $(DIR_OBJECT)/Swarm_Mod.o \ Swarm_Mod/*.f90 \ +$(DIR_OBJECT)/Solver_Mod.o \ +Solver_Mod/*.f90 \ +$(DIR_OBJECT)/Results_Mod.o \ +Results_Mod/*.f90 \ +$(DIR_OBJECT)/Read_Controls_Mod.o \ Read_Controls_Mod/*.f90 \ -$(DIR_OBJECT)/Eddies_Mod.o \ -Eddies_Mod/*.f90 +Process_Mod/*.f90 \ +$(DIR_OBJECT)/Numerics_Mod.o \ +Numerics_Mod/*.f90 \ +$(DIR_OBJECT)/Monitor_Mod.o \ +Monitor_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_OBJECT)/Field_Mod.o \ +Field_Mod/*/*.f90 \ +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o \ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 \ +$(DIR_OBJECT)/Bulk_Mod.o \ +Bulk_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Swarm_Mod.f90 +# Dependencies for: ./Vector_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Swarm_Mod.o:\ -Swarm_Mod/*.f90 \ -$(DIR_OBJECT)/Particle_Mod.o \ -Particle_Mod/*.f90 +$(DIR_OBJECT)/Vector_Mod.o:\ +Vector_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Petsc_Mod.f90 +# Dependencies for: ./Results_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Petsc_Mod.o:\ -Petsc_Mod/*/*.f90 \ -$(DIR_OBJECT)/Native_Mod.o \ -Native_Mod/*.f90 +$(DIR_OBJECT)/Results_Mod.o:\ +Results_Mod/*.f90 \ +$(DIR_OBJECT)/Backup_Mod.o \ +Backup_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Info_Mod.f90 +# Dependencies for: ./Native_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Info_Mod.o:\ -Info_Mod/*.f90 \ -$(DIR_OBJECT)/Field_Mod.o \ -Field_Mod/*/*.f90 +$(DIR_OBJECT)/Native_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_OBJECT)/Vector_Mod.o \ +Vector_Mod/*.f90 \ +Native_Mod/*.f90 \ +$(DIR_OBJECT)/Matrix_Mod.o \ +Matrix_Mod/*.f90 \ +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Interface_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Interface_Mod.o:\ +$(DIR_OBJECT)/Turb_Mod.o \ +Turb_Mod/*.f90 \ +$(DIR_OBJECT)/Profiler_Mod.o \ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +Interface_Mod/*.f90 \ +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Read_Controls_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Read_Controls_Mod.o:\ +$(DIR_OBJECT)/Swarm_Mod.o \ +Swarm_Mod/*.f90 \ +Read_Controls_Mod/*.f90 \ +$(DIR_OBJECT)/Eddies_Mod.o \ +Eddies_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Numerics_Mod.f90 @@ -95,29 +140,33 @@ $(DIR_OBJECT)/Matrix_Mod.o \ Matrix_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Vof_Mod.f90 +# Dependencies for: ./Main_Pro.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Vof_Mod.o:\ -Vof_Mod/*/*.f90 \ -$(DIR_OBJECT)/Turb_Mod.o \ -Turb_Mod/*.f90 \ -Surf_Mod/readme \ -$(DIR_OBJECT)/Surf_Mod.o \ -Surf_Mod/*.f90 \ -$(DIR_OBJECT)/Stl_Mod.o \ -$(DIR_SHARED)/Stl_Mod/*.f90 +$(DIR_OBJECT)/Main_Pro.o:\ +$(DIR_OBJECT)/Process_Mod.o \ +Process_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./User_Mod.f90 +# Dependencies for: ./Vert_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/User_Mod.o:\ -User_Mod/*.f90 \ -$(DIR_OBJECT)/Swarm_Mod.o \ -Swarm_Mod/*.f90 \ -$(DIR_OBJECT)/Porosity_Mod.o \ +$(DIR_OBJECT)/Vert_Mod.o:\ +Vert_Mod/*.f90 \ +$(DIR_OBJECT)/Point_Mod.o \ +Point_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Porosity_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Porosity_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_OBJECT)/Stl_Mod.o \ +$(DIR_SHARED)/Stl_Mod/*.f90 \ Porosity_Mod/*.f90 \ -$(DIR_OBJECT)/Interface_Mod.o \ -Interface_Mod/*.f90 +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Solver_Mod.f90 @@ -128,66 +177,54 @@ $(DIR_OBJECT)/Petsc_Mod.o \ Petsc_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Surf_Mod.f90 +# Dependencies for: ./Elem_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Surf_Mod.o:\ -Surf_Mod/readme \ -Surf_Mod/*.f90 \ -Front_Mod/readme \ -$(DIR_OBJECT)/Front_Mod.o \ -Front_Mod/*.f90 +$(DIR_OBJECT)/Elem_Mod.o:\ +Elem_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Monitor_Mod.f90 +# Dependencies for: ./Eddies_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Monitor_Mod.o:\ -Monitor_Mod/*.f90 \ +$(DIR_OBJECT)/Eddies_Mod.o:\ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Field_Mod.o \ -Field_Mod/*/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Main_Pro.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Main_Pro.o:\ -$(DIR_OBJECT)/Process_Mod.o \ -Process_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Surf_Mod/Place_Surf_At_Value.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Place_Surf_At_Value.o: - -#--------------------------------------------------- -# Dependencies for: ./Vector_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Vector_Mod.o:\ -Vector_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +Field_Mod/*/*.f90 \ +Eddies_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Var_Mod.f90 +# Dependencies for: ./User_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Var_Mod.o:\ -Var_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/User_Mod.o:\ +User_Mod/*.f90 \ +$(DIR_OBJECT)/Swarm_Mod.o \ +Swarm_Mod/*.f90 \ +$(DIR_OBJECT)/Porosity_Mod.o \ +Porosity_Mod/*.f90 \ +$(DIR_OBJECT)/Interface_Mod.o \ +Interface_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Backup_Mod.f90 +# Dependencies for: ./Petsc_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Backup_Mod.o:\ -$(DIR_OBJECT)/User_Mod.o \ -User_Mod/*.f90 \ -Backup_Mod/*.f90 +$(DIR_OBJECT)/Petsc_Mod.o:\ +Petsc_Mod/*/*.f90 \ +$(DIR_OBJECT)/Native_Mod.o \ +Native_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Elem_Mod.f90 +# Dependencies for: ./Field_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Elem_Mod.o:\ -Elem_Mod/*.f90 +$(DIR_OBJECT)/Field_Mod.o:\ +$(DIR_OBJECT)/Solver_Mod.o \ +Solver_Mod/*.f90 \ +$(DIR_OBJECT)/Numerics_Mod.o \ +Numerics_Mod/*.f90 \ +Field_Mod/*/*.f90 \ +$(DIR_OBJECT)/Face_Mod.o \ +Face_Mod/*.f90 \ +$(DIR_OBJECT)/Bulk_Mod.o \ +Bulk_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Front_Mod.f90 @@ -207,59 +244,64 @@ $(DIR_OBJECT)/Elem_Mod.o \ Elem_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Native_Mod.f90 +# Dependencies for: ./Swarm_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Native_Mod.o:\ -$(DIR_OBJECT)/Work_Mod.o \ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_OBJECT)/Vector_Mod.o \ -Vector_Mod/*.f90 \ -Native_Mod/*.f90 \ -$(DIR_OBJECT)/Matrix_Mod.o \ -Matrix_Mod/*.f90 \ -$(DIR_OBJECT)/Control_Mod.o \ -$(DIR_SHARED)/Control_Mod/*/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 +$(DIR_OBJECT)/Swarm_Mod.o:\ +Swarm_Mod/*.f90 \ +$(DIR_OBJECT)/Particle_Mod.o \ +Particle_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Point_Mod.f90 +# Dependencies for: ./Turb_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Point_Mod.o:\ -Point_Mod/*.f90 \ +$(DIR_OBJECT)/Turb_Mod.o:\ +Turb_Mod/*.f90 \ +$(DIR_OBJECT)/Info_Mod.o \ +Info_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Bulk_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Bulk_Mod.o:\ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +Bulk_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Var_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Var_Mod.o:\ +Var_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Process_Mod/Initialize_Variables.f90 +# Dependencies for: ./Info_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Initialize_Variables.o:\ -$(DIR_OBJECT)/Vof_Mod.o \ +$(DIR_OBJECT)/Info_Mod.o:\ +Info_Mod/*.f90 \ +$(DIR_OBJECT)/Field_Mod.o \ +Field_Mod/*/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Surf_Mod/Place_Surf_At_Value.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Place_Surf_At_Value.o: + +#--------------------------------------------------- +# Dependencies for: ./Vof_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Vof_Mod.o:\ Vof_Mod/*/*.f90 \ -$(DIR_OBJECT)/User_Mod.o \ -User_Mod/*.f90 \ $(DIR_OBJECT)/Turb_Mod.o \ Turb_Mod/*.f90 \ -$(DIR_OBJECT)/Swarm_Mod.o \ -Swarm_Mod/*.f90 \ -$(DIR_OBJECT)/Numerics_Mod.o \ -Numerics_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Field_Mod.o \ -Field_Mod/*/*.f90 \ -$(DIR_OBJECT)/Control_Mod.o \ -$(DIR_SHARED)/Control_Mod/*/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o \ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 \ -$(DIR_OBJECT)/Bulk_Mod.o \ -Bulk_Mod/*.f90 +Surf_Mod/readme \ +$(DIR_OBJECT)/Surf_Mod.o \ +Surf_Mod/*.f90 \ +$(DIR_OBJECT)/Stl_Mod.o \ +$(DIR_SHARED)/Stl_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Process_Mod/Update_Boundary_Values.f90 @@ -282,17 +324,9 @@ $(DIR_OBJECT)/Comm_Mod.o \ $(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Process_Mod/Logo_Pro.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Logo_Pro.o:\ -$(DIR_OBJECT)/Solver_Mod.o \ -Solver_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o - -#--------------------------------------------------- -# Dependencies for: ./Process_Mod.f90 +# Dependencies for: ./Process_Mod/Initialize_Variables.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Process_Mod.o:\ +$(DIR_OBJECT)/Initialize_Variables.o:\ $(DIR_OBJECT)/Vof_Mod.o \ Vof_Mod/*/*.f90 \ $(DIR_OBJECT)/User_Mod.o \ @@ -301,17 +335,8 @@ $(DIR_OBJECT)/Turb_Mod.o \ Turb_Mod/*.f90 \ $(DIR_OBJECT)/Swarm_Mod.o \ Swarm_Mod/*.f90 \ -$(DIR_OBJECT)/Solver_Mod.o \ -Solver_Mod/*.f90 \ -$(DIR_OBJECT)/Results_Mod.o \ -Results_Mod/*.f90 \ -$(DIR_OBJECT)/Read_Controls_Mod.o \ -Read_Controls_Mod/*.f90 \ -Process_Mod/*.f90 \ $(DIR_OBJECT)/Numerics_Mod.o \ Numerics_Mod/*.f90 \ -$(DIR_OBJECT)/Monitor_Mod.o \ -Monitor_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ @@ -329,65 +354,78 @@ $(DIR_OBJECT)/Bulk_Mod.o \ Bulk_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Turb_Mod.f90 +# Dependencies for: ./Process_Mod/Logo_Pro.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Turb_Mod.o:\ -Turb_Mod/*.f90 \ -$(DIR_OBJECT)/Info_Mod.o \ -Info_Mod/*.f90 +$(DIR_OBJECT)/Logo_Pro.o:\ +$(DIR_OBJECT)/Solver_Mod.o \ +Solver_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Field_Mod.f90 +# Dependencies for: ./Surf_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Field_Mod.o:\ -$(DIR_OBJECT)/Solver_Mod.o \ -Solver_Mod/*.f90 \ -$(DIR_OBJECT)/Numerics_Mod.o \ -Numerics_Mod/*.f90 \ -Field_Mod/*/*.f90 \ -$(DIR_OBJECT)/Face_Mod.o \ -Face_Mod/*.f90 \ -$(DIR_OBJECT)/Bulk_Mod.o \ -Bulk_Mod/*.f90 +$(DIR_OBJECT)/Surf_Mod.o:\ +Surf_Mod/readme \ +Surf_Mod/*.f90 \ +Front_Mod/readme \ +$(DIR_OBJECT)/Front_Mod.o \ +Front_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Interface_Mod.f90 +# Dependencies for: ./Face_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Interface_Mod.o:\ -$(DIR_OBJECT)/Turb_Mod.o \ -Turb_Mod/*.f90 \ -$(DIR_OBJECT)/Profiler_Mod.o \ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -Interface_Mod/*.f90 \ -$(DIR_OBJECT)/Control_Mod.o \ -$(DIR_SHARED)/Control_Mod/*/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 +$(DIR_OBJECT)/Face_Mod.o:\ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +Face_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Matrix_Mod.f90 +# Dependencies for: ./Point_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Matrix_Mod.o:\ -Matrix_Mod/*.f90 \ +$(DIR_OBJECT)/Point_Mod.o:\ +Point_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Results_Mod.f90 +# Dependencies for: ./Message_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Message_Mod.o:\ +$(DIR_OBJECT)/Tokenizer_Mod.o \ +$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Isoap_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Isoap_Mod.o:\ +$(DIR_OBJECT)/Polyhedron_Mod.o \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ +$(DIR_OBJECT)/Iso_Polygons_Mod.o \ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/readme \ +$(DIR_SHARED)/Isoap_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./File_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Results_Mod.o:\ -Results_Mod/*.f90 \ -$(DIR_OBJECT)/Backup_Mod.o \ -Backup_Mod/*.f90 +$(DIR_OBJECT)/File_Mod.o:\ +$(DIR_OBJECT)/String_Mod.o \ +$(DIR_SHARED)/String_Mod/*.f90 \ +$(DIR_OBJECT)/Message_Mod.o \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Face_Mod.f90 +# Dependencies for: ./Region_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Face_Mod.o:\ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -Face_Mod/*.f90 +$(DIR_OBJECT)/Region_Mod.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- # Dependencies for: ./Gen_Mod.f90 @@ -396,15 +434,46 @@ $(DIR_OBJECT)/Gen_Mod.o:\ $(DIR_SHARED)/Gen_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thin_Line.f90 +# Dependencies for: ./Sort_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thin_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Sort_Mod.o:\ +$(DIR_OBJECT)/Swap_Mod.o \ +$(DIR_SHARED)/Swap_Mod/*.f90 \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thick_Line.f90 +# Dependencies for: ./Polyhedron_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thick_Line.o:\ +$(DIR_OBJECT)/Polyhedron_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Control_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Control_Mod.o:\ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Probe_1d_Cells.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Probe_1d_Cells.o:\ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- @@ -414,37 +483,40 @@ $(DIR_OBJECT)/Dashed_Line.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Comm_Mod.f90 +# Dependencies for: ./Message_Mod/Thin_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Comm_Mod.o:\ -$(DIR_OBJECT)/Const_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 +$(DIR_OBJECT)/Thin_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Metis_Mod.f90 +# Dependencies for: ./Message_Mod/Thick_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Metis_Mod.o:\ -$(DIR_SHARED)/Metis_Mod/*.f90 \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Thick_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Math_Mod.f90 +# Dependencies for: ./Work_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Math_Mod.o:\ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Work_Mod.o:\ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Control_Mod.f90 +# Dependencies for: ./Probe_1d_Nodes.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Control_Mod.o:\ +$(DIR_OBJECT)/Probe_1d_Nodes.o:\ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_SHARED)/Control_Mod/*/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 +$(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Vect_Mod.f90 @@ -455,51 +527,23 @@ $(DIR_OBJECT)/Region_Mod.o \ $(DIR_OBJECT)/Assert_Mod.o \ $(DIR_SHARED)/Assert_Mod/*.f90 -#--------------------------------------------------- -# Dependencies for: ./String_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/String_Mod.o:\ -$(DIR_SHARED)/String_Mod/*.f90 - #--------------------------------------------------- # Dependencies for: ./Profiler_Mod.f90 #--------------------------------------------------- $(DIR_OBJECT)/Profiler_Mod.o:\ $(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 \ $(DIR_OBJECT)/Comm_Mod.o \ $(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Assert_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Assert_Mod.o:\ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 \ -$(DIR_SHARED)/Assert_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Sort_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Sort_Mod.o:\ -$(DIR_OBJECT)/Swap_Mod.o \ -$(DIR_SHARED)/Swap_Mod/*.f90 \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Probe_1d_Nodes.f90 +# Dependencies for: ./Math_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Nodes.o:\ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_OBJECT)/Math_Mod.o:\ $(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- # Dependencies for: ./Swap_Mod.f90 @@ -508,15 +552,25 @@ $(DIR_OBJECT)/Swap_Mod.o:\ $(DIR_SHARED)/Swap_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Region_Mod.f90 +# Dependencies for: ./Assert_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Region_Mod.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Assert_Mod.o:\ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_2d.f90 +# Dependencies for: ./String_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_2d.o:\ +$(DIR_OBJECT)/String_Mod.o:\ +$(DIR_SHARED)/String_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -525,21 +579,6 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 -#--------------------------------------------------- -# Dependencies for: ./Polyhedron_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Polyhedron_Mod.o:\ -$(DIR_OBJECT)/Work_Mod.o \ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Iso_Polygons_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 - #--------------------------------------------------- # Dependencies for: ./Grid_Mod.f90 #--------------------------------------------------- @@ -561,26 +600,26 @@ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod.f90 +# Dependencies for: ./Stl_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Message_Mod.o:\ -$(DIR_OBJECT)/Tokenizer_Mod.o \ -$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ -$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/Stl_Mod.o:\ +$(DIR_SHARED)/Stl_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Comm_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Comm_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Isoap_Mod.f90 +# Dependencies for: ./Iso_Polygons_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Isoap_Mod.o:\ -$(DIR_OBJECT)/Polyhedron_Mod.o \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ -$(DIR_OBJECT)/Iso_Polygons_Mod.o \ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/readme \ -$(DIR_SHARED)/Isoap_Mod/*.f90 +$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Vtk_Mod.f90 @@ -590,30 +629,17 @@ $(DIR_SHARED)/Vtk_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Stl_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Stl_Mod.o:\ -$(DIR_SHARED)/Stl_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Work_Mod.f90 +# Dependencies for: ./Metis_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Work_Mod.o:\ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Metis_Mod.o:\ +$(DIR_SHARED)/Metis_Mod/*.f90 \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells_Nodes.f90 +# Dependencies for: ./Probe_2d.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells_Nodes.o:\ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Probe_2d.o:\ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -629,26 +655,3 @@ $(DIR_OBJECT)/Tokenizer_Mod.o:\ $(DIR_SHARED)/Tokenizer_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o -#--------------------------------------------------- -# Dependencies for: ./File_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/File_Mod.o:\ -$(DIR_OBJECT)/String_Mod.o \ -$(DIR_SHARED)/String_Mod/*.f90 \ -$(DIR_OBJECT)/Message_Mod.o \ -$(DIR_SHARED)/Message_Mod/*.f90 \ -$(DIR_SHARED)/File_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells.o:\ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o - diff --git a/Sources/Shared/Control_Mod.f90 b/Sources/Shared/Control_Mod.f90 index c7f28cf2e..088272277 100644 --- a/Sources/Shared/Control_Mod.f90 +++ b/Sources/Shared/Control_Mod.f90 @@ -62,6 +62,9 @@ module Control_Mod # include "Control_Mod/Input_Output/Results_Save_Interval.f90" # include "Control_Mod/Input_Output/Swarm_Save_Interval.f90" + ! Profiler +# include "Control_Mod/Input_Output/Profiler_Info.f90" + !--------------------! ! Linear solvers ! (native (from T-Flows) or PETSc) !--------------------! diff --git a/Sources/Shared/Control_Mod/Input_Output/Profiler_Info.f90 b/Sources/Shared/Control_Mod/Input_Output/Profiler_Info.f90 new file mode 100644 index 000000000..a600065db --- /dev/null +++ b/Sources/Shared/Control_Mod/Input_Output/Profiler_Info.f90 @@ -0,0 +1,14 @@ +!==============================================================================! + subroutine Control_Mod_Profiler_Info(val, verbose) +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + character(SL), intent(out) :: val + logical, optional, intent(in) :: verbose +!==============================================================================! + + call Control_Mod_Read_Char_Item('PROFILER_INFO', 'percents', & + val, verbose) + call String % To_Upper_Case(val) + + end subroutine diff --git a/Sources/Shared/Profiler_Mod.f90 b/Sources/Shared/Profiler_Mod.f90 index 61bedb762..4456966db 100644 --- a/Sources/Shared/Profiler_Mod.f90 +++ b/Sources/Shared/Profiler_Mod.f90 @@ -2,6 +2,7 @@ module Profiler_Mod !----------------------------------[Modules]-----------------------------------! use Comm_Mod + use Control_Mod !------------------------------------------------------------------------------! implicit none !==============================================================================! diff --git a/Sources/Shared/Profiler_Mod/Statistics.f90 b/Sources/Shared/Profiler_Mod/Statistics.f90 index c5464a0a0..1e9739f46 100644 --- a/Sources/Shared/Profiler_Mod/Statistics.f90 +++ b/Sources/Shared/Profiler_Mod/Statistics.f90 @@ -1,22 +1,24 @@ !==============================================================================! - subroutine Statistics(Profiler, indent, in_seconds) + subroutine Statistics(Profiler, indent) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! class(Profiler_Type), target :: Profiler integer, intent(in) :: indent ! 34 for Main_Pro, 1 for Main_con - logical, optional, intent(in) :: in_seconds !-----------------------------------[Locals]-----------------------------------! integer :: i_fun real :: total_time, t_temp, percent_time integer :: hours, minutes, seconds character(DL) :: line, n_temp + character(SL) :: pinfo logical :: swap, in_sec !==============================================================================! + ! Only Process has a control file in_sec = .false. - if(present(in_seconds)) then - if(in_seconds) then + if(PROGRAM_NAME .eq. 'Process') then + call Control_Mod_Profiler_Info(pinfo, verbose=.false.) + if(pinfo == 'SECONDS') then in_sec = .true. end if end if From 6f29642d1ecec9912526b4c55b0e1881f54a61d8 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 22 Mar 2023 05:19:47 +0100 Subject: [PATCH 116/223] Spreading browsing macros to Turb_Mod. On branch bojan_fixed_cell_ranges modified: Turb_Mod.f90 modified: Turb_Mod/Src_Eps_K_Eps.f90 modified: Turb_Mod/Src_Eps_K_Eps_Zeta_F.f90 modified: Turb_Mod/Src_F22_K_Eps_Zeta_F.f90 modified: Turb_Mod/Src_Kin_K_Eps.f90 modified: Turb_Mod/Src_Kin_K_Eps_Zeta_F.f90 modified: Turb_Mod/Src_Zeta_K_Eps_Zeta_F.f90 modified: Turb_Mod/Vis_T_K_Eps.f90 modified: Turb_Mod/Vis_T_K_Eps_Zeta_F.f90 --- Sources/Process/Turb_Mod.f90 | 2 + Sources/Process/Turb_Mod/Src_Eps_K_Eps.f90 | 36 ++++++++----- .../Process/Turb_Mod/Src_Eps_K_Eps_Zeta_F.f90 | 27 +++++----- .../Process/Turb_Mod/Src_F22_K_Eps_Zeta_F.f90 | 39 ++++++++------ Sources/Process/Turb_Mod/Src_Kin_K_Eps.f90 | 50 ++++++++--------- .../Process/Turb_Mod/Src_Kin_K_Eps_Zeta_F.f90 | 50 ++++++++--------- .../Turb_Mod/Src_Zeta_K_Eps_Zeta_F.f90 | 6 +-- Sources/Process/Turb_Mod/Vis_T_K_Eps.f90 | 29 +++++----- .../Process/Turb_Mod/Vis_T_K_Eps_Zeta_F.f90 | 54 ++++++++++--------- 9 files changed, 161 insertions(+), 132 deletions(-) diff --git a/Sources/Process/Turb_Mod.f90 b/Sources/Process/Turb_Mod.f90 index 17e5e38c7..6bbdf6898 100644 --- a/Sources/Process/Turb_Mod.f90 +++ b/Sources/Process/Turb_Mod.f90 @@ -1,3 +1,5 @@ +#include "../Shared/Assert.h90" +#include "../Shared/Browse.h90" #include "../Shared/Unused.h90" !==============================================================================! diff --git a/Sources/Process/Turb_Mod/Src_Eps_K_Eps.f90 b/Sources/Process/Turb_Mod/Src_Eps_K_Eps.f90 index e364fd537..52f699f94 100644 --- a/Sources/Process/Turb_Mod/Src_Eps_K_Eps.f90 +++ b/Sources/Process/Turb_Mod/Src_Eps_K_Eps.f90 @@ -4,7 +4,14 @@ subroutine Src_Eps_K_Eps(Turb, Sol) ! Computes the source terms in the eps transport equation, ! ! wall shear stress (wall function approuch) ! !------------------------------------------------------------------------------! -! int( density (c_1e eps/kin Gk - c_2e eps^2/kin) )dV ! +! +! The form of the term being discretized: +! ! +! / ! +! | ! +! | ( density (c_1e eps/kin Gk - c_2e eps^2/kin) ) dV ! +! | ! +! / ! ! ! ! assigns epsilon from the wall function: ! ! ! @@ -22,7 +29,7 @@ subroutine Src_Eps_K_Eps(Turb, Sol) type(Var_Type), pointer :: kin, eps type(Matrix_Type), pointer :: A real, pointer :: b(:) - integer :: s, c, c1, c2, j + integer :: s, c, c1, c2, j, reg real :: u_tan, u_tau real :: re_t, f_mu, fa, kin_vis real :: eps_wf, eps_int, y_star, dia_coef_tmp @@ -48,7 +55,7 @@ subroutine Src_Eps_K_Eps(Turb, Sol) call Turb % Alias_K_Eps (kin, eps) call Sol % Alias_Native (A, b) - do c = 1, Grid % n_cells + do c = Cells_In_Domain() kin_vis = Flow % viscosity(c) / Flow % density(c) ! Positive contribution: @@ -82,13 +89,16 @@ subroutine Src_Eps_K_Eps(Turb, Sol) end do ! Imposing a boundary condition on wall for eps - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0) then - kin_vis = Flow % viscosity(c1) / Flow % density(c1) - if( Grid % Bnd_Cond_Type(c2) .eq. WALL .or. & - Grid % Bnd_Cond_Type(c2) .eq. WALLFL) then + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. WALL .or. & + Grid % region % type(reg) .eq. WALLFL) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + + Assert(c2 < 0) ! just to make sure + + kin_vis = Flow % viscosity(c1) / Flow % density(c1) ! Set up roughness coefficient z_o = Turb % Roughness_Coefficient(c1, c2) @@ -141,8 +151,8 @@ subroutine Src_Eps_K_Eps(Turb, Sol) eps % n(c2) = 2.0 * kin_vis * kin % n(c1) & / Grid % wall_dist(c1)**2 end if ! y_plus(c1) < 3 - end if ! wall or wall_flux - end if ! c2 < 0 - end do + end do ! faces in regions + end if ! region is WALL or WALLFL + end do ! through regions end subroutine diff --git a/Sources/Process/Turb_Mod/Src_Eps_K_Eps_Zeta_F.f90 b/Sources/Process/Turb_Mod/Src_Eps_K_Eps_Zeta_F.f90 index 20d177261..54882a00d 100644 --- a/Sources/Process/Turb_Mod/Src_Eps_K_Eps_Zeta_F.f90 +++ b/Sources/Process/Turb_Mod/Src_Eps_K_Eps_Zeta_F.f90 @@ -15,7 +15,7 @@ subroutine Src_Eps_K_Eps_Zeta_F(Turb, Sol) type(Var_Type), pointer :: kin, eps, zeta, f22, ut, vt, wt type(Matrix_Type), pointer :: A real, pointer :: b(:) - integer :: c, s, c1, c2, j + integer :: c, s, c1, c2, j, reg real :: u_tan, u_tau real :: e_sor, c_11e, ebf real :: eps_wf, eps_int @@ -56,7 +56,7 @@ subroutine Src_Eps_K_Eps_Zeta_F(Turb, Sol) call Turb % Time_And_Length_Scale(Grid) - do c = 1, Grid % n_cells + do c = Cells_In_Domain() e_sor = Grid % vol(c)/(Turb % t_scale(c)+TINY) c_11e = c_1e*(1.0 + alpha * ( 1.0/(zeta % n(c)+TINY) )) b(c) = b(c) + c_11e * e_sor * Turb % p_kin(c) @@ -79,13 +79,16 @@ subroutine Src_Eps_K_Eps_Zeta_F(Turb, Sol) !-------------------------------------------------------! ! Imposing a boundary condition on wall for eps - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0) then - kin_vis = Flow % viscosity(c1) / Flow % density(c1) - if( Grid % Bnd_Cond_Type(c2) .eq. WALL .or. & - Grid % Bnd_Cond_Type(c2) .eq. WALLFL) then + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. WALL .or. & + Grid % region % type(reg) .eq. WALLFL) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + + Assert(c2 < 0) + + kin_vis = Flow % viscosity(c1) / Flow % density(c1) ! Set up roughness coefficient z_o = Turb % Roughness_Coefficient(c1, c2) @@ -138,8 +141,8 @@ subroutine Src_Eps_K_Eps_Zeta_F(Turb, Sol) eps % n(c2) = 2.0 * kin_vis * kin % n(c1) & / Grid % wall_dist(c1)**2 end if ! y_plus(c1) < 3 - end if ! wall or wall_flux - end if ! c2 < 0 - end do + end do ! faces in regions + end if ! region is WALL or WALLFL + end do ! through regions end subroutine diff --git a/Sources/Process/Turb_Mod/Src_F22_K_Eps_Zeta_F.f90 b/Sources/Process/Turb_Mod/Src_F22_K_Eps_Zeta_F.f90 index ed18c622d..b664e0682 100644 --- a/Sources/Process/Turb_Mod/Src_F22_K_Eps_Zeta_F.f90 +++ b/Sources/Process/Turb_Mod/Src_F22_K_Eps_Zeta_F.f90 @@ -14,13 +14,18 @@ subroutine Src_F22_K_Eps_Zeta_F(Turb, Sol) type(Var_Type), pointer :: kin, eps, f22, zeta type(Matrix_Type), pointer :: A real, pointer :: b(:) - integer :: s, c, c1, c2 + integer :: s, c, c1, c2, reg real :: sor_11, f22hg -!==============================================================================! +!------------------------------------------------------------------------------! ! ! ! The form of source terms are : ! ! ! -! int( f22hg*dV ), ! +! / ! +! | ! +! | f22hg * dV ! +! | ! +! / ! +! ! ! where f22hg - f22hg homogenious is placed in a source coefficients b(c) ! ! ! ! f22hg = (1.0 - Cv_1)*(vi2(c)/kin(c) - 2.0/3.0)/t_scale(c) & ! @@ -28,7 +33,6 @@ subroutine Src_F22_K_Eps_Zeta_F(Turb, Sol) ! ! ! int( f22*dV ); this term is placed in a diagonal of coefficient matrix ! ! ! -! ! ! Dimensions of certain variables ! ! ! ! t_scale [s] ! @@ -37,7 +41,8 @@ subroutine Src_F22_K_Eps_Zeta_F(Turb, Sol) ! vi2 [m^2/s^2] ! ! f22 [-] ! ! l_scale [m] ! -!------------------------------------------------------------------------------! +! ! +!==============================================================================! ! Take aliases Flow => Turb % pnt_flow @@ -48,7 +53,7 @@ subroutine Src_F22_K_Eps_Zeta_F(Turb, Sol) call Turb % Time_And_Length_Scale(Grid) ! Source term f22hg - do c = 1, Grid % n_cells + do c = Cells_In_Domain() f22hg = (1.0 - c_f1 - 0.65 * Turb % p_kin(c) / Flow % density(c) & / (eps % n(c) + TINY)) & * (zeta % n(c) - TWO_THIRDS) & @@ -58,18 +63,20 @@ subroutine Src_F22_K_Eps_Zeta_F(Turb, Sol) end do ! Source term f22hg - do c = 1, Grid % n_cells + do c = Cells_In_Domain() sor_11 = Grid % vol(c)/(Turb % l_scale(c)**2 + TINY) A % val(A % dia(c)) = A % val(A % dia(c)) + sor_11 end do ! Imposing boundary condition for f22 on the wall - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0) then - if(Grid % Bnd_Cond_Type(c2) .eq. WALL .or. & - Grid % Bnd_Cond_Type(c2) .eq. WALLFL) then + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. WALL .or. & + Grid % region % type(reg) .eq. WALLFL) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + + Assert(c2 < 0) f22 % n(c2) = -2.0 * Flow % viscosity(c1) & / Flow % density(c1) * zeta % n(c1) & @@ -80,8 +87,8 @@ subroutine Src_F22_K_Eps_Zeta_F(Turb, Sol) ! Linearization of the near wall terms helps to get more ! stable solution, especially for small wall distance. b(c1) = b(c1) + A % fc(s) * f22 % n(c2) - end if ! end if of BC=wall - end if ! end if of c2<0 - end do + end do ! faces in regions + end if ! region is WALL or WALLFL + end do ! through regions end subroutine diff --git a/Sources/Process/Turb_Mod/Src_Kin_K_Eps.f90 b/Sources/Process/Turb_Mod/Src_Kin_K_Eps.f90 index 9a66c3de0..17d9c3139 100644 --- a/Sources/Process/Turb_Mod/Src_Kin_K_Eps.f90 +++ b/Sources/Process/Turb_Mod/Src_Kin_K_Eps.f90 @@ -14,14 +14,14 @@ subroutine Src_Kin_K_Eps(Turb, Sol) type(Var_Type), pointer :: kin, eps, ut, vt, wt, t2 type(Matrix_Type), pointer :: A real, pointer :: b(:) - integer :: c, c1, c2, s + integer :: c, c1, c2, s, reg real :: u_tan, u_tau - real :: kin_vis ! [m^2/s] + real :: kin_vis real :: p_kin_int, p_kin_wf real :: z_o, ebf real :: ut_log_law, vt_log_law, wt_log_law real :: nx, ny, nz, qx, qy, qz, g_buoy_wall -!==============================================================================! +!------------------------------------------------------------------------------! ! Dimensions: ! ! ! ! production p_kin [m^2/s^3] | rate-of-strain shear [1/s] ! @@ -29,11 +29,12 @@ subroutine Src_Kin_K_Eps(Turb, Sol) ! wall shear s. tau_wall [kg/(m*s^2)]| dyn visc. viscosity [kg/(m*s)] ! ! density density [kg/m^3] | turb. kin en. kin % n [m^2/s^2] ! ! cell volume vol [m^3] | length lf [m] ! -! left hand s. A [kg/s] | right hand s. b [kg*m^2/s^3]! +! left hand s. A [kg/s] | kin. visc kin_vis [m^2/s] ! +! right hand s. b [kg*m^2/s^3]| ! !------------------------------------------------------------------------------! ! p_kin = 2*vis_t / density S_ij S_ij ! ! shear = sqrt(2 S_ij S_ij) ! -!------------------------------------------------------------------------------! +!==============================================================================! ! Take aliases Flow => Turb % pnt_flow @@ -48,8 +49,9 @@ subroutine Src_Kin_K_Eps(Turb, Sol) !-----------------------------------------! ! Compute the sources in the interior ! !-----------------------------------------! + ! Production source: - do c = 1, Grid % n_cells + do c = Cells_In_Domain() Turb % p_kin(c) = Turb % vis_t(c) * Flow % shear(c)**2 b(c) = b(c) + Turb % p_kin(c) * Grid % vol(c) @@ -72,17 +74,17 @@ subroutine Src_Kin_K_Eps(Turb, Sol) !-----------------------------------------------! ! Compute the sources in the near wall cells ! !-----------------------------------------------! - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - if(c2 < 0) then + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. WALL .or. & + Grid % region % type(reg) .eq. WALLFL) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) - ! Kinematic viscosity - kin_vis = Flow % viscosity(c1) / Flow % density(c1) + Assert(c2 < 0) ! just to be on the safe side - if(Grid % Bnd_Cond_Type(c2) .eq. WALL .or. & - Grid % Bnd_Cond_Type(c2) .eq. WALLFL) then + ! Kinematic viscosity + kin_vis = Flow % viscosity(c1) / Flow % density(c1) ! Set up roughness coefficient z_o = Turb % Roughness_Coefficient(c1, c2) @@ -130,14 +132,14 @@ subroutine Src_Kin_K_Eps(Turb, Sol) qy = t % q(c2) * ny qz = t % q(c2) * nz - ut_log_law = - Turb % con_w(c1) & - / (Flow % density(c1) * Flow % capacity(c1)) & + ut_log_law = - Turb % con_w(c1) & + / (Flow % density(c1) * Flow % capacity(c1)) & * (t % n(c2) - t % n(c1))/Grid % wall_dist(c1) * nx - vt_log_law = - Turb % con_w(c1) & - / (Flow % density(c1) * Flow % capacity(c1)) & + vt_log_law = - Turb % con_w(c1) & + / (Flow % density(c1) * Flow % capacity(c1)) & * (t % n(c2) - t % n(c1))/Grid % wall_dist(c1) * ny - wt_log_law = - Turb % con_w(c1) & - / (Flow % density(c1) * Flow % capacity(c1)) & + wt_log_law = - Turb % con_w(c1) & + / (Flow % density(c1) * Flow % capacity(c1)) & * (t % n(c2) - t % n(c1))/Grid % wall_dist(c1) * nz ut % n(c1) = ut % n(c1) * exp(-1.0 * ebf) & @@ -170,9 +172,9 @@ subroutine Src_Kin_K_Eps(Turb, Sol) b(c1) = b(c1) + Turb % g_buoy(c1) * Grid % vol(c1) end if ! Flow % buoyancy .eq. THERMALLY_DRIVEN - end if ! Grid % Bnd_Cond_Type(c2) .eq. WALL or WALLFL - end if ! c2 < 0 - end do + end do ! faces in regions + end if ! region is WALL or WALLFL + end do ! through regions call Grid % Exchange_Cells_Real(kin % n) diff --git a/Sources/Process/Turb_Mod/Src_Kin_K_Eps_Zeta_F.f90 b/Sources/Process/Turb_Mod/Src_Kin_K_Eps_Zeta_F.f90 index a1d2d3f1f..72b9b9107 100644 --- a/Sources/Process/Turb_Mod/Src_Kin_K_Eps_Zeta_F.f90 +++ b/Sources/Process/Turb_Mod/Src_Kin_K_Eps_Zeta_F.f90 @@ -23,14 +23,14 @@ subroutine Src_Kin_K_Eps_Zeta_F(Turb, Sol) type(Var_Type), pointer :: kin, eps, zeta, f, ut, vt, wt, t2 type(Matrix_Type), pointer :: A real, pointer :: b(:) - integer :: c, c1, c2, s + integer :: c, c1, c2, s, reg real :: u_tan, u_tau real :: lf, ebf, p_kin_int, p_kin_wf, l_rans_d, l_rans_v real :: kin_vis real :: z_o, alpha_d, alpha_v, l_sgs_d, l_sgs_v real :: ut_log_law, vt_log_law, wt_log_law real :: nx, ny, nz, qx, qy, qz, g_buoy_wall -!==============================================================================! +!------------------------------------------------------------------------------! ! Dimensions: ! ! ! ! production p_kin [m^2/s^3] | rate-of-strain shear [1/s] ! @@ -42,7 +42,7 @@ subroutine Src_Kin_K_Eps_Zeta_F(Turb, Sol) !------------------------------------------------------------------------------! ! p_kin = 2*vis_t / density S_ij S_ij ! ! shear = sqrt(2 S_ij S_ij) ! -!------------------------------------------------------------------------------! +!==============================================================================! ! Take aliases Flow => Turb % pnt_flow @@ -55,13 +55,13 @@ subroutine Src_Kin_K_Eps_Zeta_F(Turb, Sol) call Sol % Alias_Native (A, b) ! Production source: - do c = 1, Grid % n_cells + do c = Cells_In_Domain() Turb % p_kin(c) = max(Turb % vis_t(c) * Flow % shear(c)**2, TINY) b(c) = b(c) + Turb % p_kin(c) * Grid % vol(c) end do if(Flow % buoyancy .eq. THERMALLY_DRIVEN) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain() Turb % g_buoy(c) = -Flow % beta & * ( Flow % grav_x * ut % n(c) & + Flow % grav_y * vt % n(c) & @@ -82,7 +82,7 @@ subroutine Src_Kin_K_Eps_Zeta_F(Turb, Sol) end if if(Turb % model .eq. HYBRID_LES_RANS) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain() lf = Grid % vol(c)**ONE_THIRD @@ -112,7 +112,7 @@ subroutine Src_Kin_K_Eps_Zeta_F(Turb, Sol) end if end do else ! turbuence model will be K_EPS_ZETA_F - do c = 1, Grid % n_cells + do c = Cells_In_Domain() A % val(A % dia(c)) = A % val(A % dia(c)) & + Flow % density(c) * eps % n(c) & / (kin % n(c) + TINY) * Grid % vol(c) @@ -123,17 +123,17 @@ subroutine Src_Kin_K_Eps_Zeta_F(Turb, Sol) !-----------------------------------------------! ! Compute the sources in the near wall cells ! !-----------------------------------------------! - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - if(c2 < 0) then + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. WALL .or. & + Grid % region % type(reg) .eq. WALLFL) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) - ! Kinematic viscosity - kin_vis = Flow % viscosity(c1) / Flow % density(c1) + Assert(c2 < 0) - if(Grid % Bnd_Cond_Type(c2) .eq. WALL .or. & - Grid % Bnd_Cond_Type(c2) .eq. WALLFL) then + ! Kinematic viscosity + kin_vis = Flow % viscosity(c1) / Flow % density(c1) ! Set up roughness coefficient z_o = Turb % Roughness_Coefficient(c1, c2) @@ -181,14 +181,14 @@ subroutine Src_Kin_K_Eps_Zeta_F(Turb, Sol) qy = t % q(c2) * ny qz = t % q(c2) * nz - ut_log_law = - Turb % con_w(c1) & - / (Flow % density(c1) * Flow % capacity(c1)) & + ut_log_law = - Turb % con_w(c1) & + / (Flow % density(c1) * Flow % capacity(c1)) & * (t % n(c2) - t % n(c1))/Grid % wall_dist(c1) * nx - vt_log_law = - Turb % con_w(c1) & - / (Flow % density(c1) * Flow % capacity(c1)) & + vt_log_law = - Turb % con_w(c1) & + / (Flow % density(c1) * Flow % capacity(c1)) & * (t % n(c2) - t % n(c1))/Grid % wall_dist(c1) * ny - wt_log_law = - Turb % con_w(c1) & - / (Flow % density(c1) * Flow % capacity(c1)) & + wt_log_law = - Turb % con_w(c1) & + / (Flow % density(c1) * Flow % capacity(c1)) & * (t % n(c2) - t % n(c1))/Grid % wall_dist(c1) * nz ut % n(c1) = ut % n(c1) * exp(-1.0 * ebf) & @@ -221,8 +221,8 @@ subroutine Src_Kin_K_Eps_Zeta_F(Turb, Sol) b(c1) = b(c1) + Turb % g_buoy(c1) * Grid % vol(c1) end if ! Flow % buoyancy .eq. THERMALLY_DRIVEN - end if ! Grid % Bnd_Cond_Type(c2) .eq. WALL or WALLFL - end if ! c2 < 0 - end do + end do ! faces in regions + end if ! region is WALL or WALLFL + end do ! through regions end subroutine diff --git a/Sources/Process/Turb_Mod/Src_Zeta_K_Eps_Zeta_F.f90 b/Sources/Process/Turb_Mod/Src_Zeta_K_Eps_Zeta_F.f90 index b6d9022e3..20961fcd4 100644 --- a/Sources/Process/Turb_Mod/Src_Zeta_K_Eps_Zeta_F.f90 +++ b/Sources/Process/Turb_Mod/Src_Zeta_K_Eps_Zeta_F.f90 @@ -17,7 +17,7 @@ subroutine Src_Zeta_K_Eps_Zeta_F(Turb, Sol, curr_dt) type(Matrix_Type), pointer :: A real, pointer :: b(:) integer :: c -!==============================================================================! +!------------------------------------------------------------------------------! ! In transport equation for zeta two source terms exist which have form: ! ! ! ! / ! @@ -30,7 +30,7 @@ subroutine Src_Zeta_K_Eps_Zeta_F(Turb, Sol, curr_dt) ! sign of term , it is placed on left or right hand side. Second, negative ! ! source term is added to main diagonal left hand side coefficient matrix ! ! in order to increase stability of solver ! -!------------------------------------------------------------------------------! +!==============================================================================! ! Take aliases Flow => Turb % pnt_flow @@ -43,7 +43,7 @@ subroutine Src_Zeta_K_Eps_Zeta_F(Turb, Sol, curr_dt) ! sensitive to initial condition while the second one can lead to ! instabilities for some cases such as Flow around cylinder. That is why we ! choose this particular way to the add source term. - do c = 1, Grid % n_cells + do c = Cells_In_Domain() if(curr_dt > 500) then b(c) = b(c) + f22 % n(c) * Grid % vol(c) * Flow % density(c) else diff --git a/Sources/Process/Turb_Mod/Vis_T_K_Eps.f90 b/Sources/Process/Turb_Mod/Vis_T_K_Eps.f90 index 762950e01..86e13df4d 100644 --- a/Sources/Process/Turb_Mod/Vis_T_K_Eps.f90 +++ b/Sources/Process/Turb_Mod/Vis_T_K_Eps.f90 @@ -23,12 +23,12 @@ subroutine Vis_T_K_Eps(Turb) type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: u, v, w type(Var_Type), pointer :: kin, eps - integer :: c1, c2, s, c + integer :: c1, c2, s, c, reg real :: pr, beta, ebf, sc real :: u_tan, u_tau real :: kin_vis, u_plus, y_star, re_t, f_mu real :: z_o -!==============================================================================! +!------------------------------------------------------------------------------! ! Dimensions: ! ! ! ! production p_kin [m^2/s^3] | rate-of-strain shear [1/s] ! @@ -42,7 +42,7 @@ subroutine Vis_T_K_Eps(Turb) !------------------------------------------------------------------------------! ! p_kin = 2*vis_t / density S_ij S_ij ! ! shear = sqrt(2 S_ij S_ij) ! -!------------------------------------------------------------------------------! +!==============================================================================! ! Take aliases Flow => Turb % pnt_flow @@ -50,7 +50,7 @@ subroutine Vis_T_K_Eps(Turb) call Flow % Alias_Momentum(u, v, w) call Turb % Alias_K_Eps (kin, eps) - do c = 1, Grid % n_cells + do c = Cells_In_Domain() ! Kinematic viscosities kin_vis = Flow % viscosity(c) / Flow % density(c) @@ -68,14 +68,16 @@ subroutine Vis_T_K_Eps(Turb) Turb % vis_t(c) = f_mu * c_mu * Flow % density(c) * kin % n(c)**2 & / (eps % n(c) + TINY) end do + call Grid % Exchange_Cells_Real(Turb % vis_t) - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. WALL .or. & + Grid % region % type(reg) .eq. WALLFL) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) - if(c2 < 0) then - if(Grid % Bnd_Cond_Type(c2) .eq. WALL .or. & - Grid % Bnd_Cond_Type(c2) .eq. WALLFL) then + Assert(c2 < 0) kin_vis = Flow % viscosity(c1) / Flow % density(c1) @@ -152,11 +154,10 @@ subroutine Vis_T_K_Eps(Turb) + (u_plus + beta) * sc_t * exp(-1.0 / ebf) + TINY) end if - end if ! Grid % Bnd_Cond_Type(c2).eq.WALL or WALLFL - end if ! c2 < 0 - end do + end do ! faces in regions + end if ! region is WALL or WALLFL + end do ! through regions - call Grid % Exchange_Cells_Real(Turb % vis_t) call Grid % Exchange_Cells_Real(Turb % vis_w) if(Flow % heat_transfer) then call Grid % Exchange_Cells_Real(Turb % con_w) diff --git a/Sources/Process/Turb_Mod/Vis_T_K_Eps_Zeta_F.f90 b/Sources/Process/Turb_Mod/Vis_T_K_Eps_Zeta_F.f90 index 1c8f8b775..9331375dd 100644 --- a/Sources/Process/Turb_Mod/Vis_T_K_Eps_Zeta_F.f90 +++ b/Sources/Process/Turb_Mod/Vis_T_K_Eps_Zeta_F.f90 @@ -11,12 +11,12 @@ subroutine Vis_T_K_Eps_Zeta_F(Turb) type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: u, v, w type(Var_Type), pointer :: kin, eps, zeta, f22 - integer :: c, c1, c2, s + integer :: c, c1, c2, s, reg real :: u_tan, u_tau real :: beta, pr, sc real :: u_plus, ebf, kin_vis real :: z_o -!==============================================================================! +!------------------------------------------------------------------------------! ! Dimensions: ! ! ! ! Production p_kin [m^2/s^3] | Rate-of-strain shear [1/s] ! @@ -30,7 +30,7 @@ subroutine Vis_T_K_Eps_Zeta_F(Turb) !------------------------------------------------------------------------------! ! p_kin = 2*vis_t / density S_ij S_ij ! ! shear = sqrt(2 S_ij S_ij) ! -!------------------------------------------------------------------------------! +!==============================================================================! ! Take aliases Flow => Turb % pnt_flow @@ -42,34 +42,39 @@ subroutine Vis_T_K_Eps_Zeta_F(Turb) ! Pure k-eps-zeta-f if(Turb % model .eq. K_EPS_ZETA_F) then - do c = -Grid % n_bnd_cells, Grid % n_cells - Turb % vis_t(c) = c_mu_d * Flow % density(c) * zeta % n(c) & - * kin % n(c) * Turb % t_scale(c) + do reg = Boundary_And_Inside_Regions() + do c = Cells_In_Region(reg) + Turb % vis_t(c) = c_mu_d * Flow % density(c) * zeta % n(c) & + * kin % n(c) * Turb % t_scale(c) + end do end do + call Grid % Exchange_Cells_Real(Turb % vis_t) ! Hybrid between k-eps-zeta-f and dynamic SGS model else if(Turb % model .eq. HYBRID_LES_RANS) then - do c = -Grid % n_bnd_cells, Grid % n_cells - Turb % vis_t(c) = c_mu_d * Flow % density(c) * zeta % n(c) & - * kin % n(c) * Turb % t_scale(c) - Turb % vis_t_eff(c) = max(Turb % vis_t(c), & - Turb % vis_t_sgs(c)) + do reg = Boundary_And_Inside_Regions() + do c = Cells_In_Region(reg) + Turb % vis_t(c) = c_mu_d * Flow % density(c) * zeta % n(c) & + * kin % n(c) * Turb % t_scale(c) + Turb % vis_t_eff(c) = max(Turb % vis_t(c), & + Turb % vis_t_sgs(c)) + end do end do + call Grid % Exchange_Cells_Real(Turb % vis_t) call Grid % Exchange_Cells_Real(Turb % vis_t_eff) end if - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - if(c2 < 0) then + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. WALL .or. & + Grid % region % type(reg) .eq. WALLFL) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) - ! kinematic viscosities - kin_vis = Flow % viscosity(c1) / Flow % density(c1) + Assert(c2 < 0) - if(Grid % Bnd_Cond_Type(c2) .eq. WALL .or. & - Grid % Bnd_Cond_Type(c2) .eq. WALLFL) then + kin_vis = Flow % viscosity(c1) / Flow % density(c1) ! Set up roughness coefficient z_o = Turb % Roughness_Coefficient(c1, c2) @@ -132,7 +137,7 @@ subroutine Vis_T_K_Eps_Zeta_F(Turb) * Flow % viscosity(c1) & * Flow % capacity(c1) & / ( Turb % y_plus(c1) * pr * exp(-1.0 * ebf) & - + (u_plus + beta) * pr_t * exp(-1.0 / ebf) + TINY ) + + (u_plus + beta) * pr_t * exp(-1.0 / ebf) + TINY ) end if if(Flow % n_scalars > 0) then @@ -154,11 +159,10 @@ subroutine Vis_T_K_Eps_Zeta_F(Turb) + (u_plus + beta) * sc_t * exp(-1.0 / ebf) + TINY) end if - end if ! Grid % Bnd_Cond_Type(c2).eq.WALL or WALLFL - end if ! c2 < 0 - end do + end do ! faces in regions + end if ! region is WALL or WALLFL + end do ! through regions - call Grid % Exchange_Cells_Real(Turb % vis_t) call Grid % Exchange_Cells_Real(Turb % vis_w) if(Flow % heat_transfer) then call Grid % Exchange_Cells_Real(Turb % con_w) From 3d65244958b426558a3b6103a70f00380d18f022 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 22 Mar 2023 14:56:50 +0100 Subject: [PATCH 117/223] Updated comment in a makefile, insignificant --- Sources/Process/makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Sources/Process/makefile b/Sources/Process/makefile index 4f9e847f1..f324f573b 100644 --- a/Sources/Process/makefile +++ b/Sources/Process/makefile @@ -368,9 +368,9 @@ $(DIR_OBJECT)/%.o: %.c @echo $(CC) $< @$(CC) $(OPT_C_COMP) $(PASS_ON) -c -o $@ $< -#---------------------------------------- -# Special rule to build User_Mod.f90 -#---------------------------------------- +# Special rule to build User_Mod.f90. +# Note: If you don't write it as User%Mod.o, makefile will think that it +# is the final target and would not proceed further to build the Program $(DIR_OBJECT)/User%Mod.o: User%Mod.f90 @echo $(FC) $< @$(FC) $(OPT_F_COMP_USER) $(PASS_ON) -c -o $@ $< From 4a71474067692770a385f610a6ba79eb79cccdbd Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 22 Mar 2023 15:16:48 +0100 Subject: [PATCH 118/223] Added a little comment, nothing really. --- Sources/Shared/File_Mod.f90 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Sources/Shared/File_Mod.f90 b/Sources/Shared/File_Mod.f90 index be7d59684..9c505d695 100644 --- a/Sources/Shared/File_Mod.f90 +++ b/Sources/Shared/File_Mod.f90 @@ -40,6 +40,9 @@ module File_Mod end type + !-------------------------------------! + ! Singleton objects Line and File ! + !-------------------------------------! type(Tokenizer_Type) :: Line type(File_Type) :: File From 31faca992e5f6e5f3567bcfee03c587dcced0e65 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 22 Mar 2023 15:17:09 +0100 Subject: [PATCH 119/223] Fixed intentions. On branch bojan_fixed_cell_ranges modified: Shared/Message_Mod/Error.f90 modified: Shared/Message_Mod/Framed.f90 --- Sources/Shared/Message_Mod/Error.f90 | 12 ++++++------ Sources/Shared/Message_Mod/Framed.f90 | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Sources/Shared/Message_Mod/Error.f90 b/Sources/Shared/Message_Mod/Error.f90 index 9a7b9468b..8762c4a0c 100644 --- a/Sources/Shared/Message_Mod/Error.f90 +++ b/Sources/Shared/Message_Mod/Error.f90 @@ -3,12 +3,12 @@ subroutine Error(Msg, width, message_text, file, line, one_proc) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Message_Type) :: Msg - integer, intent(in) :: width - character(*) :: message_text - character(*), optional :: file - integer, intent(in), optional :: line - logical, optional :: one_proc ! print from one processor only + class(Message_Type) :: Msg + integer, intent(in) :: width + character(*), intent(in) :: message_text + character(*), optional, intent(in) :: file + integer, optional, intent(in) :: line + logical, optional, intent(in) :: one_proc ! print from one processor !-----------------------------------[Locals]-----------------------------------! integer :: w character(DL) :: header_text diff --git a/Sources/Shared/Message_Mod/Framed.f90 b/Sources/Shared/Message_Mod/Framed.f90 index aa2be9038..ae3181b33 100644 --- a/Sources/Shared/Message_Mod/Framed.f90 +++ b/Sources/Shared/Message_Mod/Framed.f90 @@ -3,11 +3,11 @@ subroutine Framed(Msg, width, header_text, message_text, one_proc) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Message_Type) :: Msg - integer, intent(in) :: width - character(*), intent(in) :: header_text - character(*), intent(in) :: message_text - logical, optional :: one_proc + class(Message_Type) :: Msg + integer, intent(in) :: width + character(*), intent(in) :: header_text + character(*), intent(in) :: message_text + logical, optional, intent(in) :: one_proc !-----------------------------------[Locals]-----------------------------------! integer :: w character(DL) :: line From a957b07901f0dfd4ac1c9ecb869e07def1b1c591 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 22 Mar 2023 17:47:03 +0100 Subject: [PATCH 120/223] Renamed all member functions in Results_Mod. On branch bojan_fixed_cell_ranges modified: Results_Mod.f90 modified: Results_Mod/Main_Results.f90 renamed: Results_Mod/Save_Front.f90 -> Results_Mod/Save_Vtu_Front.f90 renamed: Results_Mod/Save_Results.f90 -> Results_Mod/Save_Vtu_Results.f90 renamed: Results_Mod/Save_Scalar_Int.f90 -> Results_Mod/Save_Vtu_Scalar_Int.f90 renamed: Results_Mod/Save_Scalar_Real.f90 -> Results_Mod/Save_Vtu_Scalar_Real.f90 renamed: Results_Mod/Save_Surf.f90 -> Results_Mod/Save_Vtu_Surf.f90 renamed: Results_Mod/Save_Swarm.f90 -> Results_Mod/Save_Vtu_Swarm.f90 renamed: Results_Mod/Save_Tensor_6_Real.f90 -> Results_Mod/Save_Vtu_Tensor_6_Real.f90 renamed: Results_Mod/Save_Tensor_9_Real.f90 -> Results_Mod/Save_Vtu_Tensor_9_Real.f90 renamed: Results_Mod/Save_Vector_Real.f90 -> Results_Mod/Save_Vtu_Vector_Real.f90 modified: User_Mod.f90 renamed: User_Mod/Save_Swarm.f90 -> User_Mod/Save_Vtu_Results.f90 renamed: User_Mod/Save_Results.f90 -> User_Mod/Save_Vtu_Swarm.f90 --- Sources/Process/Results_Mod.f90 | 36 +- Sources/Process/Results_Mod/Main_Results.f90 | 26 +- .../{Save_Front.f90 => Save_Vtu_Front.f90} | 2 +- ...{Save_Results.f90 => Save_Vtu_Results.f90} | 560 +++++++++--------- ...Scalar_Int.f90 => Save_Vtu_Scalar_Int.f90} | 8 +- ...alar_Real.f90 => Save_Vtu_Scalar_Real.f90} | 8 +- .../{Save_Surf.f90 => Save_Vtu_Surf.f90} | 2 +- .../{Save_Swarm.f90 => Save_Vtu_Swarm.f90} | 2 +- ..._6_Real.f90 => Save_Vtu_Tensor_6_Real.f90} | 12 +- ..._9_Real.f90 => Save_Vtu_Tensor_9_Real.f90} | 14 +- ...ctor_Real.f90 => Save_Vtu_Vector_Real.f90} | 8 +- Sources/Process/User_Mod.f90 | 4 +- .../{Save_Swarm.f90 => Save_Vtu_Results.f90} | 2 +- .../{Save_Results.f90 => Save_Vtu_Swarm.f90} | 2 +- 14 files changed, 347 insertions(+), 339 deletions(-) rename Sources/Process/Results_Mod/{Save_Front.f90 => Save_Vtu_Front.f90} (99%) rename Sources/Process/Results_Mod/{Save_Results.f90 => Save_Vtu_Results.f90} (62%) rename Sources/Process/Results_Mod/{Save_Scalar_Int.f90 => Save_Vtu_Scalar_Int.f90} (91%) rename Sources/Process/Results_Mod/{Save_Scalar_Real.f90 => Save_Vtu_Scalar_Real.f90} (91%) rename Sources/Process/Results_Mod/{Save_Surf.f90 => Save_Vtu_Surf.f90} (99%) rename Sources/Process/Results_Mod/{Save_Swarm.f90 => Save_Vtu_Swarm.f90} (99%) rename Sources/Process/Results_Mod/{Save_Tensor_6_Real.f90 => Save_Vtu_Tensor_6_Real.f90} (89%) rename Sources/Process/Results_Mod/{Save_Tensor_9_Real.f90 => Save_Vtu_Tensor_9_Real.f90} (87%) rename Sources/Process/Results_Mod/{Save_Vector_Real.f90 => Save_Vtu_Vector_Real.f90} (91%) rename Sources/Process/User_Mod/{Save_Swarm.f90 => Save_Vtu_Results.f90} (94%) rename Sources/Process/User_Mod/{Save_Results.f90 => Save_Vtu_Swarm.f90} (94%) diff --git a/Sources/Process/Results_Mod.f90 b/Sources/Process/Results_Mod.f90 index ff1684889..7eb189fa6 100644 --- a/Sources/Process/Results_Mod.f90 +++ b/Sources/Process/Results_Mod.f90 @@ -29,15 +29,15 @@ module Results_Mod contains procedure :: Main_Results - procedure, private :: Save_Results - procedure, private :: Save_Scalar_Int - procedure, private :: Save_Scalar_Real - procedure, private :: Save_Front - procedure, private :: Save_Surf - procedure, private :: Save_Swarm - procedure, private :: Save_Tensor_6_Real - procedure, private :: Save_Tensor_9_Real - procedure, private :: Save_Vector_Real + procedure, private :: Save_Vtu_Results + procedure, private :: Save_Vtu_Scalar_Int + procedure, private :: Save_Vtu_Scalar_Real + procedure, private :: Save_Vtu_Front + procedure, private :: Save_Vtu_Surf + procedure, private :: Save_Vtu_Swarm + procedure, private :: Save_Vtu_Tensor_6_Real + procedure, private :: Save_Vtu_Tensor_9_Real + procedure, private :: Save_Vtu_Vector_Real procedure, private :: Time_To_Save procedure, private :: Time_To_Save_Swarm @@ -48,15 +48,15 @@ module Results_Mod contains # include "Results_Mod/Main_Results.f90" -# include "Results_Mod/Save_Results.f90" -# include "Results_Mod/Save_Front.f90" -# include "Results_Mod/Save_Scalar_Int.f90" -# include "Results_Mod/Save_Scalar_Real.f90" -# include "Results_Mod/Save_Swarm.f90" -# include "Results_Mod/Save_Tensor_6_Real.f90" -# include "Results_Mod/Save_Tensor_9_Real.f90" -# include "Results_Mod/Save_Vector_Real.f90" -# include "Results_Mod/Save_Surf.f90" +# include "Results_Mod/Save_Vtu_Results.f90" +# include "Results_Mod/Save_Vtu_Front.f90" +# include "Results_Mod/Save_Vtu_Scalar_Int.f90" +# include "Results_Mod/Save_Vtu_Scalar_Real.f90" +# include "Results_Mod/Save_Vtu_Swarm.f90" +# include "Results_Mod/Save_Vtu_Tensor_6_Real.f90" +# include "Results_Mod/Save_Vtu_Tensor_9_Real.f90" +# include "Results_Mod/Save_Vtu_Vector_Real.f90" +# include "Results_Mod/Save_Vtu_Surf.f90" # include "Results_Mod/Time_To_Save.f90" # include "Results_Mod/Time_To_Save_Swarm.f90" diff --git a/Sources/Process/Results_Mod/Main_Results.f90 b/Sources/Process/Results_Mod/Main_Results.f90 index 6871ee3ae..b10ea7653 100644 --- a/Sources/Process/Results_Mod/Main_Results.f90 +++ b/Sources/Process/Results_Mod/Main_Results.f90 @@ -47,26 +47,26 @@ subroutine Main_Results(Results, & do d = 1, n_dom call Control_Mod_Switch_To_Domain(d) - call Results % Save_Results(Flow(d), Turb(d), Vof(d), Swarm(d), & - curr_dt, plot_inside=.true., domain=d) - call Results % Save_Results(Flow(d), Turb(d), Vof(d), Swarm(d), & - curr_dt, plot_inside=.false., domain=d) + call Results % Save_Vtu_Results(Flow(d), Turb(d), Vof(d), Swarm(d), & + curr_dt, plot_inside=.true., domain=d) + call Results % Save_Vtu_Results(Flow(d), Turb(d), Vof(d), Swarm(d), & + curr_dt, plot_inside=.false., domain=d) if(Flow(d) % with_interface) then if(Vof(d) % track_front) then - call Results % Save_Front(Vof(d) % Front, curr_dt) + call Results % Save_Vtu_Front(Vof(d) % Front, curr_dt) end if if(Vof(d) % track_surface) then - call Results % Save_Surf(Vof(d) % surf, curr_dt) + call Results % Save_Vtu_Surf(Vof(d) % surf, curr_dt) end if end if ! Write results in user-customized format - call User_Mod_Save_Results(Flow(d), Turb(d), Vof(d), Swarm(d), & - curr_dt, domain=d) + call User_Mod_Save_Vtu_Results(Flow(d), Turb(d), Vof(d), Swarm(d), & + curr_dt, domain=d) if(Flow(d) % with_particles) then - call User_Mod_Save_Swarm(Flow(d), Turb(d), Vof(d), Swarm(d), & - curr_dt, domain=d) + call User_Mod_Save_Vtu_Swarm(Flow(d), Turb(d), Vof(d), Swarm(d), & + curr_dt, domain=d) end if end do ! through domains @@ -82,10 +82,10 @@ subroutine Main_Results(Results, & do d = 1, n_dom call Control_Mod_Switch_To_Domain(d) if(Flow(d) % with_particles) then - call Results % Save_Swarm(Swarm(d), curr_dt, domain=d) + call Results % Save_Vtu_Swarm(Swarm(d), curr_dt, domain=d) - call User_Mod_Save_Swarm(Flow(d), Turb(d), Vof(d), Swarm(d), & - curr_dt, domain=d) + call User_Mod_Save_Vtu_Swarm(Flow(d), Turb(d), Vof(d), Swarm(d), & + curr_dt, domain=d) end if end do ! through domains diff --git a/Sources/Process/Results_Mod/Save_Front.f90 b/Sources/Process/Results_Mod/Save_Vtu_Front.f90 similarity index 99% rename from Sources/Process/Results_Mod/Save_Front.f90 rename to Sources/Process/Results_Mod/Save_Vtu_Front.f90 index d8318f9a1..0874155e1 100644 --- a/Sources/Process/Results_Mod/Save_Front.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Front.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Save_Front(Results, Front, time_step, domain) + subroutine Save_Vtu_Front(Results, Front, time_step, domain) !------------------------------------------------------------------------------! ! Writes surface vertices in VTU file format (for VisIt and Paraview) ! !------------------------------------------------------------------------------! diff --git a/Sources/Process/Results_Mod/Save_Results.f90 b/Sources/Process/Results_Mod/Save_Vtu_Results.f90 similarity index 62% rename from Sources/Process/Results_Mod/Save_Results.f90 rename to Sources/Process/Results_Mod/Save_Vtu_Results.f90 index 1d7fb2d22..2f6ac688c 100644 --- a/Sources/Process/Results_Mod/Save_Results.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Results.f90 @@ -1,6 +1,6 @@ !==============================================================================! - subroutine Save_Results(Results, & - Flow, Turb, Vof, Swarm, ts, plot_inside, domain) + subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & + ts, plot_inside, domain) !------------------------------------------------------------------------------! ! Writes results in VTU file format (for VisIt and Paraview) ! !------------------------------------------------------------------------------! @@ -220,9 +220,9 @@ subroutine Save_Results(Results, & offs_save(c2) = cell_offset end do end if - call Results % Save_Scalar_Int("offsets", plot_inside, & - offs_save(c_f:c_l), & - f8, f9, data_offset, 1) ! 1 => header only + call Results % Save_Vtu_Scalar_Int("offsets", plot_inside, & + offs_save(c_f:c_l), & + f8, f9, data_offset, 1) ! 1 => header only ! Fill up an array with cell types and save the header only if(plot_inside) then @@ -244,9 +244,9 @@ subroutine Save_Results(Results, & end if end do end if - call Results % Save_Scalar_Int("types", plot_inside, & - type_save(c_f:c_l), & - f8, f9, data_offset, 1) ! 1 => header only + call Results % Save_Vtu_Scalar_Int("types", plot_inside, & + type_save(c_f:c_l), & + f8, f9, data_offset, 1) ! 1 => header only ! Write parts of header for polyhedral cells if(n_polyg > 0) then @@ -329,13 +329,13 @@ subroutine Save_Results(Results, & end if ! Save cell offsets - call Results % Save_Scalar_Int("offsets", plot_inside, & - offs_save(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Int("offsets", plot_inside, & + offs_save(c_f:c_l), & + f8, f9, data_offset, run) ! Save cell types - call Results % Save_Scalar_Int("types", plot_inside, & - type_save(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Int("types", plot_inside, & + type_save(c_f:c_l), & + f8, f9, data_offset, run) if(n_polyg > 0) then @@ -401,60 +401,60 @@ subroutine Save_Results(Results, & do c2 = c_f, c_l int_save(c2) = Grid % Comm % cell_proc(c2) end do - call Results % Save_Scalar_Int("Grid Processor [1]", plot_inside, & - int_save(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Int("Grid Processor [1]", plot_inside, & + int_save(c_f:c_l), & + f8, f9, data_offset, run) !-----------------! ! Cell thread ! !-----------------! int_save(c_f:c_l) = Grid % Vect % cell_thread(c_f:c_l) - call Results % Save_Scalar_Int("Grid Thread [1]", plot_inside, & - int_save(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Int("Grid Thread [1]", plot_inside, & + int_save(c_f:c_l), & + f8, f9, data_offset, run) !-------------------! ! Domain number ! !-------------------! if(present(domain)) then int_save(c_f:c_l) = domain - call Results % Save_Scalar_Int("Grid Domain [1]", plot_inside, & - int_save(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Int("Grid Domain [1]", plot_inside, & + int_save(c_f:c_l), & + f8, f9, data_offset, run) end if !--------------! ! Velocity ! !--------------! - call Results % Save_Vector_Real("Velocity [m/s]", plot_inside, & - Flow % u % n(c_f:c_l), & - Flow % v % n(c_f:c_l), & - Flow % w % n(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Vector_Real("Velocity [m/s]", plot_inside, & + Flow % u % n(c_f:c_l), & + Flow % v % n(c_f:c_l), & + Flow % w % n(c_f:c_l), & + f8, f9, data_offset, run) !--------------------! ! Courant number ! !--------------------! if(plot_inside) then call Flow % Calculate_Courant_In_Cells(save_01) - call Results % Save_Scalar_Real("Courant Number [1]", plot_inside, & - save_01(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Courant Number [1]", plot_inside, & + save_01(c_f:c_l), & + f8, f9, data_offset, run) end if !---------------! ! Potential ! !---------------! - call Results % Save_Scalar_Real("Potential [m^2/s]", plot_inside, & - Flow % pot % n(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Potential [m^2/s]", plot_inside, & + Flow % pot % n(c_f:c_l), & + f8, f9, data_offset, run) !--------------------------------------! ! Pressure correction and pressure ! !--------------------------------------! - call Results % Save_Scalar_Real("Pressure Correction [Pa]", & - plot_inside, & - Flow % pp % n(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Pressure Correction [Pa]", & + plot_inside, & + Flow % pp % n(c_f:c_l), & + f8, f9, data_offset, run) save_01(:) = 0.0 save_02(:) = 0.0 save_03(:) = 0.0 @@ -463,16 +463,16 @@ subroutine Save_Results(Results, & save_02(c1) = Flow % pp % y(c1) * Grid % vol(c1) save_03(c1) = Flow % pp % z(c1) * Grid % vol(c1) end do - call Results % Save_Vector_Real("Pressure Correction Force [N]", & - plot_inside, & - save_01(c_f:c_l), & - save_02(c_f:c_l), & - save_03(c_f:c_l), & - f8, f9, data_offset, run) - - call Results % Save_Scalar_Real("Pressure [Pa]", plot_inside, & - Flow % p % n(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Vector_Real("Pressure Correction Force [N]", & + plot_inside, & + save_01(c_f:c_l), & + save_02(c_f:c_l), & + save_03(c_f:c_l), & + f8, f9, data_offset, run) + + call Results % Save_Vtu_Scalar_Real("Pressure [Pa]", plot_inside, & + Flow % p % n(c_f:c_l), & + f8, f9, data_offset, run) save_01(:) = 0.0 save_02(:) = 0.0 save_03(:) = 0.0 @@ -481,19 +481,19 @@ subroutine Save_Results(Results, & save_02(c1) = Flow % p % y(c1) * Grid % vol(c1) save_03(c1) = Flow % p % z(c1) * Grid % vol(c1) end do - call Results % Save_Vector_Real("PressureForce [N]", plot_inside, & - save_01(c_f:c_l), & - save_02(c_f:c_l), & - save_03(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Vector_Real("PressureForce [N]", plot_inside, & + save_01(c_f:c_l), & + save_02(c_f:c_l), & + save_03(c_f:c_l), & + f8, f9, data_offset, run) !-----------------! ! Temperature ! !-----------------! if(Flow % heat_transfer) then - call Results % Save_Scalar_Real("Temperature [K]", plot_inside, & - Flow % t % n(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Temperature [K]", plot_inside, & + Flow % t % n(c_f:c_l), & + f8, f9, data_offset, run) save_01(:) = 0.0 save_02(:) = 0.0 save_03(:) = 0.0 @@ -511,40 +511,40 @@ subroutine Save_Results(Results, & call Flow % Calculate_Grad_Matrix() end if - call Results % Save_Vector_Real("Temperature Gradients [K/m]", & - plot_inside, & - save_01(c_f:c_l), & - save_02(c_f:c_l), & - save_03(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Vector_Real("Temperature Gradients [K/m]", & + plot_inside, & + save_01(c_f:c_l), & + save_02(c_f:c_l), & + save_03(c_f:c_l), & + f8, f9, data_offset, run) end if !-------------------------! ! Physical properties ! !-------------------------! - call Results % Save_Scalar_Real("Physical Density [kg/m^3]", & - plot_inside, & - Flow % density(c_f:c_l), & - f8, f9, data_offset, run) - call Results % Save_Scalar_Real("Physical Viscosity [Pa s]", & - plot_inside, & - Flow % viscosity(c_f:c_l), & - f8, f9, data_offset, run) - call Results % Save_Scalar_Real("Physical Conductivity [W/m/K]", & - plot_inside, & - Flow % conductivity(c_f:c_l), & - f8, f9, data_offset, run) - call Results % Save_Scalar_Real("Physical Capacity [J/K]", & - plot_inside, & - Flow % capacity(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Physical Density [kg/m^3]", & + plot_inside, & + Flow % density(c_f:c_l), & + f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Physical Viscosity [Pa s]", & + plot_inside, & + Flow % viscosity(c_f:c_l), & + f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Physical Conductivity [W/m/K]", & + plot_inside, & + Flow % conductivity(c_f:c_l), & + f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Physical Capacity [J/K]", & + plot_inside, & + Flow % capacity(c_f:c_l), & + f8, f9, data_offset, run) if(Turb % rough_walls) then - call Results % Save_Scalar_Real("Roughness Coefficient z_o [1]", & - plot_inside, & - Turb % z_o(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Roughness Coefficient z_o [1]", & + plot_inside, & + Turb % z_o(c_f:c_l), & + f8, f9, data_offset, run) end if @@ -552,35 +552,35 @@ subroutine Save_Results(Results, & ! Volume fraction ! !---------------------! if(Flow % with_interface) then - call Results % Save_Scalar_Real("Vof Sharp [1]", & - plot_inside, & - Vof % fun % n(c_f:c_l), & - f8, f9, data_offset, run) - call Results % Save_Scalar_Real("Vof Smooth [1]", & - plot_inside, & - Vof % smooth % n(c_f:c_l), & - f8, f9, data_offset, run) - call Results % Save_Scalar_Real("Vof Curvature [1/m]", & - plot_inside, & - Vof % curv(c_f:c_l), & - f8, f9, data_offset, run) - call Results % Save_Vector_Real("Vof SurfaceNormals [1]", & - plot_inside, & - Vof % nx(c_f:c_l), & - Vof % ny(c_f:c_l), & - Vof % nz(c_f:c_l), & - f8, f9, data_offset, run) - call Results % Save_Vector_Real("Vof SurfaceTensionForce [N]", & - plot_inside, & - Vof % surf_fx(c_f:c_l), & - Vof % surf_fy(c_f:c_l), & - Vof % surf_fz(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Vof Sharp [1]", & + plot_inside, & + Vof % fun % n(c_f:c_l), & + f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Vof Smooth [1]", & + plot_inside, & + Vof % smooth % n(c_f:c_l), & + f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Vof Curvature [1/m]", & + plot_inside, & + Vof % curv(c_f:c_l), & + f8, f9, data_offset, run) + call Results % Save_Vtu_Vector_Real("Vof SurfaceNormals [1]", & + plot_inside, & + Vof % nx(c_f:c_l), & + Vof % ny(c_f:c_l), & + Vof % nz(c_f:c_l), & + f8, f9, data_offset, run) + call Results % Save_Vtu_Vector_Real("Vof SurfaceTensionForce [N]", & + plot_inside, & + Vof % surf_fx(c_f:c_l), & + Vof % surf_fy(c_f:c_l), & + Vof % surf_fz(c_f:c_l), & + f8, f9, data_offset, run) if (allocated(Vof % m_dot)) then - call Results % Save_Scalar_Real("Vof MassTransfer [kg/m^3/s]", & - plot_inside, & - Vof % m_dot(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Vof MassTransfer [kg/m^3/s]", & + plot_inside, & + Vof % m_dot(c_f:c_l), & + f8, f9, data_offset, run) end if end if @@ -588,14 +588,14 @@ subroutine Save_Results(Results, & ! Number of impacts and reflections ! !---------------------------------------! if(Flow % with_particles .and. .not. plot_inside) then - call Results % Save_Scalar_Real("Particles Reflected [1]", & - plot_inside, & - Swarm % n_reflected(c_f:c_l), & - f8, f9, data_offset, run) - call Results % Save_Scalar_Real("Particles Deposited [1]", & - plot_inside, & - Swarm % n_deposited(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Particles Reflected [1]", & + plot_inside, & + Swarm % n_reflected(c_f:c_l), & + f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Particles Deposited [1]", & + plot_inside, & + Swarm % n_deposited(c_f:c_l), & + f8, f9, data_offset, run) end if !------------------! @@ -603,9 +603,9 @@ subroutine Save_Results(Results, & !------------------! do sc = 1, Flow % n_scalars phi => Flow % scalar(sc) - call Results % Save_Scalar_Real(phi % name, plot_inside, & - phi % n(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real(phi % name, plot_inside, & + phi % n(c_f:c_l), & + f8, f9, data_offset, run) end do !-----------------! @@ -615,9 +615,9 @@ subroutine Save_Results(Results, & do c1 = c_f, c_l phi_save(c1) = (Flow % vort(c1)**2 - Flow % shear(c1)**2)/4. end do - call Results % Save_Scalar_Real("Q Criterion [1/s^2]", plot_inside, & - phi_save(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Q Criterion [1/s^2]", plot_inside, & + phi_save(c_f:c_l), & + f8, f9, data_offset, run) !--------------------------! ! Turbulent quantities ! @@ -629,15 +629,17 @@ subroutine Save_Results(Results, & Turb % model .eq. HYBRID_LES_RANS .or. & Turb % model .eq. RSM_MANCEAU_HANJALIC .or. & Turb % model .eq. RSM_HANJALIC_JAKIRLIC ) then - call Results % Save_Scalar_Real("Turbulent Kinetic Energy [m^2/s^2]", & - plot_inside, & - Turb % kin % n(c_f:c_l), & + call Results % Save_Vtu_Scalar_Real( & + "Turbulent Kinetic Energy [m^2/s^2]", & + plot_inside, & + Turb % kin % n(c_f:c_l), & f8, f9, data_offset, run) - call Results % Save_Scalar_Real("Turbulent Dissipation [m^2/s^3]", & - plot_inside, & - Turb % eps % n(c_f:c_l), & - f8, f9, data_offset, run) - call Results % Save_Scalar_Real( & + call Results % Save_Vtu_Scalar_Real( & + "Turbulent Dissipation [m^2/s^3]", & + plot_inside, & + Turb % eps % n(c_f:c_l), & + f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real( & "Turbulent Kinetic Energy Production [m^2/s^3]", & plot_inside, & Turb % p_kin(c_f:c_l), & @@ -651,62 +653,62 @@ subroutine Save_Results(Results, & do c1 = c_f, c_l v2_calc(c1) = Turb % kin % n(c1) * Turb % zeta % n(c1) end do -! call Results % Save_Scalar_Real("Turbulent Quantity V2 [m^2/s^2]", & -! plot_inside, & -! v2_calc (c_f:c_l), & -! f8, f9, data_offset, run) - call Results % Save_Scalar_Real("Turbulent Quantity Zeta [1]", & - plot_inside, & - Turb % zeta % n(c_f:c_l), & - f8, f9, data_offset, run) - call Results % Save_Scalar_Real("Turbulent Quantity F22 [1]", & - plot_inside, & - Turb % f22 % n(c_f:c_l), & - f8, f9, data_offset, run) +! call Results % Save_Vtu_Scalar_Real("Turbulent Quantity V2 [m^2/s^2]", & +! plot_inside, & +! v2_calc (c_f:c_l), & +! f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Turbulent Quantity Zeta [1]", & + plot_inside, & + Turb % zeta % n(c_f:c_l), & + f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Turbulent Quantity F22 [1]", & + plot_inside, & + Turb % f22 % n(c_f:c_l), & + f8, f9, data_offset, run) if(Flow % heat_transfer) then - call Results % Save_Scalar_Real("Turbulent Quantity T2 [K^2]", & - plot_inside, & - Turb % t2 % n(c_f:c_l), & - f8, f9, data_offset, run) -! call Results % Save_Scalar_Real("Turbulent T2 Production [K^2/s]", & -! plot_inside, & -! Turb % p_t2(c_f:c_l), & -! f8, f9, data_offset, run) - call Results % Save_Vector_Real("Turbulent Heat Flux [K m/s]", & - plot_inside, & - Turb % ut % n(c_f:c_l), & - Turb % vt % n(c_f:c_l), & - Turb % wt % n(c_f:c_l), & - f8, f9, data_offset, run) -! call Results % Save_Scalar_Real("Turbulent Quantity Alpha L", & -! plot_inside, & -! Turb % alpha_l(c_f:c_l), & -! f8, f9, data_offset, run) -! call Results % Save_Scalar_Real("Turbulent Quantity Alpha U", & -! plot_inside, & -! Turb % alpha_u(c_f:c_l), & -! f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Turbulent Quantity T2 [K^2]", & + plot_inside, & + Turb % t2 % n(c_f:c_l), & + f8, f9, data_offset, run) +! call Results % Save_Vtu_Scalar_Real("Turbulent T2 Production [K^2/s]",& +! plot_inside, & +! Turb % p_t2(c_f:c_l), & +! f8, f9, data_offset, run) + call Results % Save_Vtu_Vector_Real("Turbulent Heat Flux [K m/s]", & + plot_inside, & + Turb % ut % n(c_f:c_l), & + Turb % vt % n(c_f:c_l), & + Turb % wt % n(c_f:c_l), & + f8, f9, data_offset, run) +! call Results % Save_Vtu_Scalar_Real("Turbulent Quantity Alpha L", & +! plot_inside, & +! Turb % alpha_l(c_f:c_l), & +! f8, f9, data_offset, run) +! call Results % Save_Vtu_Scalar_Real("Turbulent Quantity Alpha U", & +! plot_inside, & +! Turb % alpha_u(c_f:c_l), & +! f8, f9, data_offset, run) end if end if if(Turb % model .eq. RSM_MANCEAU_HANJALIC) then - call Results % Save_Scalar_Real("Turbulent Quantity F22 [1]", & - plot_inside, & - Turb % f22 % n(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Turbulent Quantity F22 [1]", & + plot_inside, & + Turb % f22 % n(c_f:c_l), & + f8, f9, data_offset, run) end if ! Save vis and vis_t if(Turb % model .eq. DES_SPALART .or. & Turb % model .eq. SPALART_ALLMARAS) then - call Results % Save_Scalar_Real("Turbulent Viscosity [Pa s]", & - plot_inside, & - Turb % vis % n(c_f:c_l), & - f8, f9, data_offset, run) - call Results % Save_Scalar_Real("Vorticity Magnitude [1/s]", & - plot_inside, & - Flow % vort(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Turbulent Viscosity [Pa s]", & + plot_inside, & + Turb % vis % n(c_f:c_l), & + f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Vorticity Magnitude [1/s]", & + plot_inside, & + Flow % vort(c_f:c_l), & + f8, f9, data_offset, run) end if kin_vis_t(:) = 0.0 @@ -714,26 +716,27 @@ subroutine Save_Results(Results, & Turb % model .ne. HYBRID_LES_RANS .and. & Turb % model .ne. DNS) then kin_vis_t(c_f:c_l) = Turb % vis_t(c_f:c_l) / Flow % viscosity(c_f:c_l) - call Results % Save_Scalar_Real("Eddy Over Molecular Viscosity [1]", & - plot_inside, & - kin_vis_t(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real( & + "Eddy Over Molecular Viscosity [1]", & + plot_inside, & + kin_vis_t(c_f:c_l), & + f8, f9, data_offset, run) end if if(Turb % model .eq. HYBRID_LES_RANS) then kin_vis_t(:) = 0.0 kin_vis_t(c_f:c_l) = Turb % vis_t(c_f:c_l) / Flow % viscosity(c_f:c_l) - call Results % Save_Scalar_Real( & + call Results % Save_Vtu_Scalar_Real( & "Rans Eddy Over Molecular Viscosity [1]", & plot_inside, & kin_vis_t(c_f:c_l), & f8, f9, data_offset, run) kin_vis_t(:) = 0.0 kin_vis_t(c_f:c_l) = Turb % vis_t_sgs(c_f:c_l) / Flow % viscosity(c_f:c_l) - call Results % Save_Scalar_Real( & - "Sgs Eddy Over Molecular Viscosity [1]", & - plot_inside, & - kin_vis_t(c_f:c_l), & + call Results % Save_Vtu_Scalar_Real( & + "Sgs Eddy Over Molecular Viscosity [1]", & + plot_inside, & + kin_vis_t(c_f:c_l), & f8, f9, data_offset, run) end if @@ -742,33 +745,33 @@ subroutine Save_Results(Results, & Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then ! Note: follows the order in which Paraview stores tensors - call Results % Save_Tensor_6_Real("Reynolds Stress [m^2/s^2]", & - plot_inside, & - Turb % uu % n(c_f:c_l), & - Turb % vv % n(c_f:c_l), & - Turb % ww % n(c_f:c_l), & - Turb % uv % n(c_f:c_l), & - Turb % vw % n(c_f:c_l), & - Turb % uw % n(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Tensor_6_Real("Reynolds Stress [m^2/s^2]", & + plot_inside, & + Turb % uu % n(c_f:c_l), & + Turb % vv % n(c_f:c_l), & + Turb % ww % n(c_f:c_l), & + Turb % uv % n(c_f:c_l), & + Turb % vw % n(c_f:c_l), & + Turb % uw % n(c_f:c_l), & + f8, f9, data_offset, run) if(Flow % heat_transfer) then - call Results % Save_Vector_Real("Turbulent Heat Flux [K m/s]", & - plot_inside, & - Turb % ut % n(c_f:c_l), & - Turb % vt % n(c_f:c_l), & - Turb % wt % n(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Vector_Real("Turbulent Heat Flux [K m/s]", & + plot_inside, & + Turb % ut % n(c_f:c_l), & + Turb % vt % n(c_f:c_l), & + Turb % wt % n(c_f:c_l), & + f8, f9, data_offset, run) end if end if ! Statistics for large-scale simulations of turbulence if(Turb % statistics) then - call Results % Save_Vector_Real("Mean Velocity [m/s]", & - plot_inside, & - Turb % u_mean(c_f:c_l), & - Turb % v_mean(c_f:c_l), & - Turb % w_mean(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Vector_Real("Mean Velocity [m/s]", & + plot_inside, & + Turb % u_mean(c_f:c_l), & + Turb % v_mean(c_f:c_l), & + Turb % w_mean(c_f:c_l), & + f8, f9, data_offset, run) save_01(:) = 0.0 save_02(:) = 0.0 save_03(:) = 0.0 @@ -785,7 +788,8 @@ subroutine Save_Results(Results, & save_05(c1) = Turb % vw_res(c1) - Turb % v_mean(c1) * Turb % w_mean(c1) save_06(c1) = Turb % uw_res(c1) - Turb % u_mean(c1) * Turb % w_mean(c1) end do - call Results % Save_Tensor_6_Real("Mean Reynolds Stress [m^s/s^2]", & + call Results % Save_Vtu_Tensor_6_Real( & + "Mean Reynolds Stress [m^s/s^2]", & plot_inside, & save_01(c_f:c_l), & save_02(c_f:c_l), & @@ -795,9 +799,10 @@ subroutine Save_Results(Results, & save_06(c_f:c_l), & f8, f9, data_offset, run) if(Flow % heat_transfer) then - call Results % Save_Scalar_Real("Mean Temperature [K]", & - plot_inside, & - Turb % t_mean(c_f:c_l), & + call Results % Save_Vtu_Scalar_Real( & + "Mean Temperature [K]", & + plot_inside, & + Turb % t_mean(c_f:c_l), & f8, f9, data_offset, run) phi_save(:) = 0.0 save_01(:) = 0.0 @@ -809,11 +814,13 @@ subroutine Save_Results(Results, & save_02(c1) = Turb % vt_res(c1) - Turb % v_mean(c1)*Turb % t_mean(c1) save_03(c1) = Turb % wt_res(c1) - Turb % w_mean(c1)*Turb % t_mean(c1) end do - call Results % Save_Scalar_Real("Mean Turbulent Quantity T2 [K^2]", & - plot_inside, & - phi_save(c_f:c_l), & + call Results % Save_Vtu_Scalar_Real( & + "Mean Turbulent Quantity T2 [K^2]", & + plot_inside, & + phi_save(c_f:c_l), & f8, f9, data_offset, run) - call Results % Save_Vector_Real("Mean Turbulent Heat Flux [K m/s]", & + call Results % Save_Vtu_Vector_Real( & + "Mean Turbulent Heat Flux [K m/s]", & plot_inside, & save_01(c_f:c_l), & save_02(c_f:c_l), & @@ -829,51 +836,51 @@ subroutine Save_Results(Results, & do c1 = c_f, c_l phi_save(c1) = Turb % scalar_mean(sc, c1) end do - call Results % Save_Scalar_Real(name_mean, plot_inside, & - phi_save(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real(name_mean, plot_inside, & + phi_save(c_f:c_l), & + f8, f9, data_offset, run) end do end if ! Save y+ for all turbulence models if(Turb % model .ne. NO_TURBULENCE_MODEL .and. & Turb % model .ne. DNS) then - call Results % Save_Scalar_Real("Turbulent Quantity Y Plus [1]", & - plot_inside, & - Turb % y_plus(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Turbulent Quantity Y Plus [1]", & + plot_inside, & + Turb % y_plus(c_f:c_l), & + f8, f9, data_offset, run) end if ! Wall distance and delta, important for all models - call Results % Save_Scalar_Real("Grid Cell Volume [m^3]", & - plot_inside, & - Grid % vol(c_f:c_l), & - f8, f9, data_offset, run) - call Results % Save_Tensor_6_Real("Grid Cell Inertia [m^2]", & - plot_inside, & - Grid % ixx(c_f:c_l), & - Grid % iyy(c_f:c_l), & - Grid % izz(c_f:c_l), & - Grid % ixy(c_f:c_l), & - Grid % iyz(c_f:c_l), & - Grid % ixz(c_f:c_l), & - f8, f9, data_offset, run) - call Results % Save_Scalar_Real("Grid Wall Distance [m]", & - plot_inside, & - Grid % wall_dist(c_f:c_l), & - f8, f9, data_offset, run) - call Results % Save_Scalar_Real("Grid Cell Delta Max [m]", & - plot_inside, & - Turb % h_max(c_f:c_l), & - f8, f9, data_offset, run) - call Results % Save_Scalar_Real("Grid Cell Delta Min [m]", & - plot_inside, & - Turb % h_min(c_f:c_l), & - f8, f9, data_offset, run) - call Results % Save_Scalar_Real("Grid Cell Delta Wall [m]", & - plot_inside, & - Turb % h_w (c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Grid Cell Volume [m^3]", & + plot_inside, & + Grid % vol(c_f:c_l), & + f8, f9, data_offset, run) + call Results % Save_Vtu_Tensor_6_Real("Grid Cell Inertia [m^2]", & + plot_inside, & + Grid % ixx(c_f:c_l), & + Grid % iyy(c_f:c_l), & + Grid % izz(c_f:c_l), & + Grid % ixy(c_f:c_l), & + Grid % iyz(c_f:c_l), & + Grid % ixz(c_f:c_l), & + f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Grid Wall Distance [m]", & + plot_inside, & + Grid % wall_dist(c_f:c_l), & + f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Grid Cell Delta Max [m]", & + plot_inside, & + Turb % h_max(c_f:c_l), & + f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Grid Cell Delta Min [m]", & + plot_inside, & + Turb % h_min(c_f:c_l), & + f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Grid Cell Delta Wall [m]", & + plot_inside, & + Turb % h_w (c_f:c_l), & + f8, f9, data_offset, run) !---------------------------------------------------------------------! ! Variables in the first computational point, plotted at boundary ! @@ -897,10 +904,11 @@ subroutine Save_Results(Results, & save_03(c2) = Flow % w % n(c1) end if end do - call Results % Save_Vector_Real("Velocity Near Wall [m/s]", plot_inside, & - save_01(c_f:c_l), & - save_02(c_f:c_l), & - save_03(c_f:c_l), & + call Results % Save_Vtu_Vector_Real("Velocity Near Wall [m/s]", & + plot_inside, & + save_01(c_f:c_l), & + save_02(c_f:c_l), & + save_03(c_f:c_l), & f8, f9, data_offset, run) if(Turb % model .eq. K_EPS .or. & @@ -918,10 +926,10 @@ subroutine Save_Results(Results, & end do end do - call Results % Save_Scalar_Real("T.K.E. Near Wall [m^2/s^2]", & - plot_inside, & - var_ins(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("T.K.E. Near Wall [m^2/s^2]", & + plot_inside, & + var_ins(c_f:c_l), & + f8, f9, data_offset, run) ! Copy internal values to boundary var_ins(:) = 0.0 @@ -934,10 +942,10 @@ subroutine Save_Results(Results, & end do end do - call Results % Save_Scalar_Real("y+ Near Wall [1]", & - plot_inside, & - var_ins(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("y+ Near Wall [1]", & + plot_inside, & + var_ins(c_f:c_l), & + f8, f9, data_offset, run) do sc = 1, Flow % n_scalars phi => Flow % scalar(sc) @@ -952,10 +960,10 @@ subroutine Save_Results(Results, & end do end do - call Results % Save_Scalar_Real("Scalar Near Wall", & - plot_inside, & - var_ins(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Scalar Near Wall", & + plot_inside, & + var_ins(c_f:c_l), & + f8, f9, data_offset, run) ! Copy internal values to boundary var_ins(:) = 0.0 @@ -968,10 +976,10 @@ subroutine Save_Results(Results, & end do end do - call Results % Save_Scalar_Real("Mean Scalar Near Wall", & - plot_inside, & - var_ins(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Mean Scalar Near Wall", & + plot_inside, & + var_ins(c_f:c_l), & + f8, f9, data_offset, run) ! Copy internal values to boundary var_ins(:) = 0.0 @@ -984,10 +992,10 @@ subroutine Save_Results(Results, & end do end do - call Results % Save_Scalar_Real("Wall Scalar Flux", & - plot_inside, & - var_ins(c_f:c_l), & - f8, f9, data_offset, run) + call Results % Save_Vtu_Scalar_Real("Wall Scalar Flux", & + plot_inside, & + var_ins(c_f:c_l), & + f8, f9, data_offset, run) end do end if diff --git a/Sources/Process/Results_Mod/Save_Scalar_Int.f90 b/Sources/Process/Results_Mod/Save_Vtu_Scalar_Int.f90 similarity index 91% rename from Sources/Process/Results_Mod/Save_Scalar_Int.f90 rename to Sources/Process/Results_Mod/Save_Vtu_Scalar_Int.f90 index 955a94bb3..594deb00b 100644 --- a/Sources/Process/Results_Mod/Save_Scalar_Int.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Scalar_Int.f90 @@ -1,8 +1,8 @@ !==============================================================================! - subroutine Save_Scalar_Int(Results, & - var_name, plot_inside, & - val, fs, fp, & - data_offset, sweep) + subroutine Save_Vtu_Scalar_Int(Results, & + var_name, plot_inside, & + val, fs, fp, & + data_offset, sweep) !------------------------------------------------------------------------------! ! Writes one integer scalar defined over cells. ! !------------------------------------------------------------------------------! diff --git a/Sources/Process/Results_Mod/Save_Scalar_Real.f90 b/Sources/Process/Results_Mod/Save_Vtu_Scalar_Real.f90 similarity index 91% rename from Sources/Process/Results_Mod/Save_Scalar_Real.f90 rename to Sources/Process/Results_Mod/Save_Vtu_Scalar_Real.f90 index 0147f0759..4f63c0326 100644 --- a/Sources/Process/Results_Mod/Save_Scalar_Real.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Scalar_Real.f90 @@ -1,8 +1,8 @@ !==============================================================================! - subroutine Save_Scalar_Real(Results, & - var_name, plot_inside, & - val, fs, fp, & - data_offset, sweep) + subroutine Save_Vtu_Scalar_Real(Results, & + var_name, plot_inside, & + val, fs, fp, & + data_offset, sweep) !------------------------------------------------------------------------------! ! Writes one real scalar defined over cells. ! !------------------------------------------------------------------------------! diff --git a/Sources/Process/Results_Mod/Save_Surf.f90 b/Sources/Process/Results_Mod/Save_Vtu_Surf.f90 similarity index 99% rename from Sources/Process/Results_Mod/Save_Surf.f90 rename to Sources/Process/Results_Mod/Save_Vtu_Surf.f90 index 8d82d1e1d..e216112f1 100644 --- a/Sources/Process/Results_Mod/Save_Surf.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Surf.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Save_Surf(Results, surf, time_step) + subroutine Save_Vtu_Surf(Results, surf, time_step) !------------------------------------------------------------------------------! ! Writes surface vertices in VTU file format (for VisIt and Paraview) ! !------------------------------------------------------------------------------! diff --git a/Sources/Process/Results_Mod/Save_Swarm.f90 b/Sources/Process/Results_Mod/Save_Vtu_Swarm.f90 similarity index 99% rename from Sources/Process/Results_Mod/Save_Swarm.f90 rename to Sources/Process/Results_Mod/Save_Vtu_Swarm.f90 index e8ec47945..85cf2f393 100644 --- a/Sources/Process/Results_Mod/Save_Swarm.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Swarm.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Save_Swarm(Results, Swarm, time_step, domain) + subroutine Save_Vtu_Swarm(Results, Swarm, time_step, domain) !------------------------------------------------------------------------------! ! Writes particles in VTU file format (for VisIt and Paraview) ! !------------------------------------------------------------------------------! diff --git a/Sources/Process/Results_Mod/Save_Tensor_6_Real.f90 b/Sources/Process/Results_Mod/Save_Vtu_Tensor_6_Real.f90 similarity index 89% rename from Sources/Process/Results_Mod/Save_Tensor_6_Real.f90 rename to Sources/Process/Results_Mod/Save_Vtu_Tensor_6_Real.f90 index 17bf19eb7..e35cdaf96 100644 --- a/Sources/Process/Results_Mod/Save_Tensor_6_Real.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Tensor_6_Real.f90 @@ -1,10 +1,10 @@ !==============================================================================! - subroutine Save_Tensor_6_Real(Results, & - var_name, plot_inside, & - val_11, val_22, val_33, & - val_12, val_13, val_23, & - fs, fp, & - data_offset, sweep) + subroutine Save_Vtu_Tensor_6_Real(Results, & + var_name, plot_inside, & + val_11, val_22, val_33, & + val_12, val_13, val_23, & + fs, fp, & + data_offset, sweep) !------------------------------------------------------------------------------! ! Writes one real symmetric tensor defined over cells. ! !------------------------------------------------------------------------------! diff --git a/Sources/Process/Results_Mod/Save_Tensor_9_Real.f90 b/Sources/Process/Results_Mod/Save_Vtu_Tensor_9_Real.f90 similarity index 87% rename from Sources/Process/Results_Mod/Save_Tensor_9_Real.f90 rename to Sources/Process/Results_Mod/Save_Vtu_Tensor_9_Real.f90 index a87a0d4fe..96c67be5b 100644 --- a/Sources/Process/Results_Mod/Save_Tensor_9_Real.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Tensor_9_Real.f90 @@ -1,11 +1,11 @@ !==============================================================================! - subroutine Save_Tensor_9_Real(Results, & - var_name, plot_inside, & - val_11, val_12, val_13, & - val_21, val_22, val_23, & - val_31, val_32, val_33, & - fs, fp, & - data_offset, sweep) + subroutine Save_Vtu_Tensor_9_Real(Results, & + var_name, plot_inside, & + val_11, val_12, val_13, & + val_21, val_22, val_23, & + val_31, val_32, val_33, & + fs, fp, & + data_offset, sweep) !------------------------------------------------------------------------------! ! Writes one real non-symmetric tensor defined over cells. ! !------------------------------------------------------------------------------! diff --git a/Sources/Process/Results_Mod/Save_Vector_Real.f90 b/Sources/Process/Results_Mod/Save_Vtu_Vector_Real.f90 similarity index 91% rename from Sources/Process/Results_Mod/Save_Vector_Real.f90 rename to Sources/Process/Results_Mod/Save_Vtu_Vector_Real.f90 index 06471e8b6..b9f0a3989 100644 --- a/Sources/Process/Results_Mod/Save_Vector_Real.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Vector_Real.f90 @@ -1,8 +1,8 @@ !==============================================================================! - subroutine Save_Vector_Real(Results, & - var_name, plot_inside, & - val_1, val_2, val_3, fs, fp, & - data_offset, sweep) + subroutine Save_Vtu_Vector_Real(Results, & + var_name, plot_inside, & + val_1, val_2, val_3, fs, fp, & + data_offset, sweep) !------------------------------------------------------------------------------! ! Writes one real vector defined over cells. ! !------------------------------------------------------------------------------! diff --git a/Sources/Process/User_Mod.f90 b/Sources/Process/User_Mod.f90 index 07ba68b5f..8f238ef81 100644 --- a/Sources/Process/User_Mod.f90 +++ b/Sources/Process/User_Mod.f90 @@ -41,8 +41,8 @@ module User_Mod # include "User_Mod/Insert_Particles.f90" # include "User_Mod/Interface_Exchange.f90" # include "User_Mod/Force.f90" -# include "User_Mod/Save_Results.f90" -# include "User_Mod/Save_Swarm.f90" +# include "User_Mod/Save_Vtu_Results.f90" +# include "User_Mod/Save_Vtu_Swarm.f90" # include "User_Mod/Source.f90" end module diff --git a/Sources/Process/User_Mod/Save_Swarm.f90 b/Sources/Process/User_Mod/Save_Vtu_Results.f90 similarity index 94% rename from Sources/Process/User_Mod/Save_Swarm.f90 rename to Sources/Process/User_Mod/Save_Vtu_Results.f90 index 20c8855fc..e18962ced 100644 --- a/Sources/Process/User_Mod/Save_Swarm.f90 +++ b/Sources/Process/User_Mod/Save_Vtu_Results.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Save_Swarm(Flow, Turb, Vof, Swarm, ts, domain) + subroutine User_Mod_Save_Vtu_Results(Flow, Turb, Vof, Swarm, ts, domain) !------------------------------------------------------------------------------! ! This subroutine is called each RESULTS_SAVE_INTERVAL (set in control ! ! file), at the end of a simulation and after 'save_now' command. ! diff --git a/Sources/Process/User_Mod/Save_Results.f90 b/Sources/Process/User_Mod/Save_Vtu_Swarm.f90 similarity index 94% rename from Sources/Process/User_Mod/Save_Results.f90 rename to Sources/Process/User_Mod/Save_Vtu_Swarm.f90 index f46b8e77a..563d4ccb6 100644 --- a/Sources/Process/User_Mod/Save_Results.f90 +++ b/Sources/Process/User_Mod/Save_Vtu_Swarm.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) + subroutine User_Mod_Save_Vtu_Swarm(Flow, Turb, Vof, Swarm, ts, domain) !------------------------------------------------------------------------------! ! This subroutine is called each RESULTS_SAVE_INTERVAL (set in control ! ! file), at the end of a simulation and after 'save_now' command. ! From 225ea1d4c7d4fcab90ca85ee04a31f7282162699 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 22 Mar 2023 19:29:55 +0100 Subject: [PATCH 121/223] Backup_Type became a class, a full-fledged one On branch bojan_fixed_cell_ranges modified: Backup_Mod.f90 modified: Backup_Mod/Load.f90 renamed: Backup_Mod/Read_Cell_Real.f90 -> Backup_Mod/Load_Cell_Real.f90 renamed: Backup_Mod/Read_Face_Real.f90 -> Backup_Mod/Load_Face_Real.f90 renamed: Backup_Mod/Read_Int.f90 -> Backup_Mod/Load_Int.f90 renamed: Backup_Mod/Read_Int_Array.f90 -> Backup_Mod/Load_Int_Array.f90 renamed: Backup_Mod/Read_Log.f90 -> Backup_Mod/Load_Log.f90 renamed: Backup_Mod/Read_Log_Array.f90 -> Backup_Mod/Load_Log_Array.f90 renamed: Backup_Mod/Read_Real.f90 -> Backup_Mod/Load_Real.f90 renamed: Backup_Mod/Read_Real_Array.f90 -> Backup_Mod/Load_Real_Array.f90 renamed: Backup_Mod/Read_Swarm.f90 -> Backup_Mod/Load_Swarm.f90 renamed: Backup_Mod/Read_Variable.f90 -> Backup_Mod/Load_Variable.f90 modified: Backup_Mod/Save.f90 renamed: Backup_Mod/Write_Cell_Real.f90 -> Backup_Mod/Save_Cell_Real.f90 renamed: Backup_Mod/Write_Face_Real.f90 -> Backup_Mod/Save_Face_Real.f90 renamed: Backup_Mod/Write_Int.f90 -> Backup_Mod/Save_Int.f90 renamed: Backup_Mod/Write_Int_Array.f90 -> Backup_Mod/Save_Int_Array.f90 renamed: Backup_Mod/Write_Log.f90 -> Backup_Mod/Save_Log.f90 renamed: Backup_Mod/Write_Log_Array.f90 -> Backup_Mod/Save_Log_Array.f90 renamed: Backup_Mod/Write_Real.f90 -> Backup_Mod/Save_Real.f90 renamed: Backup_Mod/Write_Real_Array.f90 -> Backup_Mod/Save_Real_Array.f90 renamed: Backup_Mod/Write_Swarm.f90 -> Backup_Mod/Save_Swarm.f90 renamed: Backup_Mod/Write_Variable.f90 -> Backup_Mod/Save_Variable.f90 renamed: Backup_Mod/Time_To_Save.f90 -> Backup_Mod/Time_To_Save_Backup.f90 modified: Main_Pro.f90 modified: Results_Mod.f90 modified: Results_Mod/Main_Results.f90 renamed: Results_Mod/Time_To_Save.f90 -> Results_Mod/Time_To_Save_Results.f90 --- Sources/Process/Backup_Mod.f90 | 68 +++-- Sources/Process/Backup_Mod/Load.f90 | 235 ++++++++---------- ...{Read_Cell_Real.f90 => Load_Cell_Real.f90} | 3 +- ...{Read_Face_Real.f90 => Load_Face_Real.f90} | 8 +- .../Backup_Mod/{Read_Int.f90 => Load_Int.f90} | 13 +- ...{Read_Int_Array.f90 => Load_Int_Array.f90} | 3 +- .../Backup_Mod/{Read_Log.f90 => Load_Log.f90} | 13 +- ...{Read_Log_Array.f90 => Load_Log_Array.f90} | 3 +- .../{Read_Real.f90 => Load_Real.f90} | 13 +- ...ead_Real_Array.f90 => Load_Real_Array.f90} | 3 +- .../{Read_Swarm.f90 => Load_Swarm.f90} | 25 +- .../{Read_Variable.f90 => Load_Variable.f90} | 13 +- Sources/Process/Backup_Mod/Save.f90 | 235 ++++++++---------- ...Write_Cell_Real.f90 => Save_Cell_Real.f90} | 3 +- ...Write_Face_Real.f90 => Save_Face_Real.f90} | 8 +- .../{Write_Int.f90 => Save_Int.f90} | 13 +- ...Write_Int_Array.f90 => Save_Int_Array.f90} | 3 +- .../{Write_Log.f90 => Save_Log.f90} | 13 +- ...Write_Log_Array.f90 => Save_Log_Array.f90} | 3 +- .../{Write_Real.f90 => Save_Real.f90} | 13 +- ...ite_Real_Array.f90 => Save_Real_Array.f90} | 4 +- .../{Write_Swarm.f90 => Save_Swarm.f90} | 26 +- .../{Write_Variable.f90 => Save_Variable.f90} | 11 +- ...me_To_Save.f90 => Time_To_Save_Backup.f90} | 7 +- Sources/Process/Main_Pro.f90 | 4 +- Sources/Process/Results_Mod.f90 | 4 +- Sources/Process/Results_Mod/Main_Results.f90 | 20 +- ...e_To_Save.f90 => Time_To_Save_Results.f90} | 8 +- 28 files changed, 389 insertions(+), 386 deletions(-) rename Sources/Process/Backup_Mod/{Read_Cell_Real.f90 => Load_Cell_Real.f90} (95%) rename Sources/Process/Backup_Mod/{Read_Face_Real.f90 => Load_Face_Real.f90} (90%) rename Sources/Process/Backup_Mod/{Read_Int.f90 => Load_Int.f90} (86%) rename Sources/Process/Backup_Mod/{Read_Int_Array.f90 => Load_Int_Array.f90} (94%) rename Sources/Process/Backup_Mod/{Read_Log.f90 => Load_Log.f90} (86%) rename Sources/Process/Backup_Mod/{Read_Log_Array.f90 => Load_Log_Array.f90} (94%) rename Sources/Process/Backup_Mod/{Read_Real.f90 => Load_Real.f90} (86%) rename Sources/Process/Backup_Mod/{Read_Real_Array.f90 => Load_Real_Array.f90} (94%) rename Sources/Process/Backup_Mod/{Read_Swarm.f90 => Load_Swarm.f90} (77%) rename Sources/Process/Backup_Mod/{Read_Variable.f90 => Load_Variable.f90} (92%) rename Sources/Process/Backup_Mod/{Write_Cell_Real.f90 => Save_Cell_Real.f90} (93%) rename Sources/Process/Backup_Mod/{Write_Face_Real.f90 => Save_Face_Real.f90} (86%) rename Sources/Process/Backup_Mod/{Write_Int.f90 => Save_Int.f90} (79%) rename Sources/Process/Backup_Mod/{Write_Int_Array.f90 => Save_Int_Array.f90} (91%) rename Sources/Process/Backup_Mod/{Write_Log.f90 => Save_Log.f90} (79%) rename Sources/Process/Backup_Mod/{Write_Log_Array.f90 => Save_Log_Array.f90} (91%) rename Sources/Process/Backup_Mod/{Write_Real.f90 => Save_Real.f90} (79%) rename Sources/Process/Backup_Mod/{Write_Real_Array.f90 => Save_Real_Array.f90} (90%) rename Sources/Process/Backup_Mod/{Write_Swarm.f90 => Save_Swarm.f90} (78%) rename Sources/Process/Backup_Mod/{Write_Variable.f90 => Save_Variable.f90} (88%) rename Sources/Process/Backup_Mod/{Time_To_Save.f90 => Time_To_Save_Backup.f90} (66%) rename Sources/Process/Results_Mod/{Time_To_Save.f90 => Time_To_Save_Results.f90} (62%) diff --git a/Sources/Process/Backup_Mod.f90 b/Sources/Process/Backup_Mod.f90 index 5854857cf..3a3bcb989 100644 --- a/Sources/Process/Backup_Mod.f90 +++ b/Sources/Process/Backup_Mod.f90 @@ -14,8 +14,36 @@ module Backup_Mod !-----------------! type Backup_Type integer :: interval + + contains + procedure :: Load + procedure :: Load_Cell_Real + procedure :: Load_Int + procedure :: Load_Int_Array + procedure :: Load_Log + procedure :: Load_Log_Array + procedure :: Load_Real + procedure :: Load_Real_Array + procedure :: Load_Swarm + procedure :: Load_Variable + procedure :: Save + procedure :: Save_Cell_Real + procedure :: Save_Int + procedure :: Save_Int_Array + procedure :: Save_Log + procedure :: Save_Log_Array + procedure :: Save_Real + procedure :: Save_Real_Array + procedure :: Save_Swarm + procedure :: Save_Variable + procedure :: Time_To_Save_Backup + end type - type(Backup_Type) :: backup + + !----------------------! + ! Singleton object ! + !----------------------! + type(Backup_Type) :: Backup # if T_FLOWS_MPI == 1 type(Mpi_File) :: fh @@ -26,25 +54,25 @@ module Backup_Mod contains # include "Backup_Mod/Load.f90" -# include "Backup_Mod/Read_Cell_Real.f90" -# include "Backup_Mod/Read_Int.f90" -# include "Backup_Mod/Read_Int_Array.f90" -# include "Backup_Mod/Read_Log.f90" -# include "Backup_Mod/Read_Log_Array.f90" -# include "Backup_Mod/Read_Real.f90" -# include "Backup_Mod/Read_Real_Array.f90" -# include "Backup_Mod/Read_Swarm.f90" -# include "Backup_Mod/Read_Variable.f90" +# include "Backup_Mod/Load_Cell_Real.f90" +# include "Backup_Mod/Load_Int.f90" +# include "Backup_Mod/Load_Int_Array.f90" +# include "Backup_Mod/Load_Log.f90" +# include "Backup_Mod/Load_Log_Array.f90" +# include "Backup_Mod/Load_Real.f90" +# include "Backup_Mod/Load_Real_Array.f90" +# include "Backup_Mod/Load_Swarm.f90" +# include "Backup_Mod/Load_Variable.f90" # include "Backup_Mod/Save.f90" -# include "Backup_Mod/Time_To_Save.f90" -# include "Backup_Mod/Write_Cell_Real.f90" -# include "Backup_Mod/Write_Int.f90" -# include "Backup_Mod/Write_Int_Array.f90" -# include "Backup_Mod/Write_Log.f90" -# include "Backup_Mod/Write_Log_Array.f90" -# include "Backup_Mod/Write_Real.f90" -# include "Backup_Mod/Write_Real_Array.f90" -# include "Backup_Mod/Write_Swarm.f90" -# include "Backup_Mod/Write_Variable.f90" +# include "Backup_Mod/Save_Cell_Real.f90" +# include "Backup_Mod/Save_Int.f90" +# include "Backup_Mod/Save_Int_Array.f90" +# include "Backup_Mod/Save_Log.f90" +# include "Backup_Mod/Save_Log_Array.f90" +# include "Backup_Mod/Save_Real.f90" +# include "Backup_Mod/Save_Real_Array.f90" +# include "Backup_Mod/Save_Swarm.f90" +# include "Backup_Mod/Save_Variable.f90" +# include "Backup_Mod/Time_To_Save_Backup.f90" end module diff --git a/Sources/Process/Backup_Mod/Load.f90 b/Sources/Process/Backup_Mod/Load.f90 index 6df3c41db..f3310eda5 100644 --- a/Sources/Process/Backup_Mod/Load.f90 +++ b/Sources/Process/Backup_Mod/Load.f90 @@ -1,17 +1,18 @@ !==============================================================================! - subroutine Backup_Mod_Load(Fld, Tur, Vof, Swr, time, time_step, backup) + subroutine Load(Backup, Fld, Tur, Vof, Swr, time, time_step, bckp) !------------------------------------------------------------------------------! ! Loads backup files name.backup ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Backup_Type) :: Backup type(Field_Type), target :: Fld type(Turb_Type), target :: Tur type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swr real :: time ! time of simulation integer :: time_step ! current time step - logical :: backup, present + logical :: bckp, present !-----------------------------------[Locals]-----------------------------------! type(Comm_Type), pointer :: Comm type(Grid_Type), pointer :: Grid @@ -33,9 +34,9 @@ subroutine Backup_Mod_Load(Fld, Tur, Vof, Swr, time, time_step, backup) answer = name_in call String % To_Upper_Case(answer) - backup = .true. + bckp = .true. if(answer .eq. 'SKIP') then - backup = .false. + bckp = .false. return end if @@ -62,7 +63,7 @@ subroutine Backup_Mod_Load(Fld, Tur, Vof, Swr, time, time_step, backup) !---------------------------------------------! ! Variable count - important for checking ! !---------------------------------------------! - call Backup_Mod_Read_Int(Comm, d, 2048, 'variable_count', vc) + call Backup % Load_Int(Comm, d, 2048, 'variable_count', vc) if(vc .eq. 0) vc = 2048 ! for backward compatibility if(this_proc < 2) then @@ -78,26 +79,26 @@ subroutine Backup_Mod_Load(Fld, Tur, Vof, Swr, time, time_step, backup) !-----------------------------------------------! ! Skip three coordinates for the time being ! !-----------------------------------------------! - ! call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'x_coords', Grid % xc) - ! call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'y_coords', Grid % yc) - ! call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'z_coords', Grid % zc) + ! call Backup % Load_Cell_Real(Grid, d, vc, 'x_coords', Grid % xc) + ! call Backup % Load_Cell_Real(Grid, d, vc, 'y_coords', Grid % yc) + ! call Backup % Load_Cell_Real(Grid, d, vc, 'z_coords', Grid % zc) ! Time step - call Backup_Mod_Read_Int(Comm, d, vc, 'time_step', time_step) + call Backup % Load_Int(Comm, d, vc, 'time_step', time_step) ! Simulation time - call Backup_Mod_Read_Real(Comm, d, vc, 'time', time) + call Backup % Load_Real(Comm, d, vc, 'time', time) ! Bulk flows and pressure drops in each direction - call Backup_Mod_Read_Real(Comm, d, vc, 'bulk_flux_x', bulk % flux_x) - call Backup_Mod_Read_Real(Comm, d, vc, 'bulk_flux_y', bulk % flux_y) - call Backup_Mod_Read_Real(Comm, d, vc, 'bulk_flux_z', bulk % flux_z) - call Backup_Mod_Read_Real(Comm, d, vc, 'bulk_flux_x_o', bulk % flux_x_o) - call Backup_Mod_Read_Real(Comm, d, vc, 'bulk_flux_y_o', bulk % flux_y_o) - call Backup_Mod_Read_Real(Comm, d, vc, 'bulk_flux_z_o', bulk % flux_z_o) - call Backup_Mod_Read_Real(Comm, d, vc, 'bulk_p_drop_x', bulk % p_drop_x) - call Backup_Mod_Read_Real(Comm, d, vc, 'bulk_p_drop_y', bulk % p_drop_y) - call Backup_Mod_Read_Real(Comm, d, vc, 'bulk_p_drop_z', bulk % p_drop_z) + call Backup % Load_Real(Comm, d, vc, 'bulk_flux_x', bulk % flux_x) + call Backup % Load_Real(Comm, d, vc, 'bulk_flux_y', bulk % flux_y) + call Backup % Load_Real(Comm, d, vc, 'bulk_flux_z', bulk % flux_z) + call Backup % Load_Real(Comm, d, vc, 'bulk_flux_x_o', bulk % flux_x_o) + call Backup % Load_Real(Comm, d, vc, 'bulk_flux_y_o', bulk % flux_y_o) + call Backup % Load_Real(Comm, d, vc, 'bulk_flux_z_o', bulk % flux_z_o) + call Backup % Load_Real(Comm, d, vc, 'bulk_p_drop_x', bulk % p_drop_x) + call Backup % Load_Real(Comm, d, vc, 'bulk_p_drop_y', bulk % p_drop_y) + call Backup % Load_Real(Comm, d, vc, 'bulk_p_drop_z', bulk % p_drop_z) !----------------------------! ! ! @@ -108,18 +109,18 @@ subroutine Backup_Mod_Load(Fld, Tur, Vof, Swr, time, time_step, backup) !--------------! ! Velocity ! !--------------! - call Backup_Mod_Read_Variable(d, vc, 'u_velocity', Fld, Fld % u) - call Backup_Mod_Read_Variable(d, vc, 'v_velocity', Fld, Fld % v) - call Backup_Mod_Read_Variable(d, vc, 'w_velocity', Fld, Fld % w) + call Backup % Load_Variable(d, vc, 'u_velocity', Fld, Fld % u) + call Backup % Load_Variable(d, vc, 'v_velocity', Fld, Fld % v) + call Backup % Load_Variable(d, vc, 'w_velocity', Fld, Fld % w) !------------------------------------------------------! ! Pressure, its gradients, and pressure correction ! !------------------------------------------------------! - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'press', Fld % p % n) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'press_x', Fld % p % x) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'press_y', Fld % p % y) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'press_z', Fld % p % z) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'press_corr', Fld % pp % n) + call Backup % Load_Cell_Real(Grid, d, vc, 'press', Fld % p % n) + call Backup % Load_Cell_Real(Grid, d, vc, 'press_x', Fld % p % x) + call Backup % Load_Cell_Real(Grid, d, vc, 'press_y', Fld % p % y) + call Backup % Load_Cell_Real(Grid, d, vc, 'press_z', Fld % p % z) + call Backup % Load_Cell_Real(Grid, d, vc, 'press_corr', Fld % pp % n) call Fld % Grad_Pressure(Fld % pp) !-------------------! @@ -140,7 +141,7 @@ subroutine Backup_Mod_Load(Fld, Tur, Vof, Swr, time, time_step, backup) ! ! Update on June 2, 2022: Unified all outlet boundaries into one ! to be able to tell PETSc if matrix for pressure is singular - call Backup_Mod_Read_Log(Comm, d, vc, 'has_pressure', Fld % has_pressure) + call Backup % Load_Log(Comm, d, vc, 'has_pressure', Fld % has_pressure) !--------------! ! ! @@ -148,7 +149,7 @@ subroutine Backup_Mod_Load(Fld, Tur, Vof, Swr, time, time_step, backup) ! ! !--------------! if(Fld % heat_transfer) then - call Backup_Mod_Read_Variable(d, vc, 'temp', Fld, Fld % t) + call Backup % Load_Variable(d, vc, 'temp', Fld, Fld % t) end if !--------------! @@ -157,7 +158,7 @@ subroutine Backup_Mod_Load(Fld, Tur, Vof, Swr, time, time_step, backup) ! ! !--------------! if(Fld % with_interface) then - call Backup_Mod_Read_Variable(d, vc, 'vof_fun', Fld, Vof % fun) + call Backup % Load_Variable(d, vc, 'vof_fun', Fld, Vof % fun) end if !-----------------------! @@ -172,20 +173,20 @@ subroutine Backup_Mod_Load(Fld, Tur, Vof, Swr, time, time_step, backup) if(Tur % model .eq. K_EPS) then ! K and epsilon - call Backup_Mod_Read_Variable(d, vc, 'kin', Fld, Tur % kin) - call Backup_Mod_Read_Variable(d, vc, 'eps', Fld, Tur % eps) + call Backup % Load_Variable(d, vc, 'kin', Fld, Tur % kin) + call Backup % Load_Variable(d, vc, 'eps', Fld, Tur % eps) ! Other turbulent quantities - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'p_kin', Tur % p_kin ) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'y_plus', Tur % y_plus) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'vis_t', Tur % vis_t ) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'vis_w', Tur % vis_w ) + call Backup % Load_Cell_Real(Grid, d, vc, 'p_kin', Tur % p_kin ) + call Backup % Load_Cell_Real(Grid, d, vc, 'y_plus', Tur % y_plus) + call Backup % Load_Cell_Real(Grid, d, vc, 'vis_t', Tur % vis_t ) + call Backup % Load_Cell_Real(Grid, d, vc, 'vis_w', Tur % vis_w ) ! Turbulence quantities connected with heat transfer if(Fld % heat_transfer) then - call Backup_Mod_Read_Variable(d, vc, 't2', Fld, Tur % t2) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'p_t2', Tur % p_t2 ) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'con_w', Tur % con_w) + call Backup % Load_Variable(d, vc, 't2', Fld, Tur % t2) + call Backup % Load_Cell_Real(Grid, d, vc, 'p_t2', Tur % p_t2 ) + call Backup % Load_Cell_Real(Grid, d, vc, 'con_w', Tur % con_w) end if end if @@ -196,25 +197,25 @@ subroutine Backup_Mod_Load(Fld, Tur, Vof, Swr, time, time_step, backup) Tur % model .eq. HYBRID_LES_RANS) then ! K, eps, zeta and f22 - call Backup_Mod_Read_Variable(d, vc, 'kin', Fld, Tur % kin) - call Backup_Mod_Read_Variable(d, vc, 'eps', Fld, Tur % eps) - call Backup_Mod_Read_Variable(d, vc, 'zeta', Fld, Tur % zeta) - call Backup_Mod_Read_Variable(d, vc, 'f22', Fld, Tur % f22) + call Backup % Load_Variable(d, vc, 'kin', Fld, Tur % kin) + call Backup % Load_Variable(d, vc, 'eps', Fld, Tur % eps) + call Backup % Load_Variable(d, vc, 'zeta', Fld, Tur % zeta) + call Backup % Load_Variable(d, vc, 'f22', Fld, Tur % f22) ! Other turbulent quantities - call Backup_Mod_Read_Cell_Real(Grid, d, vc,'p_kin', Tur % p_kin ) - call Backup_Mod_Read_Cell_Real(Grid, d, vc,'y_plus', Tur % y_plus ) - call Backup_Mod_Read_Cell_Real(Grid, d, vc,'vis_t', Tur % vis_t ) - call Backup_Mod_Read_Cell_Real(Grid, d, vc,'vis_w', Tur % vis_w ) - call Backup_Mod_Read_Cell_Real(Grid, d, vc,'t_scale', Tur % t_scale) - call Backup_Mod_Read_Cell_Real(Grid, d, vc,'l_scale', Tur % l_scale) + call Backup % Load_Cell_Real(Grid, d, vc,'p_kin', Tur % p_kin ) + call Backup % Load_Cell_Real(Grid, d, vc,'y_plus', Tur % y_plus ) + call Backup % Load_Cell_Real(Grid, d, vc,'vis_t', Tur % vis_t ) + call Backup % Load_Cell_Real(Grid, d, vc,'vis_w', Tur % vis_w ) + call Backup % Load_Cell_Real(Grid, d, vc,'t_scale', Tur % t_scale) + call Backup % Load_Cell_Real(Grid, d, vc,'l_scale', Tur % l_scale) ! Turbulence quantities connected with heat transfer if(Fld % heat_transfer) then - call Backup_Mod_Read_Variable(d, vc, 't2', Fld, Tur % t2) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'p_t2', Tur % p_t2 ) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'con_w', Tur % con_w) + call Backup % Load_Variable(d, vc, 't2', Fld, Tur % t2) + call Backup % Load_Cell_Real(Grid, d, vc, 'p_t2', Tur % p_t2 ) + call Backup % Load_Cell_Real(Grid, d, vc, 'con_w', Tur % con_w) end if end if @@ -226,28 +227,28 @@ subroutine Backup_Mod_Load(Fld, Tur, Vof, Swr, time, time_step, backup) Tur % model .eq. RSM_HANJALIC_JAKIRLIC) then ! Reynolds stresses - call Backup_Mod_Read_Variable(d, vc, 'uu', Fld, Tur % uu) - call Backup_Mod_Read_Variable(d, vc, 'vv', Fld, Tur % vv) - call Backup_Mod_Read_Variable(d, vc, 'ww', Fld, Tur % ww) - call Backup_Mod_Read_Variable(d, vc, 'uv', Fld, Tur % uv) - call Backup_Mod_Read_Variable(d, vc, 'uw', Fld, Tur % uw) - call Backup_Mod_Read_Variable(d, vc, 'vw', Fld, Tur % vw) + call Backup % Load_Variable(d, vc, 'uu', Fld, Tur % uu) + call Backup % Load_Variable(d, vc, 'vv', Fld, Tur % vv) + call Backup % Load_Variable(d, vc, 'ww', Fld, Tur % ww) + call Backup % Load_Variable(d, vc, 'uv', Fld, Tur % uv) + call Backup % Load_Variable(d, vc, 'uw', Fld, Tur % uw) + call Backup % Load_Variable(d, vc, 'vw', Fld, Tur % vw) ! Epsilon - call Backup_Mod_Read_Variable(d, vc, 'eps', Fld, Tur % eps) + call Backup % Load_Variable(d, vc, 'eps', Fld, Tur % eps) ! F22 if(Tur % model .eq. RSM_MANCEAU_HANJALIC) then - call Backup_Mod_Read_Variable(d, vc, 'f22', Fld, Tur % f22) + call Backup % Load_Variable(d, vc, 'f22', Fld, Tur % f22) end if ! Other turbulent quantities ? - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'vis_t', Tur % vis_t) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'vis_w', Tur % vis_w) + call Backup % Load_Cell_Real(Grid, d, vc, 'vis_t', Tur % vis_t) + call Backup % Load_Cell_Real(Grid, d, vc, 'vis_w', Tur % vis_w) ! Turbulence quantities connected with heat transfer if(Fld % heat_transfer) then - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'con_w', Tur % con_w) + call Backup % Load_Cell_Real(Grid, d, vc, 'con_w', Tur % con_w) end if end if @@ -255,7 +256,7 @@ subroutine Backup_Mod_Load(Fld, Tur, Vof, Swr, time, time_step, backup) ! Roughness ! !--------------! if(Tur % rough_walls) then - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'z_o', Tur % z_o) + call Backup % Load_Cell_Real(Grid, d, vc, 'z_o', Tur % z_o) end if !------------------! @@ -263,7 +264,7 @@ subroutine Backup_Mod_Load(Fld, Tur, Vof, Swr, time, time_step, backup) !------------------! do sc = 1, Fld % n_scalars phi => Fld % scalar(sc) - call Backup_Mod_Read_Variable(d, vc, phi % name, Fld, phi) + call Backup % Load_Variable(d, vc, phi % name, Fld, phi) end do !-----------------------------------------! @@ -273,85 +274,65 @@ subroutine Backup_Mod_Load(Fld, Tur, Vof, Swr, time, time_step, backup) !-----------------------------------------! if(Tur % statistics) then - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'u_mean', Tur % u_mean) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'v_mean', Tur % v_mean) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'w_mean', Tur % w_mean) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'p_mean', Tur % p_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'u_mean', Tur % u_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'v_mean', Tur % v_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'w_mean', Tur % w_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'p_mean', Tur % p_mean) if(Fld % heat_transfer) then - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 't_mean', Tur % t_mean) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'q_mean', Tur % q_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 't_mean', Tur % t_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'q_mean', Tur % q_mean) end if ! K and epsilon if(Tur % model .eq. K_EPS) then - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'kin_mean', & - Tur % kin_mean) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'eps_mean', & - Tur % eps_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'kin_mean', Tur % kin_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'eps_mean', Tur % eps_mean) if(Fld % heat_transfer) then - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 't2_mean', & - Tur % t2_mean) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'ut_mean', & - Tur % ut_mean) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'vt_mean', & - Tur % vt_mean) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'wt_mean', & - Tur % wt_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 't2_mean', Tur % t2_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'ut_mean', Tur % ut_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'vt_mean', Tur % vt_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'wt_mean', Tur % wt_mean) end if end if ! K-eps-zeta-f and the hybrid model if(Tur % model .eq. K_EPS_ZETA_F .or. & Tur % model .eq. HYBRID_LES_RANS) then - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'kin_mean', & - Tur % kin_mean) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'eps_mean', & - Tur % eps_mean) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'zeta_mean', & - Tur % zeta_mean) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'f22_mean', & - Tur % f22_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'kin_mean', Tur % kin_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'eps_mean', Tur % eps_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'zeta_mean', Tur % zeta_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'f22_mean', Tur % f22_mean) if(Fld % heat_transfer) then - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 't2_mean', & - Tur % t2_mean) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'ut_mean', & - Tur % ut_mean) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'vt_mean', & - Tur % vt_mean) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'wt_mean', & - Tur % wt_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 't2_mean', Tur % t2_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'ut_mean', Tur % ut_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'vt_mean', Tur % vt_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'wt_mean', Tur % wt_mean) end if end if ! Reynolds stress models if(Tur % model .eq. RSM_MANCEAU_HANJALIC .or. & Tur % model .eq. RSM_HANJALIC_JAKIRLIC) then - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'uu_mean', & - Tur % uu_mean) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'vv_mean', & - Tur % vv_mean) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'ww_mean', & - Tur % ww_mean) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'uv_mean', & - Tur % uv_mean) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'uw_mean', & - Tur % uw_mean) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'vw_mean', & - Tur % vw_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'uu_mean', Tur % uu_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'vv_mean', Tur % vv_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'ww_mean', Tur % ww_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'uv_mean', Tur % uv_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'uw_mean', Tur % uw_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'vw_mean', Tur % vw_mean) end if - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'uu_res', Tur % uu_res) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'vv_res', Tur % vv_res) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'ww_res', Tur % ww_res) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'uv_res', Tur % uv_res) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'uw_res', Tur % uw_res) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'vw_res', Tur % vw_res) + call Backup % Load_Cell_Real(Grid, d, vc, 'uu_res', Tur % uu_res) + call Backup % Load_Cell_Real(Grid, d, vc, 'vv_res', Tur % vv_res) + call Backup % Load_Cell_Real(Grid, d, vc, 'ww_res', Tur % ww_res) + call Backup % Load_Cell_Real(Grid, d, vc, 'uv_res', Tur % uv_res) + call Backup % Load_Cell_Real(Grid, d, vc, 'uw_res', Tur % uw_res) + call Backup % Load_Cell_Real(Grid, d, vc, 'vw_res', Tur % vw_res) if(Fld % heat_transfer) then - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 't2_res', Tur % t2_res) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'ut_res', Tur % ut_res) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'vt_res', Tur % vt_res) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'wt_res', Tur % wt_res) + call Backup % Load_Cell_Real(Grid, d, vc, 't2_res', Tur % t2_res) + call Backup % Load_Cell_Real(Grid, d, vc, 'ut_res', Tur % ut_res) + call Backup % Load_Cell_Real(Grid, d, vc, 'vt_res', Tur % vt_res) + call Backup % Load_Cell_Real(Grid, d, vc, 'wt_res', Tur % wt_res) end if ! Scalars @@ -359,8 +340,8 @@ subroutine Backup_Mod_Load(Fld, Tur, Vof, Swr, time, time_step, backup) phi => Fld % scalar(sc) name_mean = phi % name name_mean(5:9) = '_mean' - call Backup_Mod_Read_Cell_Real(Grid, d, vc, name_mean, & - Tur % scalar_mean(sc, :)) + call Backup % Load_Cell_Real(Grid, d, vc, name_mean, & + Tur % scalar_mean(sc, :)) end do end if @@ -371,11 +352,9 @@ subroutine Backup_Mod_Load(Fld, Tur, Vof, Swr, time, time_step, backup) ! ! !--------------------------! if(Fld % with_particles) then - call Backup_Mod_Read_Swarm(d, vc, Swr) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'n_deposited', & - Swr % n_deposited) - call Backup_Mod_Read_Cell_Real(Grid, d, vc, 'n_reflected', & - Swr % n_reflected) + call Backup % Load_Swarm(d, vc, Swr) + call Backup % Load_Cell_Real(Grid, d, vc, 'n_deposited', Swr % n_deposited) + call Backup % Load_Cell_Real(Grid, d, vc, 'n_reflected', Swr % n_reflected) end if ! Close backup file diff --git a/Sources/Process/Backup_Mod/Read_Cell_Real.f90 b/Sources/Process/Backup_Mod/Load_Cell_Real.f90 similarity index 95% rename from Sources/Process/Backup_Mod/Read_Cell_Real.f90 rename to Sources/Process/Backup_Mod/Load_Cell_Real.f90 index 4acb21a63..6a9b14b3c 100644 --- a/Sources/Process/Backup_Mod/Read_Cell_Real.f90 +++ b/Sources/Process/Backup_Mod/Load_Cell_Real.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Backup_Mod_Read_Cell_Real(Grid, disp, vc, var_name, array) + subroutine Load_Cell_Real(Backup, Grid, disp, vc, var_name, array) !------------------------------------------------------------------------------! ! Reads a vector variable with boundary cells from a backup file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Backup_Type) :: Backup type(Grid_Type), target :: Grid integer(DP) :: disp integer :: vc diff --git a/Sources/Process/Backup_Mod/Read_Face_Real.f90 b/Sources/Process/Backup_Mod/Load_Face_Real.f90 similarity index 90% rename from Sources/Process/Backup_Mod/Read_Face_Real.f90 rename to Sources/Process/Backup_Mod/Load_Face_Real.f90 index b15b3a5d8..2ca1822fe 100644 --- a/Sources/Process/Backup_Mod/Read_Face_Real.f90 +++ b/Sources/Process/Backup_Mod/Load_Face_Real.f90 @@ -1,17 +1,17 @@ !==============================================================================! - subroutine Backup_Mod_Read_Face_Real(Grid, disp, vc, var_name, array, & - correct_sign) + subroutine Load_Face_Real(Backup, Grid, disp, vc, var_name, array, corr_sign) !------------------------------------------------------------------------------! ! Reads a vector variable with face values from a backup file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Backup_Type) :: Backup type(Grid_Type), target :: Grid integer :: disp, vc character(len=*) :: var_name real :: array(Grid % n_faces) - logical, optional :: correct_sign ! for face fluxes, signs might have - ! to be changed (check it one day) + logical, optional :: corr_sign ! for face fluxes, signs might have + ! to be changed (check it one day) !-----------------------------------[Locals]-----------------------------------! type(Comm_Type), pointer :: Comm character(SL) :: vn diff --git a/Sources/Process/Backup_Mod/Read_Int.f90 b/Sources/Process/Backup_Mod/Load_Int.f90 similarity index 86% rename from Sources/Process/Backup_Mod/Read_Int.f90 rename to Sources/Process/Backup_Mod/Load_Int.f90 index cdf253107..a1b8c609d 100644 --- a/Sources/Process/Backup_Mod/Read_Int.f90 +++ b/Sources/Process/Backup_Mod/Load_Int.f90 @@ -1,15 +1,16 @@ !==============================================================================! - subroutine Backup_Mod_Read_Int(Comm, disp, vc, var_name, var_value) + subroutine Load_Int(Backup, Comm, disp, vc, var_name, var_value) !------------------------------------------------------------------------------! ! Reads a single named integer variable from backup file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Comm_Type) :: Comm - integer(DP) :: disp - integer :: vc - character(len=*) :: var_name - integer :: var_value + class(Backup_Type) :: Backup + type(Comm_Type) :: Comm + integer(DP) :: disp + integer :: vc + character(len=*) :: var_name + integer :: var_value !-----------------------------------[Locals]-----------------------------------! character(SL) :: vn integer :: vs, cnt_loop diff --git a/Sources/Process/Backup_Mod/Read_Int_Array.f90 b/Sources/Process/Backup_Mod/Load_Int_Array.f90 similarity index 94% rename from Sources/Process/Backup_Mod/Read_Int_Array.f90 rename to Sources/Process/Backup_Mod/Load_Int_Array.f90 index ddd4d9f3b..6ec0662e5 100644 --- a/Sources/Process/Backup_Mod/Read_Int_Array.f90 +++ b/Sources/Process/Backup_Mod/Load_Int_Array.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Backup_Mod_Read_Int_Array(Comm, disp, vc, arr_name, arr_value) + subroutine Load_Int_Array(Backup, Comm, disp, vc, arr_name, arr_value) !------------------------------------------------------------------------------! ! Reads a named integer array from backup file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Backup_Type) :: Backup type(Comm_Type) :: Comm integer(DP) :: disp integer :: vc diff --git a/Sources/Process/Backup_Mod/Read_Log.f90 b/Sources/Process/Backup_Mod/Load_Log.f90 similarity index 86% rename from Sources/Process/Backup_Mod/Read_Log.f90 rename to Sources/Process/Backup_Mod/Load_Log.f90 index 3357765e1..619bc8039 100644 --- a/Sources/Process/Backup_Mod/Read_Log.f90 +++ b/Sources/Process/Backup_Mod/Load_Log.f90 @@ -1,15 +1,16 @@ !==============================================================================! - subroutine Backup_Mod_Read_Log(Comm, disp, vc, var_name, var_value) + subroutine Load_Log(Backup, Comm, disp, vc, var_name, var_value) !------------------------------------------------------------------------------! ! Reads a single named logical variable from backup file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Comm_Type) :: Comm - integer(DP) :: disp - integer :: vc - character(len=*) :: var_name - logical :: var_value + class(Backup_Type) :: Backup + type(Comm_Type) :: Comm + integer(DP) :: disp + integer :: vc + character(len=*) :: var_name + logical :: var_value !-----------------------------------[Locals]-----------------------------------! character(SL) :: vn integer :: vs, cnt_loop diff --git a/Sources/Process/Backup_Mod/Read_Log_Array.f90 b/Sources/Process/Backup_Mod/Load_Log_Array.f90 similarity index 94% rename from Sources/Process/Backup_Mod/Read_Log_Array.f90 rename to Sources/Process/Backup_Mod/Load_Log_Array.f90 index 29cf7c81f..ee286a865 100644 --- a/Sources/Process/Backup_Mod/Read_Log_Array.f90 +++ b/Sources/Process/Backup_Mod/Load_Log_Array.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Backup_Mod_Read_Log_Array(Comm, disp, vc, arr_name, arr_value) + subroutine Load_Log_Array(Backup, Comm, disp, vc, arr_name, arr_value) !------------------------------------------------------------------------------! ! Reads a named integer array from backup file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Backup_Type) :: Backup type(Comm_Type) :: Comm integer(DP) :: disp integer :: vc diff --git a/Sources/Process/Backup_Mod/Read_Real.f90 b/Sources/Process/Backup_Mod/Load_Real.f90 similarity index 86% rename from Sources/Process/Backup_Mod/Read_Real.f90 rename to Sources/Process/Backup_Mod/Load_Real.f90 index 497031e87..109cd55e8 100644 --- a/Sources/Process/Backup_Mod/Read_Real.f90 +++ b/Sources/Process/Backup_Mod/Load_Real.f90 @@ -1,15 +1,16 @@ !==============================================================================! - subroutine Backup_Mod_Read_Real(Comm, disp, vc, var_name, var_value) + subroutine Load_Real(Backup, Comm, disp, vc, var_name, var_value) !------------------------------------------------------------------------------! ! Reads a single named real variable from backup file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Comm_Type) :: Comm - integer(DP) :: disp - integer :: vc - character(len=*) :: var_name - real :: var_value + class(Backup_Type) :: Backup + type(Comm_Type) :: Comm + integer(DP) :: disp + integer :: vc + character(len=*) :: var_name + real :: var_value !-----------------------------------[Locals]-----------------------------------! character(SL) :: vn integer :: vo, cnt_loop diff --git a/Sources/Process/Backup_Mod/Read_Real_Array.f90 b/Sources/Process/Backup_Mod/Load_Real_Array.f90 similarity index 94% rename from Sources/Process/Backup_Mod/Read_Real_Array.f90 rename to Sources/Process/Backup_Mod/Load_Real_Array.f90 index 3b5f4fb69..7f0fa1418 100644 --- a/Sources/Process/Backup_Mod/Read_Real_Array.f90 +++ b/Sources/Process/Backup_Mod/Load_Real_Array.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Backup_Mod_Read_Real_Array(Comm, disp, vc, arr_name, arr_value) + subroutine Load_Real_Array(Backup, Comm, disp, vc, arr_name, arr_value) !------------------------------------------------------------------------------! ! Reads a named real array from backup file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Backup_Type) :: Backup type(Comm_Type) :: Comm integer(DP) :: disp integer :: vc diff --git a/Sources/Process/Backup_Mod/Read_Swarm.f90 b/Sources/Process/Backup_Mod/Load_Swarm.f90 similarity index 77% rename from Sources/Process/Backup_Mod/Read_Swarm.f90 rename to Sources/Process/Backup_Mod/Load_Swarm.f90 index b802d6f42..c39da2d46 100644 --- a/Sources/Process/Backup_Mod/Read_Swarm.f90 +++ b/Sources/Process/Backup_Mod/Load_Swarm.f90 @@ -1,13 +1,14 @@ !==============================================================================! - subroutine Backup_Mod_Read_Swarm(disp, vc, Swr) + subroutine Load_Swarm(Backup, disp, vc, Swr) !------------------------------------------------------------------------------! ! Loads backup files name.backup ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Backup_Type) :: Backup + type(Swarm_Type), target :: Swr integer(DP) :: disp integer :: vc - type(Swarm_Type), target :: Swr !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Comm_Type), pointer :: Comm @@ -26,7 +27,7 @@ subroutine Backup_Mod_Read_Swarm(disp, vc, Swr) !--------------------------! ! Number of particles - call Backup_Mod_Read_Int(Comm, disp, vc, 'n_particles', n_part) + call Backup % Load_Int(Comm, disp, vc, 'n_particles', n_part) Swr % i_work(:) = 0 Swr % l_work(:) = .false. @@ -34,15 +35,15 @@ subroutine Backup_Mod_Read_Swarm(disp, vc, Swr) if(n_part > 0) then Swr % n_particles = n_part - call Backup_Mod_Read_Int_Array(Comm, disp, vc, & - 'particle_int_data', & - Swr % i_work(1 : Swr % N_I_VARS*Swr % n_particles)) - call Backup_Mod_Read_Log_Array(Comm, disp, vc, & - 'particle_log_data', & - Swr % l_work(1 : Swr % N_L_VARS*Swr % n_particles)) - call Backup_Mod_Read_Real_Array(Comm, disp, vc, & - 'particle_real_data', & - Swr % r_work(1 : Swr % N_R_VARS*Swr % n_particles)) + call Backup % Load_Int_Array(Comm, disp, vc, & + 'particle_int_data', & + Swr % i_work(1 : Swr % N_I_VARS*Swr % n_particles)) + call Backup % Load_Log_Array(Comm, disp, vc, & + 'particle_log_data', & + Swr % l_work(1 : Swr % N_L_VARS*Swr % n_particles)) + call Backup % Load_Real_Array(Comm, disp, vc, & + 'particle_real_data', & + Swr % r_work(1 : Swr % N_R_VARS*Swr % n_particles)) ! Unpack particle data from arrays do k = 1, Swr % n_particles diff --git a/Sources/Process/Backup_Mod/Read_Variable.f90 b/Sources/Process/Backup_Mod/Load_Variable.f90 similarity index 92% rename from Sources/Process/Backup_Mod/Read_Variable.f90 rename to Sources/Process/Backup_Mod/Load_Variable.f90 index db7703957..f27736eae 100644 --- a/Sources/Process/Backup_Mod/Read_Variable.f90 +++ b/Sources/Process/Backup_Mod/Load_Variable.f90 @@ -1,15 +1,16 @@ !==============================================================================! - subroutine Backup_Mod_Read_Variable(disp, vc, var_name, Fld, var) + subroutine Load_Variable(Backup, disp, vc, var_name, Fld, var) !------------------------------------------------------------------------------! ! Reads a whole variable from backup file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer(DP) :: disp - integer :: vc - character(len=*) :: var_name - type(Field_Type) :: Fld - type(Var_Type) :: var + class(Backup_Type) :: Backup + type(Field_Type) :: Fld + integer(DP) :: disp + integer :: vc + character(len=*) :: var_name + type(Var_Type) :: var !-----------------------------------[Locals]-----------------------------------! type(Comm_Type), pointer :: Comm type(Grid_Type), pointer :: Grid diff --git a/Sources/Process/Backup_Mod/Save.f90 b/Sources/Process/Backup_Mod/Save.f90 index 49135b40f..9a9368746 100644 --- a/Sources/Process/Backup_Mod/Save.f90 +++ b/Sources/Process/Backup_Mod/Save.f90 @@ -1,17 +1,18 @@ !==============================================================================! - subroutine Backup_Mod_Save(Fld, Tur, Vof, Swr, time, time_step, domain) + subroutine Save(Backup, Fld, Tur, Vof, Swr, time, time_step, dom) !------------------------------------------------------------------------------! ! Saves backup files name.backup ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Backup_Type) :: Backup type(Field_Type), target :: Fld type(Turb_Type), target :: Tur type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swr real :: time ! time of simulation integer :: time_step ! current time step - integer, optional :: domain + integer, optional :: dom !-----------------------------------[Locals]-----------------------------------! type(Comm_Type), pointer :: Comm type(Grid_Type), pointer :: Grid @@ -31,7 +32,7 @@ subroutine Backup_Mod_Save(Fld, Tur, Vof, Swr, time, time_step, domain) ! Name backup file call File % Set_Name(name_out, time_step=time_step, & - extension='.backup', domain=domain) + extension='.backup', domain=dom) ! Open backup file call Comm % Open_File_Write(fh, name_out) @@ -48,9 +49,9 @@ subroutine Backup_Mod_Save(Fld, Tur, Vof, Swr, time, time_step, domain) !-----------------------------------------------------------------------! ! Save cell-centre coordinates. Could be useful for interpolations ! !-----------------------------------------------------------------------! - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'x_coords', Grid % xc) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'y_coords', Grid % yc) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'z_coords', Grid % zc) + call Backup % Save_Cell_Real(Grid, d, vc, 'x_coords', Grid % xc) + call Backup % Save_Cell_Real(Grid, d, vc, 'y_coords', Grid % yc) + call Backup % Save_Cell_Real(Grid, d, vc, 'z_coords', Grid % zc) !---------------! ! ! @@ -59,24 +60,24 @@ subroutine Backup_Mod_Save(Fld, Tur, Vof, Swr, time, time_step, domain) !---------------! ! Time step - call Backup_Mod_Write_Int(Comm, d, vc, 'time_step', time_step) + call Backup % Save_Int(Comm, d, vc, 'time_step', time_step) ! Simulation time - call Backup_Mod_Write_Real(Comm, d, vc, 'time', time) + call Backup % Save_Real(Comm, d, vc, 'time', time) ! Number of processors - call Backup_Mod_Write_Int(Comm, d, vc, 'n_proc', n_proc) + call Backup % Save_Int(Comm, d, vc, 'n_proc', n_proc) ! Bulk flows and pressure drops in each direction - call Backup_Mod_Write_Real(Comm, d, vc, 'bulk_flux_x', bulk % flux_x) - call Backup_Mod_Write_Real(Comm, d, vc, 'bulk_flux_y', bulk % flux_y) - call Backup_Mod_Write_Real(Comm, d, vc, 'bulk_flux_z', bulk % flux_z) - call Backup_Mod_Write_Real(Comm, d, vc, 'bulk_flux_x_o', bulk % flux_x_o) - call Backup_Mod_Write_Real(Comm, d, vc, 'bulk_flux_y_o', bulk % flux_y_o) - call Backup_Mod_Write_Real(Comm, d, vc, 'bulk_flux_z_o', bulk % flux_z_o) - call Backup_Mod_Write_Real(Comm, d, vc, 'bulk_p_drop_x', bulk % p_drop_x) - call Backup_Mod_Write_Real(Comm, d, vc, 'bulk_p_drop_y', bulk % p_drop_y) - call Backup_Mod_Write_Real(Comm, d, vc, 'bulk_p_drop_z', bulk % p_drop_z) + call Backup % Save_Real(Comm, d, vc, 'bulk_flux_x', bulk % flux_x) + call Backup % Save_Real(Comm, d, vc, 'bulk_flux_y', bulk % flux_y) + call Backup % Save_Real(Comm, d, vc, 'bulk_flux_z', bulk % flux_z) + call Backup % Save_Real(Comm, d, vc, 'bulk_flux_x_o', bulk % flux_x_o) + call Backup % Save_Real(Comm, d, vc, 'bulk_flux_y_o', bulk % flux_y_o) + call Backup % Save_Real(Comm, d, vc, 'bulk_flux_z_o', bulk % flux_z_o) + call Backup % Save_Real(Comm, d, vc, 'bulk_p_drop_x', bulk % p_drop_x) + call Backup % Save_Real(Comm, d, vc, 'bulk_p_drop_y', bulk % p_drop_y) + call Backup % Save_Real(Comm, d, vc, 'bulk_p_drop_z', bulk % p_drop_z) !----------------------------! ! ! @@ -87,18 +88,18 @@ subroutine Backup_Mod_Save(Fld, Tur, Vof, Swr, time, time_step, domain) !--------------! ! Velocity ! !--------------! - call Backup_Mod_Write_Variable(d, vc, 'u_velocity', Fld % u) - call Backup_Mod_Write_Variable(d, vc, 'v_velocity', Fld % v) - call Backup_Mod_Write_Variable(d, vc, 'w_velocity', Fld % w) + call Backup % Save_Variable(d, vc, 'u_velocity', Fld % u) + call Backup % Save_Variable(d, vc, 'v_velocity', Fld % v) + call Backup % Save_Variable(d, vc, 'w_velocity', Fld % w) !------------------------------------------------------! ! Pressure, its gradients, and pressure correction ! !------------------------------------------------------! - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'press', Fld % p % n) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'press_x', Fld % p % x) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'press_y', Fld % p % y) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'press_z', Fld % p % z) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'press_corr', Fld % pp % n) + call Backup % Save_Cell_Real(Grid, d, vc, 'press', Fld % p % n) + call Backup % Save_Cell_Real(Grid, d, vc, 'press_x', Fld % p % x) + call Backup % Save_Cell_Real(Grid, d, vc, 'press_y', Fld % p % y) + call Backup % Save_Cell_Real(Grid, d, vc, 'press_z', Fld % p % z) + call Backup % Save_Cell_Real(Grid, d, vc, 'press_corr', Fld % pp % n) !-------------------! ! Volume fluxes ! -> don't use for the time being, too much trouble @@ -118,7 +119,7 @@ subroutine Backup_Mod_Save(Fld, Tur, Vof, Swr, time, time_step, domain) ! ! Update on June 2, 2022: Unified all outlet boundaries into one ! to be able to tell PETSc if matrix for pressure is singular - call Backup_Mod_Write_Log(Comm, d, vc, 'has_pressure', Fld % has_pressure) + call Backup % Save_Log(Comm, d, vc, 'has_pressure', Fld % has_pressure) !--------------! ! ! @@ -126,7 +127,7 @@ subroutine Backup_Mod_Save(Fld, Tur, Vof, Swr, time, time_step, domain) ! ! !--------------! if(Fld % heat_transfer) then - call Backup_Mod_Write_Variable(d, vc, 'temp', Fld % t) + call Backup % Save_Variable(d, vc, 'temp', Fld % t) end if !--------------! @@ -135,7 +136,7 @@ subroutine Backup_Mod_Save(Fld, Tur, Vof, Swr, time, time_step, domain) ! ! !--------------! if(Fld % with_interface) then - call Backup_Mod_Write_Variable(d, vc, 'vof_fun', Vof % fun) + call Backup % Save_Variable(d, vc, 'vof_fun', Vof % fun) end if !-----------------------! @@ -150,20 +151,20 @@ subroutine Backup_Mod_Save(Fld, Tur, Vof, Swr, time, time_step, domain) if(Tur % model .eq. K_EPS) then ! K and epsilon - call Backup_Mod_Write_Variable(d, vc, 'kin', Tur % kin) - call Backup_Mod_Write_Variable(d, vc, 'eps', Tur % eps) + call Backup % Save_Variable(d, vc, 'kin', Tur % kin) + call Backup % Save_Variable(d, vc, 'eps', Tur % eps) ! Other turbulent quantities - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'p_kin', Tur % p_kin ) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'y_plus', Tur % y_plus) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'vis_t', Tur % vis_t ) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'vis_w', Tur % vis_w ) + call Backup % Save_Cell_Real(Grid, d, vc, 'p_kin', Tur % p_kin ) + call Backup % Save_Cell_Real(Grid, d, vc, 'y_plus', Tur % y_plus) + call Backup % Save_Cell_Real(Grid, d, vc, 'vis_t', Tur % vis_t ) + call Backup % Save_Cell_Real(Grid, d, vc, 'vis_w', Tur % vis_w ) ! Turbulence quantities connected with heat transfer if(Fld % heat_transfer) then - call Backup_Mod_Write_Variable(d, vc, 't2', Tur % t2) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'p_t2', Tur % p_t2 ) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'con_w', Tur % con_w) + call Backup % Save_Variable(d, vc, 't2', Tur % t2) + call Backup % Save_Cell_Real(Grid, d, vc, 'p_t2', Tur % p_t2 ) + call Backup % Save_Cell_Real(Grid, d, vc, 'con_w', Tur % con_w) end if end if @@ -175,23 +176,23 @@ subroutine Backup_Mod_Save(Fld, Tur, Vof, Swr, time, time_step, domain) Tur % model .eq. HYBRID_LES_RANS) then ! K, eps, zeta and f22 - call Backup_Mod_Write_Variable(d, vc, 'kin', Tur % kin) - call Backup_Mod_Write_Variable(d, vc, 'eps', Tur % eps) - call Backup_Mod_Write_Variable(d, vc, 'zeta', Tur % zeta) - call Backup_Mod_Write_Variable(d, vc, 'f22', Tur % f22) + call Backup % Save_Variable(d, vc, 'kin', Tur % kin) + call Backup % Save_Variable(d, vc, 'eps', Tur % eps) + call Backup % Save_Variable(d, vc, 'zeta', Tur % zeta) + call Backup % Save_Variable(d, vc, 'f22', Tur % f22) ! Other turbulent quantities - call Backup_Mod_Write_Cell_Real(Grid, d, vc,'p_kin', Tur % p_kin ) - call Backup_Mod_Write_Cell_Real(Grid, d, vc,'y_plus', Tur % y_plus ) - call Backup_Mod_Write_Cell_Real(Grid, d, vc,'vis_t', Tur % vis_t ) - call Backup_Mod_Write_Cell_Real(Grid, d, vc,'vis_w', Tur % vis_w ) - call Backup_Mod_Write_Cell_Real(Grid, d, vc,'t_scale', Tur % t_scale) - call Backup_Mod_Write_Cell_Real(Grid, d, vc,'l_scale', Tur % l_scale) + call Backup % Save_Cell_Real(Grid, d, vc,'p_kin', Tur % p_kin ) + call Backup % Save_Cell_Real(Grid, d, vc,'y_plus', Tur % y_plus ) + call Backup % Save_Cell_Real(Grid, d, vc,'vis_t', Tur % vis_t ) + call Backup % Save_Cell_Real(Grid, d, vc,'vis_w', Tur % vis_w ) + call Backup % Save_Cell_Real(Grid, d, vc,'t_scale', Tur % t_scale) + call Backup % Save_Cell_Real(Grid, d, vc,'l_scale', Tur % l_scale) if(Fld % heat_transfer) then - call Backup_Mod_Write_Variable(d, vc, 't2', Tur % t2) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'p_t2', Tur % p_t2 ) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'con_w', Tur % con_w) + call Backup % Save_Variable(d, vc, 't2', Tur % t2) + call Backup % Save_Cell_Real(Grid, d, vc, 'p_t2', Tur % p_t2 ) + call Backup % Save_Cell_Real(Grid, d, vc, 'con_w', Tur % con_w) end if end if @@ -203,28 +204,28 @@ subroutine Backup_Mod_Save(Fld, Tur, Vof, Swr, time, time_step, domain) Tur % model .eq. RSM_HANJALIC_JAKIRLIC) then ! Reynolds stresses - call Backup_Mod_Write_Variable(d, vc, 'uu', Tur % uu) - call Backup_Mod_Write_Variable(d, vc, 'vv', Tur % vv) - call Backup_Mod_Write_Variable(d, vc, 'ww', Tur % ww) - call Backup_Mod_Write_Variable(d, vc, 'uv', Tur % uv) - call Backup_Mod_Write_Variable(d, vc, 'uw', Tur % uw) - call Backup_Mod_Write_Variable(d, vc, 'vw', Tur % vw) + call Backup % Save_Variable(d, vc, 'uu', Tur % uu) + call Backup % Save_Variable(d, vc, 'vv', Tur % vv) + call Backup % Save_Variable(d, vc, 'ww', Tur % ww) + call Backup % Save_Variable(d, vc, 'uv', Tur % uv) + call Backup % Save_Variable(d, vc, 'uw', Tur % uw) + call Backup % Save_Variable(d, vc, 'vw', Tur % vw) ! Epsilon - call Backup_Mod_Write_Variable(d, vc, 'eps', Tur % eps) + call Backup % Save_Variable(d, vc, 'eps', Tur % eps) ! F22 if(Tur % model .eq. RSM_MANCEAU_HANJALIC) then - call Backup_Mod_Write_Variable(d, vc, 'f22', Tur % f22) + call Backup % Save_Variable(d, vc, 'f22', Tur % f22) end if ! Other turbulent quantities - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'vis_t', Tur % vis_t) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'vis_w', Tur % vis_w) + call Backup % Save_Cell_Real(Grid, d, vc, 'vis_t', Tur % vis_t) + call Backup % Save_Cell_Real(Grid, d, vc, 'vis_w', Tur % vis_w) ! Turbulence quantities connected with heat transfer if(Fld % heat_transfer) then - call Backup_Mod_Write_Cell_Real(Grid, d, vc,'con_w', Tur % con_w) + call Backup % Save_Cell_Real(Grid, d, vc,'con_w', Tur % con_w) end if end if @@ -232,7 +233,7 @@ subroutine Backup_Mod_Save(Fld, Tur, Vof, Swr, time, time_step, domain) ! Roughness ! !--------------! if(Tur % rough_walls) then - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'z_o', Tur % z_o) + call Backup % Save_Cell_Real(Grid, d, vc, 'z_o', Tur % z_o) end if !------------------! @@ -240,7 +241,7 @@ subroutine Backup_Mod_Save(Fld, Tur, Vof, Swr, time, time_step, domain) !------------------! do sc = 1, Fld % n_scalars phi => Fld % scalar(sc) - call Backup_Mod_Write_Variable(d, vc, phi % name, phi) + call Backup % Save_Variable(d, vc, phi % name, phi) end do !-----------------------------------------! @@ -250,85 +251,65 @@ subroutine Backup_Mod_Save(Fld, Tur, Vof, Swr, time, time_step, domain) !-----------------------------------------! if(Tur % statistics) then - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'u_mean', Tur % u_mean) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'v_mean', Tur % v_mean) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'w_mean', Tur % w_mean) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'p_mean', Tur % p_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'u_mean', Tur % u_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'v_mean', Tur % v_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'w_mean', Tur % w_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'p_mean', Tur % p_mean) if(Fld % heat_transfer) then - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 't_mean', Tur % t_mean) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'q_mean', Tur % q_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 't_mean', Tur % t_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'q_mean', Tur % q_mean) end if ! K and epsilon if(Tur % model .eq. K_EPS) then - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'kin_mean', & - Tur % kin_mean) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'eps_mean', & - Tur % eps_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'kin_mean', Tur % kin_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'eps_mean', Tur % eps_mean) if(Fld % heat_transfer) then - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 't2_mean', & - Tur % t2_mean) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'ut_mean', & - Tur % ut_mean) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'vt_mean', & - Tur % vt_mean) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'wt_mean', & - Tur % wt_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 't2_mean', Tur % t2_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'ut_mean', Tur % ut_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'vt_mean', Tur % vt_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'wt_mean', Tur % wt_mean) end if end if ! K-eps-zeta-f and the hybrid model if(Tur % model .eq. K_EPS_ZETA_F .or. & Tur % model .eq. HYBRID_LES_RANS) then - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'kin_mean', & - Tur % kin_mean ) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'eps_mean', & - Tur % eps_mean ) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'zeta_mean', & - Tur % zeta_mean) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'f22_mean', & - Tur % f22_mean ) + call Backup % Save_Cell_Real(Grid, d, vc, 'kin_mean', Tur % kin_mean ) + call Backup % Save_Cell_Real(Grid, d, vc, 'eps_mean', Tur % eps_mean ) + call Backup % Save_Cell_Real(Grid, d, vc, 'zeta_mean', Tur % zeta_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'f22_mean', Tur % f22_mean ) if(Fld % heat_transfer) then - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 't2_mean', & - Tur % t2_mean) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'ut_mean', & - Tur % ut_mean) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'vt_mean', & - Tur % vt_mean) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'wt_mean', & - Tur % wt_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 't2_mean', Tur % t2_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'ut_mean', Tur % ut_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'vt_mean', Tur % vt_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'wt_mean', Tur % wt_mean) end if end if ! Reynolds stress models if(Tur % model .eq. RSM_MANCEAU_HANJALIC .or. & Tur % model .eq. RSM_HANJALIC_JAKIRLIC) then - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'uu_mean', & - Tur % uu_mean) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'vv_mean', & - Tur % vv_mean) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'ww_mean', & - Tur % ww_mean) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'uv_mean', & - Tur % uv_mean) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'uw_mean', & - Tur % uw_mean) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'vw_mean', & - Tur % vw_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'uu_mean', Tur % uu_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'vv_mean', Tur % vv_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'ww_mean', Tur % ww_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'uv_mean', Tur % uv_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'uw_mean', Tur % uw_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'vw_mean', Tur % vw_mean) end if - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'uu_res', Tur % uu_res) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'vv_res', Tur % vv_res) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'ww_res', Tur % ww_res) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'uv_res', Tur % uv_res) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'uw_res', Tur % uw_res) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'vw_res', Tur % vw_res) + call Backup % Save_Cell_Real(Grid, d, vc, 'uu_res', Tur % uu_res) + call Backup % Save_Cell_Real(Grid, d, vc, 'vv_res', Tur % vv_res) + call Backup % Save_Cell_Real(Grid, d, vc, 'ww_res', Tur % ww_res) + call Backup % Save_Cell_Real(Grid, d, vc, 'uv_res', Tur % uv_res) + call Backup % Save_Cell_Real(Grid, d, vc, 'uw_res', Tur % uw_res) + call Backup % Save_Cell_Real(Grid, d, vc, 'vw_res', Tur % vw_res) if(Fld % heat_transfer) then - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 't2_res', Tur % t2_res) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'ut_res', Tur % ut_res) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'vt_res', Tur % vt_res) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'wt_res', Tur % wt_res) + call Backup % Save_Cell_Real(Grid, d, vc, 't2_res', Tur % t2_res) + call Backup % Save_Cell_Real(Grid, d, vc, 'ut_res', Tur % ut_res) + call Backup % Save_Cell_Real(Grid, d, vc, 'vt_res', Tur % vt_res) + call Backup % Save_Cell_Real(Grid, d, vc, 'wt_res', Tur % wt_res) end if ! Scalars @@ -336,8 +317,8 @@ subroutine Backup_Mod_Save(Fld, Tur, Vof, Swr, time, time_step, domain) phi => Fld % scalar(sc) name_mean = phi % name name_mean(5:9) = '_mean' - call Backup_Mod_Write_Cell_Real(Grid, d, vc, name_mean, & - Tur % scalar_mean(sc, :)) + call Backup % Save_Cell_Real(Grid, d, vc, name_mean, & + Tur % scalar_mean(sc, :)) end do end if @@ -348,15 +329,13 @@ subroutine Backup_Mod_Save(Fld, Tur, Vof, Swr, time, time_step, domain) ! ! !--------------------------! if(Fld % with_particles) then - call Backup_Mod_Write_Swarm(d, vc, Swr) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'n_deposited', & - Swr % n_deposited) - call Backup_Mod_Write_Cell_Real(Grid, d, vc, 'n_reflected', & - Swr % n_reflected) + call Backup % Save_Swarm(d, vc, Swr) + call Backup % Save_Cell_Real(Grid, d, vc, 'n_deposited', Swr % n_deposited) + call Backup % Save_Cell_Real(Grid, d, vc, 'n_reflected', Swr % n_reflected) end if ! Variable count (store +1 to count its own self) - call Backup_Mod_Write_Int(Comm, d, vc, 'variable_count', vc + 1) + call Backup % Save_Int(Comm, d, vc, 'variable_count', vc + 1) if(this_proc < 2) then print *, '# Wrote ', vc, ' variables!' diff --git a/Sources/Process/Backup_Mod/Write_Cell_Real.f90 b/Sources/Process/Backup_Mod/Save_Cell_Real.f90 similarity index 93% rename from Sources/Process/Backup_Mod/Write_Cell_Real.f90 rename to Sources/Process/Backup_Mod/Save_Cell_Real.f90 index b09389469..873a67deb 100644 --- a/Sources/Process/Backup_Mod/Write_Cell_Real.f90 +++ b/Sources/Process/Backup_Mod/Save_Cell_Real.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Backup_Mod_Write_Cell_Real(Grid, disp, vc, var_name, array) + subroutine Save_Cell_Real(Backup, Grid, disp, vc, var_name, array) !------------------------------------------------------------------------------! ! Writes a vector variable with boundary cells to backup file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Backup_Type) :: Backup type(Grid_Type), target :: Grid integer(DP) :: disp integer :: vc diff --git a/Sources/Process/Backup_Mod/Write_Face_Real.f90 b/Sources/Process/Backup_Mod/Save_Face_Real.f90 similarity index 86% rename from Sources/Process/Backup_Mod/Write_Face_Real.f90 rename to Sources/Process/Backup_Mod/Save_Face_Real.f90 index 243bd4f51..f19306340 100644 --- a/Sources/Process/Backup_Mod/Write_Face_Real.f90 +++ b/Sources/Process/Backup_Mod/Save_Face_Real.f90 @@ -1,18 +1,18 @@ !==============================================================================! - subroutine Backup_Mod_Write_Face_Real(Grid, disp, vc, var_name, array, & - correct_sign) + subroutine Save_Face_Real(Backup, Grid, disp, vc, var_name, array, corr_sign) !------------------------------------------------------------------------------! ! Writes a vector variable with face values backup file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Backup_Type) :: Backup type(Grid_Type), target :: Grid integer(DP) :: disp integer :: vc character(len=*) :: var_name real :: array(Grid % n_faces) - logical, optional :: correct_sign ! for face fluxes, signs might have - ! to be changed (check it one day) + logical, optional :: corr_sign ! for face fluxes, signs might have + ! to be changed (check it one day) !-----------------------------------[Locals]-----------------------------------! type(Comm_Type), pointer :: Comm character(len=80) :: vn diff --git a/Sources/Process/Backup_Mod/Write_Int.f90 b/Sources/Process/Backup_Mod/Save_Int.f90 similarity index 79% rename from Sources/Process/Backup_Mod/Write_Int.f90 rename to Sources/Process/Backup_Mod/Save_Int.f90 index ab36759a0..6b2643bce 100644 --- a/Sources/Process/Backup_Mod/Write_Int.f90 +++ b/Sources/Process/Backup_Mod/Save_Int.f90 @@ -1,15 +1,16 @@ !==============================================================================! - subroutine Backup_Mod_Write_Int(Comm, disp, vc, var_name, var_value) + subroutine Save_Int(Backup, Comm, disp, vc, var_name, var_value) !------------------------------------------------------------------------------! ! Writes a single named integer variable to backup file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Comm_Type) :: Comm - integer(DP) :: disp - integer :: vc - character(len=*) :: var_name - integer :: var_value + class(Backup_Type) :: Backup + type(Comm_Type) :: Comm + integer(DP) :: disp + integer :: vc + character(len=*) :: var_name + integer :: var_value !-----------------------------------[Locals]-----------------------------------! character(SL) :: vn integer :: vs ! variable size diff --git a/Sources/Process/Backup_Mod/Write_Int_Array.f90 b/Sources/Process/Backup_Mod/Save_Int_Array.f90 similarity index 91% rename from Sources/Process/Backup_Mod/Write_Int_Array.f90 rename to Sources/Process/Backup_Mod/Save_Int_Array.f90 index 873d05480..e713f4cca 100644 --- a/Sources/Process/Backup_Mod/Write_Int_Array.f90 +++ b/Sources/Process/Backup_Mod/Save_Int_Array.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Backup_Mod_Write_Int_Array(Comm, disp, vc, arr_name, arr_value) + subroutine Save_Int_Array(Backup, Comm, disp, vc, arr_name, arr_value) !------------------------------------------------------------------------------! ! Writes a named integer array to backup file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Backup_Type) :: Backup type(Comm_Type) :: Comm integer(DP) :: disp integer :: vc diff --git a/Sources/Process/Backup_Mod/Write_Log.f90 b/Sources/Process/Backup_Mod/Save_Log.f90 similarity index 79% rename from Sources/Process/Backup_Mod/Write_Log.f90 rename to Sources/Process/Backup_Mod/Save_Log.f90 index 921b9b04d..70fc1293f 100644 --- a/Sources/Process/Backup_Mod/Write_Log.f90 +++ b/Sources/Process/Backup_Mod/Save_Log.f90 @@ -1,15 +1,16 @@ !==============================================================================! - subroutine Backup_Mod_Write_Log(Comm, disp, vc, var_name, var_value) + subroutine Save_Log(Backup, Comm, disp, vc, var_name, var_value) !------------------------------------------------------------------------------! ! Writes a named logical variable to backup file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Comm_Type) :: Comm - integer(DP) :: disp - integer :: vc - character(len=*) :: var_name - logical :: var_value + class(Backup_Type) :: Backup + type(Comm_Type) :: Comm + integer(DP) :: disp + integer :: vc + character(len=*) :: var_name + logical :: var_value !-----------------------------------[Locals]-----------------------------------! character(SL) :: vn integer :: vs ! variable size diff --git a/Sources/Process/Backup_Mod/Write_Log_Array.f90 b/Sources/Process/Backup_Mod/Save_Log_Array.f90 similarity index 91% rename from Sources/Process/Backup_Mod/Write_Log_Array.f90 rename to Sources/Process/Backup_Mod/Save_Log_Array.f90 index cb7cdf945..9785447c0 100644 --- a/Sources/Process/Backup_Mod/Write_Log_Array.f90 +++ b/Sources/Process/Backup_Mod/Save_Log_Array.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Backup_Mod_Write_Log_Array(Comm, disp, vc, arr_name, arr_value) + subroutine Save_Log_Array(Backup, Comm, disp, vc, arr_name, arr_value) !------------------------------------------------------------------------------! ! Writes a named logical array to backup file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Backup_Type) :: Backup type(Comm_Type) :: Comm integer(DP) :: disp integer :: vc diff --git a/Sources/Process/Backup_Mod/Write_Real.f90 b/Sources/Process/Backup_Mod/Save_Real.f90 similarity index 79% rename from Sources/Process/Backup_Mod/Write_Real.f90 rename to Sources/Process/Backup_Mod/Save_Real.f90 index 459d5fc9f..4995bb588 100644 --- a/Sources/Process/Backup_Mod/Write_Real.f90 +++ b/Sources/Process/Backup_Mod/Save_Real.f90 @@ -1,15 +1,16 @@ !==============================================================================! - subroutine Backup_Mod_Write_Real(Comm, disp, vc, var_name, var_value) + subroutine Save_Real(Backup, Comm, disp, vc, var_name, var_value) !------------------------------------------------------------------------------! ! Writes a single named real variable to backup file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Comm_Type) :: Comm - integer(DP) :: disp - integer :: vc - character(len=*) :: var_name - real :: var_value + class(Backup_Type) :: Backup + type(Comm_Type) :: Comm + integer(DP) :: disp + integer :: vc + character(len=*) :: var_name + real :: var_value !-----------------------------------[Locals]-----------------------------------! character(SL) :: vn integer :: vs ! variable size diff --git a/Sources/Process/Backup_Mod/Write_Real_Array.f90 b/Sources/Process/Backup_Mod/Save_Real_Array.f90 similarity index 90% rename from Sources/Process/Backup_Mod/Write_Real_Array.f90 rename to Sources/Process/Backup_Mod/Save_Real_Array.f90 index 3199904b7..6d56d4004 100644 --- a/Sources/Process/Backup_Mod/Write_Real_Array.f90 +++ b/Sources/Process/Backup_Mod/Save_Real_Array.f90 @@ -1,11 +1,11 @@ !==============================================================================! - subroutine Backup_Mod_Write_Real_Array(Comm, disp, & - vc, arr_name, arr_value) + subroutine Save_Real_Array(Backup, Comm, disp, vc, arr_name, arr_value) !------------------------------------------------------------------------------! ! Writes a name real array to backup file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Backup_Type) :: Backup type(Comm_Type) :: Comm integer(DP) :: disp integer :: vc diff --git a/Sources/Process/Backup_Mod/Write_Swarm.f90 b/Sources/Process/Backup_Mod/Save_Swarm.f90 similarity index 78% rename from Sources/Process/Backup_Mod/Write_Swarm.f90 rename to Sources/Process/Backup_Mod/Save_Swarm.f90 index f18a7fc49..a3feea96b 100644 --- a/Sources/Process/Backup_Mod/Write_Swarm.f90 +++ b/Sources/Process/Backup_Mod/Save_Swarm.f90 @@ -1,13 +1,14 @@ !==============================================================================! - subroutine Backup_Mod_Write_Swarm(disp, vc, Swr) + subroutine Save_Swarm(Backup, disp, vc, Swr) !------------------------------------------------------------------------------! ! Saves backup files name.backup ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Backup_Type) :: Backup + type(Swarm_Type), target :: Swr integer(DP) :: disp integer :: vc - type(Swarm_Type), target :: Swr !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Comm_Type), pointer :: Comm @@ -26,8 +27,7 @@ subroutine Backup_Mod_Write_Swarm(disp, vc, Swr) !--------------------------! ! Number of particles - call Backup_Mod_Write_Int(Comm, disp, vc, 'n_particles', & - Swr % n_particles) + call Backup % Save_Int(Comm, disp, vc, 'n_particles', Swr % n_particles) !----------------------------------------------! ! Write only if there are active particles ! @@ -74,15 +74,15 @@ subroutine Backup_Mod_Write_Swarm(disp, vc, Swr) call Comm_Mod_Global_Sum_Real_Array(Swr % n_particles * Swr % N_R_VARS, & Swr % r_work) - call Backup_Mod_Write_Int_Array(Comm, disp, vc, & - 'particle_int_data', & - Swr % i_work(1 : Swr % N_I_VARS*Swr % n_particles)) - call Backup_Mod_Write_Log_Array(Comm, disp, vc, & - 'particle_log_data', & - Swr % l_work(1 : Swr % N_L_VARS*Swr % n_particles)) - call Backup_Mod_Write_Real_Array(Comm, disp, vc, & - 'particle_real_data', & - Swr % r_work(1 : Swr % N_R_VARS*Swr % n_particles)) + call Backup % Save_Int_Array(Comm, disp, vc, & + 'particle_int_data', & + Swr % i_work(1 : Swr % N_I_VARS*Swr % n_particles)) + call Backup % Save_Log_Array(Comm, disp, vc, & + 'particle_log_data', & + Swr % l_work(1 : Swr % N_L_VARS*Swr % n_particles)) + call Backup % Save_Real_Array(Comm, disp, vc, & + 'particle_real_data', & + Swr % r_work(1 : Swr % N_R_VARS*Swr % n_particles)) end if end subroutine diff --git a/Sources/Process/Backup_Mod/Write_Variable.f90 b/Sources/Process/Backup_Mod/Save_Variable.f90 similarity index 88% rename from Sources/Process/Backup_Mod/Write_Variable.f90 rename to Sources/Process/Backup_Mod/Save_Variable.f90 index 83b787e4d..9ece05b66 100644 --- a/Sources/Process/Backup_Mod/Write_Variable.f90 +++ b/Sources/Process/Backup_Mod/Save_Variable.f90 @@ -1,14 +1,15 @@ !==============================================================================! - subroutine Backup_Mod_Write_Variable(disp, vc, var_name, var) + subroutine Save_Variable(Backup, disp, vc, var_name, var) !------------------------------------------------------------------------------! ! Writes a whole variable to backup file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer(DP) :: disp - integer :: vc - character(len=*) :: var_name - type(Var_Type) :: var + class(Backup_Type) :: Backup + integer(DP) :: disp + integer :: vc + character(len=*) :: var_name + type(Var_Type) :: var !-----------------------------------[Locals]-----------------------------------! type(Comm_Type), pointer :: Comm character(SL) :: vn diff --git a/Sources/Process/Backup_Mod/Time_To_Save.f90 b/Sources/Process/Backup_Mod/Time_To_Save_Backup.f90 similarity index 66% rename from Sources/Process/Backup_Mod/Time_To_Save.f90 rename to Sources/Process/Backup_Mod/Time_To_Save_Backup.f90 index eeba39c99..26f0e512a 100644 --- a/Sources/Process/Backup_Mod/Time_To_Save.f90 +++ b/Sources/Process/Backup_Mod/Time_To_Save_Backup.f90 @@ -1,12 +1,13 @@ !==============================================================================! - logical function Backup_Mod_Time_To_Save(curr_dt) + logical function Time_To_Save_Backup(Backup, curr_dt) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer :: curr_dt ! current time step + class(Backup_Type) :: Backup + integer :: curr_dt ! current time step !==============================================================================! - Backup_Mod_Time_To_Save = mod(curr_dt, backup % interval) .eq. 0 & + Time_To_Save_Backup = mod(curr_dt, backup % interval) .eq. 0 & .and. .not. curr_dt .eq. 0 end function diff --git a/Sources/Process/Main_Pro.f90 b/Sources/Process/Main_Pro.f90 index 1eb8d4cb4..f3596b2e6 100644 --- a/Sources/Process/Main_Pro.f90 +++ b/Sources/Process/Main_Pro.f90 @@ -161,8 +161,8 @@ program Process_Prog ! Read backup file if directed so, and set the "backup" to .true. or .false. do d = 1, n_dom call Control_Mod_Switch_To_Domain(d) ! take proper control file - call Backup_Mod_Load(Flow(d), Turb(d), Vof(d), Swarm(d), & - time, first_dt, read_backup(d)) + call Backup % Load(Flow(d), Turb(d), Vof(d), Swarm(d), & + time, first_dt, read_backup(d)) ! Initialize variables if(.not. read_backup(d)) then diff --git a/Sources/Process/Results_Mod.f90 b/Sources/Process/Results_Mod.f90 index 7eb189fa6..74a933019 100644 --- a/Sources/Process/Results_Mod.f90 +++ b/Sources/Process/Results_Mod.f90 @@ -38,7 +38,7 @@ module Results_Mod procedure, private :: Save_Vtu_Tensor_6_Real procedure, private :: Save_Vtu_Tensor_9_Real procedure, private :: Save_Vtu_Vector_Real - procedure, private :: Time_To_Save + procedure, private :: Time_To_Save_Results procedure, private :: Time_To_Save_Swarm end type @@ -57,7 +57,7 @@ module Results_Mod # include "Results_Mod/Save_Vtu_Tensor_9_Real.f90" # include "Results_Mod/Save_Vtu_Vector_Real.f90" # include "Results_Mod/Save_Vtu_Surf.f90" -# include "Results_Mod/Time_To_Save.f90" +# include "Results_Mod/Time_To_Save_Results.f90" # include "Results_Mod/Time_To_Save_Swarm.f90" end module diff --git a/Sources/Process/Results_Mod/Main_Results.f90 b/Sources/Process/Results_Mod/Main_Results.f90 index b10ea7653..117c8d23d 100644 --- a/Sources/Process/Results_Mod/Main_Results.f90 +++ b/Sources/Process/Results_Mod/Main_Results.f90 @@ -26,23 +26,23 @@ subroutine Main_Results(Results, & inquire(file='save_now', exist=save_now) ! Is it time to save the backup file? - if(curr_dt .eq. last_dt .or. & - save_now .or. & - exit_now .or. & - Backup_Mod_Time_To_Save(curr_dt) .or. & + if(curr_dt .eq. last_dt .or. & + save_now .or. & + exit_now .or. & + Backup % Time_To_Save_Backup(curr_dt) .or. & Info_Mod_Time_To_Exit()) then do d = 1, n_dom call Control_Mod_Switch_To_Domain(d) - call Backup_Mod_Save(Flow(d), Turb(d), Vof(d), Swarm(d), & - time, curr_dt, domain=d) + call Backup % Save(Flow(d), Turb(d), Vof(d), Swarm(d), & + time, curr_dt, dom=d) end do end if ! Is it time to save results for post-processing? - if(curr_dt .eq. last_dt .or. & - save_now .or. & - exit_now .or. & - Results % Time_To_Save(curr_dt) .or. & + if(curr_dt .eq. last_dt .or. & + save_now .or. & + exit_now .or. & + Results % Time_To_Save_Results(curr_dt) .or. & Info_Mod_Time_To_Exit()) then do d = 1, n_dom diff --git a/Sources/Process/Results_Mod/Time_To_Save.f90 b/Sources/Process/Results_Mod/Time_To_Save_Results.f90 similarity index 62% rename from Sources/Process/Results_Mod/Time_To_Save.f90 rename to Sources/Process/Results_Mod/Time_To_Save_Results.f90 index 3a466b07e..ebc0a1fd3 100644 --- a/Sources/Process/Results_Mod/Time_To_Save.f90 +++ b/Sources/Process/Results_Mod/Time_To_Save_Results.f90 @@ -1,5 +1,5 @@ !==============================================================================! - logical function Time_To_Save(Results, curr_dt) + logical function Time_To_Save_Results(Results, curr_dt) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -7,8 +7,8 @@ logical function Time_To_Save(Results, curr_dt) integer :: curr_dt ! current time step !==============================================================================! - Time_To_Save = mod(curr_dt, Results % interval) .eq. 0 & - .or. & - curr_dt .eq. 0 .and. Results % initial + Time_To_Save_Results = mod(curr_dt, Results % interval) .eq. 0 & + .or. & + curr_dt .eq. 0 .and. Results % initial end function From e328de808a9db220f7e7ebb28e8334994d532ade Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 23 Mar 2023 09:51:10 +0100 Subject: [PATCH 122/223] Uses browsing macro. On branch bojan_fixed_cell_ranges modified: Front_Mod.f90 modified: Front_Mod/Place_Front_At_Value.f90 --- Sources/Process/Front_Mod.f90 | 1 + Sources/Process/Front_Mod/Place_Front_At_Value.f90 | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Sources/Process/Front_Mod.f90 b/Sources/Process/Front_Mod.f90 index 8e348ee3b..23097762b 100644 --- a/Sources/Process/Front_Mod.f90 +++ b/Sources/Process/Front_Mod.f90 @@ -1,4 +1,5 @@ #include "../Shared/Assert.h90" +#include "../Shared/Browse.h90" !==============================================================================! module Front_Mod diff --git a/Sources/Process/Front_Mod/Place_Front_At_Value.f90 b/Sources/Process/Front_Mod/Place_Front_At_Value.f90 index 14a880265..dcd62ceee 100644 --- a/Sources/Process/Front_Mod/Place_Front_At_Value.f90 +++ b/Sources/Process/Front_Mod/Place_Front_At_Value.f90 @@ -80,7 +80,7 @@ subroutine Place_Front_At_Value(Front, sharp, verbose) ! Browse through all cells in search of surface vertices ! ! ! !------------------------------------------------------------! - do c = 1, Grid % n_cells - Grid % Comm % n_buff_cells + do c = Cells_In_Domain() phi_cell_min = HUGE phi_cell_max = -HUGE do i_nod = 1, abs(Grid % cells_n_nodes(c)) From 3c7f4cd0f3f9a79cafba9e51cbce2fee5213e396 Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 23 Mar 2023 09:52:00 +0100 Subject: [PATCH 123/223] Calls Message module for error. On branch bojan_fixed_cell_ranges modified: Front_Mod/Calculate_Element_Normals.f90 --- Sources/Process/Front_Mod/Calculate_Element_Normals.f90 | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Sources/Process/Front_Mod/Calculate_Element_Normals.f90 b/Sources/Process/Front_Mod/Calculate_Element_Normals.f90 index 4b40d0a22..73783523b 100644 --- a/Sources/Process/Front_Mod/Calculate_Element_Normals.f90 +++ b/Sources/Process/Front_Mod/Calculate_Element_Normals.f90 @@ -13,6 +13,7 @@ subroutine Calculate_Element_Normals(Front) integer :: e, j, v1, v2, i_ver real :: surf_v(3) real :: a(3), b(3), tri_v(3), area_x2 + character(SL) :: str !==============================================================================! ! Take aliases @@ -31,6 +32,8 @@ subroutine Calculate_Element_Normals(Front) Elem(e) % sy = 0.0 Elem(e) % sz = 0.0 + Assert(Elem(e) % nv > 2) + do i_ver = 1, Elem(e) % nv v1 = Elem(e) % v(i_ver) @@ -74,8 +77,10 @@ subroutine Calculate_Element_Normals(Front) surf_v(3) = Vert(Elem(e) % v(j)) % smooth_z if(dot_product(surf_v, tri_v) < 0.0) then - print *, '# Error, element ', e, 'is not properly oriented!' - stop + write(str, '(i0.0)') e + call Message % Error(60, & + ' Element '//trim(str)//' is not properly oriented! ', & + file=__FILE__, line=__LINE__) end if end do ! for i, j, k From 413444b51d3ffd14793d4a60608ec6feacadd1b0 Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 23 Mar 2023 10:25:26 +0100 Subject: [PATCH 124/223] Track front instead of surface. On branch bojan_fixed_cell_ranges modified: control --- Tests/Vof/Fuel_Bundle/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Vof/Fuel_Bundle/control b/Tests/Vof/Fuel_Bundle/control index 22e5ebf31..94ea464e9 100644 --- a/Tests/Vof/Fuel_Bundle/control +++ b/Tests/Vof/Fuel_Bundle/control @@ -4,7 +4,7 @@ PROBLEM_NAME fuel_bundle HEAT_TRANSFER no INTERFACE_TRACKING yes - TRACK_SURFACE yes + TRACK_FRONT yes NUMBER_OF_TIME_STEPS 1200 RESULTS_SAVE_INTERVAL 10 From efca804f5d20b900f7f9306dbd352b56bc7b1a4e Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 23 Mar 2023 10:25:52 +0100 Subject: [PATCH 125/223] Calculate distance from the wall in Convert On branch bojan_fixed_cell_ranges modified: convert.scr --- Tests/Vof/Fuel_Bundle/convert.scr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Vof/Fuel_Bundle/convert.scr b/Tests/Vof/Fuel_Bundle/convert.scr index d789cac7e..19021a4a1 100644 --- a/Tests/Vof/Fuel_Bundle/convert.scr +++ b/Tests/Vof/Fuel_Bundle/convert.scr @@ -3,6 +3,6 @@ no skip 1 skip -skip +1 skip From edc680047c746f8c9d11ede7a3078446306bd297 Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 23 Mar 2023 10:26:30 +0100 Subject: [PATCH 126/223] Changed some local variable names in Backup_Mod On branch bojan_fixed_cell_ranges modified: Backup_Mod.f90 modified: Backup_Mod/Load.f90 modified: Backup_Mod/Load_Cell_Real.f90 modified: Backup_Mod/Load_Int.f90 modified: Backup_Mod/Load_Int_Array.f90 modified: Backup_Mod/Load_Log.f90 modified: Backup_Mod/Load_Log_Array.f90 modified: Backup_Mod/Load_Real.f90 modified: Backup_Mod/Load_Real_Array.f90 modified: Backup_Mod/Load_Swarm.f90 modified: Backup_Mod/Load_Variable.f90 modified: Backup_Mod/Save.f90 modified: Backup_Mod/Save_Cell_Real.f90 modified: Backup_Mod/Save_Face_Real.f90 modified: Backup_Mod/Save_Int.f90 modified: Backup_Mod/Save_Int_Array.f90 modified: Backup_Mod/Save_Log.f90 modified: Backup_Mod/Save_Log_Array.f90 modified: Backup_Mod/Save_Real.f90 modified: Backup_Mod/Save_Real_Array.f90 modified: Backup_Mod/Save_Swarm.f90 modified: Backup_Mod/Save_Variable.f90 --- Sources/Process/Backup_Mod.f90 | 4 + Sources/Process/Backup_Mod/Load.f90 | 244 +++++++++--------- Sources/Process/Backup_Mod/Load_Cell_Real.f90 | 2 + Sources/Process/Backup_Mod/Load_Int.f90 | 2 + Sources/Process/Backup_Mod/Load_Int_Array.f90 | 2 + Sources/Process/Backup_Mod/Load_Log.f90 | 2 + Sources/Process/Backup_Mod/Load_Log_Array.f90 | 2 + Sources/Process/Backup_Mod/Load_Real.f90 | 2 + .../Process/Backup_Mod/Load_Real_Array.f90 | 2 + Sources/Process/Backup_Mod/Load_Swarm.f90 | 70 ++--- Sources/Process/Backup_Mod/Load_Variable.f90 | 8 +- Sources/Process/Backup_Mod/Save.f90 | 240 ++++++++--------- Sources/Process/Backup_Mod/Save_Cell_Real.f90 | 2 + Sources/Process/Backup_Mod/Save_Face_Real.f90 | 2 + Sources/Process/Backup_Mod/Save_Int.f90 | 2 + Sources/Process/Backup_Mod/Save_Int_Array.f90 | 2 + Sources/Process/Backup_Mod/Save_Log.f90 | 2 + Sources/Process/Backup_Mod/Save_Log_Array.f90 | 2 + Sources/Process/Backup_Mod/Save_Real.f90 | 2 + .../Process/Backup_Mod/Save_Real_Array.f90 | 2 + Sources/Process/Backup_Mod/Save_Swarm.f90 | 66 ++--- Sources/Process/Backup_Mod/Save_Variable.f90 | 2 + 22 files changed, 351 insertions(+), 313 deletions(-) diff --git a/Sources/Process/Backup_Mod.f90 b/Sources/Process/Backup_Mod.f90 index 3a3bcb989..25c8c2372 100644 --- a/Sources/Process/Backup_Mod.f90 +++ b/Sources/Process/Backup_Mod.f90 @@ -1,3 +1,7 @@ +#include "../Shared/Assert.h90" +#include "../Shared/Browse.h90" +#include "../Shared/Unused.h90" + !==============================================================================! module Backup_Mod !------------------------------------------------------------------------------! diff --git a/Sources/Process/Backup_Mod/Load.f90 b/Sources/Process/Backup_Mod/Load.f90 index f3310eda5..f492a708e 100644 --- a/Sources/Process/Backup_Mod/Load.f90 +++ b/Sources/Process/Backup_Mod/Load.f90 @@ -1,15 +1,15 @@ !==============================================================================! - subroutine Load(Backup, Fld, Tur, Vof, Swr, time, time_step, bckp) + subroutine Load(Backup, Flow, Turb, Vof, Swarm, time, time_step, bckp) !------------------------------------------------------------------------------! ! Loads backup files name.backup ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! class(Backup_Type) :: Backup - type(Field_Type), target :: Fld - type(Turb_Type), target :: Tur + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof - type(Swarm_Type), target :: Swr + type(Swarm_Type), target :: Swarm real :: time ! time of simulation integer :: time_step ! current time step logical :: bckp, present @@ -24,8 +24,8 @@ subroutine Load(Backup, Fld, Tur, Vof, Swr, time, time_step, bckp) !==============================================================================! ! Take aliases - Grid => Fld % pnt_grid - bulk => Fld % bulk + Grid => Flow % pnt_grid + bulk => Flow % bulk Comm => Grid % Comm ! Full name is specified in control file @@ -109,19 +109,19 @@ subroutine Load(Backup, Fld, Tur, Vof, Swr, time, time_step, bckp) !--------------! ! Velocity ! !--------------! - call Backup % Load_Variable(d, vc, 'u_velocity', Fld, Fld % u) - call Backup % Load_Variable(d, vc, 'v_velocity', Fld, Fld % v) - call Backup % Load_Variable(d, vc, 'w_velocity', Fld, Fld % w) + call Backup % Load_Variable(d, vc, 'u_velocity', Flow, Flow % u) + call Backup % Load_Variable(d, vc, 'v_velocity', Flow, Flow % v) + call Backup % Load_Variable(d, vc, 'w_velocity', Flow, Flow % w) !------------------------------------------------------! ! Pressure, its gradients, and pressure correction ! !------------------------------------------------------! - call Backup % Load_Cell_Real(Grid, d, vc, 'press', Fld % p % n) - call Backup % Load_Cell_Real(Grid, d, vc, 'press_x', Fld % p % x) - call Backup % Load_Cell_Real(Grid, d, vc, 'press_y', Fld % p % y) - call Backup % Load_Cell_Real(Grid, d, vc, 'press_z', Fld % p % z) - call Backup % Load_Cell_Real(Grid, d, vc, 'press_corr', Fld % pp % n) - call Fld % Grad_Pressure(Fld % pp) + call Backup % Load_Cell_Real(Grid, d, vc, 'press', Flow % p % n) + call Backup % Load_Cell_Real(Grid, d, vc, 'press_x', Flow % p % x) + call Backup % Load_Cell_Real(Grid, d, vc, 'press_y', Flow % p % y) + call Backup % Load_Cell_Real(Grid, d, vc, 'press_z', Flow % p % z) + call Backup % Load_Cell_Real(Grid, d, vc, 'press_corr', Flow % pp % n) + call Flow % Grad_Pressure(Flow % pp) !-------------------! ! Volume fluxes ! -> don't use for the time being, too much trouble @@ -141,15 +141,15 @@ subroutine Load(Backup, Fld, Tur, Vof, Swr, time, time_step, bckp) ! ! Update on June 2, 2022: Unified all outlet boundaries into one ! to be able to tell PETSc if matrix for pressure is singular - call Backup % Load_Log(Comm, d, vc, 'has_pressure', Fld % has_pressure) + call Backup % Load_Log(Comm, d, vc, 'has_pressure', Flow % has_pressure) !--------------! ! ! ! Enthalpy ! ! ! !--------------! - if(Fld % heat_transfer) then - call Backup % Load_Variable(d, vc, 'temp', Fld, Fld % t) + if(Flow % heat_transfer) then + call Backup % Load_Variable(d, vc, 'temp', Flow, Flow % t) end if !--------------! @@ -157,8 +157,8 @@ subroutine Load(Backup, Fld, Tur, Vof, Swr, time, time_step, bckp) ! Multiphase ! ! ! !--------------! - if(Fld % with_interface) then - call Backup % Load_Variable(d, vc, 'vof_fun', Fld, Vof % fun) + if(Flow % with_interface) then + call Backup % Load_Variable(d, vc, 'vof_fun', Flow, Vof % fun) end if !-----------------------! @@ -170,52 +170,52 @@ subroutine Load(Backup, Fld, Tur, Vof, Swr, time, time_step, bckp) !-----------------! ! K-eps model ! !-----------------! - if(Tur % model .eq. K_EPS) then + if(Turb % model .eq. K_EPS) then ! K and epsilon - call Backup % Load_Variable(d, vc, 'kin', Fld, Tur % kin) - call Backup % Load_Variable(d, vc, 'eps', Fld, Tur % eps) + call Backup % Load_Variable(d, vc, 'kin', Flow, Turb % kin) + call Backup % Load_Variable(d, vc, 'eps', Flow, Turb % eps) ! Other turbulent quantities - call Backup % Load_Cell_Real(Grid, d, vc, 'p_kin', Tur % p_kin ) - call Backup % Load_Cell_Real(Grid, d, vc, 'y_plus', Tur % y_plus) - call Backup % Load_Cell_Real(Grid, d, vc, 'vis_t', Tur % vis_t ) - call Backup % Load_Cell_Real(Grid, d, vc, 'vis_w', Tur % vis_w ) + call Backup % Load_Cell_Real(Grid, d, vc, 'p_kin', Turb % p_kin ) + call Backup % Load_Cell_Real(Grid, d, vc, 'y_plus', Turb % y_plus) + call Backup % Load_Cell_Real(Grid, d, vc, 'vis_t', Turb % vis_t ) + call Backup % Load_Cell_Real(Grid, d, vc, 'vis_w', Turb % vis_w ) ! Turbulence quantities connected with heat transfer - if(Fld % heat_transfer) then - call Backup % Load_Variable(d, vc, 't2', Fld, Tur % t2) - call Backup % Load_Cell_Real(Grid, d, vc, 'p_t2', Tur % p_t2 ) - call Backup % Load_Cell_Real(Grid, d, vc, 'con_w', Tur % con_w) + if(Flow % heat_transfer) then + call Backup % Load_Variable(d, vc, 't2', Flow, Turb % t2) + call Backup % Load_Cell_Real(Grid, d, vc, 'p_t2', Turb % p_t2 ) + call Backup % Load_Cell_Real(Grid, d, vc, 'con_w', Turb % con_w) end if end if !------------------------! ! K-eps-zeta-f model ! !------------------------! - if(Tur % model .eq. K_EPS_ZETA_F .or. & - Tur % model .eq. HYBRID_LES_RANS) then + if(Turb % model .eq. K_EPS_ZETA_F .or. & + Turb % model .eq. HYBRID_LES_RANS) then ! K, eps, zeta and f22 - call Backup % Load_Variable(d, vc, 'kin', Fld, Tur % kin) - call Backup % Load_Variable(d, vc, 'eps', Fld, Tur % eps) - call Backup % Load_Variable(d, vc, 'zeta', Fld, Tur % zeta) - call Backup % Load_Variable(d, vc, 'f22', Fld, Tur % f22) + call Backup % Load_Variable(d, vc, 'kin', Flow, Turb % kin) + call Backup % Load_Variable(d, vc, 'eps', Flow, Turb % eps) + call Backup % Load_Variable(d, vc, 'zeta', Flow, Turb % zeta) + call Backup % Load_Variable(d, vc, 'f22', Flow, Turb % f22) ! Other turbulent quantities - call Backup % Load_Cell_Real(Grid, d, vc,'p_kin', Tur % p_kin ) - call Backup % Load_Cell_Real(Grid, d, vc,'y_plus', Tur % y_plus ) - call Backup % Load_Cell_Real(Grid, d, vc,'vis_t', Tur % vis_t ) - call Backup % Load_Cell_Real(Grid, d, vc,'vis_w', Tur % vis_w ) - call Backup % Load_Cell_Real(Grid, d, vc,'t_scale', Tur % t_scale) - call Backup % Load_Cell_Real(Grid, d, vc,'l_scale', Tur % l_scale) + call Backup % Load_Cell_Real(Grid, d, vc,'p_kin', Turb % p_kin ) + call Backup % Load_Cell_Real(Grid, d, vc,'y_plus', Turb % y_plus ) + call Backup % Load_Cell_Real(Grid, d, vc,'vis_t', Turb % vis_t ) + call Backup % Load_Cell_Real(Grid, d, vc,'vis_w', Turb % vis_w ) + call Backup % Load_Cell_Real(Grid, d, vc,'t_scale', Turb % t_scale) + call Backup % Load_Cell_Real(Grid, d, vc,'l_scale', Turb % l_scale) ! Turbulence quantities connected with heat transfer - if(Fld % heat_transfer) then - call Backup % Load_Variable(d, vc, 't2', Fld, Tur % t2) - call Backup % Load_Cell_Real(Grid, d, vc, 'p_t2', Tur % p_t2 ) - call Backup % Load_Cell_Real(Grid, d, vc, 'con_w', Tur % con_w) + if(Flow % heat_transfer) then + call Backup % Load_Variable(d, vc, 't2', Flow, Turb % t2) + call Backup % Load_Cell_Real(Grid, d, vc, 'p_t2', Turb % p_t2 ) + call Backup % Load_Cell_Real(Grid, d, vc, 'con_w', Turb % con_w) end if end if @@ -223,48 +223,48 @@ subroutine Load(Backup, Fld, Tur, Vof, Swr, time, time_step, bckp) !----------------------------! ! Reynolds stress models ! !----------------------------! - if(Tur % model .eq. RSM_MANCEAU_HANJALIC .or. & - Tur % model .eq. RSM_HANJALIC_JAKIRLIC) then + if(Turb % model .eq. RSM_MANCEAU_HANJALIC .or. & + Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then ! Reynolds stresses - call Backup % Load_Variable(d, vc, 'uu', Fld, Tur % uu) - call Backup % Load_Variable(d, vc, 'vv', Fld, Tur % vv) - call Backup % Load_Variable(d, vc, 'ww', Fld, Tur % ww) - call Backup % Load_Variable(d, vc, 'uv', Fld, Tur % uv) - call Backup % Load_Variable(d, vc, 'uw', Fld, Tur % uw) - call Backup % Load_Variable(d, vc, 'vw', Fld, Tur % vw) + call Backup % Load_Variable(d, vc, 'uu', Flow, Turb % uu) + call Backup % Load_Variable(d, vc, 'vv', Flow, Turb % vv) + call Backup % Load_Variable(d, vc, 'ww', Flow, Turb % ww) + call Backup % Load_Variable(d, vc, 'uv', Flow, Turb % uv) + call Backup % Load_Variable(d, vc, 'uw', Flow, Turb % uw) + call Backup % Load_Variable(d, vc, 'vw', Flow, Turb % vw) ! Epsilon - call Backup % Load_Variable(d, vc, 'eps', Fld, Tur % eps) + call Backup % Load_Variable(d, vc, 'eps', Flow, Turb % eps) ! F22 - if(Tur % model .eq. RSM_MANCEAU_HANJALIC) then - call Backup % Load_Variable(d, vc, 'f22', Fld, Tur % f22) + if(Turb % model .eq. RSM_MANCEAU_HANJALIC) then + call Backup % Load_Variable(d, vc, 'f22', Flow, Turb % f22) end if ! Other turbulent quantities ? - call Backup % Load_Cell_Real(Grid, d, vc, 'vis_t', Tur % vis_t) - call Backup % Load_Cell_Real(Grid, d, vc, 'vis_w', Tur % vis_w) + call Backup % Load_Cell_Real(Grid, d, vc, 'vis_t', Turb % vis_t) + call Backup % Load_Cell_Real(Grid, d, vc, 'vis_w', Turb % vis_w) ! Turbulence quantities connected with heat transfer - if(Fld % heat_transfer) then - call Backup % Load_Cell_Real(Grid, d, vc, 'con_w', Tur % con_w) + if(Flow % heat_transfer) then + call Backup % Load_Cell_Real(Grid, d, vc, 'con_w', Turb % con_w) end if end if !--------------! ! Roughness ! !--------------! - if(Tur % rough_walls) then - call Backup % Load_Cell_Real(Grid, d, vc, 'z_o', Tur % z_o) + if(Turb % rough_walls) then + call Backup % Load_Cell_Real(Grid, d, vc, 'z_o', Turb % z_o) end if !------------------! ! Load scalars ! !------------------! - do sc = 1, Fld % n_scalars - phi => Fld % scalar(sc) - call Backup % Load_Variable(d, vc, phi % name, Fld, phi) + do sc = 1, Flow % n_scalars + phi => Flow % scalar(sc) + call Backup % Load_Variable(d, vc, phi % name, Flow, phi) end do !-----------------------------------------! @@ -272,76 +272,76 @@ subroutine Load(Backup, Fld, Tur, Vof, Swr, time, time_step, bckp) ! Turbulent statistics for all models ! ! ! !-----------------------------------------! - if(Tur % statistics) then - - call Backup % Load_Cell_Real(Grid, d, vc, 'u_mean', Tur % u_mean) - call Backup % Load_Cell_Real(Grid, d, vc, 'v_mean', Tur % v_mean) - call Backup % Load_Cell_Real(Grid, d, vc, 'w_mean', Tur % w_mean) - call Backup % Load_Cell_Real(Grid, d, vc, 'p_mean', Tur % p_mean) - if(Fld % heat_transfer) then - call Backup % Load_Cell_Real(Grid, d, vc, 't_mean', Tur % t_mean) - call Backup % Load_Cell_Real(Grid, d, vc, 'q_mean', Tur % q_mean) + if(Turb % statistics) then + + call Backup % Load_Cell_Real(Grid, d, vc, 'u_mean', Turb % u_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'v_mean', Turb % v_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'w_mean', Turb % w_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'p_mean', Turb % p_mean) + if(Flow % heat_transfer) then + call Backup % Load_Cell_Real(Grid, d, vc, 't_mean', Turb % t_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'q_mean', Turb % q_mean) end if ! K and epsilon - if(Tur % model .eq. K_EPS) then - call Backup % Load_Cell_Real(Grid, d, vc, 'kin_mean', Tur % kin_mean) - call Backup % Load_Cell_Real(Grid, d, vc, 'eps_mean', Tur % eps_mean) - if(Fld % heat_transfer) then - call Backup % Load_Cell_Real(Grid, d, vc, 't2_mean', Tur % t2_mean) - call Backup % Load_Cell_Real(Grid, d, vc, 'ut_mean', Tur % ut_mean) - call Backup % Load_Cell_Real(Grid, d, vc, 'vt_mean', Tur % vt_mean) - call Backup % Load_Cell_Real(Grid, d, vc, 'wt_mean', Tur % wt_mean) + if(Turb % model .eq. K_EPS) then + call Backup % Load_Cell_Real(Grid, d, vc, 'kin_mean', Turb % kin_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'eps_mean', Turb % eps_mean) + if(Flow % heat_transfer) then + call Backup % Load_Cell_Real(Grid, d, vc, 't2_mean', Turb % t2_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'ut_mean', Turb % ut_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'vt_mean', Turb % vt_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'wt_mean', Turb % wt_mean) end if end if ! K-eps-zeta-f and the hybrid model - if(Tur % model .eq. K_EPS_ZETA_F .or. & - Tur % model .eq. HYBRID_LES_RANS) then - call Backup % Load_Cell_Real(Grid, d, vc, 'kin_mean', Tur % kin_mean) - call Backup % Load_Cell_Real(Grid, d, vc, 'eps_mean', Tur % eps_mean) - call Backup % Load_Cell_Real(Grid, d, vc, 'zeta_mean', Tur % zeta_mean) - call Backup % Load_Cell_Real(Grid, d, vc, 'f22_mean', Tur % f22_mean) - if(Fld % heat_transfer) then - call Backup % Load_Cell_Real(Grid, d, vc, 't2_mean', Tur % t2_mean) - call Backup % Load_Cell_Real(Grid, d, vc, 'ut_mean', Tur % ut_mean) - call Backup % Load_Cell_Real(Grid, d, vc, 'vt_mean', Tur % vt_mean) - call Backup % Load_Cell_Real(Grid, d, vc, 'wt_mean', Tur % wt_mean) + if(Turb % model .eq. K_EPS_ZETA_F .or. & + Turb % model .eq. HYBRID_LES_RANS) then + call Backup % Load_Cell_Real(Grid, d, vc, 'kin_mean', Turb % kin_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'eps_mean', Turb % eps_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'zeta_mean', Turb % zeta_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'f22_mean', Turb % f22_mean) + if(Flow % heat_transfer) then + call Backup % Load_Cell_Real(Grid, d, vc, 't2_mean', Turb % t2_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'ut_mean', Turb % ut_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'vt_mean', Turb % vt_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'wt_mean', Turb % wt_mean) end if end if ! Reynolds stress models - if(Tur % model .eq. RSM_MANCEAU_HANJALIC .or. & - Tur % model .eq. RSM_HANJALIC_JAKIRLIC) then - call Backup % Load_Cell_Real(Grid, d, vc, 'uu_mean', Tur % uu_mean) - call Backup % Load_Cell_Real(Grid, d, vc, 'vv_mean', Tur % vv_mean) - call Backup % Load_Cell_Real(Grid, d, vc, 'ww_mean', Tur % ww_mean) - call Backup % Load_Cell_Real(Grid, d, vc, 'uv_mean', Tur % uv_mean) - call Backup % Load_Cell_Real(Grid, d, vc, 'uw_mean', Tur % uw_mean) - call Backup % Load_Cell_Real(Grid, d, vc, 'vw_mean', Tur % vw_mean) + if(Turb % model .eq. RSM_MANCEAU_HANJALIC .or. & + Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then + call Backup % Load_Cell_Real(Grid, d, vc, 'uu_mean', Turb % uu_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'vv_mean', Turb % vv_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'ww_mean', Turb % ww_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'uv_mean', Turb % uv_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'uw_mean', Turb % uw_mean) + call Backup % Load_Cell_Real(Grid, d, vc, 'vw_mean', Turb % vw_mean) end if - call Backup % Load_Cell_Real(Grid, d, vc, 'uu_res', Tur % uu_res) - call Backup % Load_Cell_Real(Grid, d, vc, 'vv_res', Tur % vv_res) - call Backup % Load_Cell_Real(Grid, d, vc, 'ww_res', Tur % ww_res) - call Backup % Load_Cell_Real(Grid, d, vc, 'uv_res', Tur % uv_res) - call Backup % Load_Cell_Real(Grid, d, vc, 'uw_res', Tur % uw_res) - call Backup % Load_Cell_Real(Grid, d, vc, 'vw_res', Tur % vw_res) - - if(Fld % heat_transfer) then - call Backup % Load_Cell_Real(Grid, d, vc, 't2_res', Tur % t2_res) - call Backup % Load_Cell_Real(Grid, d, vc, 'ut_res', Tur % ut_res) - call Backup % Load_Cell_Real(Grid, d, vc, 'vt_res', Tur % vt_res) - call Backup % Load_Cell_Real(Grid, d, vc, 'wt_res', Tur % wt_res) + call Backup % Load_Cell_Real(Grid, d, vc, 'uu_res', Turb % uu_res) + call Backup % Load_Cell_Real(Grid, d, vc, 'vv_res', Turb % vv_res) + call Backup % Load_Cell_Real(Grid, d, vc, 'ww_res', Turb % ww_res) + call Backup % Load_Cell_Real(Grid, d, vc, 'uv_res', Turb % uv_res) + call Backup % Load_Cell_Real(Grid, d, vc, 'uw_res', Turb % uw_res) + call Backup % Load_Cell_Real(Grid, d, vc, 'vw_res', Turb % vw_res) + + if(Flow % heat_transfer) then + call Backup % Load_Cell_Real(Grid, d, vc, 't2_res', Turb % t2_res) + call Backup % Load_Cell_Real(Grid, d, vc, 'ut_res', Turb % ut_res) + call Backup % Load_Cell_Real(Grid, d, vc, 'vt_res', Turb % vt_res) + call Backup % Load_Cell_Real(Grid, d, vc, 'wt_res', Turb % wt_res) end if ! Scalars - do sc = 1, Fld % n_scalars - phi => Fld % scalar(sc) + do sc = 1, Flow % n_scalars + phi => Flow % scalar(sc) name_mean = phi % name name_mean(5:9) = '_mean' call Backup % Load_Cell_Real(Grid, d, vc, name_mean, & - Tur % scalar_mean(sc, :)) + Turb % scalar_mean(sc, :)) end do end if @@ -351,10 +351,10 @@ subroutine Load(Backup, Fld, Tur, Vof, Swr, time, time_step, bckp) ! Swarm (of particles) ! ! ! !--------------------------! - if(Fld % with_particles) then - call Backup % Load_Swarm(d, vc, Swr) - call Backup % Load_Cell_Real(Grid, d, vc, 'n_deposited', Swr % n_deposited) - call Backup % Load_Cell_Real(Grid, d, vc, 'n_reflected', Swr % n_reflected) + if(Flow % with_particles) then + call Backup % Load_Swarm(Swarm, d, vc) + call Backup % Load_Cell_Real(Grid, d,vc,'n_deposited', Swarm % n_deposited) + call Backup % Load_Cell_Real(Grid, d,vc,'n_reflected', Swarm % n_reflected) end if ! Close backup file diff --git a/Sources/Process/Backup_Mod/Load_Cell_Real.f90 b/Sources/Process/Backup_Mod/Load_Cell_Real.f90 index 6a9b14b3c..27893625f 100644 --- a/Sources/Process/Backup_Mod/Load_Cell_Real.f90 +++ b/Sources/Process/Backup_Mod/Load_Cell_Real.f90 @@ -16,6 +16,8 @@ subroutine Load_Cell_Real(Backup, Grid, disp, vc, var_name, array) character(SL) :: vn integer :: vs, cnt_loop, nb, nc integer(DP) :: disp_loop +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Backup) !==============================================================================! ! Take alias diff --git a/Sources/Process/Backup_Mod/Load_Int.f90 b/Sources/Process/Backup_Mod/Load_Int.f90 index a1b8c609d..32e76abf8 100644 --- a/Sources/Process/Backup_Mod/Load_Int.f90 +++ b/Sources/Process/Backup_Mod/Load_Int.f90 @@ -15,6 +15,8 @@ subroutine Load_Int(Backup, Comm, disp, vc, var_name, var_value) character(SL) :: vn integer :: vs, cnt_loop integer(DP) :: disp_loop +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Backup) !==============================================================================! cnt_loop = 0 diff --git a/Sources/Process/Backup_Mod/Load_Int_Array.f90 b/Sources/Process/Backup_Mod/Load_Int_Array.f90 index 6ec0662e5..918517a38 100644 --- a/Sources/Process/Backup_Mod/Load_Int_Array.f90 +++ b/Sources/Process/Backup_Mod/Load_Int_Array.f90 @@ -15,6 +15,8 @@ subroutine Load_Int_Array(Backup, Comm, disp, vc, arr_name, arr_value) character(SL) :: vn integer :: vs, cnt_loop, length integer(DP) :: disp_loop +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Backup) !==============================================================================! cnt_loop = 0 diff --git a/Sources/Process/Backup_Mod/Load_Log.f90 b/Sources/Process/Backup_Mod/Load_Log.f90 index 619bc8039..dc436dce0 100644 --- a/Sources/Process/Backup_Mod/Load_Log.f90 +++ b/Sources/Process/Backup_Mod/Load_Log.f90 @@ -15,6 +15,8 @@ subroutine Load_Log(Backup, Comm, disp, vc, var_name, var_value) character(SL) :: vn integer :: vs, cnt_loop integer(DP) :: disp_loop +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Backup) !==============================================================================! cnt_loop = 0 diff --git a/Sources/Process/Backup_Mod/Load_Log_Array.f90 b/Sources/Process/Backup_Mod/Load_Log_Array.f90 index ee286a865..68d867e92 100644 --- a/Sources/Process/Backup_Mod/Load_Log_Array.f90 +++ b/Sources/Process/Backup_Mod/Load_Log_Array.f90 @@ -15,6 +15,8 @@ subroutine Load_Log_Array(Backup, Comm, disp, vc, arr_name, arr_value) character(SL) :: vn integer :: vs, cnt_loop, length integer(DP) :: disp_loop +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Backup) !==============================================================================! cnt_loop = 0 diff --git a/Sources/Process/Backup_Mod/Load_Real.f90 b/Sources/Process/Backup_Mod/Load_Real.f90 index 109cd55e8..7d68f41a7 100644 --- a/Sources/Process/Backup_Mod/Load_Real.f90 +++ b/Sources/Process/Backup_Mod/Load_Real.f90 @@ -15,6 +15,8 @@ subroutine Load_Real(Backup, Comm, disp, vc, var_name, var_value) character(SL) :: vn integer :: vo, cnt_loop integer(DP) :: disp_loop +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Backup) !==============================================================================! cnt_loop = 0 diff --git a/Sources/Process/Backup_Mod/Load_Real_Array.f90 b/Sources/Process/Backup_Mod/Load_Real_Array.f90 index 7f0fa1418..c9270ac6b 100644 --- a/Sources/Process/Backup_Mod/Load_Real_Array.f90 +++ b/Sources/Process/Backup_Mod/Load_Real_Array.f90 @@ -15,6 +15,8 @@ subroutine Load_Real_Array(Backup, Comm, disp, vc, arr_name, arr_value) character(SL) :: vn integer :: vo, cnt_loop, length integer(DP) :: disp_loop +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Backup) !==============================================================================! cnt_loop = 0 diff --git a/Sources/Process/Backup_Mod/Load_Swarm.f90 b/Sources/Process/Backup_Mod/Load_Swarm.f90 index c39da2d46..16e43bc39 100644 --- a/Sources/Process/Backup_Mod/Load_Swarm.f90 +++ b/Sources/Process/Backup_Mod/Load_Swarm.f90 @@ -1,12 +1,12 @@ !==============================================================================! - subroutine Load_Swarm(Backup, disp, vc, Swr) + subroutine Load_Swarm(Backup, Swarm, disp, vc) !------------------------------------------------------------------------------! ! Loads backup files name.backup ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! class(Backup_Type) :: Backup - type(Swarm_Type), target :: Swr + type(Swarm_Type), target :: Swarm integer(DP) :: disp integer :: vc !-----------------------------------[Locals]-----------------------------------! @@ -17,7 +17,7 @@ subroutine Load_Swarm(Backup, disp, vc, Swr) !==============================================================================! ! Take aliases - Grid => Swr % pnt_grid + Grid => Swarm % pnt_grid Comm => Grid % Comm !--------------------------! @@ -29,58 +29,58 @@ subroutine Load_Swarm(Backup, disp, vc, Swr) ! Number of particles call Backup % Load_Int(Comm, disp, vc, 'n_particles', n_part) - Swr % i_work(:) = 0 - Swr % l_work(:) = .false. - Swr % r_work(:) = 0.0 + Swarm % i_work(:) = 0 + Swarm % l_work(:) = .false. + Swarm % r_work(:) = 0.0 if(n_part > 0) then - Swr % n_particles = n_part + Swarm % n_particles = n_part call Backup % Load_Int_Array(Comm, disp, vc, & 'particle_int_data', & - Swr % i_work(1 : Swr % N_I_VARS*Swr % n_particles)) + Swarm % i_work(1 : Swarm % N_I_VARS*Swarm % n_particles)) call Backup % Load_Log_Array(Comm, disp, vc, & 'particle_log_data', & - Swr % l_work(1 : Swr % N_L_VARS*Swr % n_particles)) + Swarm % l_work(1 : Swarm % N_L_VARS*Swarm % n_particles)) call Backup % Load_Real_Array(Comm, disp, vc, & 'particle_real_data', & - Swr % r_work(1 : Swr % N_R_VARS*Swr % n_particles)) + Swarm % r_work(1 : Swarm % N_R_VARS*Swarm % n_particles)) ! Unpack particle data from arrays - do k = 1, Swr % n_particles + do k = 1, Swarm % n_particles ! Take aliases for the Particle - part => Swr % Particle(k) + part => Swarm % Particle(k) - i = (k-1) * Swr % N_I_VARS - part % proc = Swr % i_work(i + 1) - part % buff = Swr % i_work(i + 2) - part % cell = Swr % i_work(i + 3) ! holds global number for the moment + i = (k-1) * Swarm % N_I_VARS + part % proc = Swarm % i_work(i + 1) + part % buff = Swarm % i_work(i + 2) + part % cell = Swarm % i_work(i + 3) ! holds global number for the moment - i = (k-1) * Swr % N_L_VARS - part % deposited = Swr % l_work(i + 1) - part % escaped = Swr % l_work(i + 2) + i = (k-1) * Swarm % N_L_VARS + part % deposited = Swarm % l_work(i + 1) + part % escaped = Swarm % l_work(i + 2) - i = (k-1) * Swr % N_R_VARS - part % x_n = Swr % r_work(i + 1) - part % y_n = Swr % r_work(i + 2) - part % z_n = Swr % r_work(i + 3) - part % u = Swr % r_work(i + 4) - part % v = Swr % r_work(i + 5) - part % w = Swr % r_work(i + 6) - part % d = Swr % r_work(i + 7) - part % cfl = Swr % r_work(i + 8) + i = (k-1) * Swarm % N_R_VARS + part % x_n = Swarm % r_work(i + 1) + part % y_n = Swarm % r_work(i + 2) + part % z_n = Swarm % r_work(i + 3) + part % u = Swarm % r_work(i + 4) + part % v = Swarm % r_work(i + 5) + part % w = Swarm % r_work(i + 6) + part % d = Swarm % r_work(i + 7) + part % cfl = Swarm % r_work(i + 8) end do end if n_parts_in_buffers = 0 - do k = 1, Swr % n_particles - Swr % Particle(k) % cell = 0 - Swr % Particle(k) % node = 0 - Swr % Particle(k) % proc = 0 - Swr % Particle(k) % buff = 0 - call Swr % Particle(k) % Find_Nearest_Cell(n_parts_in_buffers) - call Swr % Particle(k) % Find_Nearest_Node() + do k = 1, Swarm % n_particles + Swarm % Particle(k) % cell = 0 + Swarm % Particle(k) % node = 0 + Swarm % Particle(k) % proc = 0 + Swarm % Particle(k) % buff = 0 + call Swarm % Particle(k) % Find_Nearest_Cell(n_parts_in_buffers) + call Swarm % Particle(k) % Find_Nearest_Node() end do end subroutine diff --git a/Sources/Process/Backup_Mod/Load_Variable.f90 b/Sources/Process/Backup_Mod/Load_Variable.f90 index f27736eae..1e0d9bc3d 100644 --- a/Sources/Process/Backup_Mod/Load_Variable.f90 +++ b/Sources/Process/Backup_Mod/Load_Variable.f90 @@ -1,12 +1,12 @@ !==============================================================================! - subroutine Load_Variable(Backup, disp, vc, var_name, Fld, var) + subroutine Load_Variable(Backup, disp, vc, var_name, Flow, var) !------------------------------------------------------------------------------! ! Reads a whole variable from backup file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! class(Backup_Type) :: Backup - type(Field_Type) :: Fld + type(Field_Type) :: Flow integer(DP) :: disp integer :: vc character(len=*) :: var_name @@ -17,6 +17,8 @@ subroutine Load_Variable(Backup, disp, vc, var_name, Fld, var) character(SL) :: vn integer :: vs, cnt_loop, nb, nc integer(DP) :: disp_loop +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Backup) !==============================================================================! ! Take aliases @@ -58,7 +60,7 @@ subroutine Load_Variable(Backup, disp, vc, var_name, Fld, var) call Grid % Exchange_Cells_Real(var % o(-nb:nc)) ! Compute fresh gradients - call Fld % Grad_Variable(var) + call Flow % Grad_Variable(var) disp = disp_loop return diff --git a/Sources/Process/Backup_Mod/Save.f90 b/Sources/Process/Backup_Mod/Save.f90 index 9a9368746..17163fc1f 100644 --- a/Sources/Process/Backup_Mod/Save.f90 +++ b/Sources/Process/Backup_Mod/Save.f90 @@ -1,15 +1,15 @@ !==============================================================================! - subroutine Save(Backup, Fld, Tur, Vof, Swr, time, time_step, dom) + subroutine Save(Backup, Flow, Turb, Vof, Swarm, time, time_step, dom) !------------------------------------------------------------------------------! ! Saves backup files name.backup ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! class(Backup_Type) :: Backup - type(Field_Type), target :: Fld - type(Turb_Type), target :: Tur + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof - type(Swarm_Type), target :: Swr + type(Swarm_Type), target :: Swarm real :: time ! time of simulation integer :: time_step ! current time step integer, optional :: dom @@ -26,8 +26,8 @@ subroutine Save(Backup, Fld, Tur, Vof, Swr, time, time_step, dom) call Profiler % Start('Backup_Mod_Save') ! Take aliases - Grid => Fld % pnt_grid - bulk => Fld % bulk + Grid => Flow % pnt_grid + bulk => Flow % bulk Comm => Grid % Comm ! Name backup file @@ -88,18 +88,18 @@ subroutine Save(Backup, Fld, Tur, Vof, Swr, time, time_step, dom) !--------------! ! Velocity ! !--------------! - call Backup % Save_Variable(d, vc, 'u_velocity', Fld % u) - call Backup % Save_Variable(d, vc, 'v_velocity', Fld % v) - call Backup % Save_Variable(d, vc, 'w_velocity', Fld % w) + call Backup % Save_Variable(d, vc, 'u_velocity', Flow % u) + call Backup % Save_Variable(d, vc, 'v_velocity', Flow % v) + call Backup % Save_Variable(d, vc, 'w_velocity', Flow % w) !------------------------------------------------------! ! Pressure, its gradients, and pressure correction ! !------------------------------------------------------! - call Backup % Save_Cell_Real(Grid, d, vc, 'press', Fld % p % n) - call Backup % Save_Cell_Real(Grid, d, vc, 'press_x', Fld % p % x) - call Backup % Save_Cell_Real(Grid, d, vc, 'press_y', Fld % p % y) - call Backup % Save_Cell_Real(Grid, d, vc, 'press_z', Fld % p % z) - call Backup % Save_Cell_Real(Grid, d, vc, 'press_corr', Fld % pp % n) + call Backup % Save_Cell_Real(Grid, d, vc, 'press', Flow % p % n) + call Backup % Save_Cell_Real(Grid, d, vc, 'press_x', Flow % p % x) + call Backup % Save_Cell_Real(Grid, d, vc, 'press_y', Flow % p % y) + call Backup % Save_Cell_Real(Grid, d, vc, 'press_z', Flow % p % z) + call Backup % Save_Cell_Real(Grid, d, vc, 'press_corr', Flow % pp % n) !-------------------! ! Volume fluxes ! -> don't use for the time being, too much trouble @@ -119,15 +119,15 @@ subroutine Save(Backup, Fld, Tur, Vof, Swr, time, time_step, dom) ! ! Update on June 2, 2022: Unified all outlet boundaries into one ! to be able to tell PETSc if matrix for pressure is singular - call Backup % Save_Log(Comm, d, vc, 'has_pressure', Fld % has_pressure) + call Backup % Save_Log(Comm, d, vc, 'has_pressure', Flow % has_pressure) !--------------! ! ! ! Enthalpy ! ! ! !--------------! - if(Fld % heat_transfer) then - call Backup % Save_Variable(d, vc, 'temp', Fld % t) + if(Flow % heat_transfer) then + call Backup % Save_Variable(d, vc, 'temp', Flow % t) end if !--------------! @@ -135,7 +135,7 @@ subroutine Save(Backup, Fld, Tur, Vof, Swr, time, time_step, dom) ! Multiphase ! ! ! !--------------! - if(Fld % with_interface) then + if(Flow % with_interface) then call Backup % Save_Variable(d, vc, 'vof_fun', Vof % fun) end if @@ -148,23 +148,23 @@ subroutine Save(Backup, Fld, Tur, Vof, Swr, time, time_step, dom) !-----------------! ! K-eps model ! !-----------------! - if(Tur % model .eq. K_EPS) then + if(Turb % model .eq. K_EPS) then ! K and epsilon - call Backup % Save_Variable(d, vc, 'kin', Tur % kin) - call Backup % Save_Variable(d, vc, 'eps', Tur % eps) + call Backup % Save_Variable(d, vc, 'kin', Turb % kin) + call Backup % Save_Variable(d, vc, 'eps', Turb % eps) ! Other turbulent quantities - call Backup % Save_Cell_Real(Grid, d, vc, 'p_kin', Tur % p_kin ) - call Backup % Save_Cell_Real(Grid, d, vc, 'y_plus', Tur % y_plus) - call Backup % Save_Cell_Real(Grid, d, vc, 'vis_t', Tur % vis_t ) - call Backup % Save_Cell_Real(Grid, d, vc, 'vis_w', Tur % vis_w ) + call Backup % Save_Cell_Real(Grid, d, vc, 'p_kin', Turb % p_kin ) + call Backup % Save_Cell_Real(Grid, d, vc, 'y_plus', Turb % y_plus) + call Backup % Save_Cell_Real(Grid, d, vc, 'vis_t', Turb % vis_t ) + call Backup % Save_Cell_Real(Grid, d, vc, 'vis_w', Turb % vis_w ) ! Turbulence quantities connected with heat transfer - if(Fld % heat_transfer) then - call Backup % Save_Variable(d, vc, 't2', Tur % t2) - call Backup % Save_Cell_Real(Grid, d, vc, 'p_t2', Tur % p_t2 ) - call Backup % Save_Cell_Real(Grid, d, vc, 'con_w', Tur % con_w) + if(Flow % heat_transfer) then + call Backup % Save_Variable(d, vc, 't2', Turb % t2) + call Backup % Save_Cell_Real(Grid, d, vc, 'p_t2', Turb % p_t2 ) + call Backup % Save_Cell_Real(Grid, d, vc, 'con_w', Turb % con_w) end if end if @@ -172,27 +172,27 @@ subroutine Save(Backup, Fld, Tur, Vof, Swr, time, time_step, dom) !------------------------! ! K-eps-zeta-f model ! !------------------------! - if(Tur % model .eq. K_EPS_ZETA_F .or. & - Tur % model .eq. HYBRID_LES_RANS) then + if(Turb % model .eq. K_EPS_ZETA_F .or. & + Turb % model .eq. HYBRID_LES_RANS) then ! K, eps, zeta and f22 - call Backup % Save_Variable(d, vc, 'kin', Tur % kin) - call Backup % Save_Variable(d, vc, 'eps', Tur % eps) - call Backup % Save_Variable(d, vc, 'zeta', Tur % zeta) - call Backup % Save_Variable(d, vc, 'f22', Tur % f22) + call Backup % Save_Variable(d, vc, 'kin', Turb % kin) + call Backup % Save_Variable(d, vc, 'eps', Turb % eps) + call Backup % Save_Variable(d, vc, 'zeta', Turb % zeta) + call Backup % Save_Variable(d, vc, 'f22', Turb % f22) ! Other turbulent quantities - call Backup % Save_Cell_Real(Grid, d, vc,'p_kin', Tur % p_kin ) - call Backup % Save_Cell_Real(Grid, d, vc,'y_plus', Tur % y_plus ) - call Backup % Save_Cell_Real(Grid, d, vc,'vis_t', Tur % vis_t ) - call Backup % Save_Cell_Real(Grid, d, vc,'vis_w', Tur % vis_w ) - call Backup % Save_Cell_Real(Grid, d, vc,'t_scale', Tur % t_scale) - call Backup % Save_Cell_Real(Grid, d, vc,'l_scale', Tur % l_scale) - - if(Fld % heat_transfer) then - call Backup % Save_Variable(d, vc, 't2', Tur % t2) - call Backup % Save_Cell_Real(Grid, d, vc, 'p_t2', Tur % p_t2 ) - call Backup % Save_Cell_Real(Grid, d, vc, 'con_w', Tur % con_w) + call Backup % Save_Cell_Real(Grid, d, vc,'p_kin', Turb % p_kin ) + call Backup % Save_Cell_Real(Grid, d, vc,'y_plus', Turb % y_plus ) + call Backup % Save_Cell_Real(Grid, d, vc,'vis_t', Turb % vis_t ) + call Backup % Save_Cell_Real(Grid, d, vc,'vis_w', Turb % vis_w ) + call Backup % Save_Cell_Real(Grid, d, vc,'t_scale', Turb % t_scale) + call Backup % Save_Cell_Real(Grid, d, vc,'l_scale', Turb % l_scale) + + if(Flow % heat_transfer) then + call Backup % Save_Variable(d, vc, 't2', Turb % t2) + call Backup % Save_Cell_Real(Grid, d, vc, 'p_t2', Turb % p_t2 ) + call Backup % Save_Cell_Real(Grid, d, vc, 'con_w', Turb % con_w) end if end if @@ -200,47 +200,47 @@ subroutine Save(Backup, Fld, Tur, Vof, Swr, time, time_step, dom) !----------------------------! ! Reynolds stress models ! !----------------------------! - if(Tur % model .eq. RSM_MANCEAU_HANJALIC .or. & - Tur % model .eq. RSM_HANJALIC_JAKIRLIC) then + if(Turb % model .eq. RSM_MANCEAU_HANJALIC .or. & + Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then ! Reynolds stresses - call Backup % Save_Variable(d, vc, 'uu', Tur % uu) - call Backup % Save_Variable(d, vc, 'vv', Tur % vv) - call Backup % Save_Variable(d, vc, 'ww', Tur % ww) - call Backup % Save_Variable(d, vc, 'uv', Tur % uv) - call Backup % Save_Variable(d, vc, 'uw', Tur % uw) - call Backup % Save_Variable(d, vc, 'vw', Tur % vw) + call Backup % Save_Variable(d, vc, 'uu', Turb % uu) + call Backup % Save_Variable(d, vc, 'vv', Turb % vv) + call Backup % Save_Variable(d, vc, 'ww', Turb % ww) + call Backup % Save_Variable(d, vc, 'uv', Turb % uv) + call Backup % Save_Variable(d, vc, 'uw', Turb % uw) + call Backup % Save_Variable(d, vc, 'vw', Turb % vw) ! Epsilon - call Backup % Save_Variable(d, vc, 'eps', Tur % eps) + call Backup % Save_Variable(d, vc, 'eps', Turb % eps) ! F22 - if(Tur % model .eq. RSM_MANCEAU_HANJALIC) then - call Backup % Save_Variable(d, vc, 'f22', Tur % f22) + if(Turb % model .eq. RSM_MANCEAU_HANJALIC) then + call Backup % Save_Variable(d, vc, 'f22', Turb % f22) end if ! Other turbulent quantities - call Backup % Save_Cell_Real(Grid, d, vc, 'vis_t', Tur % vis_t) - call Backup % Save_Cell_Real(Grid, d, vc, 'vis_w', Tur % vis_w) + call Backup % Save_Cell_Real(Grid, d, vc, 'vis_t', Turb % vis_t) + call Backup % Save_Cell_Real(Grid, d, vc, 'vis_w', Turb % vis_w) ! Turbulence quantities connected with heat transfer - if(Fld % heat_transfer) then - call Backup % Save_Cell_Real(Grid, d, vc,'con_w', Tur % con_w) + if(Flow % heat_transfer) then + call Backup % Save_Cell_Real(Grid, d, vc,'con_w', Turb % con_w) end if end if !--------------! ! Roughness ! !--------------! - if(Tur % rough_walls) then - call Backup % Save_Cell_Real(Grid, d, vc, 'z_o', Tur % z_o) + if(Turb % rough_walls) then + call Backup % Save_Cell_Real(Grid, d, vc, 'z_o', Turb % z_o) end if !------------------! ! Save scalars ! !------------------! - do sc = 1, Fld % n_scalars - phi => Fld % scalar(sc) + do sc = 1, Flow % n_scalars + phi => Flow % scalar(sc) call Backup % Save_Variable(d, vc, phi % name, phi) end do @@ -249,76 +249,76 @@ subroutine Save(Backup, Fld, Tur, Vof, Swr, time, time_step, dom) ! Turbulent statistics for all models ! ! ! !-----------------------------------------! - if(Tur % statistics) then - - call Backup % Save_Cell_Real(Grid, d, vc, 'u_mean', Tur % u_mean) - call Backup % Save_Cell_Real(Grid, d, vc, 'v_mean', Tur % v_mean) - call Backup % Save_Cell_Real(Grid, d, vc, 'w_mean', Tur % w_mean) - call Backup % Save_Cell_Real(Grid, d, vc, 'p_mean', Tur % p_mean) - if(Fld % heat_transfer) then - call Backup % Save_Cell_Real(Grid, d, vc, 't_mean', Tur % t_mean) - call Backup % Save_Cell_Real(Grid, d, vc, 'q_mean', Tur % q_mean) + if(Turb % statistics) then + + call Backup % Save_Cell_Real(Grid, d, vc, 'u_mean', Turb % u_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'v_mean', Turb % v_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'w_mean', Turb % w_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'p_mean', Turb % p_mean) + if(Flow % heat_transfer) then + call Backup % Save_Cell_Real(Grid, d, vc, 't_mean', Turb % t_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'q_mean', Turb % q_mean) end if ! K and epsilon - if(Tur % model .eq. K_EPS) then - call Backup % Save_Cell_Real(Grid, d, vc, 'kin_mean', Tur % kin_mean) - call Backup % Save_Cell_Real(Grid, d, vc, 'eps_mean', Tur % eps_mean) - if(Fld % heat_transfer) then - call Backup % Save_Cell_Real(Grid, d, vc, 't2_mean', Tur % t2_mean) - call Backup % Save_Cell_Real(Grid, d, vc, 'ut_mean', Tur % ut_mean) - call Backup % Save_Cell_Real(Grid, d, vc, 'vt_mean', Tur % vt_mean) - call Backup % Save_Cell_Real(Grid, d, vc, 'wt_mean', Tur % wt_mean) + if(Turb % model .eq. K_EPS) then + call Backup % Save_Cell_Real(Grid, d, vc, 'kin_mean', Turb % kin_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'eps_mean', Turb % eps_mean) + if(Flow % heat_transfer) then + call Backup % Save_Cell_Real(Grid, d, vc, 't2_mean', Turb % t2_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'ut_mean', Turb % ut_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'vt_mean', Turb % vt_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'wt_mean', Turb % wt_mean) end if end if ! K-eps-zeta-f and the hybrid model - if(Tur % model .eq. K_EPS_ZETA_F .or. & - Tur % model .eq. HYBRID_LES_RANS) then - call Backup % Save_Cell_Real(Grid, d, vc, 'kin_mean', Tur % kin_mean ) - call Backup % Save_Cell_Real(Grid, d, vc, 'eps_mean', Tur % eps_mean ) - call Backup % Save_Cell_Real(Grid, d, vc, 'zeta_mean', Tur % zeta_mean) - call Backup % Save_Cell_Real(Grid, d, vc, 'f22_mean', Tur % f22_mean ) - if(Fld % heat_transfer) then - call Backup % Save_Cell_Real(Grid, d, vc, 't2_mean', Tur % t2_mean) - call Backup % Save_Cell_Real(Grid, d, vc, 'ut_mean', Tur % ut_mean) - call Backup % Save_Cell_Real(Grid, d, vc, 'vt_mean', Tur % vt_mean) - call Backup % Save_Cell_Real(Grid, d, vc, 'wt_mean', Tur % wt_mean) + if(Turb % model .eq. K_EPS_ZETA_F .or. & + Turb % model .eq. HYBRID_LES_RANS) then + call Backup % Save_Cell_Real(Grid, d, vc, 'kin_mean', Turb % kin_mean ) + call Backup % Save_Cell_Real(Grid, d, vc, 'eps_mean', Turb % eps_mean ) + call Backup % Save_Cell_Real(Grid, d, vc, 'zeta_mean', Turb % zeta_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'f22_mean', Turb % f22_mean ) + if(Flow % heat_transfer) then + call Backup % Save_Cell_Real(Grid, d, vc, 't2_mean', Turb % t2_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'ut_mean', Turb % ut_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'vt_mean', Turb % vt_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'wt_mean', Turb % wt_mean) end if end if ! Reynolds stress models - if(Tur % model .eq. RSM_MANCEAU_HANJALIC .or. & - Tur % model .eq. RSM_HANJALIC_JAKIRLIC) then - call Backup % Save_Cell_Real(Grid, d, vc, 'uu_mean', Tur % uu_mean) - call Backup % Save_Cell_Real(Grid, d, vc, 'vv_mean', Tur % vv_mean) - call Backup % Save_Cell_Real(Grid, d, vc, 'ww_mean', Tur % ww_mean) - call Backup % Save_Cell_Real(Grid, d, vc, 'uv_mean', Tur % uv_mean) - call Backup % Save_Cell_Real(Grid, d, vc, 'uw_mean', Tur % uw_mean) - call Backup % Save_Cell_Real(Grid, d, vc, 'vw_mean', Tur % vw_mean) + if(Turb % model .eq. RSM_MANCEAU_HANJALIC .or. & + Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then + call Backup % Save_Cell_Real(Grid, d, vc, 'uu_mean', Turb % uu_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'vv_mean', Turb % vv_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'ww_mean', Turb % ww_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'uv_mean', Turb % uv_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'uw_mean', Turb % uw_mean) + call Backup % Save_Cell_Real(Grid, d, vc, 'vw_mean', Turb % vw_mean) end if - call Backup % Save_Cell_Real(Grid, d, vc, 'uu_res', Tur % uu_res) - call Backup % Save_Cell_Real(Grid, d, vc, 'vv_res', Tur % vv_res) - call Backup % Save_Cell_Real(Grid, d, vc, 'ww_res', Tur % ww_res) - call Backup % Save_Cell_Real(Grid, d, vc, 'uv_res', Tur % uv_res) - call Backup % Save_Cell_Real(Grid, d, vc, 'uw_res', Tur % uw_res) - call Backup % Save_Cell_Real(Grid, d, vc, 'vw_res', Tur % vw_res) - - if(Fld % heat_transfer) then - call Backup % Save_Cell_Real(Grid, d, vc, 't2_res', Tur % t2_res) - call Backup % Save_Cell_Real(Grid, d, vc, 'ut_res', Tur % ut_res) - call Backup % Save_Cell_Real(Grid, d, vc, 'vt_res', Tur % vt_res) - call Backup % Save_Cell_Real(Grid, d, vc, 'wt_res', Tur % wt_res) + call Backup % Save_Cell_Real(Grid, d, vc, 'uu_res', Turb % uu_res) + call Backup % Save_Cell_Real(Grid, d, vc, 'vv_res', Turb % vv_res) + call Backup % Save_Cell_Real(Grid, d, vc, 'ww_res', Turb % ww_res) + call Backup % Save_Cell_Real(Grid, d, vc, 'uv_res', Turb % uv_res) + call Backup % Save_Cell_Real(Grid, d, vc, 'uw_res', Turb % uw_res) + call Backup % Save_Cell_Real(Grid, d, vc, 'vw_res', Turb % vw_res) + + if(Flow % heat_transfer) then + call Backup % Save_Cell_Real(Grid, d, vc, 't2_res', Turb % t2_res) + call Backup % Save_Cell_Real(Grid, d, vc, 'ut_res', Turb % ut_res) + call Backup % Save_Cell_Real(Grid, d, vc, 'vt_res', Turb % vt_res) + call Backup % Save_Cell_Real(Grid, d, vc, 'wt_res', Turb % wt_res) end if ! Scalars - do sc = 1, Fld % n_scalars - phi => Fld % scalar(sc) + do sc = 1, Flow % n_scalars + phi => Flow % scalar(sc) name_mean = phi % name name_mean(5:9) = '_mean' call Backup % Save_Cell_Real(Grid, d, vc, name_mean, & - Tur % scalar_mean(sc, :)) + Turb % scalar_mean(sc, :)) end do end if @@ -328,10 +328,10 @@ subroutine Save(Backup, Fld, Tur, Vof, Swr, time, time_step, dom) ! Swarm (of particles) ! ! ! !--------------------------! - if(Fld % with_particles) then - call Backup % Save_Swarm(d, vc, Swr) - call Backup % Save_Cell_Real(Grid, d, vc, 'n_deposited', Swr % n_deposited) - call Backup % Save_Cell_Real(Grid, d, vc, 'n_reflected', Swr % n_reflected) + if(Flow % with_particles) then + call Backup % Save_Swarm(Swarm, d, vc) + call Backup % Save_Cell_Real(Grid,d,vc, 'n_deposited', Swarm % n_deposited) + call Backup % Save_Cell_Real(Grid,d,vc, 'n_reflected', Swarm % n_reflected) end if ! Variable count (store +1 to count its own self) diff --git a/Sources/Process/Backup_Mod/Save_Cell_Real.f90 b/Sources/Process/Backup_Mod/Save_Cell_Real.f90 index 873a67deb..c9a3fe704 100644 --- a/Sources/Process/Backup_Mod/Save_Cell_Real.f90 +++ b/Sources/Process/Backup_Mod/Save_Cell_Real.f90 @@ -15,6 +15,8 @@ subroutine Save_Cell_Real(Backup, Grid, disp, vc, var_name, array) type(Comm_Type), pointer :: Comm character(SL) :: vn integer :: vs ! variable size +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Backup) !==============================================================================! ! Take alias diff --git a/Sources/Process/Backup_Mod/Save_Face_Real.f90 b/Sources/Process/Backup_Mod/Save_Face_Real.f90 index f19306340..0dd3c1857 100644 --- a/Sources/Process/Backup_Mod/Save_Face_Real.f90 +++ b/Sources/Process/Backup_Mod/Save_Face_Real.f90 @@ -19,6 +19,8 @@ subroutine Save_Face_Real(Backup, Grid, disp, vc, var_name, array, corr_sign) integer :: vs ! variable size integer :: s, c1, c2, cg1, cg2, sg, i_sid, error real :: buffer +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Backup) !==============================================================================! ! Take alias diff --git a/Sources/Process/Backup_Mod/Save_Int.f90 b/Sources/Process/Backup_Mod/Save_Int.f90 index 6b2643bce..3cbfbf6d0 100644 --- a/Sources/Process/Backup_Mod/Save_Int.f90 +++ b/Sources/Process/Backup_Mod/Save_Int.f90 @@ -14,6 +14,8 @@ subroutine Save_Int(Backup, Comm, disp, vc, var_name, var_value) !-----------------------------------[Locals]-----------------------------------! character(SL) :: vn integer :: vs ! variable size +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Backup) !==============================================================================! if(this_proc < 2) print *, '# Writing variable: ', trim(var_name) diff --git a/Sources/Process/Backup_Mod/Save_Int_Array.f90 b/Sources/Process/Backup_Mod/Save_Int_Array.f90 index e713f4cca..f2fe3e15b 100644 --- a/Sources/Process/Backup_Mod/Save_Int_Array.f90 +++ b/Sources/Process/Backup_Mod/Save_Int_Array.f90 @@ -14,6 +14,8 @@ subroutine Save_Int_Array(Backup, Comm, disp, vc, arr_name, arr_value) !-----------------------------------[Locals]-----------------------------------! character(SL) :: vn integer :: vs, length ! variable size +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Backup) !==============================================================================! length = size(arr_value) diff --git a/Sources/Process/Backup_Mod/Save_Log.f90 b/Sources/Process/Backup_Mod/Save_Log.f90 index 70fc1293f..4cb4f07c5 100644 --- a/Sources/Process/Backup_Mod/Save_Log.f90 +++ b/Sources/Process/Backup_Mod/Save_Log.f90 @@ -14,6 +14,8 @@ subroutine Save_Log(Backup, Comm, disp, vc, var_name, var_value) !-----------------------------------[Locals]-----------------------------------! character(SL) :: vn integer :: vs ! variable size +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Backup) !==============================================================================! if(this_proc < 2) print *, '# Writing variable: ', trim(var_name) diff --git a/Sources/Process/Backup_Mod/Save_Log_Array.f90 b/Sources/Process/Backup_Mod/Save_Log_Array.f90 index 9785447c0..b2e8245ec 100644 --- a/Sources/Process/Backup_Mod/Save_Log_Array.f90 +++ b/Sources/Process/Backup_Mod/Save_Log_Array.f90 @@ -14,6 +14,8 @@ subroutine Save_Log_Array(Backup, Comm, disp, vc, arr_name, arr_value) !-----------------------------------[Locals]-----------------------------------! character(SL) :: vn integer :: vs, length ! variable size +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Backup) !==============================================================================! length = size(arr_value) diff --git a/Sources/Process/Backup_Mod/Save_Real.f90 b/Sources/Process/Backup_Mod/Save_Real.f90 index 4995bb588..fcbbf4d6a 100644 --- a/Sources/Process/Backup_Mod/Save_Real.f90 +++ b/Sources/Process/Backup_Mod/Save_Real.f90 @@ -14,6 +14,8 @@ subroutine Save_Real(Backup, Comm, disp, vc, var_name, var_value) !-----------------------------------[Locals]-----------------------------------! character(SL) :: vn integer :: vs ! variable size +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Backup) !==============================================================================! if(this_proc < 2) print *, '# Writing variable: ', trim(var_name) diff --git a/Sources/Process/Backup_Mod/Save_Real_Array.f90 b/Sources/Process/Backup_Mod/Save_Real_Array.f90 index 6d56d4004..1b608d711 100644 --- a/Sources/Process/Backup_Mod/Save_Real_Array.f90 +++ b/Sources/Process/Backup_Mod/Save_Real_Array.f90 @@ -14,6 +14,8 @@ subroutine Save_Real_Array(Backup, Comm, disp, vc, arr_name, arr_value) !-----------------------------------[Locals]-----------------------------------! character(SL) :: vn integer :: vs, length ! variable size +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Backup) !==============================================================================! length = size(arr_value) diff --git a/Sources/Process/Backup_Mod/Save_Swarm.f90 b/Sources/Process/Backup_Mod/Save_Swarm.f90 index a3feea96b..85f9f4652 100644 --- a/Sources/Process/Backup_Mod/Save_Swarm.f90 +++ b/Sources/Process/Backup_Mod/Save_Swarm.f90 @@ -1,12 +1,12 @@ !==============================================================================! - subroutine Save_Swarm(Backup, disp, vc, Swr) + subroutine Save_Swarm(Backup, Swarm, disp, vc) !------------------------------------------------------------------------------! ! Saves backup files name.backup ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! class(Backup_Type) :: Backup - type(Swarm_Type), target :: Swr + type(Swarm_Type), target :: Swarm integer(DP) :: disp integer :: vc !-----------------------------------[Locals]-----------------------------------! @@ -17,7 +17,7 @@ subroutine Save_Swarm(Backup, disp, vc, Swr) !==============================================================================! ! Take aliases - Grid => Swr % pnt_grid + Grid => Swarm % pnt_grid Comm => Grid % Comm !--------------------------! @@ -27,62 +27,62 @@ subroutine Save_Swarm(Backup, disp, vc, Swr) !--------------------------! ! Number of particles - call Backup % Save_Int(Comm, disp, vc, 'n_particles', Swr % n_particles) + call Backup % Save_Int(Comm, disp, vc, 'n_particles', Swarm % n_particles) !----------------------------------------------! ! Write only if there are active particles ! !----------------------------------------------! - if(Swr % n_particles > 0) then + if(Swarm % n_particles > 0) then - Swr % i_work(:) = 0 - Swr % l_work(:) = .false. - Swr % r_work(:) = 0.0 + Swarm % i_work(:) = 0 + Swarm % l_work(:) = .false. + Swarm % r_work(:) = 0.0 ! Pack particle data in arrays - do k = 1, Swr % n_particles + do k = 1, Swarm % n_particles ! Take aliases for the particle - Part => Swr % Particle(k) + Part => Swarm % Particle(k) if(Part % proc .eq. this_proc) then - i = (k-1) * Swr % N_I_VARS - Swr % i_work(i + 1) = Part % proc ! where it resides - Swr % i_work(i + 2) = Part % buff ! where it wants to go - Swr % i_work(i + 3) = Grid % Comm % cell_glo(Part % cell) + i = (k-1) * Swarm % N_I_VARS + Swarm % i_work(i + 1) = Part % proc ! where it resides + Swarm % i_work(i + 2) = Part % buff ! where it wants to go + Swarm % i_work(i + 3) = Grid % Comm % cell_glo(Part % cell) - i = (k-1) * Swr % N_L_VARS - Swr % l_work(i + 1) = Part % deposited - Swr % l_work(i + 2) = Part % escaped + i = (k-1) * Swarm % N_L_VARS + Swarm % l_work(i + 1) = Part % deposited + Swarm % l_work(i + 2) = Part % escaped - i = (k-1) * Swr % N_R_VARS - Swr % r_work(i + 1) = Part % x_n - Swr % r_work(i + 2) = Part % y_n - Swr % r_work(i + 3) = Part % z_n - Swr % r_work(i + 4) = Part % u - Swr % r_work(i + 5) = Part % v - Swr % r_work(i + 6) = Part % w - Swr % r_work(i + 7) = Part % d - Swr % r_work(i + 8) = Part % cfl + i = (k-1) * Swarm % N_R_VARS + Swarm % r_work(i + 1) = Part % x_n + Swarm % r_work(i + 2) = Part % y_n + Swarm % r_work(i + 3) = Part % z_n + Swarm % r_work(i + 4) = Part % u + Swarm % r_work(i + 5) = Part % v + Swarm % r_work(i + 6) = Part % w + Swarm % r_work(i + 7) = Part % d + Swarm % r_work(i + 8) = Part % cfl end if ! particle on this processor end do !-----------------------! ! Exchange the data ! !-----------------------! - call Comm_Mod_Global_Sum_Int_Array (Swr % n_particles * Swr % N_I_VARS, & - Swr % i_work) - call Comm_Mod_Global_Sum_Real_Array(Swr % n_particles * Swr % N_R_VARS, & - Swr % r_work) + call Comm_Mod_Global_Sum_Int_Array (Swarm % n_particles*Swarm % N_I_VARS, & + Swarm % i_work) + call Comm_Mod_Global_Sum_Real_Array(Swarm % n_particles*Swarm % N_R_VARS, & + Swarm % r_work) call Backup % Save_Int_Array(Comm, disp, vc, & 'particle_int_data', & - Swr % i_work(1 : Swr % N_I_VARS*Swr % n_particles)) + Swarm % i_work(1 : Swarm % N_I_VARS*Swarm % n_particles)) call Backup % Save_Log_Array(Comm, disp, vc, & 'particle_log_data', & - Swr % l_work(1 : Swr % N_L_VARS*Swr % n_particles)) + Swarm % l_work(1 : Swarm % N_L_VARS*Swarm % n_particles)) call Backup % Save_Real_Array(Comm, disp, vc, & 'particle_real_data', & - Swr % r_work(1 : Swr % N_R_VARS*Swr % n_particles)) + Swarm % r_work(1 : Swarm % N_R_VARS*Swarm % n_particles)) end if end subroutine diff --git a/Sources/Process/Backup_Mod/Save_Variable.f90 b/Sources/Process/Backup_Mod/Save_Variable.f90 index 9ece05b66..a29f9bd7f 100644 --- a/Sources/Process/Backup_Mod/Save_Variable.f90 +++ b/Sources/Process/Backup_Mod/Save_Variable.f90 @@ -14,6 +14,8 @@ subroutine Save_Variable(Backup, disp, vc, var_name, var) type(Comm_Type), pointer :: Comm character(SL) :: vn integer :: vs ! variable size +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Backup) !==============================================================================! ! Take alias From 9ba45c4ff104a6222ddc6a53985ce076cf8d7ff4 Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 23 Mar 2023 10:27:38 +0100 Subject: [PATCH 127/223] Added an STL file --- Tests/Vof/Fuel_Bundle/two_spheres.stl | Bin 0 -> 32084 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Tests/Vof/Fuel_Bundle/two_spheres.stl diff --git a/Tests/Vof/Fuel_Bundle/two_spheres.stl b/Tests/Vof/Fuel_Bundle/two_spheres.stl new file mode 100644 index 0000000000000000000000000000000000000000..98949de170a2d28b7d14179414bb162330162b82 GIT binary patch literal 32084 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 literal 0 HcmV?d00001 From eacc70abef335c4fe72c85de409643194e370ec5 Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 23 Mar 2023 11:58:35 +0100 Subject: [PATCH 128/223] Two changes in test_build.sh 1. Added a test case with heat exchanger to the test suite 2. Removed all compulation with MPI=no since it messes up re-compilation after user functions have only been touched. On branch bojan_updated_tests modified: Tests/test_build.sh --- Tests/test_build.sh | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/Tests/test_build.sh b/Tests/test_build.sh index 57a54925a..ea5bcd0e9 100755 --- a/Tests/test_build.sh +++ b/Tests/test_build.sh @@ -85,6 +85,7 @@ RANS_FUEL_BUNDLE_DIR=Rans/Fuel_Bundle RANS_IMPINGING_JET_DIR=Rans/Impinging_Jet_2d_Distant_Re_23000 MULTDOM_BACKSTEP_DIR=Laminar/Copy_Inlet +MULTDOM_HEAT_EXCHANGER_2_DIR=Laminar/Heat_Exchanger/2_Domains MULTDOM_MEMBRANE_DIR=Rans/Membrane ELBOW_ASCII_DIR=Functionality/Meshes/Ansys/Elbow_Ascii @@ -104,9 +105,6 @@ LES_RB_109_DIR=Les/Rayleigh_Benard_Convection_Ra_10e09 HYB_CHANNEL_HR_STRETCHED_DIR=Hybrid_Les_Rans/Channel_Re_Tau_2000/Stretched_Mesh HYB_CHANNEL_HR_UNIFORM_DIR=Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh -# Add compressed meshes for these: -# MULTDOM_SINGLE_ROD_DIR=Rans/Single_Rod -# MULTDOM_COPY_INLET_DIR=Laminar/Copy_Inlet # MULTDOM_HEAT_EXCHANGER_2_DIR=Laminar/Heat_Exchanger/2_Domains # MULTDOM_HEAT_EXCHANGER_3_DIR=Laminar/Heat_Exchanger/3_Domains @@ -129,6 +127,7 @@ ALL_GENERATE_TESTS=( \ "$RANS_CHANNEL_LR_STRETCHED_DIR" \ "$RANS_CHANNEL_LR_UNIFORM_DIR" \ "$MULTDOM_BACKSTEP_DIR" \ + "$MULTDOM_HEAT_EXCHANGER_2_DIR" \ "$VOF_DAM_BREAK_2D_DIR" \ "$VOF_RISING_BUBBLE_DIR" \ "$SWARM_VOF_THREE_PHASE_DIR" \ @@ -183,6 +182,7 @@ ALL_DIVIDE_TESTS=( \ "$RANS_FUEL_BUNDLE_DIR" \ "$RANS_IMPINGING_JET_DIR" \ "$MULTDOM_BACKSTEP_DIR" \ + "$MULTDOM_HEAT_EXCHANGER_2_DIR" \ "$MULTDOM_MEMBRANE_DIR" \ "$SWARM_PERIODIC_CYL_DIR" \ "$SWARM_ROD_BUNDLE_POLYHEDRAL_DIR" \ @@ -221,6 +221,7 @@ ALL_PROCESS_TESTS=( \ "$RANS_CHANNEL_LR_RSM_DIR" \ "$RANS_IMPINGING_JET_DIR" \ "$MULTDOM_BACKSTEP_DIR" \ + "$MULTDOM_HEAT_EXCHANGER_2_DIR" \ "$SWARM_PERIODIC_CYL_DIR" \ "$SWARM_ROD_BUNDLE_POLYHEDRAL_DIR" \ "$VOF_DAM_BREAK_2D_DIR" \ @@ -252,6 +253,7 @@ ALL_TURBULENCE_MODELS=( \ "none" \ "none" \ "none" \ + "none" \ "les_dynamic" \ "hybrid_les_rans" \ "hybrid_les_rans" \ @@ -275,6 +277,7 @@ ALL_INTERFACE_TRACKING=( \ "no" \ "no" \ "no" \ + "no" \ "yes" \ "yes" \ "yes" \ @@ -299,6 +302,7 @@ ALL_PARTICLE_TRACKING=( \ "no" \ "no" \ "no" \ + "no" \ "yes" \ "yes" \ "no" \ @@ -826,8 +830,8 @@ function process_backup_test { nproc_in_div=$(head -n2 divide.1.scr | tail -n1) # BEGIN:---------------------------------------# - elog "np=1, MPI=no, start from 0, make a backup" - user_compile $PROC_DIR no # dir MPI + elog "np=1, MPI=yes, start from 0, make a backup" + user_compile $PROC_DIR yes # dir MPI for (( i=1; i<=$n_dom; i++ )); do name_in_div=$(head -n1 divide."$i".scr) @@ -856,7 +860,7 @@ function process_backup_test { # BEGIN:---------------------------------------------# - elog "np=1, MPI=no, load from backup(produced by seq)" + elog "np=1, MPI=yes, load from backup(produced by seq)" for (( i=1; i<=$n_dom; i++ )); do name_in_div=$(head -n1 divide."$i".scr) @@ -937,7 +941,7 @@ function process_backup_test { # BEGIN:------------------------------------------# elog "np=1, MPI=yes, backup=(produced by par.np=2)" - user_compile $PROC_DIR no # dir MPI + user_compile $PROC_DIR yes # dir MPI launch_process par 1 #--------------------------------------------:END # @@ -1087,8 +1091,8 @@ function process_save_exit_now_test { nproc_in_div=$(head -n2 divide.1.scr | tail -n1) # BEGIN:---------------------------------------# - elog "np=1, MPI=no, start from 0, make a backup" - user_compile $PROC_DIR no # dir MPI + elog "np=1, MPI=yes, start from 0, make a backup" + user_compile $PROC_DIR yes # dir MPI for (( i=1; i<=$n_dom; i++ )); do name_in_div=$(head -n1 divide."$i".scr) @@ -1110,7 +1114,7 @@ function process_save_exit_now_test { elog "" elog "#====================================================================" if [ "$i" = 1 ]; then - elog "# Test np=1, MPI=no" + elog "# Test np=1, MPI=yes" fi if [ "$i" = 2 ]; then elog "# Test np=1, MPI=yes" @@ -1121,7 +1125,7 @@ function process_save_exit_now_test { elog "#--------------------------------------------------------------------" # BEGIN:---------------------------------------------# - elog "np=1, MPI=no, load from backup(produced by seq)" + elog "np=1, MPI=yes, load from backup(produced by seq)" for (( i=1; i<=$n_dom; i++ )); do name_in_div=$(head -n1 divide."$i".scr) @@ -1137,7 +1141,7 @@ function process_save_exit_now_test { #-----------------------------------------------:END # if [ "$i" = 1 ]; then - user_compile $PROC_DIR no + user_compile $PROC_DIR yes elif [ "$i" = 2 ]; then user_compile $PROC_DIR yes elif [ "$i" = 3 ]; then From 4a22c7cbfa2ad47aa0f2fecd1153d73ef733d26d Mon Sep 17 00:00:00 2001 From: Niceno Date: Fri, 24 Mar 2023 13:53:53 +0100 Subject: [PATCH 129/223] Fixed compilation for Nvidia's Fortran. This is still not great - Nvidia suite of developments tools is a big mess, I wasn't exactly sure what was I using. Also, MPI version of Nvidia Fortran was having some issues. On branch bojan_more_robust_communicator modified: Convert/makefile modified: Divide/makefile modified: Generate/makefile modified: Process/makefile --- Sources/Convert/makefile | 2 +- Sources/Divide/makefile | 2 +- Sources/Generate/makefile | 2 +- Sources/Process/makefile | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Sources/Convert/makefile b/Sources/Convert/makefile index fc83abefd..3f360328c 100644 --- a/Sources/Convert/makefile +++ b/Sources/Convert/makefile @@ -127,7 +127,7 @@ else ifeq ($(FORTRAN), nvidia) else FC = $(FCOMP) endif - OPT_F_COMP = -module $(DIR_MODULE) + OPT_F_COMP = -module $(DIR_MODULE) -cpp ifeq ($(DEBUG), yes) OPT_F_COMP += -O0 -g else diff --git a/Sources/Divide/makefile b/Sources/Divide/makefile index 7c0e08483..1120c24ac 100644 --- a/Sources/Divide/makefile +++ b/Sources/Divide/makefile @@ -126,7 +126,7 @@ else ifeq ($(FORTRAN), nvidia) else FC = $(FCOMP) endif - OPT_F_COMP = -module $(DIR_MODULE) + OPT_F_COMP = -module $(DIR_MODULE) -cpp ifeq ($(DEBUG), yes) OPT_F_COMP += -O0 -g else diff --git a/Sources/Generate/makefile b/Sources/Generate/makefile index d05f7733e..497936e78 100644 --- a/Sources/Generate/makefile +++ b/Sources/Generate/makefile @@ -127,7 +127,7 @@ else ifeq ($(FORTRAN), nvidia) else FC = $(FCOMP) endif - OPT_F_COMP = -module $(DIR_MODULE) + OPT_F_COMP = -module $(DIR_MODULE) -cpp ifeq ($(DEBUG), yes) OPT_F_COMP += -O0 -g else diff --git a/Sources/Process/makefile b/Sources/Process/makefile index f324f573b..61c2b45eb 100644 --- a/Sources/Process/makefile +++ b/Sources/Process/makefile @@ -136,7 +136,7 @@ else ifeq ($(FORTRAN), nvidia) else FC = $(FCOMP) endif - OPT_F_COMP = -module $(DIR_MODULE) + OPT_F_COMP = -module $(DIR_MODULE) -cpp ifeq ($(DEBUG), yes) OPT_F_COMP += -O0 -g else From 0f03428e20aa415300747a93242e882203744e64 Mon Sep 17 00:00:00 2001 From: Niceno Date: Fri, 24 Mar 2023 13:58:02 +0100 Subject: [PATCH 130/223] No idea how this file ended up here. Gone now! On branch bojan_more_robust_communicator deleted: Tests/Laminar/Membrane/2_Domains/User_Mod/Read_Control_Boundary_Conditions.f90 --- .../Read_Control_Boundary_Conditions.f90 | 899 ------------------ 1 file changed, 899 deletions(-) delete mode 100644 Tests/Laminar/Membrane/2_Domains/User_Mod/Read_Control_Boundary_Conditions.f90 diff --git a/Tests/Laminar/Membrane/2_Domains/User_Mod/Read_Control_Boundary_Conditions.f90 b/Tests/Laminar/Membrane/2_Domains/User_Mod/Read_Control_Boundary_Conditions.f90 deleted file mode 100644 index 86826e4bb..000000000 --- a/Tests/Laminar/Membrane/2_Domains/User_Mod/Read_Control_Boundary_Conditions.f90 +++ /dev/null @@ -1,899 +0,0 @@ -!==============================================================================! - subroutine Read_Control_Boundary_Conditions(Flow, Turb, Vof, turb_planes) -!------------------------------------------------------------------------------! -! Reads boundary condition from control file ! -!------------------------------------------------------------------------------! -!----------------------------------[Modules]-----------------------------------! - use Const_Mod - use Comm_Mod, only: this_proc, Comm_Mod_End - use Field_Mod, only: Field_Type, heat_transfer - use Turb_Mod - use Multiphase_Mod, only: Multiphase_Type, VOLUME_OF_FLUID - use Grid_Mod, only: Grid_Type - use Eddies_Mod - use User_Mod - use Control_Mod - use Var_Mod, only: Var_Type -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - type(Field_Type), target :: Flow - type(Turb_Type), target :: Turb - type(Multiphase_Type), target :: Vof - type(Turb_Plane_Type) :: turb_planes -!----------------------------------[Calling]-----------------------------------! - integer :: Key_Ind -!-----------------------------------[Locals]-----------------------------------! - type(Grid_Type), pointer :: Grid - type(Var_Type), pointer :: u, v, w, t, p, fun - type(Var_Type), pointer :: kin, eps, f22, zeta, vis, t2 - type(Var_Type), pointer :: uu, vv, ww, uv, uw, vw - type(Var_Type), pointer :: scalar(:) - integer :: c,m,l,k,i,bc,n_points,nks,nvs,sc,c1,c2,s,fu - character(SL) :: name_prof(128) - real :: wi, dist_min, x, y, z, xp, dist - real, allocatable :: prof(:,:) - logical :: here - character(SL) :: bc_type_name, try_str - integer :: bc_type_tag - character(SL) :: keys(128) - real :: vals(0:128) ! they start from zero! - integer :: types_per_color(128) ! how many types in a color - character(SL) :: types_names(128) ! name of each type - logical :: types_file(128) ! type specified in a file? - integer :: c_types ! counter types - integer :: edd_n - real :: edd_r - real :: edd_i - logical :: found -!==============================================================================! - - ! Take aliases - Grid => Flow % pnt_grid - t => Flow % t - p => Flow % p - scalar => Flow % scalar - vis => Turb % vis - t2 => Turb % t2 - fun => Vof % fun - - call Field_Mod_Alias_Momentum (Flow, u, v, w) - call Turb % Alias_K_Eps_Zeta_F(kin, eps, zeta, f22) - call Turb % Alias_Stresses (uu, vv, ww, uv, uw, vw) - - !-------------------------! - ! Read wall roughness ! - !-------------------------! - call Control_Mod_Roughness_Coefficient(Turb % z_o) - - !----------------------------------------------------------------! - ! Count number of types per boundary condition, total number ! - ! of types specified, and also extract their names ! - !----------------------------------------------------------------! - types_per_color(:) = 0 - types_file(:) = .false. - c_types = 0 - - do bc = 1, Grid % n_bnd_cond - call Control_Mod_Position_At_Two_Keys('BOUNDARY_CONDITION', & - Grid % bnd_cond % name(bc), & - found, & - .false.) - if(found) then -1 continue - - ! Try to read next 'TYPE' in the control file - call Control_Mod_Read_Char_Item_On('TYPE', 'VOID', bc_type_name, .false.) - - ! Get out of the loop if you fail - if(bc_type_name .eq. 'VOID') goto 2 - - ! Skip following two lines - call Control_Mod_Read_Char_Item_On('VARIABLES', 'VOID', try_str, .false.) - call Control_Mod_Read_Char_Item_On('VALUES', 'VOID', try_str, .false.) - - types_per_color(bc) = types_per_color(bc) + 1 - c_types = c_types + 1 - types_names(c_types) = bc_type_name - - ! If try_str is 'VOID', it didn't find 'VALUES' - ! meaning that the keyword 'FILE' was specified - if(try_str .eq. 'VOID') then - types_file(c_types) = .true. - end if - - goto 1 - else - if(this_proc < 2) then - print *, '# ERROR! Boundary conditions for ', & - trim(Grid % bnd_cond % name(bc)), & - ' not specified in the control file!' - print *, '# Exiting the program.' - end if - call Comm_Mod_End - stop - end if - -2 continue - - end do - - !------------------------------------------------! - ! ! - ! ! - ! Read boundary conditions from control file ! - ! ! - ! ! - !------------------------------------------------! - c_types = 0 - - do bc = 1, Grid % n_bnd_cond - - ! Position yourself well - call Control_Mod_Position_At_Two_Keys('BOUNDARY_CONDITION', & - Grid % bnd_cond % name(bc), & - found, & - .false.) - do l = 1, types_per_color(bc) - - ! Update the counter - c_types = c_types + 1 - - !---------------------------------------------! - ! ! - ! Read first line which is common for all ! - ! ! - !---------------------------------------------! - call Control_Mod_Read_Char_Item_On('TYPE', 'WALL', bc_type_name, .false.) - call To_Upper_Case(bc_type_name) - - ! Copy boundary conditions which were given for the Grid - if( bc_type_name .eq. 'INFLOW') then - bc_type_tag = INFLOW - Grid % bnd_cond % type(bc) = INFLOW - else if( bc_type_name .eq. 'WALL') then - bc_type_tag = WALL - Grid % bnd_cond % type(bc) = WALL - else if( bc_type_name .eq. 'OUTFLOW') then - bc_type_tag = OUTFLOW - Grid % bnd_cond % type(bc) = OUTFLOW - else if( bc_type_name .eq. 'SYMMETRY') then - bc_type_tag = SYMMETRY - Grid % bnd_cond % type(bc) = SYMMETRY - else if( bc_type_name .eq. 'WALL_FLUX') then - bc_type_tag = WALLFL - Grid % bnd_cond % type(bc) = WALLFL - else if( bc_type_name .eq. 'CONVECTIVE') then - bc_type_tag = CONVECT - Grid % bnd_cond % type(bc) = CONVECT - else if( bc_type_name .eq. 'PRESSURE') then - bc_type_tag = PRESSURE - Grid % bnd_cond % type(bc) = PRESSURE - else if( bc_type_name .eq. 'OPENBC') then - bc_type_tag = OPENBC - Grid % bnd_cond % type(bc) = OPENBC - else - if(this_proc < 2) then - print *, '# ERROR! Read_Control_Boundary_Conditions: '// & - '# Unknown boundary condition type: ', & - bc_type_name - print *, '# This error is critical, exiting!' - call Comm_Mod_End - stop - end if - end if - - !----------------------------------------------! - ! ! - ! Read second line which is common for all ! - ! ! - !----------------------------------------------! - call Control_Mod_Read_Strings_On('VARIABLES', keys, nks, .false.) - do i = 1, nks - call To_Upper_Case(keys(i)) - end do - - !-----------------------------------------------------------------! - ! ! - ! Boundary values are specified in a list (and not in a file) ! - ! ! - !-----------------------------------------------------------------! - if( .not. types_file(c_types) ) then - call Control_Mod_Read_Real_Array_On('VALUES', vals(1), nvs, .false.) - - !--------------------------------------------------! - ! Distribute boundary values to boundary cells ! - !--------------------------------------------------! - - ! Distribute b.c. tags only. - do c = -1, -Grid % n_bnd_cells, -1 - if(Grid % bnd_cond % color(c) .eq. bc) then - - ! Temperature - if(heat_transfer) then - i = Key_Ind('T', keys, nks) - if(i > 0) then - t % bnd_cond_type(c) = bc_type_tag - if(bc_type_tag .eq. WALLFL) t % bnd_cond_type(c) = WALL - if(bc_type_tag .eq. WALLFL) Grid % bnd_cond % type(bc) = WALL - end if - i = Key_Ind('Q', keys, nks) - if(i > 0) then - t % bnd_cond_type(c) = bc_type_tag - if(bc_type_tag .eq. WALL) t % bnd_cond_type(c) = WALLFL - if(bc_type_tag .eq. WALL) Grid % bnd_cond % type(bc) = WALLFL - end if - end if - - ! Volume of fluid -> still to be worked around - if (Vof % model .eq. VOLUME_OF_FLUID) then - i = Key_Ind('VOF', keys, nks) - if(i > 0) fun % bnd_cond_type(c) = bc_type_tag - i = Key_Ind('VOF_C_ANG', keys, nks) - if(i > 0) fun % bnd_cond_type(c) = bc_type_tag - end if - - ! For scalars - do sc = 1, Flow % n_scalars - i = Key_Ind(scalar(sc) % name, keys, nks) - if(i > 0) then - scalar(sc) % bnd_cond_type(c) = WALL - end if - i = Key_Ind(scalar(sc) % flux_name, keys, nks) - if(i > 0) then - scalar(sc) % bnd_cond_type(c) = WALLFL - end if - end do - - end if ! bnd_color .eq. bc - - end do - - ! Distribute b.c. values - do c = -1, -Grid % n_bnd_cells, -1 - if(Grid % bnd_cond % color(c) .eq. bc) then - - ! For velocity and pressure - i = Key_Ind('U', keys, nks); if(i > 0) u % b(c) = vals(i) - i = Key_Ind('V', keys, nks); if(i > 0) v % b(c) = vals(i) - i = Key_Ind('W', keys, nks); if(i > 0) w % b(c) = vals(i) - i = Key_Ind('P', keys, nks); if(i > 0) p % b(c) = vals(i) - - ! Temperature - if(heat_transfer) then - i = Key_Ind('T', keys, nks) - if(i > 0) t % b(c) = vals(i) - i = Key_Ind('Q', keys, nks) - if(i > 0) t % q(c) = vals(i) - end if - - ! Multiphase Flow - if (Vof % model .eq. VOLUME_OF_FLUID) then - i = Key_Ind('VOF', keys, nks) - if(i > 0) fun % b(c) = vals(i) - i = Key_Ind('VOF_C_ANG', keys, nks) - if(i > 0) fun % q(c) = vals(i) - end if - - ! For scalars - do sc = 1, Flow % n_scalars - i = Key_Ind(scalar(sc) % name, keys, nks) - if(i > 0) scalar(sc) % b(c) = vals(i) - i = Key_Ind(scalar(sc) % flux_name, keys, nks) - if(i > 0) scalar(sc) % q(c) = vals(i) - end do - - ! For turbulence models - if(Turb % model .eq. RSM_MANCEAU_HANJALIC .or. & - Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then - i = Key_Ind('UU', keys, nks); if(i > 0) uu % b(c) = vals(i) - i = Key_Ind('VV', keys, nks); if(i > 0) vv % b(c) = vals(i) - i = Key_Ind('WW', keys, nks); if(i > 0) ww % b(c) = vals(i) - i = Key_Ind('UV', keys, nks); if(i > 0) uv % b(c) = vals(i) - i = Key_Ind('UW', keys, nks); if(i > 0) uw % b(c) = vals(i) - i = Key_Ind('VW', keys, nks); if(i > 0) vw % b(c) = vals(i) - i = Key_Ind('EPS', keys, nks); if(i > 0) eps % b(c) = vals(i) - - if(Turb % model .eq. RSM_MANCEAU_HANJALIC) then - i = Key_Ind('F22', keys, nks); if(i > 0) f22 % b(c) = vals(i) - end if - end if - - if(Turb % model .eq. K_EPS) then - i = Key_Ind('KIN', keys, nks); if(i > 0) kin % b(c) = vals(i) - i = Key_Ind('EPS', keys, nks); if(i > 0) eps % b(c) = vals(i) - Turb % y_plus(c) = 1.1 - if(heat_transfer) then - i = Key_Ind('T2', keys, nks); if(i > 0) t2 % b(c) = vals(i) - end if - end if - - if(Turb % model .eq. K_EPS_ZETA_F .or. & - Turb % model .eq. HYBRID_LES_RANS) then - i = Key_Ind('KIN', keys, nks); if(i > 0) kin % b(c) = vals(i) - i = Key_Ind('EPS', keys, nks); if(i > 0) eps % b(c) = vals(i) - i = Key_Ind('ZETA', keys, nks); if(i > 0) zeta % b(c) = vals(i) - i = Key_Ind('F22', keys, nks); if(i > 0) f22 % b(c) = vals(i) - if(heat_transfer) then - i = Key_Ind('T2', keys, nks); if(i > 0) t2 % b(c) = vals(i) - end if - end if - - if(Turb % model .eq. SPALART_ALLMARAS .or. & - Turb % model .eq. DES_SPALART) then - i = Key_Ind('VIS', keys, nks); if(i > 0) vis % b(c) = vals(i) - end if - end if - - end do - - !---------------------------------------------! - ! ! - ! Boundary values are specified in a file ! - ! ! - !---------------------------------------------! - else ! types_file(c_types) == .true. - - call Control_Mod_Read_Strings_On('FILE', name_prof, nvs, .false.) - - call File % Open_For_Reading_Ascii(name_prof(1), fu) - call File % Read_Line(fu) - read(line % tokens(1),*) n_points ! number of points - - !---------------------------------! - ! Allocate memory for profile ! - !---------------------------------! - allocate(prof(n_points, 0:nks)) - - !----------------------------------! - ! Read the entire profile file ! - !----------------------------------! - do m = 1, n_points - call File % Read_Line(fu) - do i = 1, nks - read(line % tokens(i), *) prof(m,i) - end do - end do - close(fu) - - !------------------------! - ! A plane is defined ! - !------------------------! - if(keys(1) .eq. 'X' .and. keys(2) .eq. 'Y' .or. & - keys(1) .eq. 'X' .and. keys(2) .eq. 'Z' .or. & - keys(1) .eq. 'Y' .and. keys(2) .eq. 'Z') then - - ! Set the closest point - do c = -1, -Grid % n_bnd_cells, -1 - - ! Distribute b.c. types - if(Grid % bnd_cond % color(c) .eq. bc) then - - ! For temperature - if(heat_transfer) then - i = Key_Ind('T', keys, nks) - if(i > 0) then - t % bnd_cond_type(c) = bc_type_tag - if(bc_type_tag .eq. WALLFL) t % bnd_cond_type(c) = WALL - if(bc_type_tag .eq. WALLFL) Grid % bnd_cond % type(bc) = WALL - end if - i = Key_Ind('Q', keys, nks) - if(i > 0) then - t % bnd_cond_type(c) = bc_type_tag - if(bc_type_tag .eq. WALL) t % bnd_cond_type(c) = WALLFL - if(bc_type_tag .eq. WALL) Grid % bnd_cond % type(bc) = WALLFL - end if - end if - - ! For scalars - do sc = 1, Flow % n_scalars - i = Key_Ind(scalar(sc) % name, keys, nks) - if(i > 0) then - scalar(sc) % bnd_cond_type(c) = WALL - end if - i = Key_Ind(scalar(sc) % flux_name, keys, nks) - if(i > 0) then - scalar(sc) % bnd_cond_type(c) = WALLFL - end if - end do - - end if - - ! Distribute b.c. values - if(Grid % bnd_cond % color(c) .eq. bc) then - - dist_min = HUGE - do m = 1, n_points - - i = Key_Ind('X', keys, nks); prof(m,0) = 0.0; x = prof(m,i) - i = Key_Ind('Y', keys, nks); prof(m,0) = 0.0; y = prof(m,i) - i = Key_Ind('Z', keys, nks); prof(m,0) = 0.0; z = prof(m,i) - - if(keys(1) .eq. 'Y' .and. keys(2) .eq. 'Z') then - dist = Math % Distance( & - y, z, 0.0, & - Grid % yc(c), Grid % zc(c), 0.0) - - else if(keys(1) .eq. 'X' .and. keys(2) .eq. 'Z') then - dist = Math % Distance( & - x, z, 0.0, & - Grid % xc(c), Grid % zc(c), 0.0) - - else if(keys(1) .eq. 'X' .and. keys(2) .eq. 'Y') then - dist = Math % Distance( & - x, y, 0.0, & - Grid % xc(c), Grid % yc(c), 0.0) - - end if - - ! Store closest point in k - if(dist < dist_min) then - dist_min = dist - k = m - end if - - end do - - ! For velocity and pressure - i = Key_Ind('U', keys, nks); if(i > 0) u % b(c) = prof(k,i) - i = Key_Ind('V', keys, nks); if(i > 0) v % b(c) = prof(k,i) - i = Key_Ind('W', keys, nks); if(i > 0) w % b(c) = prof(k,i) - i = Key_Ind('P', keys, nks); if(i > 0) p % b(c) = prof(k,i) - - ! For temperature - if(heat_transfer) then - i = Key_Ind('T', keys, nks) - if(i > 0) t % b(c) = prof(k,i) - i = Key_Ind('Q', keys, nks) - if(i > 0) t % q(c) = prof(k,i) - end if - - ! For scalars - do sc = 1, Flow % n_scalars - i = Key_Ind(scalar(sc) % name, keys, nks) - if(i > 0) scalar(sc) % b(c) = prof(k,i) - i = Key_Ind(scalar(sc) % flux_name, keys, nks) - if(i > 0) scalar(sc) % q(c) = prof(k,i) - end do - - ! For turbulence models - if(Turb % model .eq. K_EPS) then - i = Key_Ind('KIN', keys, nks); if(i > 0) kin % b(c) = prof(k,i) - i = Key_Ind('EPS', keys, nks); if(i > 0) eps % b(c) = prof(k,i) - if(heat_transfer) then - i = Key_Ind('T2', keys, nks); if(i>0) t2 % b(c) = prof(k,i) - end if - end if - - if(Turb % model .eq. K_EPS_ZETA_F .or. & - Turb % model .eq. HYBRID_LES_RANS) then - i = Key_Ind('KIN', keys, nks); if(i>0) kin % b(c) = prof(k,i) - i = Key_Ind('EPS', keys, nks); if(i>0) eps % b(c) = prof(k,i) - i = Key_Ind('ZETA', keys, nks); if(i>0) zeta % b(c) = prof(k,i) - i = Key_Ind('F22', keys, nks); if(i>0) f22 % b(c) = prof(k,i) - if(heat_transfer) then - i = Key_Ind('T2', keys, nks); if(i>0) t2 % b(c) = prof(k,i) - end if - end if - - if(Turb % model .eq. SPALART_ALLMARAS .or. & - Turb % model .eq. DES_SPALART) then - i = Key_Ind('VIS', keys, nks); if(i > 0) vis % b(c) = prof(k,i) - end if - - if(Turb % model .eq. RSM_MANCEAU_HANJALIC .or. & - Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then - i = Key_Ind('UU', keys, nks); if(i > 0) uu % b(c) = prof(k,i) - i = Key_Ind('VV', keys, nks); if(i > 0) vv % b(c) = prof(k,i) - i = Key_Ind('WW', keys, nks); if(i > 0) ww % b(c) = prof(k,i) - i = Key_Ind('UV', keys, nks); if(i > 0) uv % b(c) = prof(k,i) - i = Key_Ind('UW', keys, nks); if(i > 0) uw % b(c) = prof(k,i) - i = Key_Ind('VW', keys, nks); if(i > 0) vw % b(c) = prof(k,i) - i = Key_Ind('EPS',keys, nks); if(i > 0) eps % b(c) = prof(k,i) - - if(Turb % model .eq. RSM_MANCEAU_HANJALIC) then - i = Key_Ind('F22', keys, nks); if(i>0) f22 % b(c) = prof(k,i) - end if - end if - end if !end if(Grid % bnd_cond % color(c) .eq. n) - end do !end do c = -1, -Grid % n_bnd_cells, -1 - - !----------------------------! - ! A plane is not defined ! - !----------------------------! - else ! dir .eq. "XPL" ... - - do c = -1, -Grid % n_bnd_cells, -1 - - if(Grid % bnd_cond % color(c) .eq. bc) then - - do m = 1, n_points-1 - here = .false. - - i = Key_Ind(keys(1), keys, nks) - prof(m, 0) = 0.0; - prof(m+1, 0) = 0.0; - x = prof(m,i) - xp = prof(m+1,i) - - ! Compute the weight factors - if( keys(1) .eq. 'X' .and. & - Grid % xc(c) >= x .and. Grid % xc(c) <= xp ) then - wi = ( xp - Grid % xc(c) ) / (xp - x) - here = .true. - else if( keys(1) .eq. 'Y' .and. & - Grid % yc(c) >= x .and. Grid % yc(c) <= xp ) then - wi = ( xp - Grid % yc(c) ) / (xp - x) - here = .true. - else if( keys(1) .eq. 'Z' .and. & - Grid % zc(c) >= x .and. Grid % zc(c) <= xp ) then - wi = ( xp - Grid % zc(c) ) / (xp - x) - here = .true. - - ! Beware; for cylindrical coordinates you have "inversion" - else if( (keys(1) .eq. 'RX' .and. & - sqrt(Grid % yc(c)**2 + Grid % zc(c)**2) >= xp .and. & - sqrt(Grid % yc(c)**2 + Grid % zc(c)**2) <= x) ) then - wi = ( xp - sqrt(Grid % yc(c)**2 + Grid % zc(c)**2) ) / (xp-x) - here = .true. - else if( (keys(1) .eq. 'RY' .and. & - sqrt(Grid % xc(c)**2 + Grid % zc(c)**2) >= xp .and. & - sqrt(Grid % xc(c)**2 + Grid % zc(c)**2) <= x) ) then - wi = ( xp - sqrt(Grid % xc(c)**2 + Grid % zc(c)**2) ) / (xp-x) - here = .true. - else if( (keys(1) .eq. 'RZ' .and. & - sqrt(Grid % xc(c)**2 + Grid % yc(c)**2) >= xp .and. & - sqrt(Grid % xc(c)**2 + Grid % yc(c)**2) <= x) ) then - wi = ( xp - sqrt(Grid % xc(c)**2 + Grid % yc(c)**2) ) / (xp-x) - here = .true. - - ! Wall distance too - else if( (keys(1) .eq. 'WD' .and. & - Grid % wall_dist(c) >= min(x,xp) .and. & - Grid % wall_dist(c) <= max(x,xp)) ) then - wi = ( max(x,xp) - Grid % wall_dist(c) ) & - / ( max(x,xp) - min(x,xp) ) - here = .true. - end if - - if(here) then - - ! For temperature - if(heat_transfer) then - i = Key_Ind('T',keys,nks) - if(i > 0) then - t % bnd_cond_type(c) = bc_type_tag - if(bc_type_tag .eq. WALLFL) t % bnd_cond_type(c) = WALL - if(bc_type_tag .eq. WALLFL) & - Grid % bnd_cond % type(bc) = WALL - end if - i = Key_Ind('Q',keys,nks) - if(i > 0) then - t % bnd_cond_type(c) = bc_type_tag - if(bc_type_tag .eq. WALL) t % bnd_cond_type(c) = WALLFL - if(bc_type_tag .eq. WALL) & - Grid % bnd_cond % type(bc) = WALLFL - end if - end if - - ! For scalars - do sc = 1, Flow % n_scalars - i = Key_Ind(scalar(sc) % name, keys, nks) - if(i > 0) then - scalar(sc) % bnd_cond_type(c) = WALL - end if - i = Key_Ind(scalar(sc) % flux_name, keys, nks) - if(i > 0) then - scalar(sc) % bnd_cond_type(c) = WALLFL - end if - end do - - end if ! here - end do ! m, points - end if ! bnd_color .eq. bc - - if(Grid % bnd_cond % color(c) .eq. bc) then - - do m = 1, n_points-1 - here = .false. - - i = Key_Ind(keys(1), keys, nks) - prof(m, 0) = 0.0; - prof(m+1, 0) = 0.0; - x = prof(m,i) - xp = prof(m+1,i) - - ! Compute the weight factors - if( keys(1) .eq. 'X' .and. & - Grid % xc(c) >= x .and. Grid % xc(c) <= xp ) then - wi = ( xp - Grid % xc(c) ) / (xp - x) - here = .true. - else if( keys(1) .eq. 'Y' .and. & - Grid % yc(c) >= x .and. Grid % yc(c) <= xp ) then - wi = ( xp - Grid % yc(c) ) / (xp - x) - here = .true. - else if( keys(1) .eq. 'Z' .and. & - Grid % zc(c) >= x .and. Grid % zc(c) <= xp ) then - wi = ( xp - Grid % zc(c) ) / (xp - x) - here = .true. - - ! Beware; for cylindrical coordinates you have "inversion" - else if( (keys(1) .eq. 'RX' .and. & - sqrt(Grid % yc(c)**2 + Grid % zc(c)**2) >= xp .and. & - sqrt(Grid % yc(c)**2 + Grid % zc(c)**2) <= x) ) then - wi = ( xp - sqrt(Grid % yc(c)**2 + Grid % zc(c)**2) ) / (xp-x) - here = .true. - else if( (keys(1) .eq. 'RY' .and. & - sqrt(Grid % xc(c)**2 + Grid % zc(c)**2) >= xp .and. & - sqrt(Grid % xc(c)**2 + Grid % zc(c)**2) <= x) ) then - wi = ( xp - sqrt(Grid % xc(c)**2 + Grid % zc(c)**2) ) / (xp-x) - here = .true. - else if( (keys(1) .eq. 'RZ' .and. & - sqrt(Grid % xc(c)**2 + Grid % yc(c)**2) >= xp .and. & - sqrt(Grid % xc(c)**2 + Grid % yc(c)**2) <= x) ) then - wi = ( xp - sqrt(Grid % xc(c)**2 + Grid % yc(c)**2) ) / (xp-x) - here = .true. - - ! Wall distance too - else if( (keys(1) .eq. 'WD' .and. & - Grid % wall_dist(c) >= min(x,xp) .and. & - Grid % wall_dist(c) <= max(x,xp)) ) then - wi = ( max(x,xp) - Grid % wall_dist(c) ) & - / ( max(x,xp) - min(x,xp) ) - here = .true. - end if - - ! Interpolate the profiles - if(here) then - - ! For velocity and pressure - i = Key_Ind('U',keys,nks) - if(i > 0) u % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - i = Key_Ind('V',keys,nks) - if(i > 0) v % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - i = Key_Ind('W',keys,nks) - if(i > 0) w % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - i = Key_Ind('P',keys,nks) - if(i > 0) p % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - - ! For temperature - if(heat_transfer) then - i = Key_Ind('T',keys,nks) - if(i > 0) t % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - if(i > 0) then - t % bnd_cond_type(c) = bc_type_tag - if(bc_type_tag .eq. WALLFL) t % bnd_cond_type(c) = WALL - if(bc_type_tag .eq. WALLFL) & - Grid % bnd_cond % type(bc) = WALL - end if - i = Key_Ind('Q',keys,nks) - if(i > 0) t % q(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - if(i > 0) then - t % bnd_cond_type(c) = bc_type_tag - if(bc_type_tag .eq. WALL) t % bnd_cond_type(c) = WALLFL - if(bc_type_tag .eq. WALL) & - Grid % bnd_cond % type(bc) = WALLFL - end if - end if - - ! For scalars - do sc = 1, Flow % n_scalars - i = Key_Ind(scalar(sc) % name, keys, nks) - if(i > 0) then - scalar(sc) % b(c)=wi*prof(m,i)+(1.-wi)*prof(m+1,i) - scalar(sc) % bnd_cond_type(c) = WALL - end if - i = Key_Ind(scalar(sc) % flux_name, keys, nks) - if(i > 0) then - scalar(sc) % q(c)=wi*prof(m,i)+(1.-wi)*prof(m+1,i) - scalar(sc) % bnd_cond_type(c) = WALLFL - end if - end do - - ! For turbulence models - if(Turb % model .eq. K_EPS) then - - i = Key_Ind('KIN',keys,nks) - if(i > 0) kin % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - - i = Key_Ind('EPS',keys,nks) - if(i > 0) eps % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - - if(heat_transfer) then - i = Key_Ind('T2',keys,nks) - if(i > 0) t2 % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - end if - - end if - - if(Turb % model .eq. K_EPS_ZETA_F .or. & - Turb % model .eq. HYBRID_LES_RANS) then - - i = Key_Ind('KIN',keys,nks) - if(i > 0) kin % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - - i = Key_Ind('EPS',keys,nks) - if(i > 0) eps % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - - i = Key_Ind('ZETA',keys,nks) - if(i > 0) zeta % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - - i = Key_Ind('F22',keys,nks) - if(i > 0) f22 % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - - if(heat_transfer) then - i = Key_Ind('T2',keys,nks) - if(i > 0) t2 % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - end if - - end if - - if(Turb % model .eq. RSM_MANCEAU_HANJALIC .or. & - Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then - - i = Key_Ind('UU', keys, nks) - if(i > 0) uu % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - - i = Key_Ind('VV', keys, nks) - if(i > 0) vv % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - - i = Key_Ind('WW', keys, nks) - if(i > 0) ww % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - - i = Key_Ind('UV', keys, nks) - if(i > 0) uv % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - - i = Key_Ind('UW', keys, nks) - if(i > 0) uw % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - - i = Key_Ind('VW', keys, nks) - if(i > 0) vw % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - - i = Key_Ind('EPS', keys, nks) - if(i > 0) eps % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - - if(Turb % model .eq. RSM_MANCEAU_HANJALIC) then - i = Key_Ind('F22', keys, nks) - if(i > 0)f22 % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - end if - end if - - if(Turb % model .eq. SPALART_ALLMARAS .or. & - Turb % model .eq. DES_SPALART) then - i = Key_Ind('VIS',keys,nks) - if(i > 0) vis % b(c) = wi*prof(m,i) + (1.-wi)*prof(m+1,i) - end if - - end if ! (here) - end do ! m = 1, n_points-1 - end if - end do ! c = -1, -Grid % n_bnd_cells, -1 - end if ! plane is defined? - close(fu) - - !-----------------------------! - ! Free memory for profile ! - !-----------------------------! - deallocate(prof) - - end if ! boundary defined in a file - end do - - end do - - !-----------------------------------! - ! ! - ! Read data on synthetic eddies ! - ! ! - !-----------------------------------! - turb_planes % n_planes = 0 - do bc = 1, Grid % n_bnd_cond ! imagine there are as many eddies as bcs - call Control_Mod_Position_At_Two_Keys('SYNTHETIC_EDDIES', & - Grid % bnd_cond % name(bc), & - found, & - .false.) - if(found) then - turb_planes % n_planes = turb_planes % n_planes + 1 - call Control_Mod_Read_Int_Item_On ('NUMBER_OF_EDDIES', 24, edd_n, .false.) - call Control_Mod_Read_Real_Item_On('MAX_EDDY_RADIUS', .2, edd_r, .false.) - call Control_Mod_Read_Real_Item_On('EDDY_INTENSITY', .1, edd_i, .false.) - call Eddies_Mod_Allocate(turb_planes % plane(turb_planes % n_planes), & - edd_n, & - edd_r, & - edd_i, & - Flow, & - Grid % bnd_cond % name(bc)) - end if - end do - if(turb_planes % n_planes > 0 .and. this_proc < 2) then - print *, '# Found ', turb_planes % n_planes, ' turbulent planes' - end if - - !---------------------------------------! - ! ! - ! ! - ! Copy all "b" values to "n" values ! - ! ! - ! ! - !---------------------------------------! - do c = -1, -Grid % n_bnd_cells, -1 - - u % n(c) = u % b(c) - v % n(c) = v % b(c) - w % n(c) = w % b(c) - p % n(c) = p % b(c) - - if(heat_transfer) then - t % n(c) = t % b(c) - end if - - if (Vof % model .eq. VOLUME_OF_FLUID) then - fun % n(c) = fun % b(c) - end if - - do sc = 1, Flow % n_scalars - scalar(sc) % n(c) = scalar(sc) % b(c) - end do - - if(Turb % model .eq. RSM_MANCEAU_HANJALIC .or. & - Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then - uu % n(c) = uu % b(c) - vv % n(c) = vv % b(c) - ww % n(c) = ww % b(c) - uv % n(c) = uv % b(c) - uw % n(c) = uw % b(c) - vw % n(c) = vw % b(c) - eps % n(c) = eps % b(c) - - if(Turb % model .eq. RSM_MANCEAU_HANJALIC) then - f22 % n(c) = f22 % b(c) - end if - end if - - if(Turb % model .eq. K_EPS) then - kin % n(c) = kin % b(c) - eps % n(c) = eps % b(c) - if(heat_transfer) then - t2 % n(c) = t2 % b(c) - end if - end if - - if(Turb % model .eq. K_EPS_ZETA_F .or. & - Turb % model .eq. HYBRID_LES_RANS) then - kin % n(c) = kin % b(c) - eps % n(c) = eps % b(c) - zeta % n(c) = zeta % b(c) - f22 % n(c) = f22 % b(c) - if(heat_transfer) then - t2 % n(c) = t2 % b(c) - end if - end if - - if(Turb % model .eq. SPALART_ALLMARAS .or. & - Turb % model .eq. DES_SPALART) then - vis % n(c) = vis % b(c) - end if - - end do ! through boundary cells - - !------------------------------! - ! Find the near-wall cells ! - !------------------------------! - Grid % cell_near_wall = .false. - - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - if(c2 < 0) then - if(Grid_Mod_Bnd_Cond_Type(Grid,c2) .eq. WALL .or. & - Grid_Mod_Bnd_Cond_Type(Grid,c2) .eq. WALLFL) then - Grid % cell_near_wall(c1) = .true. - end if - end if - - end do ! faces - - call Grid_Mod_Exchange_Cells_Log(Grid, Grid % cell_near_wall) - - end subroutine From 3f3b4c2922fe514e07ec61117b029712e6047ae9 Mon Sep 17 00:00:00 2001 From: Niceno Date: Fri, 24 Mar 2023 14:07:51 +0100 Subject: [PATCH 131/223] IMPORTANT: this_proc and n_proc no longer global! OK, so here is the deal. Variables "this_proc" and "n_proc", standing for current processor and number of processors, are no longer global variables. Vulnerability was paramount. They are two most important variables for parallel execution of the program, yet they are global and available for anyone to change them anywhere. These variables still exist, but are now called this_processor and n_processors, and are private inside the Comm_Type. They can be accessed through new member functions which have been introduced in Comm_Mod: - First_Proc() - N_Procs() - Parallel_Run() - Sequential_Run() - This_Proc() Procedures throughout T-Flows now use these new functions instead of global variables n_proc and this_proc. While making these changes, in many places error messages which were local, have been replaced by calls to Message % Error. On branch bojan_more_robust_communicator Date: Fri Mar 24 14:07:51 2023 +0100 modified: Sources/Process/Backup_Mod/Load.f90 modified: Sources/Process/Backup_Mod/Load_Cell_Real.f90 modified: Sources/Process/Backup_Mod/Load_Face_Real.f90 modified: Sources/Process/Backup_Mod/Load_Int.f90 modified: Sources/Process/Backup_Mod/Load_Int_Array.f90 modified: Sources/Process/Backup_Mod/Load_Log.f90 modified: Sources/Process/Backup_Mod/Load_Log_Array.f90 modified: Sources/Process/Backup_Mod/Load_Real.f90 modified: Sources/Process/Backup_Mod/Load_Real_Array.f90 modified: Sources/Process/Backup_Mod/Load_Variable.f90 modified: Sources/Process/Backup_Mod/Save.f90 modified: Sources/Process/Backup_Mod/Save_Cell_Real.f90 modified: Sources/Process/Backup_Mod/Save_Face_Real.f90 modified: Sources/Process/Backup_Mod/Save_Int.f90 modified: Sources/Process/Backup_Mod/Save_Int_Array.f90 modified: Sources/Process/Backup_Mod/Save_Log.f90 modified: Sources/Process/Backup_Mod/Save_Log_Array.f90 modified: Sources/Process/Backup_Mod/Save_Real.f90 modified: Sources/Process/Backup_Mod/Save_Real_Array.f90 modified: Sources/Process/Backup_Mod/Save_Swarm.f90 modified: Sources/Process/Backup_Mod/Save_Variable.f90 modified: Sources/Process/Bulk_Mod/Print_Areas.f90 modified: Sources/Process/Eddies_Mod/Gather_Bnd_Cells.f90 modified: Sources/Process/Field_Mod/Utilities/Calculate_Bulk_Fluxes.f90 modified: Sources/Process/Field_Mod/Utilities/Compute_Wall_Distance.f90 modified: Sources/Process/Field_Mod/Utilities/Potential_Initialization.f90 modified: Sources/Process/Field_Mod/Utilities/Report_Volume_Balance.f90 modified: Sources/Process/Field_Mod/Utilities/Report_Volume_Balance_Start.f90 modified: Sources/Process/Field_Mod/Utilities/Report_Volume_Balance_Stop.f90 modified: Sources/Process/Front_Mod/Compress_Front_Vertices.f90 modified: Sources/Process/Front_Mod/Find_Sides.f90 modified: Sources/Process/Front_Mod/Print_Front_Statistics.f90 modified: Sources/Process/Front_Mod/Save_Debug_Front_Vtu.f90 modified: Sources/Process/Info_Mod/Bulk_Fill.f90 modified: Sources/Process/Info_Mod/Bulk_Print.f90 modified: Sources/Process/Info_Mod/Bulk_Start.f90 modified: Sources/Process/Info_Mod/Iter_Fill.f90 modified: Sources/Process/Info_Mod/Iter_Fill_At.f90 modified: Sources/Process/Info_Mod/Iter_Fill_User_At.f90 modified: Sources/Process/Info_Mod/Iter_Print.f90 modified: Sources/Process/Info_Mod/Iter_Start.f90 modified: Sources/Process/Info_Mod/Time_Fill.f90 modified: Sources/Process/Info_Mod/Time_Print.f90 modified: Sources/Process/Info_Mod/Time_Start.f90 modified: Sources/Process/Interface_Mod/Create.f90 modified: Sources/Process/Main_Pro.f90 modified: Sources/Process/Monitor_Mod/Initialize.f90 modified: Sources/Process/Native_Mod/Create_Native.f90 modified: Sources/Process/Numerics_Mod/Pressure_Momentum_Coupling_Code.f90 modified: Sources/Process/Numerics_Mod/Time_Integration_Scheme_Code.f90 modified: Sources/Process/Particle_Mod/Initialize_Particle.f90 modified: Sources/Process/Petsc_Mod/Fake/Create_Petsc.f90 modified: Sources/Process/Petsc_Mod/True/Create_Petsc.f90 modified: Sources/Process/Petsc_Mod/True/Solve_Petsc.f90 modified: Sources/Process/Point_Mod/Find_Nearest_Cell.f90 modified: Sources/Process/Process_Mod/Initialize_Variables.f90 modified: Sources/Process/Process_Mod/Logo_Pro.f90 modified: Sources/Process/Process_Mod/Update_Boundary_Values.f90 modified: Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 modified: Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 modified: Sources/Process/Read_Controls_Mod/Physical_Models.f90 modified: Sources/Process/Results_Mod/Main_Results.f90 modified: Sources/Process/Results_Mod/Save_Vtu_Front.f90 modified: Sources/Process/Results_Mod/Save_Vtu_Results.f90 modified: Sources/Process/Results_Mod/Save_Vtu_Scalar_Int.f90 modified: Sources/Process/Results_Mod/Save_Vtu_Scalar_Real.f90 modified: Sources/Process/Results_Mod/Save_Vtu_Surf.f90 modified: Sources/Process/Results_Mod/Save_Vtu_Swarm.f90 modified: Sources/Process/Results_Mod/Save_Vtu_Tensor_6_Real.f90 modified: Sources/Process/Results_Mod/Save_Vtu_Tensor_9_Real.f90 modified: Sources/Process/Results_Mod/Save_Vtu_Vector_Real.f90 modified: Sources/Process/Surf_Mod/Compress_Surf_Vertices.f90 modified: Sources/Process/Surf_Mod/Distribute_Cell_Coords.f90 modified: Sources/Process/Surf_Mod/Distribute_Mesh.f90 modified: Sources/Process/Surf_Mod/Distribute_Smooth.f90 modified: Sources/Process/Surf_Mod/Place_Surf_At_Value.f90 modified: Sources/Process/Swarm_Mod/Advance_Particles.f90 modified: Sources/Process/Swarm_Mod/Allocate_Swarm.f90 modified: Sources/Process/Swarm_Mod/Bounce_Particle.f90 modified: Sources/Process/Swarm_Mod/Check_Periodicity.f90 modified: Sources/Process/Swarm_Mod/Exchange_Particles.f90 modified: Sources/Process/Swarm_Mod/Print_Statistics.f90 modified: Sources/Process/Swarm_Mod/Sgs_Discrete_Random_Walk.f90 modified: Sources/Process/Vof_Mod/Core/Compute_Vof.f90 modified: Sources/Process/Vof_Mod/Core/Initialize_From_Stl.f90 modified: Sources/Shared/Assert_Mod/Handle_Assert.f90 modified: Sources/Shared/Comm_Mod.f90 modified: Sources/Shared/Comm_Mod/Parallel/Exchange_Int_Array.f90 modified: Sources/Shared/Comm_Mod/Parallel/Exchange_Log_Array.f90 modified: Sources/Shared/Comm_Mod/Parallel/Exchange_Real_Array.f90 modified: Sources/Shared/Comm_Mod/Parallel/Sendrecv_Int_Arrays.f90 modified: Sources/Shared/Comm_Mod/Parallel/Sendrecv_Log_Arrays.f90 modified: Sources/Shared/Comm_Mod/Parallel/Sendrecv_Real_Arrays.f90 modified: Sources/Shared/Comm_Mod/Parallel/Start.f90 modified: Sources/Shared/Comm_Mod/Sequential/Exchange_Int_Array.f90 modified: Sources/Shared/Comm_Mod/Sequential/Exchange_Log_Array.f90 modified: Sources/Shared/Comm_Mod/Sequential/Exchange_Real_Array.f90 modified: Sources/Shared/Comm_Mod/Sequential/Sendrecv_Int_Arrays.f90 modified: Sources/Shared/Comm_Mod/Sequential/Sendrecv_Log_Arrays.f90 modified: Sources/Shared/Comm_Mod/Sequential/Sendrecv_Real_Arrays.f90 modified: Sources/Shared/Comm_Mod/Sequential/Start.f90 new file: Sources/Shared/Comm_Mod/Shared/First_Proc.f90 new file: Sources/Shared/Comm_Mod/Shared/N_Procs.f90 new file: Sources/Shared/Comm_Mod/Shared/Parallel_Run.f90 new file: Sources/Shared/Comm_Mod/Shared/Sequential_Run.f90 new file: Sources/Shared/Comm_Mod/Shared/This_Proc.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Open_Domain_File.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Open_Root_File.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Position_At_One_Key.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Position_At_Three_Keys.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Position_At_Two_Keys.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item_On.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item_On.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Array.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Array_On.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item_On.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Read_Strings_On.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Similar_Warning.f90 modified: Sources/Shared/Control_Mod/Input_Output/Save_Initial_Condition.f90 modified: Sources/Shared/Control_Mod/Input_Output/Save_Results_At_Boundaries.f90 modified: Sources/Shared/Control_Mod/Native/Preconditioner_For_System_Matrix.f90 modified: Sources/Shared/Control_Mod/Native/Solver_For_Energy.f90 modified: Sources/Shared/Control_Mod/Native/Solver_For_Momentum.f90 modified: Sources/Shared/Control_Mod/Native/Solver_For_Potential.f90 modified: Sources/Shared/Control_Mod/Native/Solver_For_Pressure.f90 modified: Sources/Shared/Control_Mod/Native/Solver_For_Scalars.f90 modified: Sources/Shared/Control_Mod/Native/Solver_For_Turbulence.f90 modified: Sources/Shared/Control_Mod/Native/Solver_For_Vof.f90 modified: Sources/Shared/Control_Mod/Native/Solver_For_Wall_Distance.f90 modified: Sources/Shared/Control_Mod/Numerics/Choi_Correction.f90 modified: Sources/Shared/Control_Mod/Numerics/Gu_Correction.f90 modified: Sources/Shared/Control_Mod/Numerics/Report_Volume_Balance.f90 modified: Sources/Shared/Control_Mod/Numerics/Skewness_Correction_Vof.f90 modified: Sources/Shared/Control_Mod/Physics/Extrapolate_Temperature_Exp.f90 modified: Sources/Shared/Control_Mod/Physics/Heat_Transfer.f90 modified: Sources/Shared/Control_Mod/Physics/Interface_Tracking.f90 modified: Sources/Shared/Control_Mod/Physics/Mass_Transfer.f90 modified: Sources/Shared/Control_Mod/Physics/Particle_Tracking.f90 modified: Sources/Shared/Control_Mod/Physics/Potential_Initialization.f90 modified: Sources/Shared/Control_Mod/Physics/Rough_Walls.f90 modified: Sources/Shared/Control_Mod/Physics/Track_Front.f90 modified: Sources/Shared/Control_Mod/Physics/Track_Surface.f90 modified: Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 modified: Sources/Shared/Grid_Mod/Determine_Regions_Ranges.f90 modified: Sources/Shared/Grid_Mod/Exchange_Cells_Int.f90 modified: Sources/Shared/Grid_Mod/Exchange_Cells_Log.f90 modified: Sources/Shared/Grid_Mod/Exchange_Cells_Real.f90 modified: Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 modified: Sources/Shared/Grid_Mod/Form_Maps_For_Backup.f90 modified: Sources/Shared/Grid_Mod/Merge_Duplicate_Nodes.f90 modified: Sources/Shared/Grid_Mod/Print_Grid_Statistics.f90 modified: Sources/Shared/Grid_Mod/Save_Debug_Vtu.f90 modified: Sources/Shared/Grid_Mod/Save_Vtu_Faces.f90 modified: Sources/Shared/Message_Mod/Error.f90 modified: Sources/Shared/Message_Mod/Framed.f90 modified: Sources/Shared/Message_Mod/Warning.f90 modified: Sources/Shared/Profiler_Mod/Statistics.f90 modified: Sources/Shared/Stl_Mod/Create_From_File.f90 modified: Sources/Shared/Stl_Mod/Read_Stl_Ascii.f90 modified: Sources/Shared/Stl_Mod/Read_Stl_Binary.f90 modified: Sources/Shared/Work_Mod/Check_Usage/Finalize_Work.f90 modified: Tests/Functionality/Gradients/User_Mod/Initialize_Variables.f90 modified: Tests/Functionality/Omp/User_Mod/Beginning_Of_Simulation.f90 modified: Tests/Functionality/Omp/control modified: Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/Save_Results.f90 modified: Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/Save_Results.f90 modified: Tests/Laminar/Cavity/Thermally_Driven/Conjugate/User_Mod/End_Of_Time_Step.f90 modified: Tests/Laminar/Cavity/Thermally_Driven/Direct/Variable_Properties_Air/User_Mod/Beginning_Of_Simulation.f90 modified: Tests/Laminar/Cylinder/Vertical/User_Mod/Beginning_Of_Iteration.f90 modified: Tests/Laminar/Cylinder/Vertical/User_Mod/Save_Results.f90 modified: Tests/Laminar/Flat_Plate/User_Mod/Plain_Nu.f90 modified: Tests/Laminar/Flat_Plate/User_Mod/Plain_Profiles.f90 modified: Tests/Laminar/Membrane/2_Domains/User_Mod/Beginning_Of_Iteration.f90 modified: Tests/Laminar/Membrane/2_Domains/User_Mod/Interface_Exchange.f90 modified: Tests/Les/Barc/User_Mod/Beginning_Of_Simulation.f90 modified: Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/End_Of_Time_Step.f90 modified: Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/Save_Results.f90 modified: Tests/Les/Channel_Re_Tau_180/User_Mod/Save_Results.f90 modified: Tests/Les/Forrest/User_Mod/End_Of_Time_Step.f90 modified: Tests/Les/Forrest/User_Mod/Save_Results.f90 modified: Tests/Les/Pipe_Re_Tau_180/User_Mod/End_Of_Time_Step.f90 modified: Tests/Les/Pipe_Re_Tau_180/User_Mod/Save_Results.f90 modified: Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 modified: Tests/Manual/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 modified: Tests/Manual/Conjugate/User_Mod/End_Of_Time_Step.f90 modified: Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 modified: Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Profiles.f90 modified: Tests/Manual/Inflows/Option_4/User_Mod/End_Of_Time_Step.f90 modified: Tests/Manual/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 modified: Tests/Manual/Thermally_Driven/Varible/User_Mod/Beginning_Of_Simulation.f90 modified: Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Cf_St.f90 modified: Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Profiles.f90 modified: Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Save_Results.f90 modified: Tests/Rans/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 modified: Tests/Rans/Channel_Re_Tau_590/Uniform_Mesh/User_Mod/Save_Results.f90 modified: Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 modified: Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Profiles.f90 modified: Tests/Rans/Pipe_Re_Tau_550/User_Mod/Save_Results.f90 modified: Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 modified: Tests/Swarm/Bend_90_Degrees/User_Mod/Insert_Particles.f90 modified: Tests/Swarm/Channel_Re_Tau_590/User_Mod/End_Of_Time_Step.f90 modified: Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Results.f90 modified: Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Swarm.f90 modified: Tests/Swarm/T_Junction_Square/User_Mod/Force.f90 modified: Tests/Swarm/Three_Phase_Flow/User_Mod/Insert_Particles.f90 modified: Tests/Vof/Dam_Break_3d/User_Mod/End_Of_Time_Step.f90 modified: Tests/Vof/Dam_Break_3d/User_Mod/Initialize_Variables.f90 modified: Tests/Vof/Pie/User_Mod/End_Of_Time_Step.f90 modified: Tests/Vof/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 modified: Tests/Vof/Spurious/User_Mod/End_Of_Time_Step.f90 modified: Tests/Vof/Vertical_Tube/User_Mod/End_Of_Time_Step.f90 --- Sources/Process/Backup_Mod/Load.f90 | 2 +- Sources/Process/Backup_Mod/Load_Cell_Real.f90 | 4 +- Sources/Process/Backup_Mod/Load_Face_Real.f90 | 4 +- Sources/Process/Backup_Mod/Load_Int.f90 | 4 +- Sources/Process/Backup_Mod/Load_Int_Array.f90 | 4 +- Sources/Process/Backup_Mod/Load_Log.f90 | 4 +- Sources/Process/Backup_Mod/Load_Log_Array.f90 | 4 +- Sources/Process/Backup_Mod/Load_Real.f90 | 4 +- .../Process/Backup_Mod/Load_Real_Array.f90 | 4 +- Sources/Process/Backup_Mod/Load_Variable.f90 | 4 +- Sources/Process/Backup_Mod/Save.f90 | 4 +- Sources/Process/Backup_Mod/Save_Cell_Real.f90 | 2 +- Sources/Process/Backup_Mod/Save_Face_Real.f90 | 2 +- Sources/Process/Backup_Mod/Save_Int.f90 | 2 +- Sources/Process/Backup_Mod/Save_Int_Array.f90 | 2 +- Sources/Process/Backup_Mod/Save_Log.f90 | 2 +- Sources/Process/Backup_Mod/Save_Log_Array.f90 | 2 +- Sources/Process/Backup_Mod/Save_Real.f90 | 2 +- .../Process/Backup_Mod/Save_Real_Array.f90 | 2 +- Sources/Process/Backup_Mod/Save_Swarm.f90 | 2 +- Sources/Process/Backup_Mod/Save_Variable.f90 | 2 +- Sources/Process/Bulk_Mod/Print_Areas.f90 | 2 +- .../Process/Eddies_Mod/Gather_Bnd_Cells.f90 | 28 +++--- .../Utilities/Calculate_Bulk_Fluxes.f90 | 2 +- .../Utilities/Compute_Wall_Distance.f90 | 4 +- .../Utilities/Potential_Initialization.f90 | 4 +- .../Utilities/Report_Volume_Balance.f90 | 2 +- .../Utilities/Report_Volume_Balance_Start.f90 | 6 +- .../Utilities/Report_Volume_Balance_Stop.f90 | 2 +- .../Front_Mod/Compress_Front_Vertices.f90 | 2 +- Sources/Process/Front_Mod/Find_Sides.f90 | 4 +- .../Front_Mod/Print_Front_Statistics.f90 | 2 +- .../Front_Mod/Save_Debug_Front_Vtu.f90 | 10 +-- Sources/Process/Info_Mod/Bulk_Fill.f90 | 2 +- Sources/Process/Info_Mod/Bulk_Print.f90 | 2 +- Sources/Process/Info_Mod/Bulk_Start.f90 | 2 +- Sources/Process/Info_Mod/Iter_Fill.f90 | 2 +- Sources/Process/Info_Mod/Iter_Fill_At.f90 | 2 +- .../Process/Info_Mod/Iter_Fill_User_At.f90 | 2 +- Sources/Process/Info_Mod/Iter_Print.f90 | 2 +- Sources/Process/Info_Mod/Iter_Start.f90 | 2 +- Sources/Process/Info_Mod/Time_Fill.f90 | 2 +- Sources/Process/Info_Mod/Time_Print.f90 | 2 +- Sources/Process/Info_Mod/Time_Start.f90 | 2 +- Sources/Process/Interface_Mod/Create.f90 | 60 ++++++------- Sources/Process/Main_Pro.f90 | 6 +- Sources/Process/Monitor_Mod/Initialize.f90 | 2 +- Sources/Process/Native_Mod/Create_Native.f90 | 4 +- .../Pressure_Momentum_Coupling_Code.f90 | 11 +-- .../Time_Integration_Scheme_Code.f90 | 17 ++-- .../Particle_Mod/Initialize_Particle.f90 | 4 +- .../Process/Petsc_Mod/Fake/Create_Petsc.f90 | 2 +- .../Process/Petsc_Mod/True/Create_Petsc.f90 | 4 +- .../Process/Petsc_Mod/True/Solve_Petsc.f90 | 2 +- .../Process/Point_Mod/Find_Nearest_Cell.f90 | 12 +-- .../Process_Mod/Initialize_Variables.f90 | 14 +-- Sources/Process/Process_Mod/Logo_Pro.f90 | 14 +-- .../Process_Mod/Update_Boundary_Values.f90 | 14 ++- .../Read_Controls_Mod/Boundary_Conditions.f90 | 26 ++---- .../Read_Controls_Mod/Petsc_Solvers.f90 | 16 ++-- .../Read_Controls_Mod/Physical_Models.f90 | 49 ++++------- Sources/Process/Results_Mod/Main_Results.f90 | 4 +- .../Process/Results_Mod/Save_Vtu_Front.f90 | 44 +++++----- .../Process/Results_Mod/Save_Vtu_Results.f90 | 22 ++--- .../Results_Mod/Save_Vtu_Scalar_Int.f90 | 2 +- .../Results_Mod/Save_Vtu_Scalar_Real.f90 | 2 +- Sources/Process/Results_Mod/Save_Vtu_Surf.f90 | 2 +- .../Process/Results_Mod/Save_Vtu_Swarm.f90 | 4 +- .../Results_Mod/Save_Vtu_Tensor_6_Real.f90 | 2 +- .../Results_Mod/Save_Vtu_Tensor_9_Real.f90 | 2 +- .../Results_Mod/Save_Vtu_Vector_Real.f90 | 2 +- .../Surf_Mod/Compress_Surf_Vertices.f90 | 2 +- .../Surf_Mod/Distribute_Cell_Coords.f90 | 4 +- Sources/Process/Surf_Mod/Distribute_Mesh.f90 | 22 ++--- .../Process/Surf_Mod/Distribute_Smooth.f90 | 4 +- .../Process/Surf_Mod/Place_Surf_At_Value.f90 | 2 +- .../Process/Swarm_Mod/Advance_Particles.f90 | 4 +- Sources/Process/Swarm_Mod/Allocate_Swarm.f90 | 2 +- Sources/Process/Swarm_Mod/Bounce_Particle.f90 | 6 +- .../Process/Swarm_Mod/Check_Periodicity.f90 | 6 +- .../Process/Swarm_Mod/Exchange_Particles.f90 | 10 +-- .../Process/Swarm_Mod/Print_Statistics.f90 | 6 +- .../Swarm_Mod/Sgs_Discrete_Random_Walk.f90 | 2 +- Sources/Process/Vof_Mod/Core/Compute_Vof.f90 | 2 +- .../Vof_Mod/Core/Initialize_From_Stl.f90 | 20 ++--- Sources/Shared/Assert_Mod/Handle_Assert.f90 | 4 +- Sources/Shared/Comm_Mod.f90 | 17 +++- .../Comm_Mod/Parallel/Exchange_Int_Array.f90 | 14 +-- .../Comm_Mod/Parallel/Exchange_Log_Array.f90 | 14 +-- .../Comm_Mod/Parallel/Exchange_Real_Array.f90 | 14 +-- .../Comm_Mod/Parallel/Sendrecv_Int_Arrays.f90 | 18 ++-- .../Comm_Mod/Parallel/Sendrecv_Log_Arrays.f90 | 18 ++-- .../Parallel/Sendrecv_Real_Arrays.f90 | 18 ++-- Sources/Shared/Comm_Mod/Parallel/Start.f90 | 14 +-- .../Sequential/Exchange_Int_Array.f90 | 8 +- .../Sequential/Exchange_Log_Array.f90 | 8 +- .../Sequential/Exchange_Real_Array.f90 | 8 +- .../Sequential/Sendrecv_Int_Arrays.f90 | 12 +-- .../Sequential/Sendrecv_Log_Arrays.f90 | 12 +-- .../Sequential/Sendrecv_Real_Arrays.f90 | 12 +-- Sources/Shared/Comm_Mod/Sequential/Start.f90 | 4 +- Sources/Shared/Comm_Mod/Shared/First_Proc.f90 | 9 ++ Sources/Shared/Comm_Mod/Shared/N_Procs.f90 | 9 ++ .../Shared/Comm_Mod/Shared/Parallel_Run.f90 | 9 ++ .../Shared/Comm_Mod/Shared/Sequential_Run.f90 | 9 ++ Sources/Shared/Comm_Mod/Shared/This_Proc.f90 | 9 ++ .../Basic_Functions/Open_Domain_File.f90 | 5 +- .../Basic_Functions/Open_Root_File.f90 | 2 +- .../Basic_Functions/Position_At_One_Key.f90 | 2 +- .../Position_At_Three_Keys.f90 | 2 +- .../Basic_Functions/Position_At_Two_Keys.f90 | 2 +- .../Basic_Functions/Read_Char_Item.f90 | 2 +- .../Basic_Functions/Read_Char_Item_On.f90 | 2 +- .../Basic_Functions/Read_Int_Item.f90 | 2 +- .../Basic_Functions/Read_Int_Item_On.f90 | 2 +- .../Basic_Functions/Read_Real_Array.f90 | 2 +- .../Basic_Functions/Read_Real_Array_On.f90 | 2 +- .../Basic_Functions/Read_Real_Item.f90 | 2 +- .../Basic_Functions/Read_Real_Item_On.f90 | 2 +- .../Basic_Functions/Read_Strings_On.f90 | 2 +- .../Basic_Functions/Similar_Warning.f90 | 2 +- .../Input_Output/Save_Initial_Condition.f90 | 10 +-- .../Save_Results_At_Boundaries.f90 | 10 +-- .../Preconditioner_For_System_Matrix.f90 | 20 ++--- .../Control_Mod/Native/Solver_For_Energy.f90 | 11 ++- .../Native/Solver_For_Momentum.f90 | 11 ++- .../Native/Solver_For_Potential.f90 | 11 ++- .../Native/Solver_For_Pressure.f90 | 11 ++- .../Control_Mod/Native/Solver_For_Scalars.f90 | 11 ++- .../Native/Solver_For_Turbulence.f90 | 11 ++- .../Control_Mod/Native/Solver_For_Vof.f90 | 11 ++- .../Native/Solver_For_Wall_Distance.f90 | 11 ++- .../Control_Mod/Numerics/Choi_Correction.f90 | 12 +-- .../Control_Mod/Numerics/Gu_Correction.f90 | 12 +-- .../Numerics/Report_Volume_Balance.f90 | 11 +-- .../Numerics/Skewness_Correction_Vof.f90 | 11 +-- .../Physics/Extrapolate_Temperature_Exp.f90 | 11 +-- .../Control_Mod/Physics/Heat_Transfer.f90 | 10 +-- .../Physics/Interface_Tracking.f90 | 11 +-- .../Control_Mod/Physics/Mass_Transfer.f90 | 10 +-- .../Control_Mod/Physics/Particle_Tracking.f90 | 11 +-- .../Physics/Potential_Initialization.f90 | 10 +-- .../Control_Mod/Physics/Rough_Walls.f90 | 10 +-- .../Control_Mod/Physics/Track_Front.f90 | 11 +-- .../Control_Mod/Physics/Track_Surface.f90 | 11 +-- .../Grid_Mod/Calculate_Face_Geometry.f90 | 10 +-- .../Grid_Mod/Determine_Regions_Ranges.f90 | 38 ++++---- .../Shared/Grid_Mod/Exchange_Cells_Int.f90 | 6 +- .../Shared/Grid_Mod/Exchange_Cells_Log.f90 | 6 +- .../Shared/Grid_Mod/Exchange_Cells_Real.f90 | 16 ++-- Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 | 88 ++++++++++--------- .../Shared/Grid_Mod/Form_Maps_For_Backup.f90 | 4 +- .../Shared/Grid_Mod/Merge_Duplicate_Nodes.f90 | 10 +-- .../Shared/Grid_Mod/Print_Grid_Statistics.f90 | 16 ++-- Sources/Shared/Grid_Mod/Save_Debug_Vtu.f90 | 10 ++- Sources/Shared/Grid_Mod/Save_Vtu_Faces.f90 | 4 +- Sources/Shared/Message_Mod/Error.f90 | 14 +-- Sources/Shared/Message_Mod/Framed.f90 | 18 ++-- Sources/Shared/Message_Mod/Warning.f90 | 14 +-- Sources/Shared/Profiler_Mod/Statistics.f90 | 6 +- Sources/Shared/Stl_Mod/Create_From_File.f90 | 2 +- Sources/Shared/Stl_Mod/Read_Stl_Ascii.f90 | 4 +- Sources/Shared/Stl_Mod/Read_Stl_Binary.f90 | 4 +- .../Work_Mod/Check_Usage/Finalize_Work.f90 | 2 +- .../User_Mod/Initialize_Variables.f90 | 10 +-- .../Omp/User_Mod/Beginning_Of_Simulation.f90 | 5 +- Tests/Functionality/Omp/control | 19 ++-- .../Uniform_Mesh/User_Mod/Save_Results.f90 | 6 +- .../Channel_Re_2000/User_Mod/Save_Results.f90 | 4 +- .../Conjugate/User_Mod/End_Of_Time_Step.f90 | 4 +- .../User_Mod/Beginning_Of_Simulation.f90 | 2 +- .../User_Mod/Beginning_Of_Iteration.f90 | 2 +- .../Vertical/User_Mod/Save_Results.f90 | 2 +- .../Laminar/Flat_Plate/User_Mod/Plain_Nu.f90 | 4 +- .../Flat_Plate/User_Mod/Plain_Profiles.f90 | 8 +- .../User_Mod/Beginning_Of_Iteration.f90 | 4 +- .../2_Domains/User_Mod/Interface_Exchange.f90 | 4 +- .../Barc/User_Mod/Beginning_Of_Simulation.f90 | 2 +- .../User_Mod/End_Of_Time_Step.f90 | 9 +- .../Periodic_Domain/User_Mod/Save_Results.f90 | 14 +-- .../User_Mod/Save_Results.f90 | 13 +-- .../Les/Forrest/User_Mod/End_Of_Time_Step.f90 | 9 +- Tests/Les/Forrest/User_Mod/Save_Results.f90 | 4 +- .../User_Mod/End_Of_Time_Step.f90 | 2 +- .../Pipe_Re_Tau_180/User_Mod/Save_Results.f90 | 6 +- .../User_Mod/Save_Results.f90 | 6 +- .../Stretched_Mesh/User_Mod/Save_Results.f90 | 8 +- .../Conjugate/User_Mod/End_Of_Time_Step.f90 | 4 +- .../User_Mod/Save_Impinging_Jet_Nu.f90 | 6 +- .../User_Mod/Save_Impinging_Jet_Profiles.f90 | 6 +- .../Option_4/User_Mod/End_Of_Time_Step.f90 | 11 +-- .../User_Mod/End_Of_Time_Step.f90 | 2 +- .../User_Mod/Beginning_Of_Simulation.f90 | 2 +- .../User_Mod/Backstep_Cf_St.f90 | 4 +- .../User_Mod/Backstep_Profiles.f90 | 8 +- .../Rsm/User_Mod/Save_Results.f90 | 6 +- .../Stretched_Mesh/User_Mod/Save_Results.f90 | 6 +- .../Uniform_Mesh/User_Mod/Save_Results.f90 | 6 +- .../User_Mod/Impinging_Jet_Nu.f90 | 6 +- .../User_Mod/Impinging_Jet_Profiles.f90 | 6 +- .../Pipe_Re_Tau_550/User_Mod/Save_Results.f90 | 6 +- .../User_Mod/Save_Results.f90 | 6 +- .../User_Mod/Insert_Particles.f90 | 4 +- .../User_Mod/End_Of_Time_Step.f90 | 11 +-- .../User_Mod/Save_Results.f90 | 16 +--- .../User_Mod/Save_Swarm.f90 | 15 +--- .../T_Junction_Square/User_Mod/Force.f90 | 4 +- .../User_Mod/Insert_Particles.f90 | 4 +- .../User_Mod/End_Of_Time_Step.f90 | 2 +- .../User_Mod/Initialize_Variables.f90 | 2 +- Tests/Vof/Pie/User_Mod/End_Of_Time_Step.f90 | 4 +- .../User_Mod/End_Of_Time_Step.f90 | 2 +- .../Spurious/User_Mod/End_Of_Time_Step.f90 | 4 +- .../User_Mod/End_Of_Time_Step.f90 | 2 +- 214 files changed, 808 insertions(+), 895 deletions(-) create mode 100644 Sources/Shared/Comm_Mod/Shared/First_Proc.f90 create mode 100644 Sources/Shared/Comm_Mod/Shared/N_Procs.f90 create mode 100644 Sources/Shared/Comm_Mod/Shared/Parallel_Run.f90 create mode 100644 Sources/Shared/Comm_Mod/Shared/Sequential_Run.f90 create mode 100644 Sources/Shared/Comm_Mod/Shared/This_Proc.f90 diff --git a/Sources/Process/Backup_Mod/Load.f90 b/Sources/Process/Backup_Mod/Load.f90 index f492a708e..421e756ed 100644 --- a/Sources/Process/Backup_Mod/Load.f90 +++ b/Sources/Process/Backup_Mod/Load.f90 @@ -66,7 +66,7 @@ subroutine Load(Backup, Flow, Turb, Vof, Swarm, time, time_step, bckp) call Backup % Load_Int(Comm, d, 2048, 'variable_count', vc) if(vc .eq. 0) vc = 2048 ! for backward compatibility - if(this_proc < 2) then + if(First_Proc()) then print *, "# Backup file holds ", vc, " variables." end if diff --git a/Sources/Process/Backup_Mod/Load_Cell_Real.f90 b/Sources/Process/Backup_Mod/Load_Cell_Real.f90 index 27893625f..77ba0c0a4 100644 --- a/Sources/Process/Backup_Mod/Load_Cell_Real.f90 +++ b/Sources/Process/Backup_Mod/Load_Cell_Real.f90 @@ -41,7 +41,7 @@ subroutine Load_Cell_Real(Backup, Grid, disp, vc, var_name, array) ! If variable is found, read it and retrun if(vn .eq. var_name) then - if(this_proc < 2) print *, '# Reading variable: ', trim(vn) + if(First_Proc()) print *, '# Reading variable: ', trim(vn) call Comm % Read_Cell_Real(fh, array(1:Comm % nc_sub), disp_loop) call Comm % Read_Bnd_Real (fh, array( -Comm % nb_f: & -Comm % nb_l), disp_loop) @@ -59,7 +59,7 @@ subroutine Load_Cell_Real(Backup, Grid, disp, vc, var_name, array) end do -1 if(this_proc < 2) print *, '# Variable: ', trim(var_name), ' not found! ', & +1 if(First_Proc()) print *, '# Variable: ', trim(var_name), ' not found! ', & 'Setting the values to 0.0!' array(:) = 0.0 diff --git a/Sources/Process/Backup_Mod/Load_Face_Real.f90 b/Sources/Process/Backup_Mod/Load_Face_Real.f90 index 2ca1822fe..9d5b0f9a8 100644 --- a/Sources/Process/Backup_Mod/Load_Face_Real.f90 +++ b/Sources/Process/Backup_Mod/Load_Face_Real.f90 @@ -40,7 +40,7 @@ subroutine Load_Face_Real(Backup, Grid, disp, vc, var_name, array, corr_sign) ! If variable is found, read it and retrun if(vn .eq. var_name) then - if(this_proc < 2) print *, '# Reading variable: ', trim(vn) + if(First_Proc()) print *, '# Reading variable: ', trim(vn) i_sid = 1 ! local side counter do sg = 1, Comm % nf_tot ! global side loop @@ -81,7 +81,7 @@ subroutine Load_Face_Real(Backup, Grid, disp, vc, var_name, array, corr_sign) return -1 if(this_proc < 2) print *, '# Variable: ', trim(var_name), ' not found! ', & +1 if(First_Proc()) print *, '# Variable: ', trim(var_name), ' not found! ', & 'Setting the values to 0.0!' array(:) = 0.0 diff --git a/Sources/Process/Backup_Mod/Load_Int.f90 b/Sources/Process/Backup_Mod/Load_Int.f90 index 32e76abf8..cc6da8b84 100644 --- a/Sources/Process/Backup_Mod/Load_Int.f90 +++ b/Sources/Process/Backup_Mod/Load_Int.f90 @@ -35,7 +35,7 @@ subroutine Load_Int(Backup, Comm, disp, vc, var_name, var_value) ! If variable is found, read it and retrun if(vn .eq. var_name) then - if(this_proc < 2) print *, '# Reading variable: ', trim(vn) + if(First_Proc()) print *, '# Reading variable: ', trim(vn) call Comm % Read_Int(fh, var_value, disp_loop) disp = disp_loop return @@ -50,7 +50,7 @@ subroutine Load_Int(Backup, Comm, disp, vc, var_name, var_value) end do -1 if(this_proc < 2) print *, '# Variable: ', trim(var_name), ' not found! ', & +1 if(First_Proc()) print *, '# Variable: ', trim(var_name), ' not found! ', & 'Setting the value to 0!' var_value = 0 diff --git a/Sources/Process/Backup_Mod/Load_Int_Array.f90 b/Sources/Process/Backup_Mod/Load_Int_Array.f90 index 918517a38..3f9b5251f 100644 --- a/Sources/Process/Backup_Mod/Load_Int_Array.f90 +++ b/Sources/Process/Backup_Mod/Load_Int_Array.f90 @@ -36,7 +36,7 @@ subroutine Load_Int_Array(Backup, Comm, disp, vc, arr_name, arr_value) ! If variable is found, read it and retrun if(vn .eq. arr_name) then - if(this_proc < 2) print *, '# Reading array: ', trim(vn) + if(First_Proc()) print *, '# Reading array: ', trim(vn) call Comm % Read_Int_Array(fh, arr_value, disp_loop) disp = disp_loop return @@ -51,7 +51,7 @@ subroutine Load_Int_Array(Backup, Comm, disp, vc, arr_name, arr_value) end do -1 if(this_proc < 2) print *, '# Array: ', trim(arr_name), ' not found! ', & +1 if(First_Proc()) print *, '# Array: ', trim(arr_name), ' not found! ', & 'Setting the values to 0!' arr_value(:) = 0 diff --git a/Sources/Process/Backup_Mod/Load_Log.f90 b/Sources/Process/Backup_Mod/Load_Log.f90 index dc436dce0..487913765 100644 --- a/Sources/Process/Backup_Mod/Load_Log.f90 +++ b/Sources/Process/Backup_Mod/Load_Log.f90 @@ -35,7 +35,7 @@ subroutine Load_Log(Backup, Comm, disp, vc, var_name, var_value) ! If variable is found, read it and retrun if(vn .eq. var_name) then - if(this_proc < 2) print *, '# Reading variable: ', trim(vn) + if(First_Proc()) print *, '# Reading variable: ', trim(vn) call Comm % Read_Log(fh, var_value, disp_loop) disp = disp_loop return @@ -50,7 +50,7 @@ subroutine Load_Log(Backup, Comm, disp, vc, var_name, var_value) end do -1 if(this_proc < 2) print *, '# Variable: ', trim(var_name), ' not found! ', & +1 if(First_Proc()) print *, '# Variable: ', trim(var_name), ' not found! ', & 'Setting the value to false!' var_value = .false. diff --git a/Sources/Process/Backup_Mod/Load_Log_Array.f90 b/Sources/Process/Backup_Mod/Load_Log_Array.f90 index 68d867e92..bd17e18f2 100644 --- a/Sources/Process/Backup_Mod/Load_Log_Array.f90 +++ b/Sources/Process/Backup_Mod/Load_Log_Array.f90 @@ -36,7 +36,7 @@ subroutine Load_Log_Array(Backup, Comm, disp, vc, arr_name, arr_value) ! If variable is found, read it and retrun if(vn .eq. arr_name) then - if(this_proc < 2) print *, '# Reading array: ', trim(vn) + if(First_Proc()) print *, '# Reading array: ', trim(vn) call Comm % Read_Log_Array(fh, arr_value, disp_loop) disp = disp_loop return @@ -51,7 +51,7 @@ subroutine Load_Log_Array(Backup, Comm, disp, vc, arr_name, arr_value) end do -1 if(this_proc < 2) print *, '# Array: ', trim(arr_name), ' not found! ', & +1 if(First_Proc()) print *, '# Array: ', trim(arr_name), ' not found! ', & 'Setting the values to .false.!' arr_value(:) = .false. diff --git a/Sources/Process/Backup_Mod/Load_Real.f90 b/Sources/Process/Backup_Mod/Load_Real.f90 index 7d68f41a7..3c17ddefb 100644 --- a/Sources/Process/Backup_Mod/Load_Real.f90 +++ b/Sources/Process/Backup_Mod/Load_Real.f90 @@ -35,7 +35,7 @@ subroutine Load_Real(Backup, Comm, disp, vc, var_name, var_value) ! If variable is found, read it and retrun if(vn .eq. var_name) then - if(this_proc < 2) print *, '# Reading variable: ', trim(vn) + if(First_Proc()) print *, '# Reading variable: ', trim(vn) call Comm % Read_Real(fh, var_value, disp_loop) disp = disp_loop return @@ -50,7 +50,7 @@ subroutine Load_Real(Backup, Comm, disp, vc, var_name, var_value) end do -1 if(this_proc < 2) print *, '# Variable: ', trim(var_name), ' not found! ', & +1 if(First_Proc()) print *, '# Variable: ', trim(var_name), ' not found! ', & 'Setting the value to 0.0!' var_value = 0.0 diff --git a/Sources/Process/Backup_Mod/Load_Real_Array.f90 b/Sources/Process/Backup_Mod/Load_Real_Array.f90 index c9270ac6b..85d0e0706 100644 --- a/Sources/Process/Backup_Mod/Load_Real_Array.f90 +++ b/Sources/Process/Backup_Mod/Load_Real_Array.f90 @@ -36,7 +36,7 @@ subroutine Load_Real_Array(Backup, Comm, disp, vc, arr_name, arr_value) ! If variable is found, read it and retrun if(vn .eq. arr_name) then - if(this_proc < 2) print *, '# Reading array: ', trim(vn) + if(First_Proc()) print *, '# Reading array: ', trim(vn) call Comm % Read_Real_Array(fh, arr_value(1:length), disp_loop) disp = disp_loop return @@ -51,7 +51,7 @@ subroutine Load_Real_Array(Backup, Comm, disp, vc, arr_name, arr_value) end do -1 if(this_proc < 2) print *, '# Array: ', trim(arr_name), ' not found!', & +1 if(First_Proc()) print *, '# Array: ', trim(arr_name), ' not found!', & 'Setting the values to 0.0!' arr_value(:) = 0.0 diff --git a/Sources/Process/Backup_Mod/Load_Variable.f90 b/Sources/Process/Backup_Mod/Load_Variable.f90 index 1e0d9bc3d..b925445a6 100644 --- a/Sources/Process/Backup_Mod/Load_Variable.f90 +++ b/Sources/Process/Backup_Mod/Load_Variable.f90 @@ -43,7 +43,7 @@ subroutine Load_Variable(Backup, disp, vc, var_name, Flow, var) ! If variable is found, read it and retrun if(vn .eq. var_name) then - if(this_proc < 2) print *, '# Reading variable: ', trim(vn) + if(First_Proc()) print *, '# Reading variable: ', trim(vn) call Comm % Read_Cell_Real(fh,var % n(1:Comm % nc_sub), disp_loop) call Comm % Read_Bnd_Real (fh,var % n( -Comm % nb_f: & -Comm % nb_l), disp_loop) @@ -75,7 +75,7 @@ subroutine Load_Variable(Backup, disp, vc, var_name, Flow, var) end do -1 if(this_proc < 2) print *, '# Variable: ', trim(var_name), ' not found!', & +1 if(First_Proc()) print *, '# Variable: ', trim(var_name), ' not found!', & 'Setting the values to 0.0!' var % n(:) = 0.0 var % q(:) = 0.0 diff --git a/Sources/Process/Backup_Mod/Save.f90 b/Sources/Process/Backup_Mod/Save.f90 index 17163fc1f..995e291eb 100644 --- a/Sources/Process/Backup_Mod/Save.f90 +++ b/Sources/Process/Backup_Mod/Save.f90 @@ -66,7 +66,7 @@ subroutine Save(Backup, Flow, Turb, Vof, Swarm, time, time_step, dom) call Backup % Save_Real(Comm, d, vc, 'time', time) ! Number of processors - call Backup % Save_Int(Comm, d, vc, 'n_proc', n_proc) + call Backup % Save_Int(Comm, d, vc, 'n_proc', N_Procs()) ! Bulk flows and pressure drops in each direction call Backup % Save_Real(Comm, d, vc, 'bulk_flux_x', bulk % flux_x) @@ -337,7 +337,7 @@ subroutine Save(Backup, Flow, Turb, Vof, Swarm, time, time_step, dom) ! Variable count (store +1 to count its own self) call Backup % Save_Int(Comm, d, vc, 'variable_count', vc + 1) - if(this_proc < 2) then + if(First_Proc()) then print *, '# Wrote ', vc, ' variables!' end if diff --git a/Sources/Process/Backup_Mod/Save_Cell_Real.f90 b/Sources/Process/Backup_Mod/Save_Cell_Real.f90 index c9a3fe704..253b2b1bf 100644 --- a/Sources/Process/Backup_Mod/Save_Cell_Real.f90 +++ b/Sources/Process/Backup_Mod/Save_Cell_Real.f90 @@ -22,7 +22,7 @@ subroutine Save_Cell_Real(Backup, Grid, disp, vc, var_name, array) ! Take alias Comm => Grid % Comm - if(this_proc < 2) print *, '# Writing variable: ', trim(var_name) + if(First_Proc()) print *, '# Writing variable: ', trim(var_name) ! Increase variable count vc = vc + 1 diff --git a/Sources/Process/Backup_Mod/Save_Face_Real.f90 b/Sources/Process/Backup_Mod/Save_Face_Real.f90 index 0dd3c1857..5875c2480 100644 --- a/Sources/Process/Backup_Mod/Save_Face_Real.f90 +++ b/Sources/Process/Backup_Mod/Save_Face_Real.f90 @@ -26,7 +26,7 @@ subroutine Save_Face_Real(Backup, Grid, disp, vc, var_name, array, corr_sign) ! Take alias Comm => Grid % Comm - if(this_proc < 2) print *, '# Writing variable: ', trim(var_name) + if(First_Proc()) print *, '# Writing variable: ', trim(var_name) ! Increase variable count vc = vc + 1 diff --git a/Sources/Process/Backup_Mod/Save_Int.f90 b/Sources/Process/Backup_Mod/Save_Int.f90 index 3cbfbf6d0..b8345b5f1 100644 --- a/Sources/Process/Backup_Mod/Save_Int.f90 +++ b/Sources/Process/Backup_Mod/Save_Int.f90 @@ -18,7 +18,7 @@ subroutine Save_Int(Backup, Comm, disp, vc, var_name, var_value) Unused(Backup) !==============================================================================! - if(this_proc < 2) print *, '# Writing variable: ', trim(var_name) + if(First_Proc()) print *, '# Writing variable: ', trim(var_name) ! Increase variable count vc = vc + 1 diff --git a/Sources/Process/Backup_Mod/Save_Int_Array.f90 b/Sources/Process/Backup_Mod/Save_Int_Array.f90 index f2fe3e15b..90c6d7fe3 100644 --- a/Sources/Process/Backup_Mod/Save_Int_Array.f90 +++ b/Sources/Process/Backup_Mod/Save_Int_Array.f90 @@ -20,7 +20,7 @@ subroutine Save_Int_Array(Backup, Comm, disp, vc, arr_name, arr_value) length = size(arr_value) - if(this_proc < 2) print *, '# Writing array: ', trim(arr_name) + if(First_Proc()) print *, '# Writing array: ', trim(arr_name) ! Increase variable count vc = vc + 1 diff --git a/Sources/Process/Backup_Mod/Save_Log.f90 b/Sources/Process/Backup_Mod/Save_Log.f90 index 4cb4f07c5..e261f3764 100644 --- a/Sources/Process/Backup_Mod/Save_Log.f90 +++ b/Sources/Process/Backup_Mod/Save_Log.f90 @@ -18,7 +18,7 @@ subroutine Save_Log(Backup, Comm, disp, vc, var_name, var_value) Unused(Backup) !==============================================================================! - if(this_proc < 2) print *, '# Writing variable: ', trim(var_name) + if(First_Proc()) print *, '# Writing variable: ', trim(var_name) ! Increase variable count vc = vc + 1 diff --git a/Sources/Process/Backup_Mod/Save_Log_Array.f90 b/Sources/Process/Backup_Mod/Save_Log_Array.f90 index b2e8245ec..5609986a7 100644 --- a/Sources/Process/Backup_Mod/Save_Log_Array.f90 +++ b/Sources/Process/Backup_Mod/Save_Log_Array.f90 @@ -20,7 +20,7 @@ subroutine Save_Log_Array(Backup, Comm, disp, vc, arr_name, arr_value) length = size(arr_value) - if(this_proc < 2) print *, '# Writing array: ', trim(arr_name) + if(First_Proc()) print *, '# Writing array: ', trim(arr_name) ! Increase variable count vc = vc + 1 diff --git a/Sources/Process/Backup_Mod/Save_Real.f90 b/Sources/Process/Backup_Mod/Save_Real.f90 index fcbbf4d6a..7e7bc79ab 100644 --- a/Sources/Process/Backup_Mod/Save_Real.f90 +++ b/Sources/Process/Backup_Mod/Save_Real.f90 @@ -18,7 +18,7 @@ subroutine Save_Real(Backup, Comm, disp, vc, var_name, var_value) Unused(Backup) !==============================================================================! - if(this_proc < 2) print *, '# Writing variable: ', trim(var_name) + if(First_Proc()) print *, '# Writing variable: ', trim(var_name) ! Increase variable count vc = vc + 1 diff --git a/Sources/Process/Backup_Mod/Save_Real_Array.f90 b/Sources/Process/Backup_Mod/Save_Real_Array.f90 index 1b608d711..100668522 100644 --- a/Sources/Process/Backup_Mod/Save_Real_Array.f90 +++ b/Sources/Process/Backup_Mod/Save_Real_Array.f90 @@ -20,7 +20,7 @@ subroutine Save_Real_Array(Backup, Comm, disp, vc, arr_name, arr_value) length = size(arr_value) - if(this_proc < 2) print *, '# Writing array: ', trim(arr_name) + if(First_Proc()) print *, '# Writing array: ', trim(arr_name) ! Increase variable count vc = vc + 1 diff --git a/Sources/Process/Backup_Mod/Save_Swarm.f90 b/Sources/Process/Backup_Mod/Save_Swarm.f90 index 85f9f4652..143e8cac9 100644 --- a/Sources/Process/Backup_Mod/Save_Swarm.f90 +++ b/Sources/Process/Backup_Mod/Save_Swarm.f90 @@ -44,7 +44,7 @@ subroutine Save_Swarm(Backup, Swarm, disp, vc) ! Take aliases for the particle Part => Swarm % Particle(k) - if(Part % proc .eq. this_proc) then + if(Part % proc .eq. This_Proc()) then i = (k-1) * Swarm % N_I_VARS Swarm % i_work(i + 1) = Part % proc ! where it resides Swarm % i_work(i + 2) = Part % buff ! where it wants to go diff --git a/Sources/Process/Backup_Mod/Save_Variable.f90 b/Sources/Process/Backup_Mod/Save_Variable.f90 index a29f9bd7f..325c655fb 100644 --- a/Sources/Process/Backup_Mod/Save_Variable.f90 +++ b/Sources/Process/Backup_Mod/Save_Variable.f90 @@ -21,7 +21,7 @@ subroutine Save_Variable(Backup, disp, vc, var_name, var) ! Take alias Comm => var % pnt_grid % Comm - if(this_proc < 2) print *, '# Writing variable: ', trim(var_name) + if(First_Proc()) print *, '# Writing variable: ', trim(var_name) ! Increase variable count vc = vc + 1 diff --git a/Sources/Process/Bulk_Mod/Print_Areas.f90 b/Sources/Process/Bulk_Mod/Print_Areas.f90 index dd8f96d2f..d0c209b4b 100644 --- a/Sources/Process/Bulk_Mod/Print_Areas.f90 +++ b/Sources/Process/Bulk_Mod/Print_Areas.f90 @@ -8,7 +8,7 @@ subroutine Bulk_Mod_Print_Areas(bulk) type(Bulk_Type) :: bulk !==============================================================================! - if(this_proc < 2) then + if(First_Proc()) then write(*,'(a7,es12.5)') ' # Ax :', bulk % area_x write(*,'(a7,es12.5)') ' # Ay :', bulk % area_y write(*,'(a7,es12.5)') ' # Az :', bulk % area_z diff --git a/Sources/Process/Eddies_Mod/Gather_Bnd_Cells.f90 b/Sources/Process/Eddies_Mod/Gather_Bnd_Cells.f90 index 5fc09d0ad..3eff2599d 100644 --- a/Sources/Process/Eddies_Mod/Gather_Bnd_Cells.f90 +++ b/Sources/Process/Eddies_Mod/Gather_Bnd_Cells.f90 @@ -32,13 +32,13 @@ subroutine Eddies_Mod_Gather_Bnd_Cells(eddies) end do ! Estimate first boundary cell for each processor - if(n_proc > 1) then - allocate(n_bnd_cells_proc(n_proc)); n_bnd_cells_proc(:) = 0; - n_bnd_cells_proc(this_proc) = eddies % n_bnd_cells - call Comm_Mod_Global_Sum_Int_Array(n_proc, n_bnd_cells_proc) + if(Parallel_Run()) then + allocate(n_bnd_cells_proc(N_Procs())); n_bnd_cells_proc(:) = 0; + n_bnd_cells_proc(This_Proc()) = eddies % n_bnd_cells + call Comm_Mod_Global_Sum_Int_Array(N_Procs(), n_bnd_cells_proc) - allocate(s_bnd_cell_proc(n_proc)); s_bnd_cell_proc(:) = 0 - do n = 2, n_proc + allocate(s_bnd_cell_proc(N_Procs())); s_bnd_cell_proc(:) = 0 + do n = 2, N_Procs() s_bnd_cell_proc(n) = s_bnd_cell_proc(n-1) + n_bnd_cells_proc(n-1) end do else @@ -48,7 +48,7 @@ subroutine Eddies_Mod_Gather_Bnd_Cells(eddies) ! Gather coordinates from all processors eddies % n_bnd_cells_glo = eddies % n_bnd_cells call Comm_Mod_Global_Sum_Int(eddies % n_bnd_cells_glo) - if(this_proc < 2) then + if(First_Proc()) then print '(a,a,i6)', ' # Number of boundary cells at ', & trim(eddies % bc_name), & eddies % n_bnd_cells_glo @@ -65,13 +65,13 @@ subroutine Eddies_Mod_Gather_Bnd_Cells(eddies) do c = -Grid % n_bnd_cells, -1 if(Grid % Bnd_Cond_Name_At_Cell(c) .eq. eddies % bc_name) then cnt = cnt + 1 - eddies % bnd_xc(cnt + s_bnd_cell_proc(this_proc)) = Grid % xc(c) - eddies % bnd_yc(cnt + s_bnd_cell_proc(this_proc)) = Grid % yc(c) - eddies % bnd_zc(cnt + s_bnd_cell_proc(this_proc)) = Grid % zc(c) - eddies % bnd_wd(cnt + s_bnd_cell_proc(this_proc)) = Grid % wall_dist(c) - eddies % bnd_u (cnt + s_bnd_cell_proc(this_proc)) = Flow % u % b(c) - eddies % bnd_v (cnt + s_bnd_cell_proc(this_proc)) = Flow % v % b(c) - eddies % bnd_w (cnt + s_bnd_cell_proc(this_proc)) = Flow % w % b(c) + eddies % bnd_xc(cnt + s_bnd_cell_proc(This_Proc())) = Grid % xc(c) + eddies % bnd_yc(cnt + s_bnd_cell_proc(This_Proc())) = Grid % yc(c) + eddies % bnd_zc(cnt + s_bnd_cell_proc(This_Proc())) = Grid % zc(c) + eddies % bnd_wd(cnt + s_bnd_cell_proc(This_Proc())) = Grid % wall_dist(c) + eddies % bnd_u (cnt + s_bnd_cell_proc(This_Proc())) = Flow % u % b(c) + eddies % bnd_v (cnt + s_bnd_cell_proc(This_Proc())) = Flow % v % b(c) + eddies % bnd_w (cnt + s_bnd_cell_proc(This_Proc())) = Flow % w % b(c) end if end do call Comm_Mod_Global_Sum_Real_Array(eddies % n_bnd_cells_glo, eddies % bnd_xc) diff --git a/Sources/Process/Field_Mod/Utilities/Calculate_Bulk_Fluxes.f90 b/Sources/Process/Field_Mod/Utilities/Calculate_Bulk_Fluxes.f90 index 190aba0cb..8889aa0ba 100644 --- a/Sources/Process/Field_Mod/Utilities/Calculate_Bulk_Fluxes.f90 +++ b/Sources/Process/Field_Mod/Utilities/Calculate_Bulk_Fluxes.f90 @@ -39,7 +39,7 @@ subroutine Calculate_Bulk_Fluxes(Flow, v_flux) ! If the flux is across a buffer face, it is summed up twice. ! The variable "wgt" is here to take care of that. wgt = 1.0 - if(Grid % Comm % cell_proc(c2) .ne. this_proc) wgt = 0.5 + if(Grid % Comm % cell_proc(c2) .ne. This_Proc()) wgt = 0.5 !-------! ! X ! diff --git a/Sources/Process/Field_Mod/Utilities/Compute_Wall_Distance.f90 b/Sources/Process/Field_Mod/Utilities/Compute_Wall_Distance.f90 index 831281f40..941026bf8 100644 --- a/Sources/Process/Field_Mod/Utilities/Compute_Wall_Distance.f90 +++ b/Sources/Process/Field_Mod/Utilities/Compute_Wall_Distance.f90 @@ -37,7 +37,7 @@ subroutine Compute_Wall_Distance(Flow, Sol) call Work % Connect_Real_Cell(cross) - if(this_proc < 2) then + if(First_Proc()) then print '(a)', ' # Computing wall distance ...' print '(a,i3,a)', ' # ... with ', NDT, ' fake time steps.' print '(a)', ' # This might take a while, please wait' @@ -200,7 +200,7 @@ subroutine Compute_Wall_Distance(Flow, Sol) phi % tol, & phi % res) - if(this_proc < 2) then + if(First_Proc()) then print '(a,i4,a,e12.4)', ' # Computed wall distance in ', phi % eniter, & ' iterations with residual: ', phi % res end if diff --git a/Sources/Process/Field_Mod/Utilities/Potential_Initialization.f90 b/Sources/Process/Field_Mod/Utilities/Potential_Initialization.f90 index 2d7bd10f4..2ffd517b1 100644 --- a/Sources/Process/Field_Mod/Utilities/Potential_Initialization.f90 +++ b/Sources/Process/Field_Mod/Utilities/Potential_Initialization.f90 @@ -27,7 +27,7 @@ subroutine Potential_Initialization(Flow, Sol) call Work % Connect_Real_Cell(log_dist, cross) - if(this_proc < 2) then + if(First_Proc()) then print '(a)', ' # Computing potential to initialize velocity field ...' print '(a,i3,a)', ' # ... with ', NDT, ' fake time steps.' print '(a)', ' # This might take a while, please wait' @@ -229,7 +229,7 @@ subroutine Potential_Initialization(Flow, Sol) call Profiler % Stop(String % First_Upper(phi % solver) // & ' (solver for potential initialization)') - if(this_proc < 2) then + if(First_Proc()) then print '(a,i4,a,e12.4)', ' # Computed potential in ', phi % eniter, & ' iterations with residual: ', phi % res end if diff --git a/Sources/Process/Field_Mod/Utilities/Report_Volume_Balance.f90 b/Sources/Process/Field_Mod/Utilities/Report_Volume_Balance.f90 index 0e839b8bf..67f2ccb52 100644 --- a/Sources/Process/Field_Mod/Utilities/Report_Volume_Balance.f90 +++ b/Sources/Process/Field_Mod/Utilities/Report_Volume_Balance.f90 @@ -25,7 +25,7 @@ subroutine Report_Volume_Balance(Flow, Sol, curr_dt, ini) call Comm_Mod_Global_Sum_Real(src) ! Print it out - if(this_proc < 2) then + if(First_Proc()) then if(Flow % p_m_coupling == PISO) then write(Flow % fuvbr, '(a,i6.6,a,i3.3,a,i2.2,es13.5)') & '# ts-', curr_dt, & diff --git a/Sources/Process/Field_Mod/Utilities/Report_Volume_Balance_Start.f90 b/Sources/Process/Field_Mod/Utilities/Report_Volume_Balance_Start.f90 index 49baade6a..c52cbc309 100644 --- a/Sources/Process/Field_Mod/Utilities/Report_Volume_Balance_Start.f90 +++ b/Sources/Process/Field_Mod/Utilities/Report_Volume_Balance_Start.f90 @@ -9,9 +9,11 @@ subroutine Report_Volume_Balance_Start(Flow, curr_dt, ini) integer, intent(in) :: curr_dt, ini !==============================================================================! - if(this_proc < 2) then + if(First_Proc()) then if(Flow % report_vol_balance) then - call File % Append_For_Writing_Ascii('volume.bal', Flow % fuvbr,this_proc) + call File % Append_For_Writing_Ascii('volume.bal', & + Flow % fuvbr, & + This_Proc()) if(Flow % p_m_coupling == PISO) then if(curr_dt .eq. 1 .and. ini .eq. 1 .and. Flow % i_corr .eq. 1) then write(Flow % fuvbr, '(a)') '# Report on volume balance' diff --git a/Sources/Process/Field_Mod/Utilities/Report_Volume_Balance_Stop.f90 b/Sources/Process/Field_Mod/Utilities/Report_Volume_Balance_Stop.f90 index 1f56b0cd8..03227236e 100644 --- a/Sources/Process/Field_Mod/Utilities/Report_Volume_Balance_Stop.f90 +++ b/Sources/Process/Field_Mod/Utilities/Report_Volume_Balance_Stop.f90 @@ -8,7 +8,7 @@ subroutine Report_Volume_Balance_Stop(Flow) class(Field_Type) :: Flow !==============================================================================! - if(this_proc < 2) then + if(First_Proc()) then if(Flow % report_vol_balance) close(Flow % fuvbr) end if diff --git a/Sources/Process/Front_Mod/Compress_Front_Vertices.f90 b/Sources/Process/Front_Mod/Compress_Front_Vertices.f90 index 5ac24d8a6..a86a4fb8c 100644 --- a/Sources/Process/Front_Mod/Compress_Front_Vertices.f90 +++ b/Sources/Process/Front_Mod/Compress_Front_Vertices.f90 @@ -114,7 +114,7 @@ subroutine Compress_Front_Vertices(Front, verbose) if(Front % mesh_divided) then call Comm_Mod_Global_Sum_Int(nv_tot) end if - if(verbose .and. this_proc < 2) then + if(verbose .and. First_Proc()) then print '(a40,i8)', ' # Compressed number of vertices: ', nv_tot end if diff --git a/Sources/Process/Front_Mod/Find_Sides.f90 b/Sources/Process/Front_Mod/Find_Sides.f90 index ebc9e5cf8..20a2a3194 100644 --- a/Sources/Process/Front_Mod/Find_Sides.f90 +++ b/Sources/Process/Front_Mod/Find_Sides.f90 @@ -54,7 +54,7 @@ subroutine Find_Sides(Front, verbose) call Comm_Mod_Global_Sum_Int(ne_tot) call Comm_Mod_Global_Sum_Int(ns_tot) end if - if(this_proc < 2) then + if(First_Proc()) then print '(a40,i8)', ' # Number of elements: ', ne_tot print '(a40,i8)', ' # Tentative number of sides: ', ns_tot end if @@ -201,7 +201,7 @@ subroutine Find_Sides(Front, verbose) call Comm_Mod_Global_Sum_Int(cnt_one_tot) end if - if(this_proc < 2) then + if(First_Proc()) then print '(a40,i8)', ' # Compressed number of sides: ', ns_tot print '(a40,i8)', ' # Sides surrounded by two elements: ', cnt_two_tot print '(a40,i8)', ' # Sides surrounded by one element: ', cnt_one_tot diff --git a/Sources/Process/Front_Mod/Print_Front_Statistics.f90 b/Sources/Process/Front_Mod/Print_Front_Statistics.f90 index 8996f206c..35fbf82b3 100644 --- a/Sources/Process/Front_Mod/Print_Front_Statistics.f90 +++ b/Sources/Process/Front_Mod/Print_Front_Statistics.f90 @@ -111,7 +111,7 @@ subroutine Print_Front_Statistics(Front) call Comm_Mod_Global_Max_Real(max_a) call Comm_Mod_Global_Min_Real(min_a) - if(this_proc < 2) then + if(First_Proc()) then line( 1:160) = ' ' line( 1+T:63+T) = & diff --git a/Sources/Process/Front_Mod/Save_Debug_Front_Vtu.f90 b/Sources/Process/Front_Mod/Save_Debug_Front_Vtu.f90 index 964d3e615..7544c3909 100644 --- a/Sources/Process/Front_Mod/Save_Debug_Front_Vtu.f90 +++ b/Sources/Process/Front_Mod/Save_Debug_Front_Vtu.f90 @@ -37,12 +37,12 @@ subroutine Save_Debug_Front_Vtu(Front, time_step) ! ! !----------------------------! -! if(this_proc < 2) then +! if(First_Proc()) then - call File % Set_Name(name_out, & - processor = this_proc, & - time_step = time_step, & - appendix = '-front', & + call File % Set_Name(name_out, & + processor = This_Proc(), & + time_step = time_step, & + appendix = '-front', & extension = '.vtu') call File % Open_For_Writing_Ascii(name_out, fu) diff --git a/Sources/Process/Info_Mod/Bulk_Fill.f90 b/Sources/Process/Info_Mod/Bulk_Fill.f90 index af4764f3a..c8be8644a 100644 --- a/Sources/Process/Info_Mod/Bulk_Fill.f90 +++ b/Sources/Process/Info_Mod/Bulk_Fill.f90 @@ -8,7 +8,7 @@ subroutine Info_Mod_Bulk_Fill(Flow) type(Field_Type) :: Flow !==============================================================================! - if(this_proc < 2) then + if(First_Proc()) then ! Courant and Peclet numbers write(bulk_info % lines(1)( 27: 49), '(a23)') 'Maximum Courant number:' diff --git a/Sources/Process/Info_Mod/Bulk_Print.f90 b/Sources/Process/Info_Mod/Bulk_Print.f90 index d191e2322..a31f0892a 100644 --- a/Sources/Process/Info_Mod/Bulk_Print.f90 +++ b/Sources/Process/Info_Mod/Bulk_Print.f90 @@ -11,7 +11,7 @@ subroutine Info_Mod_Bulk_Print(Flow, dom, n_dom) call Info_Mod_Bulk_Fill(Flow) - if(this_proc < 2) then + if(First_Proc()) then ! String is L_LINE+2 long if(dom .eq. 1) then diff --git a/Sources/Process/Info_Mod/Bulk_Start.f90 b/Sources/Process/Info_Mod/Bulk_Start.f90 index c90a3b584..7d5ac3d7d 100644 --- a/Sources/Process/Info_Mod/Bulk_Start.f90 +++ b/Sources/Process/Info_Mod/Bulk_Start.f90 @@ -8,7 +8,7 @@ subroutine Info_Mod_Bulk_Start() integer :: i !==============================================================================! - if(this_proc < 2) then + if(First_Proc()) then ! Create a frame diff --git a/Sources/Process/Info_Mod/Iter_Fill.f90 b/Sources/Process/Info_Mod/Iter_Fill.f90 index 4af3a7fa2..00a492411 100644 --- a/Sources/Process/Info_Mod/Iter_Fill.f90 +++ b/Sources/Process/Info_Mod/Iter_Fill.f90 @@ -10,7 +10,7 @@ subroutine Info_Mod_Iter_Fill(n) integer :: c !==============================================================================! - if(this_proc < 2) then + if(First_Proc()) then ! Write basic info c = 1 ! a column diff --git a/Sources/Process/Info_Mod/Iter_Fill_At.f90 b/Sources/Process/Info_Mod/Iter_Fill_At.f90 index 00a7b90a5..46b2364e5 100644 --- a/Sources/Process/Info_Mod/Iter_Fill_At.f90 +++ b/Sources/Process/Info_Mod/Iter_Fill_At.f90 @@ -12,7 +12,7 @@ subroutine Info_Mod_Iter_Fill_At(r, c, name_var, n_iter, res) real :: res !==============================================================================! - if(this_proc < 2) then + if(First_Proc()) then ! Normal variables if(n_iter > -1) then ! if n_iter .eq. -1, iterations won't be written diff --git a/Sources/Process/Info_Mod/Iter_Fill_User_At.f90 b/Sources/Process/Info_Mod/Iter_Fill_User_At.f90 index ad5038acc..e35ca51da 100644 --- a/Sources/Process/Info_Mod/Iter_Fill_User_At.f90 +++ b/Sources/Process/Info_Mod/Iter_Fill_User_At.f90 @@ -12,7 +12,7 @@ subroutine Info_Mod_Iter_Fill_User_At(r, c, name_var, n_iter, res) real :: res !==============================================================================! - if(this_proc < 2) then + if(First_Proc()) then ! Update the number of lines you'll have to print in the end iter_info % n_user_lines = max(iter_info % n_user_lines, r) diff --git a/Sources/Process/Info_Mod/Iter_Print.f90 b/Sources/Process/Info_Mod/Iter_Print.f90 index 8a5d838d8..333b643bb 100644 --- a/Sources/Process/Info_Mod/Iter_Print.f90 +++ b/Sources/Process/Info_Mod/Iter_Print.f90 @@ -11,7 +11,7 @@ subroutine Info_Mod_Iter_Print(d) character(len=L_LINE) :: tmp !==============================================================================! - if(this_proc < 2) then + if(First_Proc()) then if(d .eq. 1) then print '(a129)', iter_info % line_lead diff --git a/Sources/Process/Info_Mod/Iter_Start.f90 b/Sources/Process/Info_Mod/Iter_Start.f90 index 44b61153d..83bf189d6 100644 --- a/Sources/Process/Info_Mod/Iter_Start.f90 +++ b/Sources/Process/Info_Mod/Iter_Start.f90 @@ -8,7 +8,7 @@ subroutine Info_Mod_Iter_Start() integer :: i, l !==============================================================================! - if(this_proc < 2) then + if(First_Proc()) then ! Create frame do i = 1, L_LINE, L_LINE-1 diff --git a/Sources/Process/Info_Mod/Time_Fill.f90 b/Sources/Process/Info_Mod/Time_Fill.f90 index 364232ee0..7fb2a0f1f 100644 --- a/Sources/Process/Info_Mod/Time_Fill.f90 +++ b/Sources/Process/Info_Mod/Time_Fill.f90 @@ -16,7 +16,7 @@ subroutine Info_Mod_Time_Fill(n, sim_time) call system_clock(sys_clock % cur) wall_time = real(sys_clock % cur - sys_clock % ini) / real(sys_clock % cnt) - if(this_proc < 2) then + if(First_Proc()) then ! Write time step number write(time_info % lines(2)(55:65), '(a11)') 'Time step :' diff --git a/Sources/Process/Info_Mod/Time_Print.f90 b/Sources/Process/Info_Mod/Time_Print.f90 index 7b426f65c..6b82f60d0 100644 --- a/Sources/Process/Info_Mod/Time_Print.f90 +++ b/Sources/Process/Info_Mod/Time_Print.f90 @@ -8,7 +8,7 @@ subroutine Info_Mod_Time_Print() integer :: i !==============================================================================! - if(this_proc < 2) then + if(First_Proc()) then print '(a)', '' print '(a)', '' diff --git a/Sources/Process/Info_Mod/Time_Start.f90 b/Sources/Process/Info_Mod/Time_Start.f90 index a4174679e..a000a21dd 100644 --- a/Sources/Process/Info_Mod/Time_Start.f90 +++ b/Sources/Process/Info_Mod/Time_Start.f90 @@ -8,7 +8,7 @@ subroutine Info_Mod_Time_Start() integer :: i !==============================================================================! - if(this_proc < 2) then + if(First_Proc()) then ! Create a frame time_info % line_lead (2*L_BOX-2 : 2*L_BOX-2) = '#' diff --git a/Sources/Process/Interface_Mod/Create.f90 b/Sources/Process/Interface_Mod/Create.f90 index 7572a8fac..d13e361b1 100644 --- a/Sources/Process/Interface_Mod/Create.f90 +++ b/Sources/Process/Interface_Mod/Create.f90 @@ -42,9 +42,9 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) call Work % Connect_Int_Face(ic_1, ib_1, ip_1, ic_2, ib_2, ip_2) ! Allocate memory for offsets - if(n_proc > 1) then - allocate(off_1(n_proc)); off_1 = 0 - allocate(off_2(n_proc)); off_2 = 0 + if(Parallel_Run()) then + allocate(off_1(N_Procs())); off_1 = 0 + allocate(off_2(N_Procs())); off_2 = 0 end if !--------------------------------------------! @@ -110,7 +110,7 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) if(Grid(d1) % faces_s(s) > 0) then ! only if it has a shadow c1 = Grid(d1) % faces_c(1,s) if(Grid(d1) % Bnd_Cond_Name_At_Face(s) .eq. keys(1) .and. & - Grid(d1) % Comm % cell_proc(c1) .eq. this_proc) then + Grid(d1) % Comm % cell_proc(c1) .eq. This_Proc()) then n1 = n1 + 1 end if end if @@ -135,7 +135,7 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) if(Grid(d2) % faces_s(s) > 0) then ! only if it has a shadow c1 = Grid(d2) % faces_c(1,s) if(Grid(d2) % Bnd_Cond_Name_At_Face(s) .eq. keys(2) .and. & - Grid(d2) % Comm % cell_proc(c1) .eq. this_proc) then + Grid(d2) % Comm % cell_proc(c1) .eq. This_Proc()) then n2 = n2 + 1 end if end if @@ -153,7 +153,7 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) call Comm_Mod_Global_Sum_Int(n2_tot) if(n1_tot .ne. n2_tot) then - if(this_proc < 2) then + if(First_Proc()) then print *, '# Number of cells at the interface between ', & trim(problem_name(d1)), ' and ', & trim(problem_name(d2)), ' is not the same!' @@ -164,7 +164,7 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) else n_tot = n1_tot inter(d1, d2) % n_tot = n_tot - if(this_proc < 2) then + if(First_Proc()) then print '(5a,i6,a)', ' # Domains ', trim(problem_name(d1)), & ' and ', trim(problem_name(d2)), & ' are connected with ', n_tot, ' interface cells!' @@ -184,15 +184,15 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) inter(d1, d2) % phi_2(:,:) = 0.0 ! Work out offsets for each interface for each processor - if(n_proc > 1) then - off_1(1:n_proc) = 0 - off_2(1:n_proc) = 0 - off_1(this_proc) = n1 - off_2(this_proc) = n2 - call Comm_Mod_Global_Sum_Int_Array(n_proc, off_1) - call Comm_Mod_Global_Sum_Int_Array(n_proc, off_2) - - do p = n_proc, 2, -1 + if(Parallel_Run()) then + off_1(1:N_Procs()) = 0 + off_2(1:N_Procs()) = 0 + off_1(This_Proc()) = n1 + off_2(This_Proc()) = n2 + call Comm_Mod_Global_Sum_Int_Array(N_Procs(), off_1) + call Comm_Mod_Global_Sum_Int_Array(N_Procs(), off_2) + + do p = N_Procs(), 2, -1 off_1(p) = sum(off_1(1:p-1)) off_2(p) = sum(off_2(1:p-1)) end do @@ -209,10 +209,10 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) if(Grid(d1) % Bnd_Cond_Name_At_Cell(c2) .eq. keys(1)) then n1 = n1 + 1 pos = n1 - if(n_proc > 1) pos = pos + off_1(this_proc) + if(Parallel_Run()) pos = pos + off_1(This_Proc()) ic_1(pos) = c1 ib_1(pos) = c2 - ip_1(pos) = this_proc + ip_1(pos) = This_Proc() xf_1(pos) = Grid(d1) % xf(s) yf_1(pos) = Grid(d1) % yf(s) zf_1(pos) = Grid(d1) % zf(s) @@ -224,13 +224,13 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) c2 = Grid(d1) % faces_c(2,s) if(Grid(d1) % faces_s(s) > 0) then ! only if it has a shadow if(Grid(d1) % Bnd_Cond_Name_At_Face(s) .eq. keys(1) .and. & - Grid(d1) % Comm % cell_proc(c1) .eq. this_proc) then + Grid(d1) % Comm % cell_proc(c1) .eq. This_Proc()) then n1 = n1 + 1 pos = n1 - if(n_proc > 1) pos = pos + off_1(this_proc) + if(Parallel_Run()) pos = pos + off_1(This_Proc()) ic_1(pos) = c1 ib_1(pos) = c2 - ip_1(pos) = this_proc + ip_1(pos) = This_Proc() xf_1(pos) = Grid(d1) % xf(s) yf_1(pos) = Grid(d1) % yf(s) zf_1(pos) = Grid(d1) % zf(s) @@ -247,10 +247,10 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) if(Grid(d2) % Bnd_Cond_Name_At_Cell(c2) .eq. keys(2)) then n2 = n2 + 1 pos = n2 - if(n_proc > 1) pos = pos + off_2(this_proc) + if(Parallel_Run()) pos = pos + off_2(This_Proc()) ic_2(pos) = c1 ib_2(pos) = c2 - ip_2(pos) = this_proc + ip_2(pos) = This_Proc() xf_2 (pos) = Grid(d2) % xf(s) yf_2 (pos) = Grid(d2) % yf(s) zf_2 (pos) = Grid(d2) % zf(s) @@ -262,13 +262,13 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) c2 = Grid(d2) % faces_c(2,s) if(Grid(d2) % faces_s(s) > 0) then ! only if it has a shadow if(Grid(d2) % Bnd_Cond_Name_At_Face(s) .eq. keys(2) .and. & - Grid(d2) % Comm % cell_proc(c1) .eq. this_proc) then + Grid(d2) % Comm % cell_proc(c1) .eq. This_Proc()) then n2 = n2 + 1 pos = n2 - if(n_proc > 1) pos = pos + off_2(this_proc) + if(Parallel_Run()) pos = pos + off_2(This_Proc()) ic_2(pos) = c1 ib_2(pos) = c2 - ip_2(pos) = this_proc + ip_2(pos) = This_Proc() xf_2 (pos) = Grid(d2) % xf(s) yf_2 (pos) = Grid(d2) % yf(s) zf_2 (pos) = Grid(d2) % zf(s) @@ -311,7 +311,7 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) ip_2(1:n_tot)) ! ! Write some debugging information ! do n = 1, inter(d1, d2) % n_tot -! write(100*this_proc+d1*10+d2, '(i4, 6f10.5)') & +! write(100*This_Proc()+d1*10+d2, '(i4, 6f10.5)') & ! n, & ! xf_1(n), yf_1(n), zf_1(n), & ! xf_2(n), yf_2(n), zf_2(n) @@ -338,7 +338,7 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) do n = 1, inter(d1, d2) % n_tot ! browse through interface now ! Handle domain 1 - if(ip_1(n) .eq. this_proc) then + if(ip_1(n) .eq. This_Proc()) then n1 = n1 + 1 do c = 1, Grid(d1) % n_cells if(c .eq. ic_1(n)) then @@ -352,7 +352,7 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) end if ! Handle domain 2 - if(ip_2(n) .eq. this_proc) then + if(ip_2(n) .eq. This_Proc()) then n2 = n2 + 1 do c = 1, Grid(d2) % n_cells if(c .eq. ic_2(n)) then @@ -373,7 +373,7 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) end do end do - if(n_proc > 1) then + if(Parallel_Run()) then deallocate(off_1) deallocate(off_2) end if diff --git a/Sources/Process/Main_Pro.f90 b/Sources/Process/Main_Pro.f90 index f3596b2e6..40ad4c411 100644 --- a/Sources/Process/Main_Pro.f90 +++ b/Sources/Process/Main_Pro.f90 @@ -83,8 +83,8 @@ program Process_Prog call Control_Mod_Problem_Name(problem_name(d)) ! Load the finite volume Grid - call Grid(d) % Load_Cfn(this_proc, domain=d) - call Grid(d) % Load_Dim(this_proc, domain=d) + call Grid(d) % Load_Cfn(This_Proc(), domain=d) + call Grid(d) % Load_Dim(This_Proc(), domain=d) ! Determine threads for OpenMP runs call Control_Mod_Max_Threads(Grid(d) % Vect % d_threads, .true.) @@ -436,7 +436,7 @@ program Process_Prog end do ! curr_dt until the last time step -2 if(this_proc < 2) print *, '# Exiting !' +2 if(First_Proc()) print *, '# Exiting !' do d = 1, n_dom ! Close monitoring files diff --git a/Sources/Process/Monitor_Mod/Initialize.f90 b/Sources/Process/Monitor_Mod/Initialize.f90 index 7ae04c327..a78da38d0 100644 --- a/Sources/Process/Monitor_Mod/Initialize.f90 +++ b/Sources/Process/Monitor_Mod/Initialize.f90 @@ -81,7 +81,7 @@ subroutine Initialize(Monitor, Flow, restart, domain) end do ! Check if smaller distance is found on another processor - if(n_proc > 1) then + if(Parallel_Run()) then min_dist_all = min_dist(m) call Comm_Mod_Global_Min_Real(min_dist_all) diff --git a/Sources/Process/Native_Mod/Create_Native.f90 b/Sources/Process/Native_Mod/Create_Native.f90 index e95669e3a..aba74b83b 100644 --- a/Sources/Process/Native_Mod/Create_Native.f90 +++ b/Sources/Process/Native_Mod/Create_Native.f90 @@ -9,12 +9,12 @@ subroutine Create_Native(Nat, Grid) Nat % pnt_grid => Grid - if(this_proc < 2) print *, '# Determining matrix topology.' + if(First_Proc()) print *, '# Determining matrix topology.' call Nat % A % Create_Matrix(Grid) call Nat % M % Create_Matrix(Grid) call Vector_Mod_Allocate(Nat % b, Grid) - if(this_proc < 2) print *, '# Finished !' + if(First_Proc()) print *, '# Finished !' end subroutine diff --git a/Sources/Process/Numerics_Mod/Pressure_Momentum_Coupling_Code.f90 b/Sources/Process/Numerics_Mod/Pressure_Momentum_Coupling_Code.f90 index 15979783a..875437d39 100644 --- a/Sources/Process/Numerics_Mod/Pressure_Momentum_Coupling_Code.f90 +++ b/Sources/Process/Numerics_Mod/Pressure_Momentum_Coupling_Code.f90 @@ -15,14 +15,9 @@ integer function Numerics_Mod_Pressure_Momentum_Coupling_Code(name) Numerics_Mod_Pressure_Momentum_Coupling_Code = PISO case default - if(this_proc < 2) then - print *, '# ERROR! Unknown pressure-momentum coupling algorithm: ', & - trim(name) - print *, '# Exiting!' - end if - call Comm_Mod_End - stop - + call Message % Error(72, & + 'Unknown pressure-momentum coupling algorithm: '//trim(name)// & + '. \n Exiting!', one_proc=.true.) end select end function diff --git a/Sources/Process/Numerics_Mod/Time_Integration_Scheme_Code.f90 b/Sources/Process/Numerics_Mod/Time_Integration_Scheme_Code.f90 index b6d176a2e..2d4baaedb 100644 --- a/Sources/Process/Numerics_Mod/Time_Integration_Scheme_Code.f90 +++ b/Sources/Process/Numerics_Mod/Time_Integration_Scheme_Code.f90 @@ -1,12 +1,12 @@ !==============================================================================! - integer function Numerics_Mod_Time_Integration_Scheme_Code(scheme_name) + integer function Numerics_Mod_Time_Integration_Scheme_Code(name) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - character(SL) :: scheme_name + character(SL) :: name !==============================================================================! - select case(scheme_name) + select case(name) case('LINEAR') Numerics_Mod_Time_Integration_Scheme_Code = LINEAR @@ -16,14 +16,9 @@ integer function Numerics_Mod_Time_Integration_Scheme_Code(scheme_name) Numerics_Mod_Time_Integration_Scheme_Code = RUNGE_KUTTA_3 case default - if(this_proc < 2) then - print *, '# ERROR! Unknown time-integration scheme: ', & - trim(scheme_name) - print *, '# Exiting!' - end if - call Comm_Mod_End - stop - + call Message % Error(60, & + 'Unknown time-integration scheme: '//trim(name)// & + '. \n Exiting!', one_proc=.true.) end select end function diff --git a/Sources/Process/Particle_Mod/Initialize_Particle.f90 b/Sources/Process/Particle_Mod/Initialize_Particle.f90 index 228b294ac..011aaaada 100644 --- a/Sources/Process/Particle_Mod/Initialize_Particle.f90 +++ b/Sources/Process/Particle_Mod/Initialize_Particle.f90 @@ -56,7 +56,7 @@ subroutine Initialize_Particle(Particle, Flow, diameter, density) Particle % trapped = .false. ! Set some processor number to particle - Particle % proc = min(1, n_proc) - Particle % buff = min(1, n_proc) + Particle % proc = min(1, N_Procs()) + Particle % buff = min(1, N_Procs()) end subroutine diff --git a/Sources/Process/Petsc_Mod/Fake/Create_Petsc.f90 b/Sources/Process/Petsc_Mod/Fake/Create_Petsc.f90 index 3395302a3..190138435 100644 --- a/Sources/Process/Petsc_Mod/Fake/Create_Petsc.f90 +++ b/Sources/Process/Petsc_Mod/Fake/Create_Petsc.f90 @@ -12,7 +12,7 @@ subroutine Create_Petsc(Pet, Nat, Grid) Pet % pnt_grid => Grid - if(this_proc < 2) then + if(First_Proc()) then print '(a)', ' # NOTE! This version was compiled without PETSc,' // & ' so the PETSc class was not created ...' print '(a)', ' # ... which is OK as long as you don''t specify' // & diff --git a/Sources/Process/Petsc_Mod/True/Create_Petsc.f90 b/Sources/Process/Petsc_Mod/True/Create_Petsc.f90 index 43dba424d..1d7892cd5 100644 --- a/Sources/Process/Petsc_Mod/True/Create_Petsc.f90 +++ b/Sources/Process/Petsc_Mod/True/Create_Petsc.f90 @@ -13,7 +13,7 @@ subroutine Create_Petsc(Pet, Nat, Grid) Pet % pnt_grid => Grid - if(this_proc < 2) print *, '# Initializing PETSc.' + if(First_Proc()) print *, '# Initializing PETSc.' ! Total number of unknowns and unknowns in this processor only Pet % m_upper = Grid % Comm % nc_tot @@ -111,7 +111,7 @@ subroutine Create_Petsc(Pet, Nat, Grid) !-------------------------! call C_Petsc_Ksp_Create(Pet % ksp) - if(this_proc < 2) print *, '# Finished !' + if(First_Proc()) print *, '# Finished !' end subroutine diff --git a/Sources/Process/Petsc_Mod/True/Solve_Petsc.f90 b/Sources/Process/Petsc_Mod/True/Solve_Petsc.f90 index 38e6e8a1b..436ffb7c4 100644 --- a/Sources/Process/Petsc_Mod/True/Solve_Petsc.f90 +++ b/Sources/Process/Petsc_Mod/True/Solve_Petsc.f90 @@ -126,7 +126,7 @@ subroutine Solve_Petsc(Pet, & x(i)) end do else - ! if(this_proc < 2) print *, ' # Warning: linear system failed to converge!' + ! if(First_Proc()) print *, ' # Warning: linear system failed to converge!' end if end subroutine diff --git a/Sources/Process/Point_Mod/Find_Nearest_Cell.f90 b/Sources/Process/Point_Mod/Find_Nearest_Cell.f90 index 0d7b84f05..f125ac434 100644 --- a/Sources/Process/Point_Mod/Find_Nearest_Cell.f90 +++ b/Sources/Process/Point_Mod/Find_Nearest_Cell.f90 @@ -89,7 +89,7 @@ subroutine Find_Nearest_Cell(Point, n_parts_in_buffers, locally) !--------------------------------------! Point % buff = Point % proc ! assume buffer was not entered - ! If processor number in the cell is differnt than this_proc + ! If processor number in the cell is differnt than This_Proc() ! (and Point % proc in this case) you entered the buffer if(Grid % Comm % cell_proc(cc) .ne. Point % proc) then Point % buff = Grid % Comm % cell_proc(cc) ! store buffer process @@ -132,15 +132,15 @@ subroutine Find_Nearest_Cell(Point, n_parts_in_buffers, locally) Point % cell = cc min_dc_glob = min_dc - if(n_proc > 1 .and. .not. local) then + if(Parallel_Run() .and. .not. local) then call Comm_Mod_Global_Min_Real(min_dc_glob) end if Point % proc = 0 Point % buff = 0 if( min_dc .eq. min_dc_glob ) then - Point % proc = this_proc - Point % buff = this_proc + Point % proc = This_Proc() + Point % buff = This_Proc() end if !--------------------! @@ -175,7 +175,7 @@ subroutine Find_Nearest_Cell(Point, n_parts_in_buffers, locally) ! Check if point is in this processor ! !-----------------------------------------! min_db_glob = min_db - if(n_proc > 1 .and. .not. local) then + if(Parallel_Run() .and. .not. local) then call Comm_Mod_Global_Min_Real(min_db_glob) end if @@ -188,7 +188,7 @@ subroutine Find_Nearest_Cell(Point, n_parts_in_buffers, locally) ! (Didn't really work) ! ! ! !------------------------------! - ! if(Point % proc .eq. this_proc & + ! if(Point % proc .eq. This_Proc() & ! .and. .not. Grid % Is_Point_In_Cell(Point % cell, & ! Point % x_n, & ! Point % y_n, & diff --git a/Sources/Process/Process_Mod/Initialize_Variables.f90 b/Sources/Process/Process_Mod/Initialize_Variables.f90 index e356a28c4..26f313588 100644 --- a/Sources/Process/Process_Mod/Initialize_Variables.f90 +++ b/Sources/Process/Process_Mod/Initialize_Variables.f90 @@ -75,7 +75,7 @@ subroutine Initialize_Variables(Process, Flow, Turb, Vof, Swarm, Sol) call Turb % Alias_T2 (t2) area = 0.0 - if (this_proc < 2) print '(a,a)', ' # Grid name: ', trim(Grid % name) + if (First_Proc()) print '(a,a)', ' # Grid name: ', trim(Grid % name) ! Found the line where boundary condition definition is defined call Control_Mod_Position_At_One_Key('INITIAL_CONDITION', & @@ -106,17 +106,17 @@ subroutine Initialize_Variables(Process, Flow, Turb, Vof, Swarm, Sol) !------------------------------------------------! if (nvs .eq. 1) then ! word 'file' was specified - if (this_proc < 2) & + if (First_Proc()) & print *, '# Values specified in the file: ', trim(keys_file(nvs)) - call File % Open_For_Reading_Ascii(keys_file(1), fu, this_proc) + call File % Open_For_Reading_Ascii(keys_file(1), fu, This_Proc()) ! Number of points call File % Read_Line(fu) read(Line % tokens(1), *) n_points - if (this_proc < 2) print '(a,i0,2a)', " # Reading ", nks, & + if (First_Proc()) print '(a,i0,2a)', " # Reading ", nks, & " columns in file " , trim(keys_file(1)) allocate(prof(n_points, 0:nks)); prof = 0. @@ -271,13 +271,13 @@ subroutine Initialize_Variables(Process, Flow, Turb, Vof, Swarm, Sol) call Control_Mod_Read_Strings_On('VALUES', vals(1), nvs, .true.) ! Check validity of the input - if(nks .eq. 0 .or. nvs .eq. 0 .and. this_proc < 2) then + if(nks .eq. 0 .or. nvs .eq. 0 .and. First_Proc()) then print '(2a)', '# Critical, for initial condition: ', & ' no values or variables have been provided' call Comm_Mod_End stop end if - if(nks .ne. nvs .and. this_proc < 2) then + if(nks .ne. nvs .and. First_Proc()) then print '(2a)', '# Critical for initial conditions, number of values ', & ' is not the same as number of provided variable names' call Comm_Mod_End @@ -504,7 +504,7 @@ subroutine Initialize_Variables(Process, Flow, Turb, Vof, Swarm, Sol) !----------------------! ! Initializes time ! !----------------------! - if(this_proc < 2) then + if(First_Proc()) then if(n_inflow .gt. 0) then print '(a29,es12.5)', ' # Volume inflow : ', bulk % vol_in if(Flow % with_interface) then diff --git a/Sources/Process/Process_Mod/Logo_Pro.f90 b/Sources/Process/Process_Mod/Logo_Pro.f90 index ea603441e..8b786bb2e 100644 --- a/Sources/Process/Process_Mod/Logo_Pro.f90 +++ b/Sources/Process/Process_Mod/Logo_Pro.f90 @@ -10,16 +10,16 @@ subroutine Logo_Pro(Process) Unused(Process) !==============================================================================! - if(this_proc < 2) then + if(First_Proc()) then print *,'#===================================' // & '====================================' print *,'#' - print *,'# ______________________ ____ ________ __ __ _________' - print *,'# \__ ___/\_ _____/| | \_____ \/ \ / \/ _____/' - print *,'# | | | __) | | / | \ \/\/ /\_____ \' - print *,'# | | | \ | |___/ | \ / / \' - print *,'# |____| \___ / |_______ \_______ /\__/\ / /_______ /' - print *,'# \/ \/ \/ \/ \/' + print *,'# ______________________ ____ ________ __ __ _________ ' + print *,'# \__ ___/\_ _____/| | \_____ \/ \ / \/ _____/ ' + print *,'# | | | __) | | / | \ \/\/ /\_____ \ ' + print *,'# | | | \ | |___/ | \ / / \ ' + print *,'# |____| \___ / |_______ \_______ /\__/\ / /_______ / ' + print *,'# \/ \/ \/ \/ \/ ' print *,'# ___' print *,'# / _ \_______ _______ ___ ___' print *,'# / ___/ __/ _ \/ __/ -_|_-<(_-<' diff --git a/Sources/Process/Process_Mod/Update_Boundary_Values.f90 b/Sources/Process/Process_Mod/Update_Boundary_Values.f90 index 4fe467720..fafdf65e7 100644 --- a/Sources/Process/Process_Mod/Update_Boundary_Values.f90 +++ b/Sources/Process/Process_Mod/Update_Boundary_Values.f90 @@ -58,11 +58,9 @@ subroutine Update_Boundary_Values(Process, Flow, Turb, Vof, update) update .ne. 'ENERGY' .and. & update .ne. 'SCALARS' .and. & update .ne. 'ALL') then - if(this_proc < 2) then - print *, '# Invalid parameter in call to Update_Boundary_Values' - end if - call Comm_Mod_End - stop + call Message % Error(72, & + 'Invalid parameter in function call. Exiting!', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if !--------------! @@ -274,7 +272,7 @@ subroutine Update_Boundary_Values(Process, Flow, Turb, Vof, update) c2 = Grid % faces_c(2,s) ! On the boundary perform the extrapolation - if(Grid % Comm % cell_proc(c1) .eq. this_proc .and. c2 < 0) then + if(Grid % Comm % cell_proc(c1) .eq. This_Proc() .and. c2 < 0) then ! Wall temperature or heat fluxes for k-eps-zeta-f ! and high-re k-eps models. @@ -346,7 +344,7 @@ subroutine Update_Boundary_Values(Process, Flow, Turb, Vof, update) c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) - if(Grid % Comm % cell_proc(c1) .eq. this_proc .and. c2 < 0) then + if(Grid % Comm % cell_proc(c1) .eq. This_Proc() .and. c2 < 0) then if(Var_Mod_Bnd_Cond_Type(t,c2) .eq. WALL .or. & Var_Mod_Bnd_Cond_Type(t,c2) .eq. WALLFL) then do i_fac = 1, Grid % cells_n_faces(c1) @@ -367,7 +365,7 @@ subroutine Update_Boundary_Values(Process, Flow, Turb, Vof, update) 1 continue ! On the boundary perform the extrapolation - if(Grid % Comm % cell_proc(c1) .eq. this_proc .and. c2 < 0) then + if(Grid % Comm % cell_proc(c1) .eq. This_Proc() .and. c2 < 0) then ! In the "new way" the extrapolation is ! independent from turbulence model diff --git a/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 b/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 index 99d84e36d..0610618b5 100644 --- a/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 +++ b/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 @@ -96,14 +96,10 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) goto 1 else - if(this_proc < 2) then - print *, '# ERROR! Boundary conditions for ', & - trim(Grid % region % name(bc)), & - ' not specified in the control file!' - print *, '# Exiting the program.' - end if - call Comm_Mod_End - stop + call Message % Error(72, & + 'Boundary conditions for '//trim(Grid % region % name(bc))// & + ' not specified in the control file! \n \n Exiting!', & + file=__FILE__, line=__LINE__) end if 2 continue @@ -162,14 +158,10 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) bc_type_tag = PRESSURE Grid % region % type(bc) = PRESSURE else - if(this_proc < 2) then - print *, '# ERROR! Read_Control_Boundary_Conditions: '// & - '# Unknown boundary condition type: ', & - bc_type_name - print *, '# This error is critical, exiting!' - call Comm_Mod_End - stop - end if + call Message % Error(72, & + 'Unknown boundary condition type: '//trim(bc_type_name)// & + '. \n \n This error is critical. Exiting!', & + file=__FILE__, line=__LINE__) end if !----------------------------------------------! @@ -783,7 +775,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) Grid % region % name(bc)) end if end do - if(turb_planes % n_planes > 0 .and. this_proc < 2) then + if(turb_planes % n_planes > 0 .and. First_Proc()) then print *, '# Found ', turb_planes % n_planes, ' turbulent planes' end if diff --git a/Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 b/Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 index d1aea05d9..e8fac14f1 100644 --- a/Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 +++ b/Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 @@ -75,7 +75,7 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) v % tol = tol w % tol = tol else - if(this_proc < 2) then + if(First_Proc()) then print *, '# NOTE! PETSc options for momentum are not specified.' // & ' Using the default values' end if @@ -105,7 +105,7 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) Flow % pp % prec_opts(1:n_opts) = opts(1:n_opts) Flow % pp % tol = tol else - if(this_proc < 2) then + if(First_Proc()) then print *, '# NOTE! PETSc options for pressure are not specified.' // & ' Using the default values' end if @@ -131,7 +131,7 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) Flow % wall_dist % prec_opts(1:n_opts) = opts(1:n_opts) Flow % wall_dist % tol = tol else - if(this_proc < 2) then + if(First_Proc()) then print *, '# NOTE! PETSc options for potential are not specified.' // & ' Using the default values' end if @@ -157,7 +157,7 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) Flow % pot % prec_opts(1:n_opts) = opts(1:n_opts) Flow % pot % tol = tol else - if(this_proc < 2) then + if(First_Proc()) then print *, '# NOTE! PETSc options for potential are not specified.' // & ' Using the default values' end if @@ -183,7 +183,7 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) Vof % fun % prec_opts(1:n_opts) = opts(1:n_opts) Vof % fun % tol = tol else - if(this_proc < 2) then + if(First_Proc()) then print *, '# NOTE! PETSc options for VOF are not specified.' // & ' Using the default values' end if @@ -209,7 +209,7 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) t % prec_opts(1:n_opts) = opts(1:n_opts) t % tol = tol else - if(this_proc < 2) then + if(First_Proc()) then print *, '# NOTE! PETSc options for energy are not specified.' // & ' Using the default values' end if @@ -239,7 +239,7 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) phi % tol = tol end do else - if(this_proc < 2) then + if(First_Proc()) then print *, '# NOTE! PETSc options for scalars are not specified.' // & ' Using the default values' end if @@ -282,7 +282,7 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) tq % tol = tol end do else - if(this_proc < 2) then + if(First_Proc()) then print *, '# NOTE! PETSc options for turbulence are not specified.' // & ' Using the default values' end if diff --git a/Sources/Process/Read_Controls_Mod/Physical_Models.f90 b/Sources/Process/Read_Controls_Mod/Physical_Models.f90 index da0843ce6..6514a938b 100644 --- a/Sources/Process/Read_Controls_Mod/Physical_Models.f90 +++ b/Sources/Process/Read_Controls_Mod/Physical_Models.f90 @@ -50,12 +50,9 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) case('THERMAL') Flow % buoyancy = THERMALLY_DRIVEN case default - if(this_proc < 2) then - print *, '# ERROR! Unknown buoyancy model :', trim(name) - print *, '# Exiting!' - end if - call Comm_Mod_End - stop + call Message % Error(60, & + 'Unknown buoyancy model: '//trim(name)// & + '. \n Exiting!') end select call Control_Mod_Reference_Density (Flow % dens_ref, .true.) @@ -102,13 +99,9 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) Turb % model = LES_TVM case default - if(this_proc < 2) then - print *, '# ERROR! Unknown turbulence model :', trim(name) - print *, '# Exiting!' - end if - call Comm_Mod_End - stop - + call Message % Error(60, & + 'Unknown turbulence model: '//trim(name)// & + '. \n Exiting!') end select !---------------------------------------------------------! @@ -122,11 +115,9 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) else if(name .eq. 'STABILIZED') then Turb % model_variant = STABILIZED else - if(this_proc < 2) then - print *, '# ERROR! Unknown turbulence model variant: ', trim(name) - print *, '# Exiting!' - end if - call Comm_Mod_End + call Message % Error(72, & + 'Unknown turbulence model variant: '//trim(name)// & + '. \n Exiting!') end if end if @@ -153,7 +144,7 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) Turb % model .eq. K_EPS_ZETA_F) .and. & n_times > n_stat) then ! last line covers unsteady RANS models - if(this_proc < 2) then + if(First_Proc()) then print *, '# NOTE! Scale resolving simulation used; ' // & 'turbulence statistics engaged!' end if @@ -173,11 +164,9 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) case('AFM') Turb % heat_flux_model = AFM case default - if(this_proc < 2) then - print *, '# ERROR! Unknown turbulent heat flux model :', trim(name) - print *, '# Exiting!' - end if - call Comm_Mod_End + call Message % Error(64, & + 'Unknown turbulent heat flux model: '//trim(name)// & + '. \n Exiting!') end select !-------------------------------------------! @@ -191,12 +180,9 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) case('SWITCH_VELOCITY') Turb % hybrid_les_rans_switch = SWITCH_VELOCITY case default - if(this_proc < 2) then - print *, '# ERROR! Unknown type of hybrid LES/RANS switch:', & - trim(name) - print *, '# Exiting!' - end if - call Comm_Mod_End + call Message % Error(72, & + 'Unknown type of hybrid LES/RANS switch: '//trim(name)// & + '. \n Exiting!') end select end if @@ -235,7 +221,6 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) call Turb % Const_Les() end if - !------------------------------------! !------------------------------------! ! ! ! Pressure drops and mass fluxes ! @@ -299,7 +284,7 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) end select if(n_times > n_stat_p) then ! last line covers unsteady RANS models - if(this_proc < 2) then + if(First_Proc()) then print *, '# NOTE! Lagrangian particle tracking used; ' // & 'swarm statistics engaged!' // & 'and particle statistics begins at:', n_stat_p diff --git a/Sources/Process/Results_Mod/Main_Results.f90 b/Sources/Process/Results_Mod/Main_Results.f90 index 117c8d23d..05fc2e99a 100644 --- a/Sources/Process/Results_Mod/Main_Results.f90 +++ b/Sources/Process/Results_Mod/Main_Results.f90 @@ -92,14 +92,14 @@ subroutine Main_Results(Results, & end if if(save_now) then - if(this_proc < 2) then + if(First_Proc()) then open (9, file='save_now', status='old') close(9, status='delete') end if end if if(exit_now) then - if(this_proc < 2) then + if(First_Proc()) then open (9, file='exit_now', status='old') close(9, status='delete') end if diff --git a/Sources/Process/Results_Mod/Save_Vtu_Front.f90 b/Sources/Process/Results_Mod/Save_Vtu_Front.f90 index 0874155e1..984b81ae9 100644 --- a/Sources/Process/Results_Mod/Save_Vtu_Front.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Front.f90 @@ -40,13 +40,13 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) extension = '.pvtu', & domain = domain) call File % Set_Name(name_out_9, & - processor = this_proc, & + processor = This_Proc(), & time_step = time_step, & appendix = '-front', & extension = '.vtu', & domain = domain) - if(this_proc .eq. 1) then + if(This_Proc() .eq. 1) then call File % Open_For_Writing_Binary(name_out_8, f8) end if call File % Open_For_Writing_Ascii(name_out_9, f9) @@ -56,7 +56,7 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) ! Header ! ! ! !------------! - if(this_proc .eq. 1) then + if(This_Proc() .eq. 1) then write(f8) IN_0 // '' // LF write(f8) IN_0 // '' // LF write(f8) IN_1 // '' // LF @@ -76,7 +76,7 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) ! Vertex coordinates ! ! ! !------------------------! - if(this_proc .eq. 1) then + if(This_Proc() .eq. 1) then write(f8) IN_3 // '' // LF write(f8) IN_4 // '' // LF @@ -100,7 +100,7 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) ! Point data ! ! ! !----------------! - if(this_proc .eq. 1) then + if(This_Proc() .eq. 1) then write(f8) IN_3 // '' // LF end if write(f9,'(a,a)') IN_3, '' @@ -108,7 +108,7 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) !--------------------! ! Particle i.d.s ! !--------------------! - if(this_proc .eq. 1) then + if(This_Proc() .eq. 1) then write(f8) IN_4 // '' // LF end if @@ -122,7 +122,7 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) !--------------------------! ! Number of neighbours ! !--------------------------! - if(this_proc .eq. 1) then + if(This_Proc() .eq. 1) then write(f8) IN_4 // '' // LF end if @@ -136,7 +136,7 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) !-----------------------------! ! Curvatures at the nodes ! !-----------------------------! - if(this_proc .eq. 1) then + if(This_Proc() .eq. 1) then write(f8) IN_4 // '' // LF end if @@ -148,7 +148,7 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) end do write(f9,'(a,a)') IN_4, '' - if(this_proc .eq. 1) then + if(This_Proc() .eq. 1) then write(f8) IN_3 // '' // LF end if write(f9,'(a,a)') IN_3, '' @@ -158,7 +158,7 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) ! Cells ! ! ! !-----------! - if(this_proc .eq. 1) then + if(This_Proc() .eq. 1) then write(f8) IN_3 // '' // LF write(f8) IN_4 // '' // LF @@ -174,7 +174,7 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) write(f9,'(a,a)') IN_4, '' ! Cell offsets - if(this_proc .eq. 1) then + if(This_Proc() .eq. 1) then write(f8) IN_4 // '' // LF end if @@ -188,7 +188,7 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) write(f9,'(a,a)') IN_4, '' ! Cell types - if(this_proc .eq. 1) then + if(This_Proc() .eq. 1) then write(f8) IN_4 // '' // LF end if @@ -199,7 +199,7 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) end do write(f9,'(a,a)') IN_4, '' - if(this_proc .eq. 1) then + if(This_Proc() .eq. 1) then write(f8) IN_3 // '' // LF end if write(f9,'(a,a)') IN_3, '' @@ -211,7 +211,7 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) !---------------! ! Beginning of cell data - if(this_proc .eq. 1) then + if(This_Proc() .eq. 1) then write(f8) IN_3 // '' // LF end if write(f9,'(a,a)') IN_3, '' @@ -219,7 +219,7 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) !-------------------------------------! ! Number of neighbouring elements ! !-------------------------------------! - if(this_proc .eq. 1) then + if(This_Proc() .eq. 1) then write(f8) IN_4 // '' // LF end if @@ -233,7 +233,7 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) !---------------------! ! Surface normals ! !---------------------! - if(this_proc .eq. 1) then + if(This_Proc() .eq. 1) then write(f8) IN_4 // '' // LF @@ -252,7 +252,7 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) !-------------------! ! Element areas ! !-------------------! - if(this_proc .eq. 1) then + if(This_Proc() .eq. 1) then write(f8) IN_4 // '' // LF @@ -268,7 +268,7 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) !-------------------------! ! Element coordinates ! !-------------------------! - if(this_proc .eq. 1) then + if(This_Proc() .eq. 1) then write(f8) IN_4 // '' // LF @@ -288,7 +288,7 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) !------------------------! ! Surface curvatures ! !------------------------! - if(this_proc .eq. 1) then + if(This_Proc() .eq. 1) then write(f8) IN_4 // '' // LF @@ -302,7 +302,7 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) write(f9,'(a,a)') IN_4, '' ! End of cell data - if(this_proc .eq. 1) then + if(This_Proc() .eq. 1) then write(f8) IN_3 // '' // LF end if write(f9,'(a,a)') IN_3, '' @@ -312,8 +312,8 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) ! Footer ! ! ! !------------! - if(this_proc .eq. 1) then - do n = 1, n_proc + if(This_Proc() .eq. 1) then + do n = 1, N_Procs() call File % Set_Name(name_out_9, & processor = n, & time_step = time_step, & diff --git a/Sources/Process/Results_Mod/Save_Vtu_Results.f90 b/Sources/Process/Results_Mod/Save_Vtu_Results.f90 index 2f6ac688c..5cc0d10c9 100644 --- a/Sources/Process/Results_Mod/Save_Vtu_Results.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Results.f90 @@ -65,10 +65,10 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & c_l = -1 if(.not. PLOT_BUFFERS) then do c_f = -Grid % n_bnd_cells, -1 - if( Grid % Comm % cell_proc(c_f) .eq. this_proc) exit + if( Grid % Comm % cell_proc(c_f) .eq. This_Proc()) exit end do do c_l = -1, -Grid % n_bnd_cells, -1 - if( Grid % Comm % cell_proc(c_l) .eq. this_proc) exit + if( Grid % Comm % cell_proc(c_l) .eq. This_Proc()) exit end do end if end if @@ -113,7 +113,7 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & extension='.pvtu', & domain=domain) call File % Set_Name(name_out_9, & - processor=this_proc, & + processor=This_Proc(), & time_step=ts, & extension='.vtu', & domain=domain) @@ -124,14 +124,14 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & extension='.pvtu', & domain=domain) call File % Set_Name(name_out_9, & - processor=this_proc, & + processor=This_Proc(), & time_step=ts, & appendix ='-bnd', & extension='.vtu', & domain=domain) end if - if(n_proc > 1 .and. this_proc .eq. 1) then + if(Parallel_Run() .and. First_Proc()) then call File % Open_For_Writing_Binary(name_out_8, f8) end if call File % Open_For_Writing_Binary(name_out_9, f9) @@ -141,7 +141,7 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & ! Header ! ! ! !------------! - if(n_proc > 1 .and. this_proc .eq. 1) then + if(Parallel_Run() .and. First_Proc()) then write(f8) IN_0 // '' // LF write(f8) IN_0 // '' // LF write(f8) IN_1 // '' // LF @@ -176,7 +176,7 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & !-----------! ! Nodes ! !-----------! - if(n_proc > 1 .and. this_proc .eq. 1) then + if(Parallel_Run() .and. First_Proc()) then write(f8) IN_3 // '' // LF write(f8) IN_4 // '' // LF @@ -279,7 +279,7 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & ! Results and other cell data ! ! ! !---------------------------------! - if(n_proc > 1 .and. this_proc .eq. 1) then + if(Parallel_Run() .and. First_Proc()) then write(f8) IN_3 // '' // LF end if write(f9) IN_3 // '' // LF @@ -1007,7 +1007,7 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & ! ! !----------------------! if(run .eq. 1) then - if(n_proc > 1 .and. this_proc .eq. 1) then + if(Parallel_Run() .and. First_Proc()) then write(f8) IN_3 // '' // LF end if write(f9) IN_3 // '' // LF @@ -1036,8 +1036,8 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & ! Footer ! ! ! !------------! - if(n_proc > 1 .and. this_proc .eq. 1) then - do n = 1, n_proc + if(Parallel_Run() .and. First_Proc()) then + do n = 1, N_Procs() if(plot_inside) then call File % Set_Name(name_out_9, & processor=n, & diff --git a/Sources/Process/Results_Mod/Save_Vtu_Scalar_Int.f90 b/Sources/Process/Results_Mod/Save_Vtu_Scalar_Int.f90 index 594deb00b..284eed745 100644 --- a/Sources/Process/Results_Mod/Save_Vtu_Scalar_Int.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Scalar_Int.f90 @@ -33,7 +33,7 @@ subroutine Save_Vtu_Scalar_Int(Results, & ! Header if(sweep .eq. 1) then - if(n_proc > 1 .and. this_proc .eq. 1) then + if(Parallel_Run() .and. First_Proc()) then write(fs) IN_4 // & '' // LF diff --git a/Sources/Process/Results_Mod/Save_Vtu_Scalar_Real.f90 b/Sources/Process/Results_Mod/Save_Vtu_Scalar_Real.f90 index 4f63c0326..b85bd8e67 100644 --- a/Sources/Process/Results_Mod/Save_Vtu_Scalar_Real.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Scalar_Real.f90 @@ -33,7 +33,7 @@ subroutine Save_Vtu_Scalar_Real(Results, & ! Header if(sweep .eq. 1) then - if(n_proc > 1 .and. this_proc .eq. 1) then + if(Parallel_Run() .and. First_Proc()) then write(fs) IN_4 // & '' // LF diff --git a/Sources/Process/Results_Mod/Save_Vtu_Surf.f90 b/Sources/Process/Results_Mod/Save_Vtu_Surf.f90 index e216112f1..6c4ad4101 100644 --- a/Sources/Process/Results_Mod/Save_Vtu_Surf.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Surf.f90 @@ -36,7 +36,7 @@ subroutine Save_Vtu_Surf(Results, surf, time_step) ! ! !---------------------------! - if(this_proc < 2) then + if(First_Proc()) then call File % Set_Name(name_out, & time_step = time_step, & diff --git a/Sources/Process/Results_Mod/Save_Vtu_Swarm.f90 b/Sources/Process/Results_Mod/Save_Vtu_Swarm.f90 index 85cf2f393..f89bea7ea 100644 --- a/Sources/Process/Results_Mod/Save_Vtu_Swarm.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Swarm.f90 @@ -54,7 +54,7 @@ subroutine Save_Vtu_Swarm(Results, Swarm, time_step, domain) end do if(n_remaining_particles .eq. 0) then - if(this_proc < 2) then + if(First_Proc()) then print *, '# No particles remaining in the domain, nothing to save!' end if return @@ -66,7 +66,7 @@ subroutine Save_Vtu_Swarm(Results, Swarm, time_step, domain) ! ! !----------------------------! - if(this_proc < 2) then + if(First_Proc()) then call File % Set_Name(name_out, & time_step=time_step, & diff --git a/Sources/Process/Results_Mod/Save_Vtu_Tensor_6_Real.f90 b/Sources/Process/Results_Mod/Save_Vtu_Tensor_6_Real.f90 index e35cdaf96..e2281e991 100644 --- a/Sources/Process/Results_Mod/Save_Vtu_Tensor_6_Real.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Tensor_6_Real.f90 @@ -36,7 +36,7 @@ subroutine Save_Vtu_Tensor_6_Real(Results, & ! Header if(sweep .eq. 1) then - if(n_proc > 1 .and. this_proc .eq. 1) then + if(Parallel_Run() .and. First_Proc()) then write(fs) IN_4 // & ' 1 .and. this_proc .eq. 1) then + if(Parallel_Run() .and. First_Proc()) then write(fs) IN_4 // & ' 1 .and. this_proc .eq. 1) then + if(Parallel_Run() .and. First_Proc()) then write(fs) IN_4 // & ' Surf % Vert nv => Surf % n_verts - if(n_proc < 2) then + if(Sequential_Run()) then do v = 1, nv c = Surf % Vert(v) % cell ! get nearest cell Surf % Vert(v) % cell_x = Grid % xc(c) @@ -33,7 +33,7 @@ subroutine Distribute_Cell_Coords(Surf) c = Surf % Vert(v) % cell ! get nearest cell if(c > 0) then ! if cell is in this processor - if(Grid % Comm % cell_proc(c) .eq. this_proc) then + if(Grid % Comm % cell_proc(c) .eq. This_Proc()) then Surf % buff_x(v) = Grid % xc(c) Surf % buff_y(v) = Grid % yc(c) Surf % buff_z(v) = Grid % zc(c) diff --git a/Sources/Process/Surf_Mod/Distribute_Mesh.f90 b/Sources/Process/Surf_Mod/Distribute_Mesh.f90 index 09dd9da80..2cd0a1f77 100644 --- a/Sources/Process/Surf_Mod/Distribute_Mesh.f90 +++ b/Sources/Process/Surf_Mod/Distribute_Mesh.f90 @@ -42,20 +42,20 @@ subroutine Distribute_Mesh(Surf, verbose) !------------------------------------------------------------! ! Estimate number of vertices and elements per processor ! !------------------------------------------------------------! - allocate(nv_proc(n_proc)); nv_proc(:) = 0 - allocate(ne_proc(n_proc)); ne_proc(:) = 0 + allocate(nv_proc(N_Procs())); nv_proc(:) = 0 + allocate(ne_proc(N_Procs())); ne_proc(:) = 0 - nv_proc(this_proc) = nv - ne_proc(this_proc) = ne + nv_proc(This_Proc()) = nv + ne_proc(This_Proc()) = ne - call Comm_Mod_Global_Sum_Int_Array(n_proc, nv_proc) - call Comm_Mod_Global_Sum_Int_Array(n_proc, ne_proc) + call Comm_Mod_Global_Sum_Int_Array(N_Procs(), nv_proc) + call Comm_Mod_Global_Sum_Int_Array(N_Procs(), ne_proc) - nv_tot = sum(nv_proc(1:n_proc)) - ne_tot = sum(ne_proc(1:n_proc)) + nv_tot = sum(nv_proc(1:N_Procs())) + ne_tot = sum(ne_proc(1:N_Procs())) if(verbose) then - if(this_proc < 2) then + if(First_Proc()) then print '(a40,i8)', ' # Cummulative number of elements found:', ne_tot print '(a40,i8)', ' # Cummulative number of vertices found:', nv_tot end if @@ -67,8 +67,8 @@ subroutine Distribute_Mesh(Surf, verbose) n_acc_vert = 0 ! accumulated nodes n_acc_elem = 0 ! accumulated nodes - n_acc_vert = sum(nv_proc(1:this_proc-1)) - n_acc_elem = sum(ne_proc(1:this_proc-1)) + n_acc_vert = sum(nv_proc(1:This_Proc()-1)) + n_acc_elem = sum(ne_proc(1:This_Proc()-1)) ! PRINT *, 'N_ACC_VERT', THIS_PROC, N_ACC_VERT ! PRINT *, 'N_ACC_ELEM', THIS_PROC, N_ACC_ELEM diff --git a/Sources/Process/Surf_Mod/Distribute_Smooth.f90 b/Sources/Process/Surf_Mod/Distribute_Smooth.f90 index 91387c25a..b2f5af6af 100644 --- a/Sources/Process/Surf_Mod/Distribute_Smooth.f90 +++ b/Sources/Process/Surf_Mod/Distribute_Smooth.f90 @@ -17,7 +17,7 @@ subroutine Distribute_Smooth(Surf, smooth) Vert => Surf % Vert nv => Surf % n_verts - if(n_proc < 2) then + if(Sequential_Run()) then do v = 1, nv c = Surf % Vert(v) % cell ! get nearest cell Surf % Vert(v) % smooth = smooth % n(c) @@ -36,7 +36,7 @@ subroutine Distribute_Smooth(Surf, smooth) c = Surf % Vert(v) % cell ! get nearest cell if(c > 0) then ! if cell is in this processor - if(Grid % Comm % cell_proc(c) .eq. this_proc) then + if(Grid % Comm % cell_proc(c) .eq. This_Proc()) then Surf % buff_v(v) = smooth % n(c) Surf % buff_x(v) = smooth % x(c) Surf % buff_y(v) = smooth % y(c) diff --git a/Sources/Process/Surf_Mod/Place_Surf_At_Value.f90 b/Sources/Process/Surf_Mod/Place_Surf_At_Value.f90 index 9c863e1e4..e35f58352 100644 --- a/Sources/Process/Surf_Mod/Place_Surf_At_Value.f90 +++ b/Sources/Process/Surf_Mod/Place_Surf_At_Value.f90 @@ -140,7 +140,7 @@ subroutine Place_Surf_At_Value(Surf, sharp, smooth, verbose) ! should be unique since buffer cells are avoided in the loop above ! ! ! !-----------------------------------------------------------------------! - if(n_proc > 1) then + if(Parallel_Run()) then call Surf % Distribute_Mesh(verbose) end if diff --git a/Sources/Process/Swarm_Mod/Advance_Particles.f90 b/Sources/Process/Swarm_Mod/Advance_Particles.f90 index 4a5ed9e27..d96dbe188 100644 --- a/Sources/Process/Swarm_Mod/Advance_Particles.f90 +++ b/Sources/Process/Swarm_Mod/Advance_Particles.f90 @@ -92,7 +92,7 @@ subroutine Swarm_Mod_Advance_Particles(Swarm, n, n_stat_p, first_dt_p) if(.not. deposited .and. .not. escaped .and. .not. trapped) then ! If particle is in this processor, carry on with it - if(Part % proc .eq. this_proc) then + if(Part % proc .eq. This_Proc()) then ! Compute velocity at the particle, and move it ! (also calls Bounce_Particle) @@ -148,7 +148,7 @@ subroutine Swarm_Mod_Advance_Particles(Swarm, n, n_stat_p, first_dt_p) if(trapped) then ! If particle is in this processor, carry on with it - if(Part % proc .eq. this_proc) then + if(Part % proc .eq. This_Proc()) then call Swarm % Move_Trapped(k) ! It might have moved to a new cell diff --git a/Sources/Process/Swarm_Mod/Allocate_Swarm.f90 b/Sources/Process/Swarm_Mod/Allocate_Swarm.f90 index d9cf4305a..3ded24dc2 100644 --- a/Sources/Process/Swarm_Mod/Allocate_Swarm.f90 +++ b/Sources/Process/Swarm_Mod/Allocate_Swarm.f90 @@ -26,7 +26,7 @@ subroutine Allocate_Swarm(Swarm, Flow, Turb, Vof) if(Swarm % max_particles > 0) then allocate(Swarm % Particle(Swarm % max_particles)) else - if(this_proc < 2) then + if(First_Proc()) then print *, '# ERROR! You are attempting a simulation with' print *, '# particles but max number of particles is zero.' print *, '# Did you set the parameter MAX_PARTICLES in control file?' diff --git a/Sources/Process/Swarm_Mod/Bounce_Particle.f90 b/Sources/Process/Swarm_Mod/Bounce_Particle.f90 index 5f2c6da6d..e309d9d82 100644 --- a/Sources/Process/Swarm_Mod/Bounce_Particle.f90 +++ b/Sources/Process/Swarm_Mod/Bounce_Particle.f90 @@ -35,7 +35,7 @@ subroutine Bounce_Particle(Swarm, k) s = Grid % cells_bnd_face(c2) ! index of the closest boundary face end if - ! Debug: write(this_proc*1000+k, '(a,4i7)') & + ! Debug: write(This_Proc()*1000+k, '(a,4i7)') & ! Debug: 'time, part, cell and face: ', n, k, c2, s ! If no boundary cell close, no need to stay here @@ -119,7 +119,7 @@ subroutine Bounce_Particle(Swarm, k) escaped = .true. ! Mark the particle by enlarging it big time Part % d = 1.0e-4 - ! Debug: write(this_proc*1000+k, '(a,2i7,a)') & + ! Debug: write(This_Proc()*1000+k, '(a,2i7,a)') & ! Debug: 'time, part ', n, k, ' is out' end if @@ -222,7 +222,7 @@ subroutine Bounce_Particle(Swarm, k) ! Increasing the number of particle reflections Swarm % n_reflected(c2) = Swarm % n_reflected(c2) + 1 - ! Debug: write(this_proc*1000+k, '(a,2i7, 5(e12.4))') & + ! Debug: write(This_Proc()*1000+k, '(a,2i7, 5(e12.4))') & ! Debug: 'time, part bounced at ', & ! Debug: n, k, & ! Debug: xi, yi, zi, dsc_n, dsc_o diff --git a/Sources/Process/Swarm_Mod/Check_Periodicity.f90 b/Sources/Process/Swarm_Mod/Check_Periodicity.f90 index ace762832..157d551c3 100644 --- a/Sources/Process/Swarm_Mod/Check_Periodicity.f90 +++ b/Sources/Process/Swarm_Mod/Check_Periodicity.f90 @@ -26,7 +26,7 @@ subroutine Check_Periodicity(Swarm, k, n_parts_in_buffers) Swarm % cell_has_particles(:) = .false. ! assume no cells has particles Part => Swarm % Particle(k) - if(Part % proc .eq. this_proc) then + if(Part % proc .eq. This_Proc()) then Swarm % cell_has_particles(Part % cell) = .true. end if @@ -49,7 +49,7 @@ subroutine Check_Periodicity(Swarm, k, n_parts_in_buffers) Part => Swarm % Particle(k) - if(Part % proc .eq. this_proc) then + if(Part % proc .eq. This_Proc()) then xc1 = Grid % xc(c1) yc1 = Grid % yc(c1) @@ -105,7 +105,7 @@ subroutine Check_Periodicity(Swarm, k, n_parts_in_buffers) Part => Swarm % Particle(k) - if(Part % proc .eq. this_proc) then + if(Part % proc .eq. This_Proc()) then ! Take position of c1 at its shadow position xc1 = Grid % xc(c2) - Grid % dx(s) diff --git a/Sources/Process/Swarm_Mod/Exchange_Particles.f90 b/Sources/Process/Swarm_Mod/Exchange_Particles.f90 index 2e0bbe43f..8a0103872 100644 --- a/Sources/Process/Swarm_Mod/Exchange_Particles.f90 +++ b/Sources/Process/Swarm_Mod/Exchange_Particles.f90 @@ -21,7 +21,7 @@ subroutine Swarm_Mod_Exchange_Particles(Swarm) ! Exchange particle data between processors ! ! ! !-----------------------------------------------! - if(n_proc > 1) then + if(Parallel_Run()) then Swarm % i_work(:) = 0 Swarm % l_work(:) = .false. @@ -36,7 +36,7 @@ subroutine Swarm_Mod_Exchange_Particles(Swarm) ! Pack data for sending (all processors which ... ! ! ... send will put data in this globall pool) ! !-----------------------------------------------------! - if(Part % proc .eq. this_proc) then + if(Part % proc .eq. This_Proc()) then i = (k-1) * Swarm % N_I_VARS Swarm % i_work(i + 1) = Part % proc ! where it resides Swarm % i_work(i + 2) = Part % buff ! where it wants to go @@ -98,8 +98,8 @@ subroutine Swarm_Mod_Exchange_Particles(Swarm) Part % node = Swarm % i_work(i + 4) ! Particle was not in this processor but wants to enter here - if(Part % proc .ne. this_proc .and. & - Part % buff .eq. this_proc) then + if(Part % proc .ne. This_Proc() .and. & + Part % buff .eq. This_Proc()) then ! Set particle processor to correct value Part % proc = Part % buff @@ -130,7 +130,7 @@ subroutine Swarm_Mod_Exchange_Particles(Swarm) ! Particle was not in this processor and doesn't even want to ... ! ... enter here or particle was in this processor but has left it - else if(Part % buff .ne. this_proc) then + else if(Part % buff .ne. This_Proc()) then Part % proc = Part % buff end if diff --git a/Sources/Process/Swarm_Mod/Print_Statistics.f90 b/Sources/Process/Swarm_Mod/Print_Statistics.f90 index 66101fb92..e50c8cf91 100644 --- a/Sources/Process/Swarm_Mod/Print_Statistics.f90 +++ b/Sources/Process/Swarm_Mod/Print_Statistics.f90 @@ -31,7 +31,7 @@ subroutine Swarm_Mod_Print_Statistics(Swarm) max_st = -HUGE do k = 1, Swarm % n_particles Part => Swarm % Particle(k) - if(Part % proc .eq. this_proc) then + if(Part % proc .eq. This_Proc()) then avg_cfl = avg_cfl + Part % cfl avg_re = avg_re + Part % re avg_st = avg_st + Part % st @@ -54,7 +54,7 @@ subroutine Swarm_Mod_Print_Statistics(Swarm) n_esc = 0 n_ref = 0 do c = -Grid % n_bnd_cells, -1 - if(Grid % Comm % cell_proc(c) .eq. this_proc) then ! avoid buffer cells + if(Grid % Comm % cell_proc(c) .eq. This_Proc()) then ! avoid buffer cells n_dep = n_dep + nint(Swarm % n_deposited(c)) n_esc = n_esc + nint(Swarm % n_escaped(c)) n_ref = n_ref + nint(Swarm % n_reflected(c)) @@ -67,7 +67,7 @@ subroutine Swarm_Mod_Print_Statistics(Swarm) !-----------------------------------! ! Print some data on the screen ! !-----------------------------------! - if(this_proc < 2) then + if(First_Proc()) then line( 1:160) = ' ' line( 1+T:52+T) = ' #================================================#' print '(a)', trim(line) diff --git a/Sources/Process/Swarm_Mod/Sgs_Discrete_Random_Walk.f90 b/Sources/Process/Swarm_Mod/Sgs_Discrete_Random_Walk.f90 index 5e63fe649..08a01a0ee 100644 --- a/Sources/Process/Swarm_Mod/Sgs_Discrete_Random_Walk.f90 +++ b/Sources/Process/Swarm_Mod/Sgs_Discrete_Random_Walk.f90 @@ -159,7 +159,7 @@ subroutine Swarm_Mod_Sgs_Discrete_Random_Walk(Swarm, k, rx, ry, rz) flag3 = .true. end if else - if(this_proc < 2) then + if(First_Proc()) then print *, "# Sigma is not continuous!" end if stop diff --git a/Sources/Process/Vof_Mod/Core/Compute_Vof.f90 b/Sources/Process/Vof_Mod/Core/Compute_Vof.f90 index 65cd7e921..d7fd11374 100644 --- a/Sources/Process/Vof_Mod/Core/Compute_Vof.f90 +++ b/Sources/Process/Vof_Mod/Core/Compute_Vof.f90 @@ -51,7 +51,7 @@ subroutine Compute_Vof(Vof, Sol, dt, curr_dt) ! Warning if Courant Number is exceeded if(n_sub > 1) then - if(this_proc < 2) then + if(First_Proc()) then call File % Append_For_Writing_Ascii('alert-dt-vof.dat', fu) write(fu,*) 'Courant Number was exceded at iteration: ', curr_dt write(fu,*) 'Co_max = ', courant_max diff --git a/Sources/Process/Vof_Mod/Core/Initialize_From_Stl.f90 b/Sources/Process/Vof_Mod/Core/Initialize_From_Stl.f90 index b47de9124..e45633a92 100644 --- a/Sources/Process/Vof_Mod/Core/Initialize_From_Stl.f90 +++ b/Sources/Process/Vof_Mod/Core/Initialize_From_Stl.f90 @@ -60,11 +60,11 @@ subroutine Initialize_From_Stl(Vof) call Work % Connect_Real_Cell(surf_dist, surf_dist_pos, surf_dist_neg) call Work % Connect_Real_Cell(node_dist) - if(Stl % n_boddies > 1 .and. this_proc < 2) then + if(Stl % n_boddies > 1 .and. First_Proc()) then print '(a,i3)', ' # Processing body ', b end if - if(this_proc < 2) then + if(First_Proc()) then print '(a)', ' # Calculating distance from the STL interface' end if do c = Cells_In_Domain_And_Buffers() @@ -74,7 +74,7 @@ subroutine Initialize_From_Stl(Vof) end do do c = Cells_In_Domain() - if(this_proc < 2) then + if(First_Proc()) then write(*,'(a2,f5.0,a14,a1)', advance='no') ' #', & (100.*real(c)/real(Grid % n_cells)), ' % complete...', achar(13) flush(6) @@ -158,7 +158,7 @@ subroutine Initialize_From_Stl(Vof) ! the node distance for all nodes in the grid ! ! ! !----------------------------------------------------! - if(this_proc < 2) print '(a)', ' # Searching for cells cut by the STL facets' + if(First_Proc()) print '(a)', ' # Searching for cells cut by the STL facets' do c = Cells_In_Domain_And_Buffers() ! Fetch cell coordinates @@ -170,7 +170,7 @@ subroutine Initialize_From_Stl(Vof) cut_facets(:) = 0 cut_cel(c) = NO - if(this_proc < 2) then + if(First_Proc()) then write(*,'(a2,f5.0,a14,a1)', advance='no') ' #', & (100. * real(c)/real(Grid % n_cells)), ' % complete...', achar(13) flush(6) @@ -316,7 +316,7 @@ subroutine Initialize_From_Stl(Vof) !---------------------------------------! ! The actual flood fill starts here ! !---------------------------------------! - if(this_proc < 2) write(*, '(a)', advance='no') ' # Flooding ...' + if(First_Proc()) write(*, '(a)', advance='no') ' # Flooding ...' m = 0 1 continue m = m + 1 @@ -393,7 +393,7 @@ subroutine Initialize_From_Stl(Vof) ! Flood fill still going, go back call Comm_Mod_Global_Lor_Log(flooding) if(flooding) goto 1 - if(this_proc < 2) print '(a)', ' done!' + if(First_Proc()) print '(a)', ' done!' if(DEBUG) then call Grid % Save_Debug_Vtu(append="set_cel", & @@ -439,9 +439,9 @@ subroutine Initialize_From_Stl(Vof) ! of VOF, some cells happen to have multiple iso-surfaces ! !---------------------------------------------------------------! if(Iso_Polygons % n_polys > 1) then - print '(4(a,i8))', __FILE__, __LINE__, & - ' # check cell ', c, & - ' in processor ', this_proc, & + print '(4(a,i8))', __FILE__, __LINE__, & + ' # check cell ', c, & + ' in processor ', This_Proc(), & ' global cell ', glo(c) call Polyhedron % Plot_Polyhedron_Vtk("check-cell", glo(c)) call Iso_Polygons % Plot_Iso_polygons_Vtk("check-iso", glo(c)) diff --git a/Sources/Shared/Assert_Mod/Handle_Assert.f90 b/Sources/Shared/Assert_Mod/Handle_Assert.f90 index cf3d225e7..1b596f069 100644 --- a/Sources/Shared/Assert_Mod/Handle_Assert.f90 +++ b/Sources/Shared/Assert_Mod/Handle_Assert.f90 @@ -12,7 +12,7 @@ subroutine Handle_Assert(fail, text, file, line) !==============================================================================! ! Sequential run - if(n_proc < 2) then + if(Sequential_Run()) then if(fail) then write(numb, '(i16)') line print '(7a)', ' Assert(', text, & @@ -27,7 +27,7 @@ subroutine Handle_Assert(fail, text, file, line) else if(fail) then write(numb, '(i16)') line - write(proc, '(i16)') this_proc + write(proc, '(i16)') This_Proc() print '(9a)', ' Assert(', text, & ') failed in file ', file, & ' at line ', trim(adjustl(numb)), & diff --git a/Sources/Shared/Comm_Mod.f90 b/Sources/Shared/Comm_Mod.f90 index d9c62ea1e..6d666730d 100644 --- a/Sources/Shared/Comm_Mod.f90 +++ b/Sources/Shared/Comm_Mod.f90 @@ -65,6 +65,9 @@ module Comm_Mod type(Buffer_Type), allocatable :: cells_send(:) type(Buffer_Type), allocatable :: cells_recv(:) + integer, private :: n_processors ! number of processors + integer, private :: this_processor ! current processor + contains ! File management @@ -101,8 +104,11 @@ module Comm_Mod end type - integer :: this_proc ! processor i.d. - integer :: n_proc ! number of processors + !------------------------------------------------------------------------! + ! A big global communicator, introduced essentiall to give access to ! + ! private variables n_processors and this_processor to other objects ! + !------------------------------------------------------------------------! + type(Comm_Type) :: Communicator ! These communication types will depend on precision #if T_FLOWS_MPI == 1 @@ -117,6 +123,13 @@ module Comm_Mod contains + ! Shared pure function +# include "Comm_Mod/Shared/First_Proc.f90" +# include "Comm_Mod/Shared/N_Procs.f90" +# include "Comm_Mod/Shared/Parallel_Run.f90" +# include "Comm_Mod/Shared/Sequential_Run.f90" +# include "Comm_Mod/Shared/This_Proc.f90" + # if T_FLOWS_MPI == 1 ! Three basic ones are non-member # include "Comm_Mod/Parallel/Start.f90" diff --git a/Sources/Shared/Comm_Mod/Parallel/Exchange_Int_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Exchange_Int_Array.f90 index 2aef1c647..f0f8fd458 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Exchange_Int_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Exchange_Int_Array.f90 @@ -7,20 +7,20 @@ subroutine Exchange_Int_Array(Comm, length, phi, dest) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: length - integer :: phi(length) - integer :: dest ! destination processor + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: length + integer, intent(inout) :: phi(length) + integer, intent(in) :: dest ! destination processor !-----------------------------------[Locals]-----------------------------------! - integer :: rtag, stag, error + integer :: rtag, stag, error ! receive and send tags, error type(Mpi_Status) :: status !------------------------[Avoid unused parent warning]-------------------------! Unused(Comm) !==============================================================================! ! Form send and receive tags - stag = (n_proc) * this_proc + dest ! tag for sending - rtag = (n_proc) * dest + this_proc ! tag for receiving + stag = Communicator % n_processors * Communicator % this_processor + dest + rtag = Communicator % n_processors * dest + Communicator % this_processor call Mpi_Sendrecv_Replace(phi(1), & ! buffer length, & ! length diff --git a/Sources/Shared/Comm_Mod/Parallel/Exchange_Log_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Exchange_Log_Array.f90 index 6c5dd19c9..8a39fb1d8 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Exchange_Log_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Exchange_Log_Array.f90 @@ -7,20 +7,20 @@ subroutine Exchange_Log_Array(Comm, length, phi, dest) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: length - logical :: phi(length) - integer :: dest ! destination processor + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: length + logical, intent(inout) :: phi(length) + integer, intent(in) :: dest ! destination processor !-----------------------------------[Locals]-----------------------------------! - integer :: rtag, stag, error + integer :: rtag, stag, error ! receive and send tags, error type(Mpi_Status) :: status !------------------------[Avoid unused parent warning]-------------------------! Unused(Comm) !==============================================================================! ! Form send and receive tags - stag = (n_proc) * this_proc + dest ! tag for sending - rtag = (n_proc) * dest + this_proc ! tag for receiving + stag = Communicator % n_processors * Communicator % this_processor + dest + rtag = Communicator % n_processors * dest + Communicator % this_processor call Mpi_Sendrecv_Replace(phi(1), & ! buffer length, & ! length diff --git a/Sources/Shared/Comm_Mod/Parallel/Exchange_Real_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Exchange_Real_Array.f90 index f42a8fbe0..d47f55be5 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Exchange_Real_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Exchange_Real_Array.f90 @@ -7,20 +7,20 @@ subroutine Exchange_Real_Array(Comm, length, phi, dest) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: length - real :: phi(length) - integer :: dest ! destination processor + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: length + real, intent(inout) :: phi(length) + integer, intent(in) :: dest ! destination processor !-----------------------------------[Locals]-----------------------------------! - integer :: rtag, stag, error + integer :: rtag, stag, error ! receive and send tags, error type(Mpi_Status) :: status !------------------------[Avoid unused parent warning]-------------------------! Unused(Comm) !==============================================================================! ! Form send and receive tags - stag = (n_proc) * this_proc + dest ! tag for sending - rtag = (n_proc) * dest + this_proc ! tag for receiving + stag = Communicator % n_processors * Communicator % this_processor + dest + rtag = Communicator % n_processors * dest + Communicator % this_processor call Mpi_Sendrecv_Replace(phi(1), & ! buffer length, & ! length diff --git a/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Int_Arrays.f90 b/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Int_Arrays.f90 index 093387dfb..e17e7a900 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Int_Arrays.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Int_Arrays.f90 @@ -6,22 +6,22 @@ subroutine Sendrecv_Int_Arrays(Comm, len_s, phi_s, & !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: len_s ! send length - integer :: phi_s(len_s) ! send buffer - integer :: len_r ! receive length - integer :: phi_r(len_r) ! receive buffer - integer :: dest ! destination processor + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: len_s ! send length + integer, intent(in) :: phi_s(len_s) ! send buffer + integer, intent(in) :: len_r ! receive length + integer, intent(out) :: phi_r(len_r) ! receive buffer + integer, intent(in) :: dest ! destination processor !-----------------------------------[Locals]-----------------------------------! - integer :: rtag, stag, error + integer :: rtag, stag, error ! tags to send and receive, error type(Mpi_Status) :: status !------------------------[Avoid unused parent warning]-------------------------! Unused(Comm) !==============================================================================! ! Form send and receive tags - stag = (n_proc) * this_proc + dest ! tag for sending - rtag = (n_proc) * dest + this_proc ! tag for receiving + stag = Communicator % n_processors * Communicator % this_processor + dest + rtag = Communicator % n_processors * dest + Communicator % this_processor call Mpi_Sendrecv(phi_s(1), & ! send buffer len_s, & ! send length diff --git a/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Log_Arrays.f90 b/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Log_Arrays.f90 index 05b718bd8..a7239bc8a 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Log_Arrays.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Log_Arrays.f90 @@ -6,22 +6,22 @@ subroutine Sendrecv_Log_Arrays(Comm, len_s, phi_s, & !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: len_s ! send length - logical :: phi_s(len_s) ! send buffer - integer :: len_r ! receive length - logical :: phi_r(len_r) ! receive buffer - integer :: dest ! destination processor + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: len_s ! send length + logical, intent(in) :: phi_s(len_s) ! send buffer + integer, intent(in) :: len_r ! receive length + logical, intent(out) :: phi_r(len_r) ! receive buffer + integer, intent(in) :: dest ! destination processor !-----------------------------------[Locals]-----------------------------------! - integer :: rtag, stag, error + integer :: rtag, stag, error ! tags to send and receive, error type(Mpi_Status) :: status !------------------------[Avoid unused parent warning]-------------------------! Unused(Comm) !==============================================================================! ! Form send and receive tags - stag = (n_proc) * this_proc + dest ! tag for sending - rtag = (n_proc) * dest + this_proc ! tag for receiving + stag = Communicator % n_processors * Communicator % this_processor + dest + rtag = Communicator % n_processors * dest + Communicator % this_processor call Mpi_Sendrecv(phi_s(1), & ! send buffer len_s, & ! send length diff --git a/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Real_Arrays.f90 b/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Real_Arrays.f90 index a682d2fcf..9b94bc040 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Real_Arrays.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Real_Arrays.f90 @@ -6,22 +6,22 @@ subroutine Sendrecv_Real_Arrays(Comm, len_s, phi_s, & !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: len_s ! send length - real :: phi_s(len_s) ! send buffer - integer :: len_r ! receive length - real :: phi_r(len_r) ! receive buffer - integer :: dest ! destination processor + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: len_s ! send length + real, intent(in) :: phi_s(len_s) ! send buffer + integer, intent(in) :: len_r ! receive length + real, intent(out) :: phi_r(len_r) ! receive buffer + integer, intent(in) :: dest ! destination processor !-----------------------------------[Locals]-----------------------------------! - integer :: rtag, stag, error + integer :: rtag, stag, error ! tags to send and receive, error type(Mpi_Status) :: status !------------------------[Avoid unused parent warning]-------------------------! Unused(Comm) !==============================================================================! ! Form send and receive tags - stag = (n_proc) * this_proc + dest ! tag for sending - rtag = (n_proc) * dest + this_proc ! tag for receiving + stag = Communicator % n_processors * Communicator % this_processor + dest + rtag = Communicator % n_processors * dest + Communicator % this_processor call Mpi_Sendrecv(phi_s(1), & ! send buffer len_s, & ! send length diff --git a/Sources/Shared/Comm_Mod/Parallel/Start.f90 b/Sources/Shared/Comm_Mod/Parallel/Start.f90 index 9244e7a81..38fc0c0b9 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Start.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Start.f90 @@ -13,18 +13,18 @@ subroutine Comm_Mod_Start call Mpi_Init(error) ! Get number of processors - call Mpi_Comm_Size(MPI_COMM_WORLD, n_proc, error) + call Mpi_Comm_Size(MPI_COMM_WORLD, Communicator % n_processors, error) ! Get current processor number - call Mpi_Comm_Rank(MPI_COMM_WORLD, this_proc, error) + call Mpi_Comm_Rank(MPI_COMM_WORLD, Communicator % this_processor, error) ! Use Fortran counting - from 1 - this_proc = this_proc + 1 + Communicator % this_processor = Communicator % this_processor + 1 ! But if run is sequential, set the only processor to zero - if(n_proc .eq. 1) then - n_proc = 0 - this_proc = 0 + if(Communicator % n_processors .eq. 1) then + Communicator % n_processors = 0 + Communicator % this_processor = 0 endif ! Set proper types for communication @@ -37,7 +37,7 @@ subroutine Comm_Mod_Start ! Make sure that integers are 32-bit if(IP .eq. DP) then - if(this_proc < 2) then + if(Communicator % this_processor < 2) then print *, '# Error - 64 bit integers are not supported!' print *, '# This error is critical, exiting!' call Comm_Mod_End diff --git a/Sources/Shared/Comm_Mod/Sequential/Exchange_Int_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Exchange_Int_Array.f90 index 28b07d485..72af9ec31 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Exchange_Int_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Exchange_Int_Array.f90 @@ -5,10 +5,10 @@ subroutine Exchange_Int_Array(Comm, length, phi, dest) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: length - integer :: phi(length) - integer :: dest ! destination processor + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: length + integer, intent(inout) :: phi(length) + integer, intent(in) :: dest ! destination processor !------------------------[Avoid unused parent warning]-------------------------! Unused(Comm) Unused(length) diff --git a/Sources/Shared/Comm_Mod/Sequential/Exchange_Log_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Exchange_Log_Array.f90 index e24f2f4ba..91e91fe13 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Exchange_Log_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Exchange_Log_Array.f90 @@ -5,10 +5,10 @@ subroutine Exchange_Log_Array(Comm, length, phi, dest) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: length - logical :: phi(length) - integer :: dest ! destination processor + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: length + logical, intent(inout) :: phi(length) + integer, intent(in) :: dest ! destination processor !------------------------[Avoid unused parent warning]-------------------------! Unused(Comm) Unused(length) diff --git a/Sources/Shared/Comm_Mod/Sequential/Exchange_Real_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Exchange_Real_Array.f90 index 66526bafa..a71bc66b1 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Exchange_Real_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Exchange_Real_Array.f90 @@ -5,10 +5,10 @@ subroutine Exchange_Real_Array(Comm, length, phi, dest) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: length - real :: phi(length) - integer :: dest ! destination processor + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: length + real, intent(inout) :: phi(length) + integer, intent(in) :: dest ! destination processor !------------------------[Avoid unused parent warning]-------------------------! Unused(Comm) Unused(length) diff --git a/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Int_Arrays.f90 b/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Int_Arrays.f90 index 0ec3c1ce1..c86481d82 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Int_Arrays.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Int_Arrays.f90 @@ -6,12 +6,12 @@ subroutine Sendrecv_Int_Arrays(Comm, len_s, phi_s, & !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: len_s ! send length - integer :: phi_s(len_s) ! send buffer - integer :: len_r ! receive length - integer :: phi_r(len_r) ! receive buffer - integer :: dest ! destination processor + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: len_s ! send length + integer, intent(in) :: phi_s(len_s) ! send buffer + integer, intent(in) :: len_r ! receive length + integer, intent(out) :: phi_r(len_r) ! receive buffer + integer, intent(in) :: dest ! destination processor !------------------------[Avoid unused parent warning]-------------------------! Unused(Comm) Unused(len_s) diff --git a/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Log_Arrays.f90 b/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Log_Arrays.f90 index 232673bbf..f720b745f 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Log_Arrays.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Log_Arrays.f90 @@ -6,12 +6,12 @@ subroutine Sendrecv_Log_Arrays(Comm, len_s, phi_s, & !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: len_s ! send length - logical :: phi_s(len_s) ! send buffer - integer :: len_r ! receive length - logical :: phi_r(len_r) ! receive buffer - integer :: dest ! destination processor + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: len_s ! send length + logical, intent(in) :: phi_s(len_s) ! send buffer + integer, intent(in) :: len_r ! receive length + logical, intent(out) :: phi_r(len_r) ! receive buffer + integer, intent(in) :: dest ! destination processor !------------------------[Avoid unused parent warning]-------------------------! Unused(Comm) Unused(len_s) diff --git a/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Real_Arrays.f90 b/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Real_Arrays.f90 index 7d787d044..102ff7c6a 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Real_Arrays.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Real_Arrays.f90 @@ -6,12 +6,12 @@ subroutine Sendrecv_Real_Arrays(Comm, len_s, phi_s, & !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: len_s ! send length - real :: phi_s(len_s) ! send buffer - integer :: len_r ! receive length - real :: phi_r(len_r) ! receive buffer - integer :: dest ! destination processor + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: len_s ! send length + real, intent(in) :: phi_s(len_s) ! send buffer + integer, intent(in) :: len_r ! receive length + real, intent(out) :: phi_r(len_r) ! receive buffer + integer, intent(in) :: dest ! destination processor !------------------------[Avoid unused parent warning]-------------------------! Unused(Comm) Unused(len_s) diff --git a/Sources/Shared/Comm_Mod/Sequential/Start.f90 b/Sources/Shared/Comm_Mod/Sequential/Start.f90 index 447436bb4..a331bac07 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Start.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Start.f90 @@ -9,8 +9,8 @@ subroutine Comm_Mod_Start integer, allocatable :: seeds(:) !==============================================================================! - this_proc = 0 - n_proc = 0 + Communicator % this_processor = 0 + Communicator % n_processors = 0 call random_seed(size = n) allocate(seeds(n)); seeds(:) = 12321 diff --git a/Sources/Shared/Comm_Mod/Shared/First_Proc.f90 b/Sources/Shared/Comm_Mod/Shared/First_Proc.f90 new file mode 100644 index 000000000..24fecfb29 --- /dev/null +++ b/Sources/Shared/Comm_Mod/Shared/First_Proc.f90 @@ -0,0 +1,9 @@ +!==============================================================================! + pure logical function First_Proc() +!------------------------------------------------------------------------------! + implicit none +!==============================================================================! + + First_Proc = Communicator % this_processor < 2 + + end function diff --git a/Sources/Shared/Comm_Mod/Shared/N_Procs.f90 b/Sources/Shared/Comm_Mod/Shared/N_Procs.f90 new file mode 100644 index 000000000..6f7200baa --- /dev/null +++ b/Sources/Shared/Comm_Mod/Shared/N_Procs.f90 @@ -0,0 +1,9 @@ +!==============================================================================! + pure integer function N_Procs() +!------------------------------------------------------------------------------! + implicit none +!==============================================================================! + + N_Procs = Communicator % n_processors + + end function diff --git a/Sources/Shared/Comm_Mod/Shared/Parallel_Run.f90 b/Sources/Shared/Comm_Mod/Shared/Parallel_Run.f90 new file mode 100644 index 000000000..a0995949e --- /dev/null +++ b/Sources/Shared/Comm_Mod/Shared/Parallel_Run.f90 @@ -0,0 +1,9 @@ +!==============================================================================! + pure logical function Parallel_Run() +!------------------------------------------------------------------------------! + implicit none +!==============================================================================! + + Parallel_Run = Communicator % n_processors > 2 + + end function diff --git a/Sources/Shared/Comm_Mod/Shared/Sequential_Run.f90 b/Sources/Shared/Comm_Mod/Shared/Sequential_Run.f90 new file mode 100644 index 000000000..c24614417 --- /dev/null +++ b/Sources/Shared/Comm_Mod/Shared/Sequential_Run.f90 @@ -0,0 +1,9 @@ +!==============================================================================! + pure logical function Sequential_Run() +!------------------------------------------------------------------------------! + implicit none +!==============================================================================! + + Sequential_Run = Communicator % n_processors < 2 + + end function diff --git a/Sources/Shared/Comm_Mod/Shared/This_Proc.f90 b/Sources/Shared/Comm_Mod/Shared/This_Proc.f90 new file mode 100644 index 000000000..be6bcbca9 --- /dev/null +++ b/Sources/Shared/Comm_Mod/Shared/This_Proc.f90 @@ -0,0 +1,9 @@ +!==============================================================================! + pure integer function This_Proc() +!------------------------------------------------------------------------------! + implicit none +!==============================================================================! + + This_Proc = Communicator % this_processor + + end function diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Open_Domain_File.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Open_Domain_File.f90 index cabe0ba30..2e9bbe669 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Open_Domain_File.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Open_Domain_File.f90 @@ -9,7 +9,8 @@ subroutine Control_Mod_Open_Domain_File(dom, file_name) character(len=*) :: file_name !==============================================================================! - call File % Open_For_Reading_Ascii(file_name, dom_control_file_unit(dom), & - processor=this_proc) + call File % Open_For_Reading_Ascii(file_name, & + dom_control_file_unit(dom), & + processor = This_Proc()) end subroutine diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Open_Root_File.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Open_Root_File.f90 index 574224b15..4d4338708 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Open_Root_File.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Open_Root_File.f90 @@ -9,7 +9,7 @@ subroutine Control_Mod_Open_Root_File(file_name) !==============================================================================! call File % Open_For_Reading_Ascii(file_name, root_control_file_unit, & - processor=this_proc) + processor=This_Proc()) ! Make root default to begin with control_file_unit = root_control_file_unit diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Position_At_One_Key.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Position_At_One_Key.f90 index bc465d80f..21f8d2dfb 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Position_At_One_Key.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Position_At_One_Key.f90 @@ -41,7 +41,7 @@ subroutine Control_Mod_Position_At_One_Key(keyword, found, verbose) !--------------------------------------------! 1 if(.not. found) then if(present(verbose)) then - if(verbose .and. this_proc < 2) then + if(verbose .and. First_Proc()) then print '(3a)', ' # WARING! Could not find the line with keyword: ', & keyword, '!' end if diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Position_At_Three_Keys.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Position_At_Three_Keys.f90 index d2522c6bb..bdc0ba269 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Position_At_Three_Keys.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Position_At_Three_Keys.f90 @@ -46,7 +46,7 @@ subroutine Control_Mod_Position_At_Three_Keys(keyword_1, & !--------------------------------------------! 1 if(.not. found) then if(present(verbose)) then - if(verbose .and. this_proc < 2) then + if(verbose .and. First_Proc()) then print '(5a)', ' # NOTE! Could not find the line with keywords: ', & keyword_1, ', ', trim(keyword_2), ', ', trim(keyword_3), '!' end if diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Position_At_Two_Keys.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Position_At_Two_Keys.f90 index e3dde57a8..0c2d4ab94 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Position_At_Two_Keys.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Position_At_Two_Keys.f90 @@ -49,7 +49,7 @@ subroutine Control_Mod_Position_At_Two_Keys(keyword_1, keyword_2, & !--------------------------------------------! 1 if(.not. found) then if(present(verbose)) then - if(verbose .and. this_proc < 2) then + if(verbose .and. First_Proc()) then print '(5a)', ' # NOTE! Could not find the line with keywords: ', & keyword_1, ', ', trim(keyword_2), '!' end if diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item.f90 index 24b80e5cc..9b19b990f 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item.f90 @@ -43,7 +43,7 @@ subroutine Control_Mod_Read_Char_Item(keyword, def, val, verbose) ! Keyword was not found; issue a warning ! !--------------------------------------------! 1 if(present(verbose)) then - if(verbose .and. this_proc < 2) then + if(verbose .and. First_Proc()) then print '(4a)', ' # NOTE! Could not find the keyword: ', & trim(keyword), '. Using the default: ', trim(def) end if diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item_On.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item_On.f90 index 2fc713d90..adccce37d 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item_On.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item_On.f90 @@ -38,7 +38,7 @@ subroutine Control_Mod_Read_Char_Item_On(keyword, def, val, verbose) ! Keyword was not found; issue a warning ! !--------------------------------------------! 1 if(present(verbose)) then - if(verbose .and. this_proc < 2) then + if(verbose .and. First_Proc()) then print '(4a)', ' # NOTE! Could not find the keyword: ', & trim(keyword), '. Using the default: ', trim(def) end if diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item.f90 index 09051c173..0d44238ac 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item.f90 @@ -42,7 +42,7 @@ subroutine Control_Mod_Read_Int_Item(keyword, def, val, verbose) ! Keyword was not found; issue a warning ! !--------------------------------------------! 1 if(present(verbose)) then - if(verbose .and. this_proc < 2) then + if(verbose .and. First_Proc()) then if(def .eq. HUGE_INT) then print '(3a,i9)', ' # NOTE! Could not find the keyword: ', & trim(keyword), '. Using the default HUGE_INT value' diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item_On.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item_On.f90 index be64e210c..3e920c046 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item_On.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item_On.f90 @@ -38,7 +38,7 @@ subroutine Control_Mod_Read_Int_Item_On(keyword, def, val, verbose) ! Keyword was not found; issue a warning ! !--------------------------------------------! 1 if(present(verbose)) then - if(verbose .and. this_proc < 2) then + if(verbose .and. First_Proc()) then if(def .eq. HUGE_INT) then print '(3a,i9)', ' # NOTE! Could not find the keyword: ', & trim(keyword), '. Using the default HUGE_INT value' diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Array.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Array.f90 index f5c56b99a..33f45d65d 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Array.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Array.f90 @@ -47,7 +47,7 @@ subroutine Control_Mod_Read_Real_Array(keyword, n, def, val, verbose) ! Keyword was not found; issue a warning ! !--------------------------------------------! 1 if(present(verbose)) then - if(verbose .and. this_proc < 2) then + if(verbose .and. First_Proc()) then print '(3a,1pe9.3)', ' # NOTE! Could not find the keyword: ', & trim(keyword), '. Using the default: ', def(1) end if diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Array_On.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Array_On.f90 index 8ae83da99..4b6bbff71 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Array_On.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Array_On.f90 @@ -43,7 +43,7 @@ subroutine Control_Mod_Read_Real_Array_On(keyword, values, n, verbose) ! Keyword was not found; issue a warning ! !--------------------------------------------! 1 if(present(verbose)) then - if(verbose .and. this_proc < 2) then + if(verbose .and. First_Proc()) then print '(2a)', ' # NOTE! Could not find the keyword: ', & trim(keyword) end if diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item.f90 index 02cba9a4f..fcb9c10f4 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item.f90 @@ -42,7 +42,7 @@ subroutine Control_Mod_Read_Real_Item(keyword, def, val, verbose) ! Keyword was not found; issue a warning ! !--------------------------------------------! 1 if(present(verbose)) then - if(verbose .and. this_proc < 2) then + if(verbose .and. First_Proc()) then print '(3a,1pe9.3)', ' # NOTE! Could not find the keyword: ', & trim(keyword), '. Using the default: ', def end if diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item_On.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item_On.f90 index e129d92ce..4c72b2cd8 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item_On.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item_On.f90 @@ -38,7 +38,7 @@ subroutine Control_Mod_Read_Real_Item_On(keyword, def, val, verbose) ! Keyword was not found; issue a warning ! !--------------------------------------------! 1 if(present(verbose)) then - if(verbose .and. this_proc < 2) then + if(verbose .and. First_Proc()) then print '(3a,1pe9.3)', ' # NOTE! Could not find the keyword: ', & trim(keyword), '. Using the default: ', def end if diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Strings_On.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Strings_On.f90 index 6c913c343..256681596 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Strings_On.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Strings_On.f90 @@ -42,7 +42,7 @@ subroutine Control_Mod_Read_Strings_On(keyword, values, n, verbose) ! Keyword was not found; issue a warning ! !--------------------------------------------! 1 if(present(verbose)) then - if(verbose .and. this_proc < 2) then + if(verbose .and. First_Proc()) then print '(a,a,a)', ' # NOTE! Could not find the keyword: ', keyword, '.' end if end if diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Similar_Warning.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Similar_Warning.f90 index dafe5b88e..b46042d13 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Similar_Warning.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Similar_Warning.f90 @@ -36,7 +36,7 @@ subroutine Control_Mod_Similar_Warning(keyword, item, key_type) if( Math % Approx_String(keyword, item, 1) ) then ! Print a warning message - if(this_proc < 2) then + if(First_Proc()) then print *, '#============================================='// & '=============================================' if(.not. present(key_type)) then diff --git a/Sources/Shared/Control_Mod/Input_Output/Save_Initial_Condition.f90 b/Sources/Shared/Control_Mod/Input_Output/Save_Initial_Condition.f90 index d1e0f2f43..2215b63f2 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Save_Initial_Condition.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Save_Initial_Condition.f90 @@ -20,12 +20,10 @@ subroutine Control_Mod_Save_Initial_Condition(save_init_cond, verbose) save_init_cond = .false. else - if(this_proc < 2) then - print *, '# ERROR! Unknown state for save_init_cond: ', trim(val) - print *, '# Exiting!' - end if - call Comm_Mod_End - + call Message % Error(72, & + 'Unknown state for save initial condition: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine diff --git a/Sources/Shared/Control_Mod/Input_Output/Save_Results_At_Boundaries.f90 b/Sources/Shared/Control_Mod/Input_Output/Save_Results_At_Boundaries.f90 index b7f735223..789b6133d 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Save_Results_At_Boundaries.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Save_Results_At_Boundaries.f90 @@ -20,12 +20,10 @@ subroutine Control_Mod_Save_Results_At_Boundaries(save_results_bnd, verbose) save_results_bnd = .false. else - if(this_proc < 2) then - print *, '# ERROR! Unknown state for save_results_bnd: ', trim(val) - print *, '# Exiting!' - end if - call Comm_Mod_End - + call Message % Error(72, & + 'Unknown state for save results at boundaries: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Preconditioner_For_System_Matrix.f90 b/Sources/Shared/Control_Mod/Native/Preconditioner_For_System_Matrix.f90 index 9cd8061c2..2b96f4a0c 100644 --- a/Sources/Shared/Control_Mod/Native/Preconditioner_For_System_Matrix.f90 +++ b/Sources/Shared/Control_Mod/Native/Preconditioner_For_System_Matrix.f90 @@ -25,17 +25,15 @@ subroutine Control_Mod_Preconditioner_For_System_Matrix(val, verbose) call String % To_Lower_Case(val) ! Check validity of the input - if( val.ne.'none' .and. & - val.ne.'diagonal' .and. & - val.ne.'jacobi' .and. & - val.ne.'incomplete_cholesky' .and. & - val.ne.'icc') then - if(this_proc < 2) then - print *, '# ERROR! Unknown preconditioner for the system matrix: ', & - trim(val) - print *, '# Exiting!' - end if - call Comm_Mod_End + if( val .ne. 'none' .and. & + val .ne. 'diagonal' .and. & + val .ne. 'jacobi' .and. & + val .ne. 'incomplete_cholesky' .and. & + val .ne. 'icc') then + call Message % Error(72, & + 'Unknown preconditioner for the system matrix: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) ! Use the same names as PETSc else diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Energy.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Energy.f90 index ff4b8e153..5d729f30d 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Energy.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Energy.f90 @@ -11,12 +11,11 @@ subroutine Control_Mod_Solver_For_Energy(val, verbose) val, verbose) call String % To_Lower_Case(val) - if( val.ne.'bicg' .and. val.ne.'cgs' .and. val.ne.'cg') then - if(this_proc < 2) then - print *, '# ERROR! Unknown linear solver for energy: ', trim(val) - print *, '# Exiting!' - end if - call Comm_Mod_End + if( val .ne. 'bicg' .and. val .ne. 'cg') then + call Message % Error(60, & + 'Unknown linear solver for energy: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Momentum.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Momentum.f90 index bbfd3a57f..cd52e7a64 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Momentum.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Momentum.f90 @@ -11,12 +11,11 @@ subroutine Control_Mod_Solver_For_Momentum(val, verbose) val, verbose) call String % To_Lower_Case(val) - if( val.ne.'bicg' .and. val.ne.'cgs' .and. val.ne.'cg') then - if(this_proc < 2) then - print *, '# ERROR! Unknown linear solver for momentum: ', trim(val) - print *, '# Exiting!' - end if - call Comm_Mod_End + if( val .ne. 'bicg' .and. val .ne. 'cg') then + call Message % Error(60, & + 'Unknown linear solver for momentum: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Potential.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Potential.f90 index 405e7e047..e49db48d7 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Potential.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Potential.f90 @@ -11,12 +11,11 @@ subroutine Control_Mod_Solver_For_Potential(val, verbose) val, verbose) call String % To_Lower_Case(val) - if( val.ne.'bicg' .and. val.ne.'cgs' .and. val.ne.'cg') then - if(this_proc < 2) then - print *, '# ERROR! Unknown linear solver for pressure: ', trim(val) - print *, '# Exiting!' - end if - call Comm_Mod_End + if( val .ne. 'bicg' .and. val .ne. 'cg') then + call Message % Error(60, & + 'Unknown linear solver for potential: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Pressure.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Pressure.f90 index c68fd371a..caa325a00 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Pressure.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Pressure.f90 @@ -11,12 +11,11 @@ subroutine Control_Mod_Solver_For_Pressure(val, verbose) val, verbose) call String % To_Lower_Case(val) - if( val.ne.'bicg' .and. val.ne.'cgs' .and. val.ne.'cg') then - if(this_proc < 2) then - print *, '# ERROR! Unknown linear solver for pressure: ', trim(val) - print *, '# Exiting!' - end if - call Comm_Mod_End + if( val .ne. 'bicg' .and. val .ne. 'cg') then + call Message % Error(60, & + 'Unknown linear solver for pressure: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Scalars.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Scalars.f90 index 5415e3242..c57c4386c 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Scalars.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Scalars.f90 @@ -11,12 +11,11 @@ subroutine Control_Mod_Solver_For_Scalars(val, verbose) val, verbose) call String % To_Lower_Case(val) - if( val.ne.'bicg' .and. val.ne.'cgs' .and. val.ne.'cg') then - if(this_proc < 2) then - print *, '# ERROR! Unknown linear solver for user scalars: ', trim(val) - print *, '# Exiting!' - end if - call Comm_Mod_End + if( val .ne. 'bicg' .and. val .ne. 'cg') then + call Message % Error(60, & + 'Unknown linear solver for scalars: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Turbulence.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Turbulence.f90 index 234404fc0..76721bc07 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Turbulence.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Turbulence.f90 @@ -11,12 +11,11 @@ subroutine Control_Mod_Solver_For_Turbulence(val, verbose) val, verbose) call String % To_Lower_Case(val) - if( val.ne.'bicg' .and. val.ne.'cgs' .and. val.ne.'cg') then - if(this_proc < 2) then - print *, '# ERROR! Unknown linear solver for turbulence: ', trim(val) - print *, '# Exiting!' - end if - call Comm_Mod_End + if( val .ne. 'bicg' .and. val .ne. 'cg') then + call Message % Error(72, & + 'Unknown linear solver for wall turbulence: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Vof.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Vof.f90 index bfcc475cf..a2b6368a4 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Vof.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Vof.f90 @@ -11,12 +11,11 @@ subroutine Control_Mod_Solver_For_Vof(val, verbose) val, verbose) call String % To_Lower_Case(val) - if( val.ne.'bicg' .and. val.ne.'cgs' .and. val.ne.'cg') then - if(this_proc < 2) then - print *, '# ERROR! Unknown linear solver for multiphase: ', trim(val) - print *, '# Exiting!' - end if - call Comm_Mod_End + if( val .ne. 'bicg' .and. val .ne. 'cg') then + call Message % Error(72, & + 'Unknown linear solver for wall multiphase: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Wall_Distance.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Wall_Distance.f90 index 02adb5527..91bdc4f01 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Wall_Distance.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Wall_Distance.f90 @@ -11,12 +11,11 @@ subroutine Control_Mod_Solver_For_Wall_Distance(val, verbose) val, verbose) call String % To_Lower_Case(val) - if( val.ne.'bicg' .and. val.ne.'cgs' .and. val.ne.'cg') then - if(this_proc < 2) then - print *, '# ERROR! Unknown linear solver for pressure: ', trim(val) - print *, '# Exiting!' - end if - call Comm_Mod_End + if( val .ne. 'bicg' .and. val .ne. 'cg') then + call Message % Error(60, & + 'Unknown linear solver for wall distance: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Choi_Correction.f90 b/Sources/Shared/Control_Mod/Numerics/Choi_Correction.f90 index 1bd5e8e71..3a8e74600 100644 --- a/Sources/Shared/Control_Mod/Numerics/Choi_Correction.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Choi_Correction.f90 @@ -19,14 +19,10 @@ subroutine Control_Mod_Choi_Correction(choi_correction, verbose) choi_correction = .false. else - if(this_proc < 2) then - print *, '# ERROR! Unknown state for Choi''s correction: ', & - trim(val) - print *, '# Exiting!' - end if - call Comm_Mod_End - stop - + call Message % Error(60, & + 'Unknown state for Choi correction: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Gu_Correction.f90 b/Sources/Shared/Control_Mod/Numerics/Gu_Correction.f90 index 749df0279..f397d7a68 100644 --- a/Sources/Shared/Control_Mod/Numerics/Gu_Correction.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Gu_Correction.f90 @@ -19,14 +19,10 @@ subroutine Control_Mod_Gu_Correction(gu_correction, verbose) gu_correction = .false. else - if(this_proc < 2) then - print *, '# ERROR! Unknown state for Gu''s correction: ', & - trim(val) - print *, '# Exiting!' - end if - call Comm_Mod_End - stop - + call Message % Error(60, & + 'Unknown state for Gu correction: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Report_Volume_Balance.f90 b/Sources/Shared/Control_Mod/Numerics/Report_Volume_Balance.f90 index 8407299fe..45942af95 100644 --- a/Sources/Shared/Control_Mod/Numerics/Report_Volume_Balance.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Report_Volume_Balance.f90 @@ -20,13 +20,10 @@ subroutine Control_Mod_Report_Volume_Balance(vol_bal, verbose) vol_bal = .false. else - if(this_proc < 2) then - print *, '# ERROR! Unknown state for reporting volume balance: ', & - trim(val) - print *, '# Exiting!' - end if - call Comm_Mod_End - + call Message % Error(72, & + 'Unknown state for reporting volume balance: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Skewness_Correction_Vof.f90 b/Sources/Shared/Control_Mod/Numerics/Skewness_Correction_Vof.f90 index 8aba4dace..56080d543 100644 --- a/Sources/Shared/Control_Mod/Numerics/Skewness_Correction_Vof.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Skewness_Correction_Vof.f90 @@ -20,13 +20,10 @@ subroutine Control_Mod_Skewness_Correction_Vof(skew_corr, verbose) skew_corr = .false. else - if(this_proc < 2) then - print *, '# ERROR! Unknown state for temporal skewness correction: ', & - trim(val) - print *, '# Exiting!' - end if - call Comm_Mod_End - + call Message % Error(72, & + 'Unknown state for skewness correction: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Extrapolate_Temperature_Exp.f90 b/Sources/Shared/Control_Mod/Physics/Extrapolate_Temperature_Exp.f90 index 53ef806f3..aa684b446 100644 --- a/Sources/Shared/Control_Mod/Physics/Extrapolate_Temperature_Exp.f90 +++ b/Sources/Shared/Control_Mod/Physics/Extrapolate_Temperature_Exp.f90 @@ -23,13 +23,10 @@ subroutine Control_Mod_Extrapolate_Temperature_Exp(temp_exp, & temp_exp = .false. else - if(this_proc < 2) then - print *, '# ERROR! Unknown state for temperature extrapolation: ', & - trim(val) - print *, '# Exiting!' - end if - call Comm_Mod_End - + call Message % Error(72, & + 'Unknown state for temperature extrapolation: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Heat_Transfer.f90 b/Sources/Shared/Control_Mod/Physics/Heat_Transfer.f90 index 126c8cb62..109afe0a5 100644 --- a/Sources/Shared/Control_Mod/Physics/Heat_Transfer.f90 +++ b/Sources/Shared/Control_Mod/Physics/Heat_Transfer.f90 @@ -19,12 +19,10 @@ subroutine Control_Mod_Heat_Transfer(heat_transfer, verbose) heat_transfer = .false. else - if(this_proc < 2) then - print *, '# ERROR! Unknown state for heat transfer: ', trim(val) - print *, '# Exiting!' - end if - call Comm_Mod_End - + call Message % Error(60, & + 'Unknown state for heat transfer: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Interface_Tracking.f90 b/Sources/Shared/Control_Mod/Physics/Interface_Tracking.f90 index f13c3396f..829396d4b 100644 --- a/Sources/Shared/Control_Mod/Physics/Interface_Tracking.f90 +++ b/Sources/Shared/Control_Mod/Physics/Interface_Tracking.f90 @@ -21,13 +21,10 @@ subroutine Control_Mod_Interface_Tracking(track_int, verbose) track_int = .false. else - if(this_proc < 2) then - print *, '# ERROR! Unknown state for track front: ', & - trim(val) - print *, '# Exiting!' - end if - call Comm_Mod_End - + call Message % Error(72, & + 'Unknown state for interface tracking: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Mass_Transfer.f90 b/Sources/Shared/Control_Mod/Physics/Mass_Transfer.f90 index ccabffc5b..ee6090982 100644 --- a/Sources/Shared/Control_Mod/Physics/Mass_Transfer.f90 +++ b/Sources/Shared/Control_Mod/Physics/Mass_Transfer.f90 @@ -19,12 +19,10 @@ subroutine Control_Mod_Mass_Transfer(phase_change, verbose) phase_change = .false. else - if(this_proc < 2) then - print *, '# ERROR! Unknown state for phase_change: ', trim(val) - print *, '# Exiting!' - end if - call Comm_Mod_End - + call Message % Error(60, & + 'Unknown state for phase change: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Particle_Tracking.f90 b/Sources/Shared/Control_Mod/Physics/Particle_Tracking.f90 index 3275b87f5..2b6bfc436 100644 --- a/Sources/Shared/Control_Mod/Physics/Particle_Tracking.f90 +++ b/Sources/Shared/Control_Mod/Physics/Particle_Tracking.f90 @@ -21,13 +21,10 @@ subroutine Control_Mod_Particle_Tracking(track_part, verbose) track_part = .false. else - if(this_proc < 2) then - print *, '# ERROR! Unknown state for track front: ', & - trim(val) - print *, '# Exiting!' - end if - call Comm_Mod_End - + call Message % Error(72, & + 'Unknown state for particle tracking: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Potential_Initialization.f90 b/Sources/Shared/Control_Mod/Physics/Potential_Initialization.f90 index d3f8d087d..656175e75 100644 --- a/Sources/Shared/Control_Mod/Physics/Potential_Initialization.f90 +++ b/Sources/Shared/Control_Mod/Physics/Potential_Initialization.f90 @@ -24,12 +24,10 @@ subroutine Control_Mod_Potential_Initialization(pot_init, verbose) pot_init = .false. case default - if(this_proc < 2) then - print *, '# Unknown state for potential initalization:', trim(val) - print *, '# Exiting!' - end if - call Comm_Mod_End - + call Message % Error(72, & + 'Unknown state for potential initialization: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end select end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Rough_Walls.f90 b/Sources/Shared/Control_Mod/Physics/Rough_Walls.f90 index b2f6b15ab..177487fa0 100644 --- a/Sources/Shared/Control_Mod/Physics/Rough_Walls.f90 +++ b/Sources/Shared/Control_Mod/Physics/Rough_Walls.f90 @@ -24,12 +24,10 @@ subroutine Control_Mod_Rough_Walls(rough_walls, verbose) rough_walls = .false. case default - if(this_proc < 2) then - print *, '# Unknown wall roughness state :', trim(val) - print *, '# Exiting!' - end if - call Comm_Mod_End - + call Message % Error(60, & + 'Unknown wall roughness state: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end select end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Track_Front.f90 b/Sources/Shared/Control_Mod/Physics/Track_Front.f90 index f8ce4c56f..9f084dca5 100644 --- a/Sources/Shared/Control_Mod/Physics/Track_Front.f90 +++ b/Sources/Shared/Control_Mod/Physics/Track_Front.f90 @@ -19,13 +19,10 @@ subroutine Control_Mod_Track_Front(track_front, verbose) track_front = .false. else - if(this_proc < 2) then - print *, '# ERROR! Unknown state for track front: ', & - trim(val) - print *, '# Exiting!' - end if - call Comm_Mod_End - + call Message % Error(60, & + 'Unknown state for track front: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Track_Surface.f90 b/Sources/Shared/Control_Mod/Physics/Track_Surface.f90 index 4096815da..6abd17bc8 100644 --- a/Sources/Shared/Control_Mod/Physics/Track_Surface.f90 +++ b/Sources/Shared/Control_Mod/Physics/Track_Surface.f90 @@ -19,13 +19,10 @@ subroutine Control_Mod_Track_Surface(track_surf, verbose) track_surf = .false. else - if(this_proc < 2) then - print *, '# ERROR! Unknown state for track front: ', & - trim(val) - print *, '# Exiting!' - end if - call Comm_Mod_End - + call Message % Error(60, & + 'Unknown state for track surface: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if end subroutine diff --git a/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 b/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 index a3375d12e..8ca55645e 100644 --- a/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 +++ b/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 @@ -23,7 +23,7 @@ subroutine Calculate_Face_Geometry(Grid) real :: dist(3), surf(3) !==============================================================================! - if(this_proc < 2) print '(a)', ' # Checking the integrity of cell faces ...' + if(First_Proc()) print '(a)', ' # Checking the integrity of cell faces ...' !-----------------------------------! ! Perform some integrity checks ! @@ -153,7 +153,7 @@ subroutine Calculate_Face_Geometry(Grid) "this and will terminate now.", & file=__FILE__, line=__LINE__) - if(this_proc < 2) print '(a)', ' # All integrity tests passed' + if(First_Proc()) print '(a)', ' # All integrity tests passed' !---------------------------------------! ! ! @@ -171,7 +171,7 @@ subroutine Calculate_Face_Geometry(Grid) end do call Comm_Mod_Global_Min_Real(min_d) call Comm_Mod_Global_Max_Real(max_d) - if(this_proc < 2 .and. Grid % n_shadows > 0) then + if(First_Proc() .and. Grid % n_shadows > 0) then print '(a,f9.3)', ' # Minimum distance stored in shadow faces: ', min_d print '(a,f9.3)', ' # Maximum distance stored in shadow faces: ', max_d end if @@ -232,7 +232,7 @@ subroutine Calculate_Face_Geometry(Grid) end do call Comm_Mod_Global_Min_Real(min_d) call Comm_Mod_Global_Max_Real(max_d) - if(this_proc < 2 .and. Grid % n_shadows > 0) then + if(First_Proc() .and. Grid % n_shadows > 0) then print '(a,f9.3)', ' # Minimum corrected distance at shadows: ', min_d print '(a,f9.3)', ' # Maximum corrected distance at shadows: ', max_d end if @@ -251,7 +251,7 @@ subroutine Calculate_Face_Geometry(Grid) if(Grid % faces_s(s) .ne. 0) pnt_from = pnt_from + 1 end do if(pnt_to .ne. pnt_from) then - print *, '# Pointers to and from shadows wrong in processor: ', this_proc + print *, '# Pointers to and from shadows wrong in processor: ', This_Proc() stop end if diff --git a/Sources/Shared/Grid_Mod/Determine_Regions_Ranges.f90 b/Sources/Shared/Grid_Mod/Determine_Regions_Ranges.f90 index c86cac43e..fb6627610 100644 --- a/Sources/Shared/Grid_Mod/Determine_Regions_Ranges.f90 +++ b/Sources/Shared/Grid_Mod/Determine_Regions_Ranges.f90 @@ -32,7 +32,7 @@ subroutine Determine_Regions_Ranges(Grid) ! Forward do c = -Grid % n_bnd_cells, -1 - if(Grid % Comm % cell_proc(c) .eq. this_proc) then + if(Grid % Comm % cell_proc(c) .eq. This_Proc()) then reg = Grid % region % at_cell(c) if(c < Grid % region % f_cell(reg)) then Grid % region % f_cell(reg) = c @@ -42,7 +42,7 @@ subroutine Determine_Regions_Ranges(Grid) ! Backward do c = -1, -Grid % n_bnd_cells, -1 - if(Grid % Comm % cell_proc(c) .eq. this_proc) then + if(Grid % Comm % cell_proc(c) .eq. This_Proc()) then reg = Grid % region % at_cell(c) if(c > Grid % region % l_cell(reg)) then Grid % region % l_cell(reg) = c @@ -57,7 +57,7 @@ subroutine Determine_Regions_Ranges(Grid) Grid % region % f_cell(reg) = Grid % n_cells Grid % region % l_cell(reg) = 1 do c = 1, Grid % n_cells - if(Grid % Comm % cell_proc(c) .eq. this_proc) then + if(Grid % Comm % cell_proc(c) .eq. This_Proc()) then if(c < Grid % region % f_cell(reg)) then Grid % region % f_cell(reg) = c end if @@ -77,7 +77,7 @@ subroutine Determine_Regions_Ranges(Grid) Grid % region % f_cell(reg) = Grid % n_cells + 1 Grid % region % l_cell(reg) = Grid % n_cells do c = 1, Grid % n_cells - if(Grid % Comm % cell_proc(c) .ne. this_proc) then + if(Grid % Comm % cell_proc(c) .ne. This_Proc()) then if(c < Grid % region % f_cell(reg)) then Grid % region % f_cell(reg) = c end if @@ -88,10 +88,10 @@ subroutine Determine_Regions_Ranges(Grid) end do if(DEBUG) then - write(1000+this_proc, '(a,a)') ' # Cell ranges from ', PROGRAM_NAME + write(1000+This_Proc(), '(a,a)') ' # Cell ranges from ', PROGRAM_NAME do reg = All_Regions() siz = Grid % region % l_cell(reg) - Grid % region % f_cell(reg) + 1 - write(1000+this_proc,'(a,i3,i15,i15,i15,a,a)') ' # Region: ', reg, & + write(1000+This_Proc(),'(a,i3,i15,i15,i15,a,a)') ' # Region: ', reg, & Grid % region % f_cell(reg), & Grid % region % l_cell(reg), & max(siz, 0), ' ', & @@ -138,15 +138,15 @@ subroutine Determine_Regions_Ranges(Grid) c1 = Grid % faces_c(1, s) c2 = Grid % faces_c(2, s) if(c2 > 0) then ! limit to inside faces - if(Grid % Comm % cell_proc(c1) .eq. this_proc .or. & - Grid % Comm % cell_proc(c2) .eq. this_proc) then + if(Grid % Comm % cell_proc(c1) .eq. This_Proc() .or. & + Grid % Comm % cell_proc(c2) .eq. This_Proc()) then if(s <= Grid % region % f_face(reg)) then Grid % region % f_face(reg) = s end if if(s >= Grid % region % l_face(reg)) then Grid % region % l_face(reg) = s end if - Assert(Grid % Comm % cell_proc(c1) .eq. this_proc) ! this should hold + Assert(Grid % Comm % cell_proc(c1) .eq. This_Proc()) ! this should hold end if end if ! c2 > 0 end do @@ -168,26 +168,26 @@ subroutine Determine_Regions_Ranges(Grid) do s = Faces_In_Domain() c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) - if(Grid % Comm % cell_proc(c1) .eq. this_proc .and. & - Grid % Comm % cell_proc(c2) .eq. this_proc) then + if(Grid % Comm % cell_proc(c1) .eq. This_Proc() .and. & + Grid % Comm % cell_proc(c2) .eq. This_Proc()) then last_face_only_inside = max(last_face_only_inside, s) end if - if(Grid % Comm % cell_proc(c1) .eq. this_proc .and. & - Grid % Comm % cell_proc(c2) .ne. this_proc) then + if(Grid % Comm % cell_proc(c1) .eq. This_Proc() .and. & + Grid % Comm % cell_proc(c2) .ne. This_Proc()) then first_face_in_buffers = min(first_face_in_buffers, s) end if end do Assert(last_face_only_inside < first_face_in_buffers) if(DEBUG) then - write(2000+this_proc, '(a,a)') ' # Face ranges from ', PROGRAM_NAME + write(2000+This_Proc(), '(a,a)') ' # Face ranges from ', PROGRAM_NAME do reg = All_Regions() siz = Grid % region % l_face(reg) - Grid % region % f_face(reg) + 1 - write(2000+this_proc,'(a,i3,i15,i15,i15,a,a)') ' # Region: ', reg, & - Grid % region % f_face(reg), & - Grid % region % l_face(reg), & - max(siz, 0), ' ', & - trim(Grid % region % name(reg)) + write(2000+This_Proc(),'(a,i3,i15,i15,i15,a,a)') ' # Region: ', reg, & + Grid % region % f_face(reg), & + Grid % region % l_face(reg), & + max(siz, 0), ' ', & + trim(Grid % region % name(reg)) end do end if diff --git a/Sources/Shared/Grid_Mod/Exchange_Cells_Int.f90 b/Sources/Shared/Grid_Mod/Exchange_Cells_Int.f90 index 8975b0493..a908700f6 100644 --- a/Sources/Shared/Grid_Mod/Exchange_Cells_Int.f90 +++ b/Sources/Shared/Grid_Mod/Exchange_Cells_Int.f90 @@ -12,7 +12,7 @@ subroutine Exchange_Cells_Int(Grid, phi) !==============================================================================! ! Fill the buffers with new values - do sub = 1, n_proc + do sub = 1, N_Procs() len_s = Grid % Comm % cells_send(sub) % n_items do ln = 1, len_s c1 = Grid % Comm % cells_send(sub) % map(ln) @@ -21,7 +21,7 @@ subroutine Exchange_Cells_Int(Grid, phi) end do ! Exchange the values - do sub = 1, n_proc + do sub = 1, N_Procs() len_s = Grid % Comm % cells_send(sub) % n_items len_r = Grid % Comm % cells_recv(sub) % n_items if(len_s + len_r > 0) then @@ -35,7 +35,7 @@ subroutine Exchange_Cells_Int(Grid, phi) end do ! Fill the buffers with new values - do sub = 1, n_proc + do sub = 1, N_Procs() len_r = Grid % Comm % cells_recv(sub) % n_items do ln = 1, len_r c2 = Grid % Comm % cells_recv(sub) % map(ln) diff --git a/Sources/Shared/Grid_Mod/Exchange_Cells_Log.f90 b/Sources/Shared/Grid_Mod/Exchange_Cells_Log.f90 index 417d01db0..4753d5c3e 100644 --- a/Sources/Shared/Grid_Mod/Exchange_Cells_Log.f90 +++ b/Sources/Shared/Grid_Mod/Exchange_Cells_Log.f90 @@ -12,7 +12,7 @@ subroutine Exchange_Cells_Log(Grid, phi) !==============================================================================! ! Fill the buffers with new values - do sub = 1, n_proc + do sub = 1, N_Procs() len_s = Grid % Comm % cells_send(sub) % n_items do ln = 1, len_s c1 = Grid % Comm % cells_send(sub) % map(ln) @@ -21,7 +21,7 @@ subroutine Exchange_Cells_Log(Grid, phi) end do ! Exchange the values - do sub = 1, n_proc + do sub = 1, N_Procs() len_s = Grid % Comm % cells_send(sub) % n_items len_r = Grid % Comm % cells_recv(sub) % n_items if(len_s + len_r > 0) then @@ -35,7 +35,7 @@ subroutine Exchange_Cells_Log(Grid, phi) end do ! Fill the buffers with new values - do sub = 1, n_proc + do sub = 1, N_Procs() len_r = Grid % Comm % cells_recv(sub) % n_items do ln = 1, len_r c2 = Grid % Comm % cells_recv(sub) % map(ln) diff --git a/Sources/Shared/Grid_Mod/Exchange_Cells_Real.f90 b/Sources/Shared/Grid_Mod/Exchange_Cells_Real.f90 index 4b23dbfa4..ec2aaac07 100644 --- a/Sources/Shared/Grid_Mod/Exchange_Cells_Real.f90 +++ b/Sources/Shared/Grid_Mod/Exchange_Cells_Real.f90 @@ -29,12 +29,12 @@ subroutine Exchange_Cells_Real(Grid, phi, caller) !-------------------------------------------------------------------! if(present(caller)) then - if(this_proc < 2) then + if(First_Proc()) then call File % Append_For_Writing_Ascii( & - 'exchange_cells_real.log', fu, this_proc) + 'exchange_cells_real.log', fu, This_Proc()) end if - do sub = 1, n_proc + do sub = 1, N_Procs() len_r = Grid % Comm % cells_recv(sub) % n_items do ln = 1, len_r c2 = Grid % Comm % cells_recv(sub) % map(ln) @@ -48,7 +48,7 @@ subroutine Exchange_Cells_Real(Grid, phi, caller) !----------------------------------! ! Fill the buffers with new values - do sub = 1, n_proc + do sub = 1, N_Procs() len_s = Grid % Comm % cells_send(sub) % n_items do ln = 1, len_s c1 = Grid % Comm % cells_send(sub) % map(ln) @@ -57,7 +57,7 @@ subroutine Exchange_Cells_Real(Grid, phi, caller) end do ! Exchange the values - do sub = 1, n_proc + do sub = 1, N_Procs() len_s = Grid % Comm % cells_send(sub) % n_items len_r = Grid % Comm % cells_recv(sub) % n_items if(len_s + len_r > 0) then @@ -71,7 +71,7 @@ subroutine Exchange_Cells_Real(Grid, phi, caller) end do ! Fill the buffers with new values - do sub = 1, n_proc + do sub = 1, N_Procs() len_r = Grid % Comm % cells_recv(sub) % n_items do ln = 1, len_r c2 = Grid % Comm % cells_recv(sub) % map(ln) @@ -86,7 +86,7 @@ subroutine Exchange_Cells_Real(Grid, phi, caller) if(present(caller)) then needed = NO - do sub = 1, n_proc + do sub = 1, N_Procs() len_r = Grid % Comm % cells_recv(sub) % n_items do ln = 1, len_r if( Grid % Comm % cells_recv(sub) % r_buff(ln) .ne. & @@ -99,7 +99,7 @@ subroutine Exchange_Cells_Real(Grid, phi, caller) ! What if it is needed on some other processor call Comm_Mod_Global_Max_Int(needed) - if(this_proc < 2) then + if(First_Proc()) then if(needed .eq. YES) then write(fu,'(a)') '# Call from: ' // caller // ' was needed!' else diff --git a/Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 b/Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 index f2bbed398..af43b988d 100644 --- a/Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 +++ b/Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 @@ -16,7 +16,7 @@ subroutine Form_Cells_Comm(Grid) ! in different threads for vectorization. Once that happened, an extra ! ! measure was taken, by sorting buffers with criteria in send_sort() and ! ! recv_sort(). (Though, the latter one might not be needed.) ! -! +! ! ! In other words: because we are browsing through cells in separate dom- ! ! ains independently, we must ensure they are in right order. This is en- ! ! sured by forming send_sort() and recv_sort() and applying them order ! @@ -36,11 +36,11 @@ subroutine Form_Cells_Comm(Grid) logical, parameter :: DEBUG = .false. !==============================================================================! - if(n_proc < 2) return + if(Sequential_Run()) return ! Allocate memory for locally used arrays - allocate(send_buff_cnt(n_proc, n_proc)) - allocate(recv_buff_cnt(n_proc, n_proc)) + allocate(send_buff_cnt(N_Procs(), N_Procs())) + allocate(recv_buff_cnt(N_Procs(), N_Procs())) allocate(send_cells(-Grid % n_bnd_cells:Grid % n_cells)) allocate(recv_cells(-Grid % n_bnd_cells:Grid % n_cells)) @@ -49,10 +49,10 @@ subroutine Form_Cells_Comm(Grid) !-------------------------------! Grid % Comm % n_buff_cells = 0 do c = Cells_In_Domain() - Assert(Grid % Comm % cell_proc(c) .eq. this_proc) + Assert(Grid % Comm % cell_proc(c) .eq. This_Proc()) end do do c = Cells_In_Buffers() - Assert(Grid % Comm % cell_proc(c) .ne. this_proc) + Assert(Grid % Comm % cell_proc(c) .ne. This_Proc()) Grid % Comm % n_buff_cells = Grid % Comm % n_buff_cells + 1 end do @@ -75,22 +75,24 @@ subroutine Form_Cells_Comm(Grid) recv_cells(:) = 0 do c = Cells_In_Buffers() sub = Grid % Comm % cell_proc(c) - recv_buff_cnt(this_proc, sub) = recv_buff_cnt(this_proc, sub) + 1 + recv_buff_cnt(This_Proc(), sub) = recv_buff_cnt(This_Proc(), sub) + 1 recv_cells(c) = sub end do if(DEBUG) then - do sub=1, n_proc - if(sub .ne. this_proc) then - write(100*this_proc+sub, *) '#====================================' // & + do sub=1, N_Procs() + if(sub .ne. This_Proc()) then + write(100*This_Proc()+sub, *) & + '#====================================' // & '=====================================' - write(100*this_proc+sub, '(a,i7,a,i7)') & + write(100*This_Proc()+sub, '(a,i7,a,i7)') & ' # There are ', Grid % Comm % n_buff_cells, & - ' buffer cells in processor ', this_proc - write(100*this_proc+sub, *) '#------------------------------------' // & + ' buffer cells in processor ', This_Proc() + write(100*This_Proc()+sub, *) & + '#------------------------------------' // & '-------------------------------------' - write(100*this_proc+sub, '(a,i7,a,i7)') & - ' # It needs ', recv_buff_cnt(this_proc, sub), & + write(100*This_Proc()+sub, '(a,i7,a,i7)') & + ' # It needs ', recv_buff_cnt(This_Proc(), sub), & ' cells from processors ', sub end if end do @@ -101,8 +103,8 @@ subroutine Form_Cells_Comm(Grid) !--------------------------------------------------! n_max_buff_cells = Grid % Comm % n_buff_cells call Comm_Mod_Global_Max_Int(n_max_buff_cells) - allocate(need_cell(n_max_buff_cells, n_proc)); need_cell(:,:) = 0 - allocate(from_proc(n_max_buff_cells, n_proc)); from_proc(:,:) = 0 + allocate(need_cell(n_max_buff_cells, N_Procs())); need_cell(:,:) = 0 + allocate(from_proc(n_max_buff_cells, N_Procs())); from_proc(:,:) = 0 !-------------------------------------------! ! Store global number of cells you need ! @@ -110,36 +112,36 @@ subroutine Form_Cells_Comm(Grid) !-------------------------------------------! i_cel = 0 do c = Cells_In_Buffers() - Assert(Grid % Comm % cell_proc(c) .ne. this_proc) + Assert(Grid % Comm % cell_proc(c) .ne. This_Proc()) i_cel = i_cel + 1 - need_cell(i_cel, this_proc) = Grid % Comm % cell_glo(c) - from_proc(i_cel, this_proc) = Grid % Comm % cell_proc(c) + need_cell(i_cel, This_Proc()) = Grid % Comm % cell_glo(c) + from_proc(i_cel, This_Proc()) = Grid % Comm % cell_proc(c) end do !----------------------------------------------! ! Inform all processors about needed cells ! ! and from which processor are they needed ! !----------------------------------------------! - need_cell = reshape(need_cell, (/n_max_buff_cells*n_proc, 1/)) - from_proc = reshape(from_proc, (/n_max_buff_cells*n_proc, 1/)) - call Comm_Mod_Global_Sum_Int_Array(n_max_buff_cells*n_proc, need_cell) - call Comm_Mod_Global_Sum_Int_Array(n_max_buff_cells*n_proc, from_proc) - need_cell = reshape(need_cell, (/n_max_buff_cells, n_proc/)) - from_proc = reshape(from_proc, (/n_max_buff_cells, n_proc/)) + need_cell = reshape(need_cell, (/n_max_buff_cells*N_Procs(), 1/)) + from_proc = reshape(from_proc, (/n_max_buff_cells*N_Procs(), 1/)) + call Comm_Mod_Global_Sum_Int_Array(n_max_buff_cells*N_Procs(), need_cell) + call Comm_Mod_Global_Sum_Int_Array(n_max_buff_cells*N_Procs(), from_proc) + need_cell = reshape(need_cell, (/n_max_buff_cells, N_Procs()/)) + from_proc = reshape(from_proc, (/n_max_buff_cells, N_Procs()/)) !---------------------------------------------------------------------! ! Form send_buff_cnt from the information in the matrix from_proc ! !---------------------------------------------------------------------! send_buff_cnt(:,:) = 0 - do sub = 1, n_proc - if(sub .ne. this_proc) then + do sub = 1, N_Procs() + if(sub .ne. This_Proc()) then do i_cel = 1, n_max_buff_cells - if(from_proc(i_cel, sub) .eq. this_proc) then - send_buff_cnt(this_proc, sub) = send_buff_cnt(this_proc, sub) + 1 + if(from_proc(i_cel, sub) .eq. This_Proc()) then + send_buff_cnt(This_Proc(), sub) = send_buff_cnt(This_Proc(), sub) + 1 end if end do - if(DEBUG) write(100*this_proc + sub, '(2(a,i7))') & - ' # It should send ', send_buff_cnt(this_proc, sub), & + if(DEBUG) write(100*This_Proc() + sub, '(2(a,i7))') & + ' # It should send ', send_buff_cnt(This_Proc(), sub), & ' cells to processor ', sub end if end do @@ -147,27 +149,27 @@ subroutine Form_Cells_Comm(Grid) !--------------------------------------------------! ! Allocate memory for send and receive buffers ! !--------------------------------------------------! - allocate(Grid % Comm % cells_send(n_proc)) - allocate(Grid % Comm % cells_recv(n_proc)) + allocate(Grid % Comm % cells_send(N_Procs())) + allocate(Grid % Comm % cells_recv(N_Procs())) !-----------------------------------! ! ! ! Form send and receive buffers ! ! ! !-----------------------------------! - do sub = 1, n_proc + do sub = 1, N_Procs() ! Initialize buffer size to zero Grid % Comm % cells_send(sub) % n_items = 0 Grid % Comm % cells_recv(sub) % n_items = 0 - if(sub .ne. this_proc) then + if(sub .ne. This_Proc()) then !---------------------------------! ! Allocate memory for buffers ! !---------------------------------! - ms = send_buff_cnt(this_proc, sub) - mr = recv_buff_cnt(this_proc, sub) + ms = send_buff_cnt(This_Proc(), sub) + mr = recv_buff_cnt(This_Proc(), sub) if(ms > 0) then allocate(Grid % Comm % cells_send(sub) % map(ms)); @@ -194,7 +196,7 @@ subroutine Form_Cells_Comm(Grid) cnt = 0 send_cells(:) = 0 do i_cel = 1, n_max_buff_cells - if(from_proc(i_cel, sub) .eq. this_proc) then + if(from_proc(i_cel, sub) .eq. This_Proc()) then do c = Cells_In_Domain() if(Grid % Comm % cell_glo(c) .eq. need_cell(i_cel, sub)) then send_cells(c) = sub ! identify @@ -204,7 +206,7 @@ subroutine Form_Cells_Comm(Grid) end if end do - if(DEBUG) write(100*this_proc + sub, '(2(a,i7))') & + if(DEBUG) write(100*This_Proc() + sub, '(2(a,i7))') & ' # It did find ', cnt, & ' cells to send to processor', sub @@ -245,8 +247,8 @@ subroutine Form_Cells_Comm(Grid) ! end if if(DEBUG) then - write(100*this_proc+sub, '(a,i0.0,a,i0.0,a,i0.0,a,i0.0)') & - ' # send/recv (', this_proc, '/', sub, ') = ', ms, ' / ', mr + write(100*This_Proc()+sub, '(a,i0.0,a,i0.0,a,i0.0,a,i0.0)') & + ' # send/recv (', This_Proc(), '/', sub, ') = ', ms, ' / ', mr end if ! Store final buffer lengths @@ -257,7 +259,7 @@ subroutine Form_Cells_Comm(Grid) if(ms > 0) deallocate(send_sort) if(mr > 0) deallocate(recv_sort) - end if ! sub .ne. this_proc + end if ! sub .ne. This_Proc() end do ! sub !-------------------------------------! diff --git a/Sources/Shared/Grid_Mod/Form_Maps_For_Backup.f90 b/Sources/Shared/Grid_Mod/Form_Maps_For_Backup.f90 index 9325d0c51..67988d8cc 100644 --- a/Sources/Shared/Grid_Mod/Form_Maps_For_Backup.f90 +++ b/Sources/Shared/Grid_Mod/Form_Maps_For_Backup.f90 @@ -29,7 +29,7 @@ subroutine Form_Maps_For_Backup(Grid) ! Initialize number of boundary cells in subdomain Grid % Comm % nb_sub = 0 do c = -Grid % n_bnd_cells, -1 - if(Grid % Comm % cell_proc(c) .eq. this_proc) then + if(Grid % Comm % cell_proc(c) .eq. This_Proc()) then Grid % Comm % nb_sub = Grid % Comm % nb_sub + 1 end if end do @@ -61,7 +61,7 @@ subroutine Form_Maps_For_Backup(Grid) ! For run with one processor ! ! ! !--------------------------------! - if(n_proc < 2) then + if(Sequential_Run()) then !-------------------------------------! ! Global cell numbers for T-Flows ! diff --git a/Sources/Shared/Grid_Mod/Merge_Duplicate_Nodes.f90 b/Sources/Shared/Grid_Mod/Merge_Duplicate_Nodes.f90 index 6f39c3142..d88e198f5 100644 --- a/Sources/Shared/Grid_Mod/Merge_Duplicate_Nodes.f90 +++ b/Sources/Shared/Grid_Mod/Merge_Duplicate_Nodes.f90 @@ -9,7 +9,7 @@ subroutine Merge_Duplicate_Nodes(Grid) real, allocatable :: xn(:), yn(:), zn(:) !==============================================================================! - if(this_proc < 2) then + if(First_Proc()) then print '(a)', ' #=======================================================' print '(a,a,a)', ' # Merging nodes in "', trim(Grid % name), '" if needed' print '(a)', ' #-------------------------------------------------------' @@ -51,13 +51,13 @@ subroutine Merge_Duplicate_Nodes(Grid) end if Grid % new_n(Grid % old_n(n)) = cnt end do - if(this_proc < 2) then + if(First_Proc()) then print '(a,i9)', ' # Number of unique nodes: ', cnt end if ! Decide what to do based on the compressed number of nodes if(cnt .eq. Grid % n_nodes) then - if(this_proc < 2) then + if(First_Proc()) then print '(a)', ' # No duplicate nodes found, nothing to merge!' end if return @@ -66,7 +66,7 @@ subroutine Merge_Duplicate_Nodes(Grid) ! Do the actuall sorting work ! !---------------------------------! else - if(this_proc < 2) then + if(First_Proc()) then print '(a,i0.0,a)', ' # ', Grid % n_nodes - cnt, ' duplicate nodes' // & ' found; compressing them now!' end if @@ -121,7 +121,7 @@ subroutine Merge_Duplicate_Nodes(Grid) end do end do - if(this_proc < 2) then + if(First_Proc()) then print '(a)', ' # Done!' end if diff --git a/Sources/Shared/Grid_Mod/Print_Grid_Statistics.f90 b/Sources/Shared/Grid_Mod/Print_Grid_Statistics.f90 index eedc9bcce..7508ce112 100644 --- a/Sources/Shared/Grid_Mod/Print_Grid_Statistics.f90 +++ b/Sources/Shared/Grid_Mod/Print_Grid_Statistics.f90 @@ -14,7 +14,7 @@ subroutine Print_Grid_Statistics(Grid) !------------! ! Header ! !------------! - if(this_proc < 2) then + if(First_Proc()) then print '(a)', ' #=========================================================' print '(a)', ' #' print '(3a)', ' # Grid ', trim(Grid % name), ' statistics' @@ -27,7 +27,7 @@ subroutine Print_Grid_Statistics(Grid) !------------------! call Grid % Bounding_Box(xmin, ymin, zmin, xmax, ymax, zmax) - if(this_proc < 2) then + if(First_Proc()) then print '(a)', ' # Bounding box:' print '(2(a,es10.3))', ' # X range: ', xmin, ' to: ', xmax print '(2(a,es10.3))', ' # Y range: ', ymin, ' to: ', ymax @@ -47,7 +47,7 @@ subroutine Print_Grid_Statistics(Grid) max_n_polg = 0 ! maximum number of nodes in polygon do s = 1, Grid % n_faces c1 = Grid % faces_c(1, s) - if(Grid % Comm % cell_proc(c1) .eq. this_proc) then + if(Grid % Comm % cell_proc(c1) .eq. This_Proc()) then n_faces = n_faces + 1 max_n_polg = max(max_n_polg, Grid % faces_n_nodes(s)) if(Grid % faces_s(s) .gt. s) then @@ -70,7 +70,7 @@ subroutine Print_Grid_Statistics(Grid) call Comm_Mod_Global_Sum_Int(n_polg) call Comm_Mod_Global_Max_Int(max_n_polg) - if(this_proc < 2) then + if(First_Proc()) then print '(a)', ' #- - - - - - - - - - - - - - - - - - - - - - - - - - - -' print '(a,i9)', ' # Number of faces: ', n_faces print '(a,i9)', ' # Number of shadows: ', n_shadows @@ -90,7 +90,7 @@ subroutine Print_Grid_Statistics(Grid) n_quad = 0 n_polg = 0 do c = -Grid % n_bnd_cells, -1 - if(Grid % Comm % cell_proc(c) .eq. this_proc) then + if(Grid % Comm % cell_proc(c) .eq. This_Proc()) then n_bnd_cells = n_bnd_cells + 1 if(Grid % cells_n_nodes(c) .eq. 3) then n_tri = n_tri + 1 @@ -110,7 +110,7 @@ subroutine Print_Grid_Statistics(Grid) n_polh = 0 max_n_polh = 0 ! maximum number of nodes in polyhedron do c = 1, Grid % n_cells - if(Grid % Comm % cell_proc(c) .eq. this_proc) then + if(Grid % Comm % cell_proc(c) .eq. This_Proc()) then n_cells = n_cells + 1 if(Grid % cells_n_nodes(c) .eq. 4) then n_tet = n_tet + 1 @@ -139,7 +139,7 @@ subroutine Print_Grid_Statistics(Grid) call Comm_Mod_Global_Sum_Int(n_polh) call Comm_Mod_Global_Max_Int(max_n_polh) - if(this_proc < 2) then + if(First_Proc()) then print '(a)', ' #- - - - - - - - - - - - - - - - - - - - - - - - - - - -' print '(a,i9)', ' # Number of bnd. cells: ', n_bnd_cells print '(a,i9)', ' # Number of inside cells:', n_cells @@ -160,7 +160,7 @@ subroutine Print_Grid_Statistics(Grid) end if end if - if(this_proc < 2) then + if(First_Proc()) then print *, '#---------------------------------------------------------' end if diff --git a/Sources/Shared/Grid_Mod/Save_Debug_Vtu.f90 b/Sources/Shared/Grid_Mod/Save_Debug_Vtu.f90 index d191b7820..ba1d65e56 100644 --- a/Sources/Shared/Grid_Mod/Save_Debug_Vtu.f90 +++ b/Sources/Shared/Grid_Mod/Save_Debug_Vtu.f90 @@ -161,8 +161,10 @@ subroutine Save_Debug_Vtu(Grid, append, & ! Create .vtu file ! ! ! !----------------------! - call File % Set_Name(name_out, appendix='-'//trim(append), & - processor=this_proc, extension='.vtu') + call File % Set_Name(name_out, & + appendix = '-'//trim(append), & + processor = This_Proc(), & + extension = '.vtu') call File % Open_For_Writing_Binary(name_out, fu) !------------! @@ -644,7 +646,7 @@ subroutine Save_Debug_Vtu(Grid, append, & if(.not. allocated(Grid % Comm % cell_proc)) return ! Create it only from subdomain 1, when decomposed - if(maxval(Grid % Comm % cell_proc(:)) > 1 .and. this_proc .eq. 1) then + if(maxval(Grid % Comm % cell_proc(:)) > 1 .and. This_Proc() .eq. 1) then call File% Set_Name(name_out, appendix='-'//trim(append), & extension='.pvtu') @@ -702,7 +704,7 @@ subroutine Save_Debug_Vtu(Grid, append, & write(fu,'(a,a)') IN_2, '' ! Write out the names of all the pieces - do n = 1, n_proc + do n = 1, N_Procs() call File % Set_Name(name_out, appendix='-'//trim(append), & processor=n, extension='.vtu') write(fu, '(a,a,a,a)') IN_2, '' diff --git a/Sources/Shared/Grid_Mod/Save_Vtu_Faces.f90 b/Sources/Shared/Grid_Mod/Save_Vtu_Faces.f90 index 3c6f27aa3..1a1f1c2d4 100644 --- a/Sources/Shared/Grid_Mod/Save_Vtu_Faces.f90 +++ b/Sources/Shared/Grid_Mod/Save_Vtu_Faces.f90 @@ -52,7 +52,9 @@ subroutine Save_Vtu_Faces(Grid, plot_shadows, real_phi_f, int_phi_f) !------------------------! ! Open the .vtu file ! !------------------------! - call File % Set_Name(name_out, processor=this_proc, extension=trim(ext)) + call File % Set_Name(name_out, & + processor = This_Proc(), & + extension = trim(ext)) call File % Open_For_Writing_Binary(name_out, fu) !------------! diff --git a/Sources/Shared/Message_Mod/Error.f90 b/Sources/Shared/Message_Mod/Error.f90 index 8762c4a0c..1941600b3 100644 --- a/Sources/Shared/Message_Mod/Error.f90 +++ b/Sources/Shared/Message_Mod/Error.f90 @@ -1,16 +1,16 @@ !==============================================================================! - subroutine Error(Msg, width, message_text, file, line, one_proc) + subroutine Error(Message, width, message_text, file, line, one_proc) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Message_Type) :: Msg + class(Message_Type) :: Message integer, intent(in) :: width character(*), intent(in) :: message_text character(*), optional, intent(in) :: file integer, optional, intent(in) :: line logical, optional, intent(in) :: one_proc ! print from one processor !-----------------------------------[Locals]-----------------------------------! - integer :: w + integer :: wd character(DL) :: header_text !==============================================================================! @@ -27,19 +27,19 @@ subroutine Error(Msg, width, message_text, file, line, one_proc) end if ! Adjust width, if necessary - w = max(width, len_trim(header_text)+3) + wd = max(width, len_trim(header_text)+3) !-----------------------------------! ! Print the body of the message ! !-----------------------------------! if(present(one_proc)) then if(one_proc) then - if(this_proc < 2) call Msg % Framed(w, header_text, message_text) + if(First_Proc()) call Message % Framed(wd, header_text, message_text) else - call Msg % Framed(w, header_text, message_text) + call Message % Framed(wd, header_text, message_text) end if else - call Msg % Framed(w, header_text, message_text) + call Message % Framed(wd, header_text, message_text) end if !----------------------------------------! diff --git a/Sources/Shared/Message_Mod/Framed.f90 b/Sources/Shared/Message_Mod/Framed.f90 index ae3181b33..1adff6550 100644 --- a/Sources/Shared/Message_Mod/Framed.f90 +++ b/Sources/Shared/Message_Mod/Framed.f90 @@ -1,32 +1,32 @@ !==============================================================================! - subroutine Framed(Msg, width, header_text, message_text, one_proc) + subroutine Framed(Message, width, header_text, message_text, one_proc) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Message_Type) :: Msg + class(Message_Type) :: Message integer, intent(in) :: width character(*), intent(in) :: header_text character(*), intent(in) :: message_text logical, optional, intent(in) :: one_proc !-----------------------------------[Locals]-----------------------------------! - integer :: w + integer :: wd character(DL) :: line !==============================================================================! ! Check if all processors have to print if(present(one_proc)) then if(one_proc) then - if(this_proc > 1) return + if(.not. First_Proc()) return end if end if ! Adjust width, if necessary - w = max(width, len_trim(header_text)+3) + wd = max(width, len_trim(header_text)+3) !------------------------------! ! Write the top line first ! !------------------------------! - call Msg % Thick_Line(w) + call Message % Thick_Line(wd) !----------------------! ! Write the header ! (you should check it is not too long) @@ -37,17 +37,17 @@ subroutine Framed(Msg, width, header_text, message_text, one_proc) write(line(4:len_trim(header_text)+5), '(a)') trim(header_text) print '(a)', trim(line) - call Msg % Dashed_Line(w) + call Message % Dashed_Line(wd) end if !-----------------------------------------------------------! ! Write the message text wrapping it into desired width ! !-----------------------------------------------------------! - call Msg % Frameless(w, message_text) + call Message % Frameless(wd, message_text) !--------------------------------! ! Write the bottom line last ! !--------------------------------! - call Msg % Thin_Line(w) + call Message % Thin_Line(wd) end subroutine diff --git a/Sources/Shared/Message_Mod/Warning.f90 b/Sources/Shared/Message_Mod/Warning.f90 index a5530f191..16550409d 100644 --- a/Sources/Shared/Message_Mod/Warning.f90 +++ b/Sources/Shared/Message_Mod/Warning.f90 @@ -1,16 +1,16 @@ !==============================================================================! - subroutine Warning(Msg, width, message_text, file, line, one_proc) + subroutine Warning(Message, width, message_text, file, line, one_proc) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Message_Type) :: Msg + class(Message_Type) :: Message integer, intent(in) :: width character(*) :: message_text character(*), optional :: file integer, intent(in), optional :: line logical, optional :: one_proc ! print from one processor only !-----------------------------------[Locals]-----------------------------------! - integer :: w + integer :: wd character(DL) :: header_text !==============================================================================! @@ -25,19 +25,19 @@ subroutine Warning(Msg, width, message_text, file, line, one_proc) end if ! Adjust width, if necessary - w = max(width, len_trim(header_text)+3) + wd = max(width, len_trim(header_text)+3) !-----------------------------------! ! Print the body of the message ! !-----------------------------------! if(present(one_proc)) then if(one_proc) then - if(this_proc < 2) call Msg % Framed(w, header_text, message_text) + if(First_Proc()) call Message % Framed(wd, header_text, message_text) else - call Msg % Framed(w, header_text, message_text) + call Message % Framed(wd, header_text, message_text) end if else - call Msg % Framed(w, header_text, message_text) + call Message % Framed(wd, header_text, message_text) end if diff --git a/Sources/Shared/Profiler_Mod/Statistics.f90 b/Sources/Shared/Profiler_Mod/Statistics.f90 index 1e9739f46..c1415ae23 100644 --- a/Sources/Shared/Profiler_Mod/Statistics.f90 +++ b/Sources/Shared/Profiler_Mod/Statistics.f90 @@ -24,10 +24,10 @@ subroutine Statistics(Profiler, indent) end if ! Compute average time spent in functions over all processors - if(n_proc > 1) then + if(Parallel_Run()) then do i_fun=1, Profiler % n_functions call Comm_Mod_Global_Sum_Real(Profiler % funct_time(i_fun)) - Profiler % funct_time(i_fun) = Profiler % funct_time(i_fun) / n_proc + Profiler % funct_time(i_fun) = Profiler % funct_time(i_fun) / N_Procs() end do end if @@ -54,7 +54,7 @@ subroutine Statistics(Profiler, indent) total_time = total_time + Profiler % funct_time(i_fun) end do - if(this_proc < 2) then + if(First_Proc()) then line( 1:160) = ' ' line( 1+indent:65+indent) = & diff --git a/Sources/Shared/Stl_Mod/Create_From_File.f90 b/Sources/Shared/Stl_Mod/Create_From_File.f90 index 0be505a00..dbc6e7781 100644 --- a/Sources/Shared/Stl_Mod/Create_From_File.f90 +++ b/Sources/Shared/Stl_Mod/Create_From_File.f90 @@ -84,7 +84,7 @@ subroutine Create_From_File(Stl, file_name) end do Stl % n_boddies = maxval(Stl % body_c) - if(this_proc < 2) then + if(First_Proc()) then print '(a,i3)', ' # Number of boddies in the STL file: ', Stl % n_boddies end if diff --git a/Sources/Shared/Stl_Mod/Read_Stl_Ascii.f90 b/Sources/Shared/Stl_Mod/Read_Stl_Ascii.f90 index dfb9a2e00..4d0ceebeb 100644 --- a/Sources/Shared/Stl_Mod/Read_Stl_Ascii.f90 +++ b/Sources/Shared/Stl_Mod/Read_Stl_Ascii.f90 @@ -22,7 +22,7 @@ subroutine Read_Stl_Ascii(Stl) if(Line % tokens(1) .eq. 'endsolid') exit if(Line % tokens(1) .eq. 'facet') f = f + 1 end do - if(this_proc < 2) print '(a,i9)', ' # Number of facets on the STL: ', f + if(First_Proc()) print '(a,i9)', ' # Number of facets on the STL: ', f call Stl % Allocate_Stl(f) !------------------------------------------------! @@ -51,7 +51,7 @@ subroutine Read_Stl_Ascii(Stl) call File % Read_Line(fu) ! 'endloop' end if end do - if(this_proc < 2) print '(a)', ' # Read all STL facets!' + if(First_Proc()) print '(a)', ' # Read all STL facets!' close(fu) diff --git a/Sources/Shared/Stl_Mod/Read_Stl_Binary.f90 b/Sources/Shared/Stl_Mod/Read_Stl_Binary.f90 index 97bc16294..254b442bd 100644 --- a/Sources/Shared/Stl_Mod/Read_Stl_Binary.f90 +++ b/Sources/Shared/Stl_Mod/Read_Stl_Binary.f90 @@ -20,7 +20,7 @@ subroutine Read_Stl_Binary(Stl) call File % Read_Binary_Int4_Array(fu, 1) f = int4_array(1) - if(this_proc < 2) print '(a,i9)', ' # Number of facets on the STL: ', f + if(First_Proc()) print '(a,i9)', ' # Number of facets on the STL: ', f call Stl % Allocate_Stl(f) !------------------------------------------------! @@ -42,6 +42,6 @@ subroutine Read_Stl_Binary(Stl) read(fu) byte read(fu) byte end do - if(this_proc < 2) print '(a)', ' # Read all STL facets!' + if(First_Proc()) print '(a)', ' # Read all STL facets!' end subroutine diff --git a/Sources/Shared/Work_Mod/Check_Usage/Finalize_Work.f90 b/Sources/Shared/Work_Mod/Check_Usage/Finalize_Work.f90 index 1f1b83254..27fd7f9b3 100644 --- a/Sources/Shared/Work_Mod/Check_Usage/Finalize_Work.f90 +++ b/Sources/Shared/Work_Mod/Check_Usage/Finalize_Work.f90 @@ -10,7 +10,7 @@ subroutine Finalize_Work(Work) character(DL) :: line !==============================================================================! - if(this_proc < 2) then + if(First_Proc()) then line( 1:160) = ' ' write(line(T+1:T+33),'(a)') ' #==============================#' diff --git a/Tests/Functionality/Gradients/User_Mod/Initialize_Variables.f90 b/Tests/Functionality/Gradients/User_Mod/Initialize_Variables.f90 index b915f259b..cef1cd4c1 100644 --- a/Tests/Functionality/Gradients/User_Mod/Initialize_Variables.f90 +++ b/Tests/Functionality/Gradients/User_Mod/Initialize_Variables.f90 @@ -47,7 +47,7 @@ subroutine User_Mod_Initialize_Variables(Flow, Turb, Vof, Swarm, Sol) ! ! !----------------------------------------------------------------------! - if(this_proc < 2) then + if(First_Proc()) then print *, '#==============================================================' print *, '# Performing Test 1 - least square cell based method' print *, '#--------------------------------------------------------------' @@ -81,7 +81,7 @@ subroutine User_Mod_Initialize_Variables(Flow, Turb, Vof, Swarm, Sol) ! ! !---------------------------------------------------------! - if(this_proc < 2) then + if(First_Proc()) then print *, '#==============================================================' print *, '# Performing Test 2 - Gaussian method from poor initial guess' print *, '#--------------------------------------------------------------' @@ -111,7 +111,7 @@ subroutine User_Mod_Initialize_Variables(Flow, Turb, Vof, Swarm, Sol) ! ! !---------------------------------------------------------! - if(this_proc < 2) then + if(First_Proc()) then print *, '#==============================================================' print *, '# Performing Test 3 - Gaussian method from better initial guess' print *, '#--------------------------------------------------------------' @@ -169,7 +169,7 @@ subroutine User_Mod_Initialize_Variables(Flow, Turb, Vof, Swarm, Sol) ! ! !-------------------------------------------------------------------------! - if(this_proc < 2) then + if(First_Proc()) then print *, '#==============================================================' print *, '# Performing Test 4 - Gaussian method from an elaborate guess' print *, '#--------------------------------------------------------------' @@ -308,7 +308,7 @@ subroutine User_Mod_Initialize_Variables(Flow, Turb, Vof, Swarm, Sol) ! ! !----------------------------------------------------------------------! - if(this_proc < 2) then + if(First_Proc()) then print *, '#==============================================================' print *, '# Performing Test 5 - Field % Grad_Gauss_Pressure ' print *, '#--------------------------------------------------------------' diff --git a/Tests/Functionality/Omp/User_Mod/Beginning_Of_Simulation.f90 b/Tests/Functionality/Omp/User_Mod/Beginning_Of_Simulation.f90 index 9c226e334..d9000f1ec 100644 --- a/Tests/Functionality/Omp/User_Mod/Beginning_Of_Simulation.f90 +++ b/Tests/Functionality/Omp/User_Mod/Beginning_Of_Simulation.f90 @@ -82,7 +82,8 @@ subroutine User_Mod_Beginning_Of_Simulation(Flow, Turb, Vof, Swarm, & !$omp private(s, c1, c2, thr) & !$omp shared (faces_c, sur, f_val, c_val1, c_val2) thr = omp_get_thread_num() + 1 - do s = Grid % Vect % thread % f_face(thr), Grid % Vect % thread % l_face(thr) + do s = Grid % Vect % thread % f_face(thr), & + Grid % Vect % thread % l_face(thr) c1 = faces_c(1, s) c2 = faces_c(2, s) f_val(s) = c_val1(c1) * sur(s) & @@ -122,7 +123,7 @@ subroutine User_Mod_Beginning_Of_Simulation(Flow, Turb, Vof, Swarm, & call Work % Disconnect_Real_Cell(c_val1, c_val2) call Work % Disconnect_Real_Face(f_val1, f_val2, f_val) - call Profiler % Statistics(indent=34, in_seconds=.true.) + call Profiler % Statistics(indent=34) call Comm_Mod_End stop diff --git a/Tests/Functionality/Omp/control b/Tests/Functionality/Omp/control index 43e1c6394..f15630ee0 100644 --- a/Tests/Functionality/Omp/control +++ b/Tests/Functionality/Omp/control @@ -1,5 +1,9 @@ - MAX_THREADS 4 - +#------------------------------------------ +# A couple of things specific to this case +#------------------------------------------ + MAX_THREADS 4 + PROFILER_INFO seconds + #---------- # Prologue #--------- @@ -15,7 +19,7 @@ #LOAD_BACKUP_NAME backstep_orthogonal-ts000001.backup #------------------- -# Monitoring points +# Monitoring points #------------------- NUMBER_OF_MONITORING_POINTS 1 MONITORING_POINT_001 0.5 0.5 0.2 @@ -29,8 +33,6 @@ DYNAMIC_VISCOSITY 1.0e-3 HEAT_CAPACITY 1.0 -TURBULENCE_MODEL none - #---------------------- # Numerical parameters #---------------------- @@ -55,11 +57,6 @@ TURBULENCE_MODEL none TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 MIN_SIMPLE_ITERATIONS 1 -#-------------------- -# Initial conditions -#-------------------- -# POTENTIAL_INITIALIZATION yes - #--------------------- # Boundary conditions #--------------------- @@ -82,5 +79,3 @@ TURBULENCE_MODEL none TYPE convective VARIABLES u v w VALUES 1.0 0.0 0.0 -INTERFACE_TRACKING no -PARTICLE_TRACKING no diff --git a/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/Save_Results.f90 b/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/Save_Results.f90 index a42049ef6..6f72960bf 100644 --- a/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/Save_Results.f90 +++ b/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/Save_Results.f90 @@ -67,7 +67,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !------------------! inquire(file=coord_name, exist=there) if(.not. there) then - if(this_proc < 2) then + if(First_Proc()) then print *, '#==============================================================' print *, '# In order to extract profiles and write them in ascii files' print *, '# the code has to read cell-faces coordinates ' @@ -244,7 +244,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if if(u_tau_p .eq. 0.0) then - if(this_proc < 2) then + if(First_Proc()) then write(*,*) '# Friction velocity is zero in Save_Results.f90!' end if return @@ -458,6 +458,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) deallocate(wt_p) end if - if(this_proc < 2) write(6, *) '# Finished with User_Mod_Save_Results.f90.' + if(First_Proc()) write(6, *) '# Finished with User_Mod_Save_Results.f90.' end subroutine diff --git a/Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/Save_Results.f90 b/Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/Save_Results.f90 index 6bfad3126..5e6b8cfd1 100644 --- a/Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/Save_Results.f90 +++ b/Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/Save_Results.f90 @@ -48,7 +48,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !------------------! inquire(file=coord_name, exist=exist) if(.not. exist) then - if(this_proc < 2) then + if(First_Proc()) then print *, '# Critial error: chan.1d file does not exist' end if stop @@ -125,6 +125,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) deallocate(ind) deallocate(y_f) - if(this_proc < 2) write(*,*) '# Finished with User_Mod_Save_Results.f90.' + if(First_Proc()) write(*,*) '# Finished with User_Mod_Save_Results.f90.' end subroutine diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/User_Mod/End_Of_Time_Step.f90 b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/User_Mod/End_Of_Time_Step.f90 index c69d5def7..bf0726e94 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/User_Mod/End_Of_Time_Step.f90 @@ -39,7 +39,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) - if(c2 < 0 .and. Grid % Comm % cell_proc(c1) .eq. this_proc) then + if(c2 < 0 .and. Grid % Comm % cell_proc(c1) .eq. This_Proc()) then if( Var_Mod_Bnd_Cond_Type(t,c2) .eq. WALL ) then area = area + Grid % s(s) @@ -61,7 +61,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & !-------------------------------------------------! nu = nu / area - if(this_proc < 2) then + if(First_Proc()) then print '(a)', ' #===========================================' print '(a)', ' # Output from user function, Nusslet number!' print '(a)', ' #-------------------------------------------' diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Direct/Variable_Properties_Air/User_Mod/Beginning_Of_Simulation.f90 b/Tests/Laminar/Cavity/Thermally_Driven/Direct/Variable_Properties_Air/User_Mod/Beginning_Of_Simulation.f90 index bead8290b..38e43b7d5 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Direct/Variable_Properties_Air/User_Mod/Beginning_Of_Simulation.f90 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Direct/Variable_Properties_Air/User_Mod/Beginning_Of_Simulation.f90 @@ -44,7 +44,7 @@ subroutine User_Mod_Beginning_Of_Simulation(Flow, Turb, Vof, Swarm, n, time) close(fu) - if(this_proc < 2) then + if(First_Proc()) then print '(a)', ' #============================================' print '(a)', ' # Output from user function, read properties!' print '(a)', ' #--------------------------------------------' diff --git a/Tests/Laminar/Cylinder/Vertical/User_Mod/Beginning_Of_Iteration.f90 b/Tests/Laminar/Cylinder/Vertical/User_Mod/Beginning_Of_Iteration.f90 index 973af91cc..956982ef2 100644 --- a/Tests/Laminar/Cylinder/Vertical/User_Mod/Beginning_Of_Iteration.f90 +++ b/Tests/Laminar/Cylinder/Vertical/User_Mod/Beginning_Of_Iteration.f90 @@ -48,7 +48,7 @@ subroutine User_Mod_Beginning_Of_Iteration(Flow, Turb, Vof, Swarm, n, time) call Comm_Mod_Global_Sum_Real(vol_in) vel_in = vol_in / area_in - ! if(this_proc < 2) then + ! if(First_Proc()) then ! print *, '@ User_Mod_Beginning_Of_Time_Step' ! print *, '@ average inflow velocity = ', vel_in ! end if diff --git a/Tests/Laminar/Cylinder/Vertical/User_Mod/Save_Results.f90 b/Tests/Laminar/Cylinder/Vertical/User_Mod/Save_Results.f90 index 4843fc144..13bf60a45 100644 --- a/Tests/Laminar/Cylinder/Vertical/User_Mod/Save_Results.f90 +++ b/Tests/Laminar/Cylinder/Vertical/User_Mod/Save_Results.f90 @@ -90,7 +90,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) nuss_mean = nuss_mean / n_points end if - if(this_proc < 2) then + if(First_Proc()) then print *, 't_ref = ', Flow % t_ref print *, 'alfa_const = ', alfa_const print *, 'ra = ', ra diff --git a/Tests/Laminar/Flat_Plate/User_Mod/Plain_Nu.f90 b/Tests/Laminar/Flat_Plate/User_Mod/Plain_Nu.f90 index 2011c5bce..b8c7aeac7 100644 --- a/Tests/Laminar/Flat_Plate/User_Mod/Plain_Nu.f90 +++ b/Tests/Laminar/Flat_Plate/User_Mod/Plain_Nu.f90 @@ -49,7 +49,7 @@ subroutine User_Mod_Plain_Nu(Flow, Turb, ts) inquire(file='x_coordinate.dat', exist=there) if(.not.there) then - if(this_proc < 2) then + if(First_Proc()) then print *, "File x_coordinate.dat does not exist. Exit Plain_Nu.f90 !" end if return @@ -215,6 +215,6 @@ subroutine User_Mod_Plain_Nu(Flow, Turb, ts) deallocate(wt_p) end if - if(this_proc < 2) write(*,*) '# Finished with User_Plain_Nu' + if(First_Proc()) write(*,*) '# Finished with User_Plain_Nu' end subroutine diff --git a/Tests/Laminar/Flat_Plate/User_Mod/Plain_Profiles.f90 b/Tests/Laminar/Flat_Plate/User_Mod/Plain_Profiles.f90 index 80879d5e4..75e2e4571 100644 --- a/Tests/Laminar/Flat_Plate/User_Mod/Plain_Profiles.f90 +++ b/Tests/Laminar/Flat_Plate/User_Mod/Plain_Profiles.f90 @@ -39,7 +39,7 @@ subroutine User_Mod_Plain_Profiles(Flow, Turb, ts) inquire(file='horizontal_positions.dat', exist=there) if(.not.there) then - if(this_proc < 2) then + if(First_Proc()) then print *, "#============================================================" print *, "# In order to extract profiles and write them in ascii files " print *, "# the code has to read ascii file in which positions of the " @@ -70,11 +70,11 @@ subroutine User_Mod_Plain_Profiles(Flow, Turb, ts) !------------------! ! Read 1d file ! !------------------! - if(this_proc < 2) print *, '# Now reading the file:', coord_name + if(First_Proc()) print *, '# Now reading the file:', coord_name inquire( file=coord_name, exist=there ) if(.not.there) then - if(this_proc < 2) then + if(First_Proc()) then print *, "===========================================================" print *, "In order to extract profiles and write them in ascii files " print *, "the code has to read cell-faces coordinates " @@ -272,6 +272,6 @@ subroutine User_Mod_Plain_Profiles(Flow, Turb, ts) deallocate(wt_p) end if - if(this_proc < 2) print *, '# Finished with User_Backstep_Profiles' + if(First_Proc()) print *, '# Finished with User_Backstep_Profiles' end subroutine diff --git a/Tests/Laminar/Membrane/2_Domains/User_Mod/Beginning_Of_Iteration.f90 b/Tests/Laminar/Membrane/2_Domains/User_Mod/Beginning_Of_Iteration.f90 index a7ca560d2..31024b9ab 100644 --- a/Tests/Laminar/Membrane/2_Domains/User_Mod/Beginning_Of_Iteration.f90 +++ b/Tests/Laminar/Membrane/2_Domains/User_Mod/Beginning_Of_Iteration.f90 @@ -142,7 +142,7 @@ subroutine User_Mod_Beginning_Of_Iteration(Flow, Turb, Vof, Swarm, n, time) + k_film / d_film * (t_film - t_int)) / h_d ! If not in a buffer, update accumulated variables - if(Grid % Comm % cell_proc(c1) .eq. this_proc) then + if(Grid % Comm % cell_proc(c1) .eq. This_Proc()) then t_int_acc = t_int_acc + t_int * Grid % s(s) m_evap_acc = m_evap_acc + m_evap * Grid % s(s) area_acc = area_acc + Grid % s(s) @@ -159,7 +159,7 @@ subroutine User_Mod_Beginning_Of_Iteration(Flow, Turb, Vof, Swarm, n, time) call Comm_Mod_Global_Sum_Real(area_acc) m_evap_avg = m_evap_acc / area_acc t_int_avg = t_int_acc / area_acc - if(this_proc < 2) then + if(First_Proc()) then print * , 'm_evap =', m_evap_avg * 3600, ' kg/m²h ' print * , 't_int = ', t_int_avg, 'Celsius' end if diff --git a/Tests/Laminar/Membrane/2_Domains/User_Mod/Interface_Exchange.f90 b/Tests/Laminar/Membrane/2_Domains/User_Mod/Interface_Exchange.f90 index a2b9a3124..af70417dc 100644 --- a/Tests/Laminar/Membrane/2_Domains/User_Mod/Interface_Exchange.f90 +++ b/Tests/Laminar/Membrane/2_Domains/User_Mod/Interface_Exchange.f90 @@ -232,7 +232,7 @@ subroutine User_Mod_Interface_Exchange(inter, Flow, Turb, Vof, Swarm, n_dom) Flow(d1) % t % n(bc1) = t_int ! If not in a buffer, update accumulated variables - if(Grid1 % Comm % cell_proc(ic1) .eq. this_proc) then + if(Grid1 % Comm % cell_proc(ic1) .eq. This_Proc()) then mem_j_heat_acc = mem_j_heat_acc + mem_j_heat * Grid1 % s(n) mem_j_diff_acc = mem_j_diff_acc + mem_j_diff * Grid1 % s(n) t_int_acc = t_int_acc + t_int * Grid1 % s(n) @@ -309,7 +309,7 @@ subroutine User_Mod_Interface_Exchange(inter, Flow, Turb, Vof, Swarm, n_dom) mem_j_heat_avg = mem_j_heat_acc / area_acc t_int_avg = t_int_acc / area_acc ! Control - if(this_proc < 2) then + if(First_Proc()) then print *, 'mem_j_diff = ' , mem_j_diff_avg * 3600, ' kg/m²h' print *, 'mem_j_heat = ' , mem_j_heat_avg * 3600, ' kg/m²h' print *, 'jump condition coefficients: ', lhs_lin, lhs_fun, rhs diff --git a/Tests/Les/Barc/User_Mod/Beginning_Of_Simulation.f90 b/Tests/Les/Barc/User_Mod/Beginning_Of_Simulation.f90 index f04d60f6a..9623c1330 100644 --- a/Tests/Les/Barc/User_Mod/Beginning_Of_Simulation.f90 +++ b/Tests/Les/Barc/User_Mod/Beginning_Of_Simulation.f90 @@ -17,7 +17,7 @@ subroutine User_Mod_Beginning_Of_Simulation(Flow, Turb, Vof, Swarm, & !==============================================================================! ! Make sure you compiled it - if(this_proc < 2) print *, '# In User_Mod_Beginning_Of_Simulation' + if(First_Proc()) print *, '# In User_Mod_Beginning_Of_Simulation' ! Take alias Grid => Flow % pnt_grid diff --git a/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/End_Of_Time_Step.f90 b/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/End_Of_Time_Step.f90 index ef7159d1b..c07a0344a 100644 --- a/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/End_Of_Time_Step.f90 @@ -3,13 +3,6 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & n, n_stat_t, n_stat_p, time) !------------------------------------------------------------------------------! ! This function is called at the end of time step. ! -!------------------------------------------------------------------------------! -!----------------------------------[Modules]-----------------------------------! - use Grid_Mod, only: Grid_Type - use Field_Mod - use Var_Mod, only: Var_Type - use Const_Mod, only: PI - use Comm_Mod, only: Comm_Mod_Global_Max_Real, this_proc !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -44,7 +37,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & t => Flow % t ! Print a message - if(this_proc < 2) then + if(First_Proc()) then print *, '# Superimposing random eddies on top of velocity field!' end if diff --git a/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/Save_Results.f90 b/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/Save_Results.f90 index edff606de..b01f1f84d 100644 --- a/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/Save_Results.f90 +++ b/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/Save_Results.f90 @@ -5,14 +5,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) ! averages the results in homogeneous directions. ! ! ! ! The results are then writen in files name_res.dat and name_res_plus.dat ! -!------------------------------------------------------------------------------! - use Const_Mod ! constants - use Comm_Mod ! parallel stuff - use Grid_Mod, only: Grid_Type - use Field_Mod - use Bulk_Mod, only: Bulk_Type - use Var_Mod, only: Var_Type - use Turb_Mod !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -69,7 +61,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !------------------! inquire(file=coord_name, exist=there) if(.not. there) then - if(this_proc < 2) then + if(First_Proc()) then print *, '#==============================================================' print *, '# In order to extract profiles and write them in ascii files' print *, '# the code has to read cell-faces coordinates ' @@ -222,7 +214,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) / dens_const) end do if(u_tau_p .eq. 0.0) then - if(this_proc < 2) then + if(First_Proc()) then write(*,*) '# Friction velocity is zero in Save_Results.f90!' end if return @@ -417,6 +409,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) deallocate(wt_p) end if - if(this_proc < 2) print *, '# Finished with User_Mod_Save_Results.f90.' + if(First_Proc()) print *, '# Finished with User_Mod_Save_Results.f90.' end subroutine diff --git a/Tests/Les/Channel_Re_Tau_180/User_Mod/Save_Results.f90 b/Tests/Les/Channel_Re_Tau_180/User_Mod/Save_Results.f90 index 40f50b7c1..a92a2c7e5 100644 --- a/Tests/Les/Channel_Re_Tau_180/User_Mod/Save_Results.f90 +++ b/Tests/Les/Channel_Re_Tau_180/User_Mod/Save_Results.f90 @@ -6,15 +6,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) ! ! ! The results are then writen in files swarm_name_res.dat and ! ! swarm_name_res_plus.dat ! -!------------------------------------------------------------------------------! - use Const_Mod ! constants - use Comm_Mod ! parallel stuff - use Grid_Mod, only: Grid_Type - use Field_Mod - use Bulk_Mod, only: Bulk_Type - use Var_Mod, only: Var_Type - use Turb_Mod - use Swarm_Mod !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -74,7 +65,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !------------------! inquire(file=coord_name, exist=there) if(.not. there) then - if(this_proc < 2) then + if(First_Proc()) then print *, '#==============================================================' print *, '# In order to extract profiles and write them in ascii files' print *, '# the code has to read cell-faces coordinates ' @@ -337,6 +328,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) deallocate(store) - if(this_proc < 2) print *, '# Finished with User_Mod_Save_Swarm.f90.' + if(First_Proc()) print *, '# Finished with User_Mod_Save_Swarm.f90.' end subroutine diff --git a/Tests/Les/Forrest/User_Mod/End_Of_Time_Step.f90 b/Tests/Les/Forrest/User_Mod/End_Of_Time_Step.f90 index 37badb3dd..eaa92d287 100644 --- a/Tests/Les/Forrest/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Les/Forrest/User_Mod/End_Of_Time_Step.f90 @@ -3,13 +3,6 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & n, n_stat_t, n_stat_p, time) !------------------------------------------------------------------------------! ! This function is called at the end of time step. ! -!------------------------------------------------------------------------------! -!----------------------------------[Modules]-----------------------------------! - use Grid_Mod, only: Grid_Type - use Field_Mod - use Var_Mod, only: Var_Type - use Const_Mod, only: PI - use Comm_Mod, only: Comm_Mod_Global_Max_Real, this_proc !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -44,7 +37,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & t => Flow % t ! Print a message - if(this_proc < 2) then + if(First_Proc()) then print *, '# Superimposing random eddies on top of velocity field!' end if diff --git a/Tests/Les/Forrest/User_Mod/Save_Results.f90 b/Tests/Les/Forrest/User_Mod/Save_Results.f90 index 19e80c204..4c9102cfc 100644 --- a/Tests/Les/Forrest/User_Mod/Save_Results.f90 +++ b/Tests/Les/Forrest/User_Mod/Save_Results.f90 @@ -65,7 +65,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !------------------! inquire(file=coord_name, exist=there) if(.not. there) then - if(this_proc < 2) then + if(First_Proc()) then print *, '#==============================================================' print *, '# In order to extract profiles and write them in ascii files' print *, '# the code has to read cell-faces coordinates ' @@ -338,6 +338,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) close(fu) - if(this_proc < 2) print '(a)', ' # Finished with User_Mod_Save_Results.f90.' + if(First_Proc()) print '(a)', ' # Finished with User_Mod_Save_Results.f90.' end subroutine diff --git a/Tests/Les/Pipe_Re_Tau_180/User_Mod/End_Of_Time_Step.f90 b/Tests/Les/Pipe_Re_Tau_180/User_Mod/End_Of_Time_Step.f90 index 565f21bdc..694c5fa85 100644 --- a/Tests/Les/Pipe_Re_Tau_180/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Les/Pipe_Re_Tau_180/User_Mod/End_Of_Time_Step.f90 @@ -36,7 +36,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & if(n > 3000) return ! Print a message - if(this_proc < 2) then + if(First_Proc()) then print *, '# Superimposing random eddies on top of velocity field!' end if diff --git a/Tests/Les/Pipe_Re_Tau_180/User_Mod/Save_Results.f90 b/Tests/Les/Pipe_Re_Tau_180/User_Mod/Save_Results.f90 index 60e8d388a..b082572ac 100644 --- a/Tests/Les/Pipe_Re_Tau_180/User_Mod/Save_Results.f90 +++ b/Tests/Les/Pipe_Re_Tau_180/User_Mod/Save_Results.f90 @@ -67,7 +67,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !------------------! inquire(file=coord_name, exist=there) if(.not. there) then - if(this_proc < 2) then + if(First_Proc()) then print *, '#==============================================================' print *, '# In order to extract profiles and write them in ascii files' print *, '# the code has to read cell-faces coordinates ' @@ -229,7 +229,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) / wall_p(1)) & / dens_const) if(u_tau_p .eq. 0.0) then - if(this_proc < 2) then + if(First_Proc()) then write(*,*) '# Friction velocity is zero in Save_Results.f90!' end if return @@ -425,6 +425,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) deallocate(wt_p) end if - if(this_proc < 2) print *, '# Finished with User_Mod_Save_Results.f90.' + if(First_Proc()) print *, '# Finished with User_Mod_Save_Results.f90.' end subroutine diff --git a/Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 b/Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 index 9ca7ea742..d24e8cf95 100644 --- a/Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 +++ b/Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 @@ -78,7 +78,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !------------------! inquire(file=coord_name, exist=there) if(.not. there) then - if(this_proc < 2) then + if(First_Proc()) then print *, '#==============================================================' print *, '# In order to extract profiles and write them in ascii files' print *, '# the code has to read cell-faces coordinates ' @@ -284,7 +284,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call File % Open_For_Writing_Ascii(res_name, fu) if(Flow % heat_transfer) then - if(this_proc < 2) then + if(First_Proc()) then write(*,'(a1,(a12, f12.6))')'#', ' Nu number = ', & tz_p(1) / (t_hot - t_cold) end if @@ -335,7 +335,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) deallocate(wt_p) end if - if(this_proc < 2) print *, '# Finished with User_Mod_Save_Results.f90.' + if(First_Proc()) print *, '# Finished with User_Mod_Save_Results.f90.' call Work % Disconnect_Real_Cell(tz_mean) diff --git a/Tests/Manual/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 b/Tests/Manual/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 index cbaafbacd..2f77c5c54 100644 --- a/Tests/Manual/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 +++ b/Tests/Manual/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 @@ -34,8 +34,8 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) if(ts .eq. 0) return ! This version of the Save_Results works only for sequential runs - if(n_proc > 1) then - if(this_proc < 2) then + if(Parallel_Run()) then + if(First_Proc()) then print *, '#===========================================================' print *, '# This version of User_Mod_Save_Results is not intended for ' print *, '# parallel runs. Skipped writing of profiles in .dat file! ' @@ -70,7 +70,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !------------------! inquire(file=coord_name, exist=there) if(.not. there) then - if(this_proc < 2) then + if(First_Proc()) then print *, '#==============================================================' print *, '# In order to extract profiles and write them in ascii files' print *, '# the code has to read cell-faces coordinates ' @@ -227,6 +227,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) close(fu) - if(this_proc < 2) write(6, *) '# Finished with User_Mod_Save_Results.f90.' + if(First_Proc()) write(6, *) '# Finished with User_Mod_Save_Results.f90.' end subroutine diff --git a/Tests/Manual/Conjugate/User_Mod/End_Of_Time_Step.f90 b/Tests/Manual/Conjugate/User_Mod/End_Of_Time_Step.f90 index 455ceed01..fa8c2c248 100644 --- a/Tests/Manual/Conjugate/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Manual/Conjugate/User_Mod/End_Of_Time_Step.f90 @@ -39,7 +39,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) - if(c2 < 0 .and. Grid % Comm % cell_proc(c1) .eq. this_proc) then + if(c2 < 0 .and. Grid % Comm % cell_proc(c1) .eq. This_Proc()) then if( Var_Mod_Bnd_Cond_Type(t,c2) .eq. WALL ) then area = area + Grid % s(s) @@ -61,7 +61,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & !-------------------------------------------------! nu = nu / area - if(this_proc < 2) then + if(First_Proc()) then print '(a)', ' #===========================================' print '(a)', ' # Output from user function, Nusslet number!' print '(a)', ' #-------------------------------------------' diff --git a/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 b/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 index a1c61f2ed..63293efea 100644 --- a/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 +++ b/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 @@ -39,7 +39,7 @@ subroutine Save_Impinging_Jet_Nu(Turb, ts) !-----------------------------------! inquire(file='rad_coordinate.dat', exist=there) if(.not.there) then - if(this_proc < 2) then + if(First_Proc()) then print *, "#==========================================================" print *, "# In order to extract Nusselt number profile " print *, "# an ascii file with cell-faces coordinates has to be read." @@ -142,7 +142,7 @@ subroutine Save_Impinging_Jet_Nu(Turb, ts) !-----------------------------------! ! Write from one processor only ! !-----------------------------------! - if(this_proc < 2) then + if(First_Proc()) then ! Set the file name call File % Set_Name(res_name, time_step=ts, & @@ -166,6 +166,6 @@ subroutine Save_Impinging_Jet_Nu(Turb, ts) close(fu) end if - if(this_proc < 2) print *, '# Finished with Impinging_Jet_Nu' + if(First_Proc()) print *, '# Finished with Impinging_Jet_Nu' end subroutine diff --git a/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Profiles.f90 b/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Profiles.f90 index 1cfa2c9ea..d858d433f 100644 --- a/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Profiles.f90 +++ b/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Profiles.f90 @@ -181,7 +181,7 @@ subroutine Save_Impinging_Jet_Profiles(Turb, ts) !-----------------------------------! ! Write from one processor only ! !-----------------------------------! - if(this_proc < 2) then + if(First_Proc()) then call File % Open_For_Writing_Ascii(res_name, fu) @@ -225,10 +225,10 @@ subroutine Save_Impinging_Jet_Profiles(Turb, ts) t_p(:) = 0.0 zm_p(:) = 0.0 - if(this_proc < 2) print *, 'Finished with profile r/D = ', lnum + if(First_Proc()) print *, 'Finished with profile r/D = ', lnum end do ! end number of radius - if(this_proc < 2) write(*,*) 'Finished with User_Impinging_Jet_Profiles' + if(First_Proc()) write(*,*) 'Finished with User_Impinging_Jet_Profiles' end subroutine diff --git a/Tests/Manual/Inflows/Option_4/User_Mod/End_Of_Time_Step.f90 b/Tests/Manual/Inflows/Option_4/User_Mod/End_Of_Time_Step.f90 index 5ad83f4a2..da67cab3d 100644 --- a/Tests/Manual/Inflows/Option_4/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Manual/Inflows/Option_4/User_Mod/End_Of_Time_Step.f90 @@ -3,15 +3,6 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & curr_dt, n_stat_t, n_stat_p, time) !------------------------------------------------------------------------------! ! This function is called at the end of time step. ! -!------------------------------------------------------------------------------! -!----------------------------------[Modules]-----------------------------------! - use Grid_Mod, only: Grid_Type - use Field_Mod - use Var_Mod, only: Var_Type - use Const_Mod, only: PI - use Comm_Mod, only: Comm_Mod_Global_Max_Real, & - Comm_Mod_Global_Min_Real, & - this_proc !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -50,7 +41,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & if(Grid % name .ne. 'PRECURSOR') return ! Print a message - if(this_proc < 2) then + if(First_Proc()) then print *, '# Superimposing random eddies on top of velocity field!' end if diff --git a/Tests/Manual/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 b/Tests/Manual/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 index 9e375adbf..c83cac3e5 100644 --- a/Tests/Manual/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Manual/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 @@ -41,7 +41,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & call Comm_Mod_Global_Sum_Real(rise_velocity) ! Write to file - if (this_proc < 2) then + if (First_Proc()) then call File % Append_For_Writing_Ascii('benchmark.dat', fu) write(fu,'(4(2x,e16.10e2))') time, & diff --git a/Tests/Manual/Thermally_Driven/Varible/User_Mod/Beginning_Of_Simulation.f90 b/Tests/Manual/Thermally_Driven/Varible/User_Mod/Beginning_Of_Simulation.f90 index bead8290b..38e43b7d5 100644 --- a/Tests/Manual/Thermally_Driven/Varible/User_Mod/Beginning_Of_Simulation.f90 +++ b/Tests/Manual/Thermally_Driven/Varible/User_Mod/Beginning_Of_Simulation.f90 @@ -44,7 +44,7 @@ subroutine User_Mod_Beginning_Of_Simulation(Flow, Turb, Vof, Swarm, n, time) close(fu) - if(this_proc < 2) then + if(First_Proc()) then print '(a)', ' #============================================' print '(a)', ' # Output from user function, read properties!' print '(a)', ' #--------------------------------------------' diff --git a/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Cf_St.f90 b/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Cf_St.f90 index 3219bc4e0..bfc374812 100644 --- a/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Cf_St.f90 +++ b/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Cf_St.f90 @@ -44,7 +44,7 @@ subroutine User_Mod_Backstep_Cf_St(Flow, Turb, ts) !----------------------------------! ! Read "x_coordinate.dat" file ! !----------------------------------! - if(this_proc < 2) print *, '# Now reading the file: x_coordinate.dat ' + if(First_Proc()) print *, '# Now reading the file: x_coordinate.dat ' open(9, file='x_coordinate.dat') ! Read the number of probes @@ -214,6 +214,6 @@ subroutine User_Mod_Backstep_Cf_St(Flow, Turb, ts) deallocate(wt_p) end if - if(this_proc < 2) write(*,*) '# Finished with User_Backstep_Cf_St' + if(First_Proc()) write(*,*) '# Finished with User_Backstep_Cf_St' end subroutine diff --git a/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Profiles.f90 b/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Profiles.f90 index 49a6d5475..496156ee9 100644 --- a/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Profiles.f90 +++ b/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Profiles.f90 @@ -40,7 +40,7 @@ subroutine User_Mod_Backstep_Profiles(Flow, Turb, ts) inquire(file='horizontal_positions.dat', exist=there) if(.not.there) then - if(this_proc < 2) then + if(First_Proc()) then print *, "#============================================================" print *, "# In order to extract profiles and write them in ascii files " print *, "# the code has to read ascii file in which positions of the " @@ -71,11 +71,11 @@ subroutine User_Mod_Backstep_Profiles(Flow, Turb, ts) !------------------! ! Read 1d file ! !------------------! - if(this_proc < 2) print *, '# Now reading the file:', coord_name + if(First_Proc()) print *, '# Now reading the file:', coord_name inquire( file=coord_name, exist=there ) if(.not.there) then - if(this_proc < 2) then + if(First_Proc()) then print *, "===========================================================" print *, "In order to extract profiles and write them in ascii files " print *, "the code has to read cell-faces coordinates " @@ -304,6 +304,6 @@ subroutine User_Mod_Backstep_Profiles(Flow, Turb, ts) deallocate(wt_p) end if - if(this_proc < 2) print *, '# Finished with User_Backstep_Profiles' + if(First_Proc()) print *, '# Finished with User_Backstep_Profiles' end subroutine diff --git a/Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Save_Results.f90 b/Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Save_Results.f90 index 04c4619bd..91c3980d6 100644 --- a/Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Save_Results.f90 @@ -72,7 +72,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !------------------! inquire(file=coord_name, exist=there) if(.not. there) then - if(this_proc < 2) then + if(First_Proc()) then print *, '#==============================================================' print *, '# In order to extract profiles and write them in ascii files' print *, '# the code has to read cell-faces coordinates ' @@ -220,7 +220,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) / wall_p(1)) & / dens_const) if(u_tau_p .eq. 0.0) then - if(this_proc < 2) then + if(First_Proc()) then write(*,*) '# Friction velocity is zero in Save_Results.f90!' end if @@ -420,6 +420,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) deallocate(wt_p) end if - if(this_proc < 2) write(6, *) '# Finished with User_Mod_Save_Results.f90.' + if(First_Proc()) write(6, *) '# Finished with User_Mod_Save_Results.f90.' end subroutine diff --git a/Tests/Rans/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 b/Tests/Rans/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 index 82d4a704a..3eafed35e 100644 --- a/Tests/Rans/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 @@ -71,7 +71,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !------------------! inquire(file=coord_name, exist=there) if(.not. there) then - if(this_proc < 2) then + if(First_Proc()) then print *, '#==============================================================' print *, '# In order to extract profiles and write them in ascii files' print *, '# the code has to read cell-faces coordinates ' @@ -239,7 +239,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if if(u_tau_p .eq. 0.0) then - if(this_proc < 2) then + if(First_Proc()) then write(*,*) '# Friction velocity is zero in Save_Results.f90!' end if @@ -457,6 +457,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) deallocate(wt_p) end if - if(this_proc < 2) write(6, *) '# Finished with User_Mod_Save_Results.f90.' + if(First_Proc()) write(6, *) '# Finished with User_Mod_Save_Results.f90.' end subroutine diff --git a/Tests/Rans/Channel_Re_Tau_590/Uniform_Mesh/User_Mod/Save_Results.f90 b/Tests/Rans/Channel_Re_Tau_590/Uniform_Mesh/User_Mod/Save_Results.f90 index 86fdaa2ef..043c36316 100644 --- a/Tests/Rans/Channel_Re_Tau_590/Uniform_Mesh/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Channel_Re_Tau_590/Uniform_Mesh/User_Mod/Save_Results.f90 @@ -71,7 +71,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !------------------! inquire(file=coord_name, exist=there) if(.not. there) then - if(this_proc < 2) then + if(First_Proc()) then print *, '#==============================================================' print *, '# In order to extract profiles and write them in ascii files' print *, '# the code has to read cell-faces coordinates ' @@ -239,7 +239,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if if(u_tau_p .eq. 0.0) then - if(this_proc < 2) then + if(First_Proc()) then write(*,*) '# Friction velocity is zero in Save_Results.f90!' end if @@ -457,6 +457,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) deallocate(wt_p) end if - if(this_proc < 2) write(6, *) '# Finished with User_Mod_Save_Results.f90.' + if(First_Proc()) write(6, *) '# Finished with User_Mod_Save_Results.f90.' end subroutine diff --git a/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 b/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 index ce65faa84..d3cba4ff3 100644 --- a/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 +++ b/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 @@ -39,7 +39,7 @@ subroutine User_Mod_Impinging_Jet_Nu(Turb, ts) !-----------------------------------! inquire(file='rad_coordinate.dat', exist=there) if(.not.there) then - if(this_proc < 2) then + if(First_Proc()) then print *, "#==========================================================" print *, "# In order to extract Nusselt number profile " print *, "# an ascii file with cell-faces coordinates has to be read." @@ -152,7 +152,7 @@ subroutine User_Mod_Impinging_Jet_Nu(Turb, ts) !-----------------------------------! ! Write from one processor only ! !-----------------------------------! - if(this_proc < 2) then + if(First_Proc()) then ! Set the file name call File % Set_Name(res_name, time_step=ts, & @@ -176,6 +176,6 @@ subroutine User_Mod_Impinging_Jet_Nu(Turb, ts) close(fu) end if - if(this_proc < 2) print *, '# Finished with Impinging_Jet_Nu' + if(First_Proc()) print *, '# Finished with Impinging_Jet_Nu' end subroutine diff --git a/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Profiles.f90 b/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Profiles.f90 index 9db362f58..50b0c7221 100644 --- a/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Profiles.f90 +++ b/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Profiles.f90 @@ -182,7 +182,7 @@ subroutine User_Mod_Impinging_Jet_Profiles(Turb, ts) !-----------------------------------! ! Write from one processor only ! !-----------------------------------! - if(this_proc < 2) then + if(First_Proc()) then call File % Open_For_Writing_Ascii(res_name, fu) @@ -226,10 +226,10 @@ subroutine User_Mod_Impinging_Jet_Profiles(Turb, ts) t_p(:) = 0.0 zm_p(:) = 0.0 - if(this_proc < 2) print *, 'Finished with profile r/D = ', lnum + if(First_Proc()) print *, 'Finished with profile r/D = ', lnum end do ! end number of radius - if(this_proc < 2) write(*,*) 'Finished with User_Impinging_Jet_Profiles' + if(First_Proc()) write(*,*) 'Finished with User_Impinging_Jet_Profiles' end subroutine diff --git a/Tests/Rans/Pipe_Re_Tau_550/User_Mod/Save_Results.f90 b/Tests/Rans/Pipe_Re_Tau_550/User_Mod/Save_Results.f90 index ad9bd8252..3cd16e5f7 100644 --- a/Tests/Rans/Pipe_Re_Tau_550/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Pipe_Re_Tau_550/User_Mod/Save_Results.f90 @@ -74,7 +74,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !------------------! inquire(file=coord_name, exist=there) if(.not. there) then - if(this_proc < 2) then + if(First_Proc()) then print *, '#==============================================================' print *, '# In order to extract profiles and write them in ascii files' print *, '# the code has to read cell-faces coordinates ' @@ -245,7 +245,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if if(u_tau_p .eq. 0.0) then - if(this_proc < 2) then + if(First_Proc()) then write(*,*) '# Friction velocity is zero in Save_Results.f90!' end if @@ -462,6 +462,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) deallocate(wt_p) end if - if(this_proc < 2) print *, '# Finished with User_Mod_Save_Results.f90.' + if(First_Proc()) print *, '# Finished with User_Mod_Save_Results.f90.' end subroutine diff --git a/Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 b/Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 index 9845589a9..f6e03d845 100644 --- a/Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 @@ -74,7 +74,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !------------------! inquire(file=coord_name, exist=there) if(.not. there) then - if(this_proc < 2) then + if(First_Proc()) then print *, '#==============================================================' print *, '# In order to extract profiles and write them in ascii files' print *, '# the code has to read cell-faces coordinates ' @@ -248,7 +248,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) open(3, file = res_name) if(Flow % heat_transfer) then - if(this_proc < 2) then + if(First_Proc()) then write(*,'(a1,(a12, f12.6))')'#', ' Nu1 number = ', & -tz_p(1) / (t_hot - t_cold) write(*,'(a1,(a12, f12.6))')'#', ' Nu2 number = ', & @@ -302,6 +302,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) deallocate(wt_p) end if - if(this_proc < 2) print *, '# Finished with User_Mod_Save_Results.f90.' + if(First_Proc()) print *, '# Finished with User_Mod_Save_Results.f90.' end subroutine diff --git a/Tests/Swarm/Bend_90_Degrees/User_Mod/Insert_Particles.f90 b/Tests/Swarm/Bend_90_Degrees/User_Mod/Insert_Particles.f90 index 3d023d5a0..8e856888d 100644 --- a/Tests/Swarm/Bend_90_Degrees/User_Mod/Insert_Particles.f90 +++ b/Tests/Swarm/Bend_90_Degrees/User_Mod/Insert_Particles.f90 @@ -73,12 +73,12 @@ subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, curr_dt, time) n_new = k ! new number of particles if(n_new <= Swarm % max_particles) then - if(this_proc < 2) then + if(First_Proc()) then print *, '# @User_Mod_Insert_Particles: inserted', & n_new - n_old, ' particles' end if else - if(this_proc < 2) then + if(First_Proc()) then print *, '# @User_Mod_Insert_Particles: too many particles' call Comm_Mod_End stop diff --git a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/End_Of_Time_Step.f90 b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/End_Of_Time_Step.f90 index e373d6345..20c18e2d0 100644 --- a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/End_Of_Time_Step.f90 @@ -3,13 +3,6 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & n, n_stat_t, n_stat_p, time) !------------------------------------------------------------------------------! ! This function is called at the end of time step. ! -!------------------------------------------------------------------------------! -!----------------------------------[Modules]-----------------------------------! - use Grid_Mod, only: Grid_Type - use Field_Mod, only: Field_Type - use Var_Mod, only: Var_Type - use Const_Mod, only: PI - use Comm_Mod, only: Comm_Mod_Global_Max_Real, this_proc !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -79,7 +72,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & !! nn = n - 340000 - 1 ! since we started having particle distribution from... ! ! ... n = 340001! !! if(mod(nn , 2500) .eq. 0 .or. n .eq. n_bin .and. n .le. 347500) then -! if(this_proc < 2) then +! if(First_Proc()) then ! ! level = 0.0 ! temp = 0 @@ -164,7 +157,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & if(n > 1200) return ! Print a message - if(this_proc < 2) then + if(First_Proc()) then print *, '# Superimposing random eddies on top of velocity field!' end if diff --git a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Results.f90 b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Results.f90 index 7b507d370..b5051f8e5 100644 --- a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Results.f90 +++ b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Results.f90 @@ -5,14 +5,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, curr_dt, domain) ! averages the results in homogeneous directions. ! ! ! ! The results are then writen in files name_res.dat and name_res_plus.dat ! -!------------------------------------------------------------------------------! - use Const_Mod ! constants - use Comm_Mod ! parallel stuff - use Grid_Mod, only: Grid_Type - use Field_Mod, only: Field_Type - use Bulk_Mod, only: Bulk_Type - use Var_Mod, only: Var_Type - use Turb_Mod !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -58,7 +50,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, curr_dt, domain) !------------------! inquire(file=coord_name, exist=there) if(.not. there) then - if(this_proc < 2) then + if(First_Proc()) then print *, '#==============================================================' print *, '# In order to extract profiles and write them in ascii files' print *, '# the code has to read cell-faces coordinates ' @@ -118,7 +110,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, curr_dt, domain) !do c = 1, Grid % n_cells - Grid % comm % n_buff_cells ! ww_mod_p(c) = Turb % kin_mean(c) * Turb % zeta_mean(c) !end do - !if(this_proc < 2) then + !if(First_Proc()) then ! print *, "w_mod(503) = ", ww_mod_p(503) ! print *, "min_val_wmod = ", minval(ww_mod_p(:)) ! print *, "max_val_wmod = ", maxval(ww_mod_p(:)) @@ -230,7 +222,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, curr_dt, domain) end if if(u_tau_p < TINY) then - if(this_proc < 2) then + if(First_Proc()) then write(*,*) '# Friction velocity is zero in Save_Results.f90!' end if return @@ -344,6 +336,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, curr_dt, domain) close(fu1) close(fu2) - if(this_proc < 2) print *, '# Finished with User_Mod_Save_Results.f90.' + if(First_Proc()) print *, '# Finished with User_Mod_Save_Results.f90.' end subroutine diff --git a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Swarm.f90 b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Swarm.f90 index eacc1a694..fa1f1c60c 100644 --- a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Swarm.f90 +++ b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Swarm.f90 @@ -6,15 +6,6 @@ subroutine User_Mod_Save_Swarm(Flow, Turb, Vof, Swarm, curr_dt, domain) ! ! ! The results are then writen in files swarm_name_res.dat and ! ! swarm_name_res_plus.dat ! -!------------------------------------------------------------------------------! - use Const_Mod ! constants - use Comm_Mod ! parallel stuff - use Grid_Mod, only: Grid_Type - use Field_Mod, only: Field_Type - use Bulk_Mod, only: Bulk_Type - use Var_Mod, only: Var_Type - use Turb_Mod - use Swarm_Mod !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -62,7 +53,7 @@ subroutine User_Mod_Save_Swarm(Flow, Turb, Vof, Swarm, curr_dt, domain) !------------------! inquire(file=coord_name, exist=there) if(.not. there) then - if(this_proc < 2) then + if(First_Proc()) then print *, '#==============================================================' print *, '# In order to extract profiles and write them in ascii files' print *, '# the code has to read cell-faces coordinates ' @@ -243,7 +234,7 @@ subroutine User_Mod_Save_Swarm(Flow, Turb, Vof, Swarm, curr_dt, domain) w_p(1)**2) / wall_p(1))) if(u_tau_p .eq. 0.0) then - if(this_proc < 2) then + if(First_Proc()) then write(*,*) '# Friction velocity is zero in Save_Swarm.f90!' end if return @@ -329,6 +320,6 @@ subroutine User_Mod_Save_Swarm(Flow, Turb, Vof, Swarm, curr_dt, domain) close(fu1) close(fu2) - if(this_proc < 2) print *, '# Finished with User_Mod_Save_Swarm.f90.' + if(First_Proc()) print *, '# Finished with User_Mod_Save_Swarm.f90.' end subroutine diff --git a/Tests/Swarm/T_Junction_Square/User_Mod/Force.f90 b/Tests/Swarm/T_Junction_Square/User_Mod/Force.f90 index cec3614b4..3608b0336 100644 --- a/Tests/Swarm/T_Junction_Square/User_Mod/Force.f90 +++ b/Tests/Swarm/T_Junction_Square/User_Mod/Force.f90 @@ -20,11 +20,11 @@ subroutine User_Mod_Force(Flow, Por, ui, a_matrix, b_vector) ! Take aliases Grid => Flow % pnt_grid - !----------------------------------------------------! + !----------------------------------------------------! ! ! ! Set source depending on the velocity component ! ! ! - !----------------------------------------------------! + !----------------------------------------------------! !-------------------------------------------------------! ! Set source for velocity component in "x" direction ! diff --git a/Tests/Swarm/Three_Phase_Flow/User_Mod/Insert_Particles.f90 b/Tests/Swarm/Three_Phase_Flow/User_Mod/Insert_Particles.f90 index bf0f47d76..fe7a84a47 100644 --- a/Tests/Swarm/Three_Phase_Flow/User_Mod/Insert_Particles.f90 +++ b/Tests/Swarm/Three_Phase_Flow/User_Mod/Insert_Particles.f90 @@ -59,8 +59,8 @@ subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, n, time) ! Cell is invalid if(Swarm % Particle(p) % cell .eq. -1) then - print '(a,i6,a,i6,a)', ' # PANIC: Particle ', p, & - ' from processor ', this_proc, & + print '(a,i6,a,i6,a)', ' # PANIC: Particle ', p, & + ' from processor ', This_Proc(), & ' couldn''t be located!' print *, '# Check initial placement of particles.' print *, '# This error is critical, exiting!' diff --git a/Tests/Vof/Dam_Break_3d/User_Mod/End_Of_Time_Step.f90 b/Tests/Vof/Dam_Break_3d/User_Mod/End_Of_Time_Step.f90 index 2df077251..d840c7576 100644 --- a/Tests/Vof/Dam_Break_3d/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Vof/Dam_Break_3d/User_Mod/End_Of_Time_Step.f90 @@ -110,7 +110,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, n, n_stat_t, & call Comm_Mod_Global_Sum_Real(b_volume) ! Write to file - if (this_proc < 2) then + if (First_Proc()) then call File % Append_For_Writing_Ascii('probe-data.dat', fu) write(fu,'((e16.10e2),9(2x,e16.10e2),4(2x,e16.10e2))') & time, b_volume, p_probe(1:size(nod_probe)), & diff --git a/Tests/Vof/Dam_Break_3d/User_Mod/Initialize_Variables.f90 b/Tests/Vof/Dam_Break_3d/User_Mod/Initialize_Variables.f90 index 9801235c4..6bb2bf060 100644 --- a/Tests/Vof/Dam_Break_3d/User_Mod/Initialize_Variables.f90 +++ b/Tests/Vof/Dam_Break_3d/User_Mod/Initialize_Variables.f90 @@ -147,7 +147,7 @@ subroutine User_Mod_Initialize_Variables(Flow, Turb, Vof, Swarm, Sol) ! Sort probs by height do i_probe = 1, N_PROBE_F if (allocated(probes(i_probe) % s_probe)) then - write(*,*) this_proc,i_probe, N_PROBE_F,c_inters + write(*,*) This_Proc(), i_probe, N_PROBE_F, c_inters call Vof_Quick_Sort(probes(i_probe) % s_probe(1:c_inters), & probes(i_probe) % s_coor(:,:), 3, 1, & size(probes(i_probe) % s_probe)) diff --git a/Tests/Vof/Pie/User_Mod/End_Of_Time_Step.f90 b/Tests/Vof/Pie/User_Mod/End_Of_Time_Step.f90 index e37616478..ed6b7fbed 100644 --- a/Tests/Vof/Pie/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Vof/Pie/User_Mod/End_Of_Time_Step.f90 @@ -67,7 +67,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & !-------------------! if(n > 1) then - if(this_proc < 2) then + if(First_Proc()) then print *, 'y_pos_cen = ', y_pos_cen print *, 'y_pos_cen_old = ', y_pos_cen_old print *, 'rise_vel_int (1) = ', rise_vel_int @@ -92,7 +92,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & rise_vel_cen close(fu) - end if ! this_proc < 2 + end if ! First_Proc() end if ! n > 1 diff --git a/Tests/Vof/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 b/Tests/Vof/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 index ae26f4d9f..511947dda 100644 --- a/Tests/Vof/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Vof/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 @@ -53,7 +53,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & call Comm_Mod_Global_Sum_Real(rise_velocity) ! Write to file - if (this_proc < 2) then + if (First_Proc()) then call File % Append_For_Writing_Ascii('bench-data.dat', fu) !with circularity 2D: ! write(fu,'(5(2X,E16.10E2))') time, b_volume, & diff --git a/Tests/Vof/Spurious/User_Mod/End_Of_Time_Step.f90 b/Tests/Vof/Spurious/User_Mod/End_Of_Time_Step.f90 index 8d050f7f9..08ce9007b 100644 --- a/Tests/Vof/Spurious/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Vof/Spurious/User_Mod/End_Of_Time_Step.f90 @@ -102,7 +102,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, n, & p_out = p_out / a_out ! Write Results - if (this_proc < 2) then + if (First_Proc()) then if(n .eq. 1) then call File % Delete('spurious.dat') end if @@ -114,7 +114,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, n, & !! Calculate distance to center of cylinder !! For normals for curvature - !if(this_proc <= 2) then + !if(This_Proc() <= 2) then ! dist_n = 0 ! do c = 1, Grid % n_cells ! norm_res = norm2((/fun % x(c), fun % y(c), fun % z(c)/)) diff --git a/Tests/Vof/Vertical_Tube/User_Mod/End_Of_Time_Step.f90 b/Tests/Vof/Vertical_Tube/User_Mod/End_Of_Time_Step.f90 index e1dc82aad..9da77d839 100644 --- a/Tests/Vof/Vertical_Tube/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Vof/Vertical_Tube/User_Mod/End_Of_Time_Step.f90 @@ -48,7 +48,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & call Comm_Mod_Global_Sum_Real(c_position) call Comm_Mod_Global_Sum_Real(rise_velocity) - if (this_proc < 2) then + if (First_Proc()) then ! !with circularity: ! open(unit = 70359, file='Bench-data.dat',position='APPEND') ! write(70359,*) b_volume, 2.0*PI/surface*sqrt(b_volume/PI), & From d9bf9d367de51f0aabda9b7de10d70f023695d39 Mon Sep 17 00:00:00 2001 From: Niceno Date: Fri, 24 Mar 2023 14:56:28 +0100 Subject: [PATCH 132/223] Modifications necessary for Nvidia Fortran They help to an extent, but Nvidia Fortran is in a state of utter mess, this will only take you so far. I do know for a fact that MPI compilation (with Nvidia Fortran) throws some warninig messages. On branch bojan_more_robust_communicator modified: Sources/Convert/Convert_Mod/Load_Fluent.f90 modified: Sources/Convert/Convert_Mod/Logo_Con.f90 modified: Sources/Divide/Divide_Mod/Logo_Div.f90 modified: Sources/Generate/Generate_Mod/Logo_Gen.f90 --- Sources/Convert/Convert_Mod/Load_Fluent.f90 | 2 ++ Sources/Convert/Convert_Mod/Logo_Con.f90 | 12 ++++++------ Sources/Divide/Divide_Mod/Logo_Div.f90 | 12 ++++++------ Sources/Generate/Generate_Mod/Logo_Gen.f90 | 12 ++++++------ 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/Sources/Convert/Convert_Mod/Load_Fluent.f90 b/Sources/Convert/Convert_Mod/Load_Fluent.f90 index 8869730fd..f7381267a 100644 --- a/Sources/Convert/Convert_Mod/Load_Fluent.f90 +++ b/Sources/Convert/Convert_Mod/Load_Fluent.f90 @@ -8,6 +8,8 @@ subroutine Load_Fluent(Convert, Grid, file_name) class(Convert_Type) :: Convert type(Grid_Type) :: Grid character(SL) :: file_name +!----------------------------------[Calling]-----------------------------------! + integer :: ftell ! needed for Nvidia compiler !------------------------------[Local parameters]------------------------------! integer, parameter :: MIXED_ZONE = 0 integer, parameter :: CELL_TRI = 1 diff --git a/Sources/Convert/Convert_Mod/Logo_Con.f90 b/Sources/Convert/Convert_Mod/Logo_Con.f90 index c827b4068..674e0ee61 100644 --- a/Sources/Convert/Convert_Mod/Logo_Con.f90 +++ b/Sources/Convert/Convert_Mod/Logo_Con.f90 @@ -9,12 +9,12 @@ subroutine Logo_Con(Convert) print *,'#===================================' // & '====================================' print *,'#' - print *,'# ______________________ ____ ________ __ __ _________' - print *,'# \__ ___/\_ _____/| | \_____ \/ \ / \/ _____/' - print *,'# | | | __) | | / | \ \/\/ /\_____ \' - print *,'# | | | \ | |___/ | \ / / \' - print *,'# |____| \___ / |_______ \_______ /\__/\ / /_______ /' - print *,'# \/ \/ \/ \/ \/' + print *,'# ______________________ ____ ________ __ __ _________ ' + print *,'# \__ ___/\_ _____/| | \_____ \/ \ / \/ _____/ ' + print *,'# | | | __) | | / | \ \/\/ /\_____ \ ' + print *,'# | | | \ | |___/ | \ / / \ ' + print *,'# |____| \___ / |_______ \_______ /\__/\ / /_______ / ' + print *,'# \/ \/ \/ \/ \/ ' print *,'# _____ __' print *,'# / ___/__ ___ _ _____ ____/ /_' print *,'# / /__/ _ \/ _ \ |/ / -_) __/ __/' diff --git a/Sources/Divide/Divide_Mod/Logo_Div.f90 b/Sources/Divide/Divide_Mod/Logo_Div.f90 index dbd2b340e..0e11dc583 100644 --- a/Sources/Divide/Divide_Mod/Logo_Div.f90 +++ b/Sources/Divide/Divide_Mod/Logo_Div.f90 @@ -12,12 +12,12 @@ subroutine Logo_Div(Divide) print *,'#===================================' // & '====================================' print *,'#' - print *,'# ______________________ ____ ________ __ __ _________' - print *,'# \__ ___/\_ _____/| | \_____ \/ \ / \/ _____/' - print *,'# | | | __) | | / | \ \/\/ /\_____ \' - print *,'# | | | \ | |___/ | \ / / \' - print *,'# |____| \___ / |_______ \_______ /\__/\ / /_______ /' - print *,'# \/ \/ \/ \/ \/' + print *,'# ______________________ ____ ________ __ __ _________ ' + print *,'# \__ ___/\_ _____/| | \_____ \/ \ / \/ _____/ ' + print *,'# | | | __) | | / | \ \/\/ /\_____ \ ' + print *,'# | | | \ | |___/ | \ / / \ ' + print *,'# |____| \___ / |_______ \_______ /\__/\ / /_______ / ' + print *,'# \/ \/ \/ \/ \/ ' print *,'# ___ _ _ __' print *,'# / _ \(_) __(_)__/ /__' print *,'# / // / / |/ / / _ / -_)' diff --git a/Sources/Generate/Generate_Mod/Logo_Gen.f90 b/Sources/Generate/Generate_Mod/Logo_Gen.f90 index d0d6bfdda..dbe9af663 100644 --- a/Sources/Generate/Generate_Mod/Logo_Gen.f90 +++ b/Sources/Generate/Generate_Mod/Logo_Gen.f90 @@ -11,12 +11,12 @@ subroutine Logo_Gen(Generate) print *,'#===================================' // & '====================================' print *,'#' - print *,'# ______________________ ____ ________ __ __ _________' - print *,'# \__ ___/\_ _____/| | \_____ \/ \ / \/ _____/' - print *,'# | | | __) | | / | \ \/\/ /\_____ \' - print *,'# | | | \ | |___/ | \ / / \' - print *,'# |____| \___ / |_______ \_______ /\__/\ / /_______ /' - print *,'# \/ \/ \/ \/ \/' + print *,'# ______________________ ____ ________ __ __ _________ ' + print *,'# \__ ___/\_ _____/| | \_____ \/ \ / \/ _____/ ' + print *,'# | | | __) | | / | \ \/\/ /\_____ \ ' + print *,'# | | | \ | |___/ | \ / / \ ' + print *,'# |____| \___ / |_______ \_______ /\__/\ / /_______ / ' + print *,'# \/ \/ \/ \/ \/ ' print *,'# _____ __' print *,'# / ___/__ ___ ___ _______ _/ /____' print *,'# / (_ / -_) _ \/ -_) __/ _ `/ __/ -_)' From 7658deabcc11db3ca58785dcde13711306a7df53 Mon Sep 17 00:00:00 2001 From: Niceno Date: Fri, 24 Mar 2023 15:06:09 +0100 Subject: [PATCH 133/223] OK, this is kind of smart. It doesn't "make clean" for each new test case, but only changes "User_Mod". Tests are much, much faster now. Also, compilations are with OMP since some test cases rely on that. On branch bojan_more_robust_communicator modified: Tests/test_user_functions_compile.sh --- Tests/test_user_functions_compile.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Tests/test_user_functions_compile.sh b/Tests/test_user_functions_compile.sh index 53c247893..cb5b579f9 100755 --- a/Tests/test_user_functions_compile.sh +++ b/Tests/test_user_functions_compile.sh @@ -5,13 +5,15 @@ echo "#!/bin/bash" > worker.sh echo "" >> worker.sh echo "cd ../Sources/Process" >> worker.sh echo "" >> worker.sh +echo "make clean" >> worker.sh +echo "" >> worker.sh echo "old_directory=$PWD" >> worker.sh echo "" >> worker.sh # Find all directories with user function and append commands # for their compilation to the beginning of the test script find . -name "User_Mod" \ -| sed 's/\.\//make clean; make DIR_CASE=..\/..\/Tests\//g' \ +| sed 's/\.\//rm -f ..\/..\/Binaries\/Process; rm -fR User_Mod; git checkout User_Mod; make OMP=yes DIR_CASE=..\/..\/Tests\//g' \ | sed 's/\/User_Mod/\nif \[ -f ..\/..\/Binaries\/Process \]; then echo "SUCCESS"; else echo "FAILURE"; fi/g' \ >> worker.sh From 591e292f8cba7c0ff93174bd6ff24920b8a20ba9 Mon Sep 17 00:00:00 2001 From: Niceno Date: Fri, 24 Mar 2023 15:07:48 +0100 Subject: [PATCH 134/223] Insignificant little change in the document. On branch bojan_more_robust_communicator modified: Documentation/all_control_keywords --- Documentation/all_control_keywords | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/all_control_keywords b/Documentation/all_control_keywords index 1a211ed79..d329ac2a6 100644 --- a/Documentation/all_control_keywords +++ b/Documentation/all_control_keywords @@ -131,7 +131,7 @@ PRESSURE_DROPS | 0.0, 0.0, 0.0 | any triplet of real numbers REFERENCE_DENSITY | 0.0 | real number > 0.0 REFERENCE_TEMPERATURE | 0.0 | real number > 0.0 - ROUGHNESS_COEFFICIENT | 0.0 + ROUGHNESS_COEFFICIENT | 0.0 | real number >= 0.0 ROUGH_WALLS | no | yes SATURATION_TEMPERATURE | 100.0 | depends on liquid and pressure SCALARS_DIFFUSIVITY | 1.0-6 | physical property, usually around 1.0e-9 From 21c5069081d26b3b18f7d6b3a12354b15f571045 Mon Sep 17 00:00:00 2001 From: Niceno Date: Fri, 24 Mar 2023 15:51:21 +0100 Subject: [PATCH 135/223] Added --- Documentation/fortran.vim | 619 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 619 insertions(+) create mode 100644 Documentation/fortran.vim diff --git a/Documentation/fortran.vim b/Documentation/fortran.vim new file mode 100644 index 000000000..f8c869241 --- /dev/null +++ b/Documentation/fortran.vim @@ -0,0 +1,619 @@ +" Vim syntax file +" Language: Fortran 2008 (and older: Fortran 2003, 95, 90, and 77) +" Version: (v104) 2021 April 06 +" Maintainer: Ajit J. Thakkar ; +" Usage: For instructions, do :help fortran-syntax from Vim +" Credits: +" Version 0.1 for Fortran 95 was created in April 2000 by Ajit Thakkar from an +" older Fortran 77 syntax file by Mario Eusebio and Preben Guldberg. +" Since then, useful suggestions and contributions have been made, in order, by: +" Andrej Panjkov, Bram Moolenaar, Thomas Olsen, Michael Sternberg, Christian Reile, +" Walter Dieudonne, Alexander Wagner, Roman Bertle, Charles Rendleman, +" Andrew Griffiths, Joe Krahn, Hendrik Merx, Matt Thompson, Jan Hermann, +" Stefano Zaghi, Vishnu V. Krishnan, Judicael Grasset, Takuma Yoshida, +" Eisuke Kawashima, Andre Chalella, and Fritz Reese. + +if exists("b:current_syntax") + finish +endif + +let s:cpo_save = &cpo +set cpo&vim + +" Choose fortran_dialect using the priority: +" source file directive > buffer-local value > global value > file extension +" first try using directive in first three lines of file +let b:fortran_retype = getline(1)." ".getline(2)." ".getline(3) +if b:fortran_retype =~? '\' + let b:fortran_dialect = "F" +elseif b:fortran_retype =~? '\' + let b:fortran_dialect = "f08" +elseif !exists("b:fortran_dialect") + if exists("g:fortran_dialect") && g:fortran_dialect =~# '\' + " try global variable + let b:fortran_dialect = g:fortran_dialect + else " nothing found, so use default + let b:fortran_dialect = "f08" + endif +endif +unlet! b:fortran_retype +" make sure buffer-local value is not invalid +if b:fortran_dialect !~# '\' + let b:fortran_dialect = "f08" +endif + +" Choose between fixed and free source form if this hasn't been done yet +if !exists("b:fortran_fixed_source") + if b:fortran_dialect == "F" + " F requires free source form + let b:fortran_fixed_source = 0 + elseif exists("fortran_free_source") + " User guarantees free source form for all fortran files + let b:fortran_fixed_source = 0 + elseif exists("fortran_fixed_source") + " User guarantees fixed source form for all fortran files + let b:fortran_fixed_source = 1 + elseif expand("%:e") =~? '^f\%(90\|95\|03\|08\)$' + " Free-form file extension defaults as in Intel ifort, gcc(gfortran), NAG, Pathscale, and Cray compilers + let b:fortran_fixed_source = 0 + elseif expand("%:e") =~? '^\%(f\|f77\|for\)$' + " Fixed-form file extension defaults + let b:fortran_fixed_source = 1 + else + " Modern fortran still allows both free and fixed source form. + " Assume fixed source form unless signs of free source form + " are detected in the first five columns of the first s:lmax lines. + " Detection becomes more accurate and time-consuming if more lines + " are checked. Increase the limit below if you keep lots of comments at + " the very top of each file and you have a fast computer. + let s:lmax = 500 + if ( s:lmax > line("$") ) + let s:lmax = line("$") + endif + let b:fortran_fixed_source = 1 + let s:ln=1 + while s:ln <= s:lmax + let s:test = strpart(getline(s:ln),0,5) + if s:test !~ '^[Cc*]' && s:test !~ '^ *[!#]' && s:test =~ '[^ 0-9\t]' && s:test !~ '^[ 0-9]*\t' + let b:fortran_fixed_source = 0 + break + endif + let s:ln = s:ln + 1 + endwhile + unlet! s:lmax s:ln s:test + endif +endif + +"=====================================================================[T-Flows]= +" Do not ignore the case +" syn case ignore +"---------------------------------------------------------------------[T-Flows]- + +if b:fortran_fixed_source == 1 + syn match fortranConstructName "^\s\{6,}\zs\a\w*\ze\s*:" +else + syn match fortranConstructName "^\s*\zs\a\w*\ze\s*:" +endif +if exists("fortran_more_precise") + syn match fortranConstructName "\(\" +syn match fortranType "\" +syn match fortranType "\" +syn match fortranType "\" +syn match fortranType "\" +syn match fortranType "\" +syn keyword fortranType intrinsic +syn match fortranType "\" +syn keyword fortranStructure dimension +syn keyword fortranStorageClass parameter save +syn match fortranUnitHeader "\" +"=====================================================================[T-Flows]= +" Got rid of the special group for call ... +" syn keyword fortranCall call +"---------------------------------------------------------------------[T-Flows]- +syn match fortranUnitHeader "\" +syn match fortranUnitHeader "\" +syn match fortranUnitHeader "\" +"=====================================================================[T-Flows]= +" ... and added it (call) to the keywords +" syn keyword fortranKeyword return stop +syn keyword fortranKeyword return stop call +"---------------------------------------------------------------------[T-Flows]- +syn keyword fortranConditional else then +syn match fortranConditional "\" +syn match fortranConditionalOb "\" + +syn keyword fortranTodo contained todo fixme + +"Catch errors caused by too many right parentheses +syn region fortranParen transparent start="(" end=")" contains=ALLBUT,fortranParenError,@fortranCommentGroup,cIncluded,@spell +syn match fortranParenError ")" + +syn match fortranOperator "\.\s*n\=eqv\s*\." +syn match fortranOperator "\.\s*\(and\|or\|not\)\s*\." +syn match fortranOperator "\(+\|-\|/\|\*\)" +syn match fortranTypeOb "\" +syn match fortranType "\" + +"Numbers of various sorts +" Integers +syn match fortranNumber display "\<\d\+\(_\a\w*\)\=\>" +" floating point number, without a decimal point +syn match fortranFloatIll display "\<\d\+[deq][-+]\=\d\+\(_\a\w*\)\=\>" +" floating point number, starting with a decimal point +syn match fortranFloatIll display "\.\d\+\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>" +" floating point number, no digits after decimal +syn match fortranFloatIll display "\<\d\+\.\([deq][-+]\=\d\+\)\=\(_\a\w*\)\=\>" +" floating point number, D or Q exponents +syn match fortranFloatIll display "\<\d\+\.\d\+\([dq][-+]\=\d\+\)\=\(_\a\w*\)\=\>" +" floating point number +syn match fortranFloat display "\<\d\+\.\d\+\(e[-+]\=\d\+\)\=\(_\a\w*\)\=\>" +" binary number +syn match fortranBinary display "b["'][01]\+["']" +" octal number +syn match fortranOctal display "o["'][0-7]\+["']" +" hexadecimal number +syn match fortranHex display "z["'][0-9A-F]\+["']" +" Numbers in formats +syn match fortranFormatSpec display "\d*f\d\+\.\d\+" +syn match fortranFormatSpec display "\d*e[sn]\=\d\+\.\d\+\(e\d+\>\)\=" +syn match fortranFormatSpec display "\d*\(d\|q\|g\)\d\+\.\d\+\(e\d+\)\=" +syn match fortranFormatSpec display "\d\+x\>" +" The next match cannot be used because it would pick up identifiers as well +" syn match fortranFormatSpec display "\<\(a\|i\)\d\+" + +" Numbers as labels +syn match fortranLabelNumber display "^\d\{1,5}\s"me=e-1 +syn match fortranLabelNumber display "^ \d\{1,4}\s"ms=s+1,me=e-1 +syn match fortranLabelNumber display "^ \d\{1,3}\s"ms=s+2,me=e-1 +syn match fortranLabelNumber display "^ \d\d\=\s"ms=s+3,me=e-1 +syn match fortranLabelNumber display "^ \d\s"ms=s+4,me=e-1 + +if exists("fortran_more_precise") + " Numbers as targets + syn match fortranTarget display "\(\" + syn match fortranTarget display "\(\" + syn match fortranTarget display "\(\" +endif + +syn keyword fortranTypeR external +syn keyword fortranIOR format +syn match fortranKeywordR "\" +syn match fortranKeyword "^\s*\d\+\s\+continue\>" +syn match fortranKeyword "\" +syn match fortranKeywordDel "\" +syn keyword fortranType none + +syn keyword fortranStructure private public intent optional +syn keyword fortranStructure pointer target allocatable +syn keyword fortranStorageClass in out +syn match fortranStorageClass "\" +syn match fortranUnitHeader "\" +syn keyword fortranUnitHeader use only contains +syn keyword fortranUnitHeader result operator assignment +syn match fortranUnitHeader "\" +syn keyword fortranKeyword allocate deallocate nullify cycle exit +syn match fortranConditional "\" +syn keyword fortranConditional case default where elsewhere + +syn match fortranOperator "\(\(>\|<\)=\=\|==\|/=\|=\)" +syn match fortranOperator "=>" + +syn region fortranString start=+"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber +syn keyword fortranIO pad position action delim readwrite +syn keyword fortranIO eor advance nml + +syn keyword fortranIntrinsic adjustl adjustr all allocated any associated bit_size btest ceiling count cshift date_and_time digits dot_product eoshift epsilon exponent floor fraction huge iand ibclr ibits ibset ieor ior ishft ishftc lbound len_trim matmul maxexponent maxloc maxval merge minexponent minloc minval modulo mvbits nearest pack precision present product radix random_number random_seed range repeat reshape rrspacing +syn keyword fortranIntrinsic scale scan selected_int_kind selected_real_kind set_exponent shape size spacing spread sum system_clock tiny transpose trim ubound unpack verify +syn match fortranIntrinsic "\\(\s*\.\)\@!"me=s+3 +syn match fortranIntrinsic "\\s*[(,]"me=s+4 + +syn match fortranUnitHeader "\" +syn keyword fortranIOR namelist +syn keyword fortranConditionalR while +syn keyword fortranIntrinsicR achar iachar transfer + +syn keyword fortranInclude include +syn keyword fortranStorageClassR sequence + +syn match fortranConditional "\" +syn match fortranType "\" +syn match fortranType "\" +syn match fortranType "\" +if exists("fortran_more_precise") + syn match fortranConstructName "\(\" +endif + +if b:fortran_dialect == "f08" + " F2003 + syn keyword fortranIntrinsic command_argument_count get_command get_command_argument get_environment_variable is_iostat_end is_iostat_eor move_alloc new_line selected_char_kind same_type_as extends_type_of + " ISO_C_binding + syn keyword fortranConstant c_null_char c_alert c_backspace c_form_feed c_new_line c_carriage_return c_horizontal_tab c_vertical_tab + syn keyword fortranConstant c_int c_short c_long c_long_long c_signed_char c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr + syn keyword fortranIntrinsic iso_c_binding c_loc c_funloc c_associated c_f_pointer c_f_procpointer + syn keyword fortranType c_ptr c_funptr + " ISO_Fortran_env + syn keyword fortranConstant iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit + " IEEE_arithmetic + syn keyword fortranIntrinsic ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode + + syn keyword fortranReadWrite flush wait + syn keyword fortranIO decimal round iomsg + syn keyword fortranType asynchronous nopass non_overridable pass protected volatile extends import + syn keyword fortranType non_intrinsic value bind deferred generic final enumerator + syn match fortranType "\" + syn match fortranType "\" + syn match fortranType "\" + syn match fortranType "\" + syn match fortranConditional "\" + syn match fortranUnitHeader "\" + syn match fortranOperator "\([\|]\)" + + " F2008 + syn keyword fortranIntrinsic acosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2 + syn keyword fortranIntrinsic atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits + syn keyword fortranIntrinsic bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image + syn keyword fortranIO newunit + syn keyword fortranType contiguous + syn keyword fortranRepeat concurrent + +"=====================================================================[T-Flows]= +" T-Flows specific + syn match fortranTypeTflows "\" +" Start with constants from Const_Mod: + syn keyword fortranConstant PROGRAM_NAME + syn keyword fortranConstant VL SL DL MSI DP SP IP LP RP + syn keyword fortranConstant YOCTO ZEPTO ATTO FEMTO PICO NANO MICRO MILI + syn keyword fortranConstant YOTTA ZETTA EXA PETA TERA GIGA MEGA KILO + syn keyword fortranConstant HUGE TINY HUGE_INT EULER PI + syn keyword fortranConstant ONE_THIRD TWO_THIRDS ONE_SIXTH + syn keyword fortranConstant MD MAX_VARS_INTERFACE +" Constants related to indentation (O think they are defined in a few places - bad! + syn keyword fortranConstant IN_0 IN_1 IN_2 IN_3 IN_4 IN_5 +" Constants from Numerics_Mod + syn keyword fortranConstant UPWIND CENTRAL LUDS QUICK SMART GAMMA + syn keyword fortranConstant MINMOD BLENDED SUPERBEE AVL_SMART CICSAM STACS + syn keyword fortranConstant LINEAR PARABOLIC RUNGE_KUTTA_3 + syn keyword fortranConstant SIMPLE PISO CHOI + syn keyword fortranConstant LEAST_SQUARES GAUSS_THEOREM +" Constants from Turb_Mod + syn keyword fortranConstant NO_TURBULENCE_MODEL DNS LES_SMAGORINSKY LES_DYNAMIC + syn keyword fortranConstant LES_WALE LES_TVM K_EPS K_EPS_ZETA_F DES_SPALART + syn keyword fortranConstant SPALART_ALLMARAS RSM_HANJALIC_JAKIRLIC RSM_MANCEAU_HANJALIC + syn keyword fortranConstant HYBRID_LES_RANS HYBRID_LES_PRANDTL STABILIZED SGDH GGDH AFM + syn keyword fortranConstant SWITCH_DISTANCE SWITCH_VELOCITY +" After the constants, I have alternating definitions of types and objects derived from them + syn keyword fortranTypeTflows Domain_Type Generate_Type Convert_Type Grid_Type + syn keyword fortranObjectTflows Dom Generate Convert Grid Prim Dual + syn keyword fortranTypeTflows Math_Type Sort_Type File_Type String_Type Work_Type Tokenizer_Type + syn keyword fortranObjectTflows Math Sort File String Work Line Tok + syn keyword fortranTypeTflows Comm_Type Backup_Type Field_Type Turb_Type Vof_Type Swarm_Type + syn keyword fortranObjectTflows Comm World Backup Bac Flow Fld Turb Tur Vof Swarm Swr + syn keyword fortranObjectTflows This_Proc N_Procs First_Proc Sequential_Run Parallel_Run + syn keyword fortranTypeTflows Front_Type Surf_Type Elem_Type Vert_Type Particle_Type + syn keyword fortranObjectTflows Front Surf Elem Vert Part + syn keyword fortranTypeTflows Monitor_Type Results_Type Porosity_Type Profiler_Type Message_Type + syn keyword fortranObjectTflows Monitor Results Por Profiler Message + syn keyword fortranTypeTflows Var_Type + syn keyword fortranObjectTflows u v w t kin eps zeta f22 uu vv ww uv vw uw ut vt wt t2 vis + syn keyword fortranTypeTflows Matrix_Type Vector_Type Solver_Type Native_Type Petsc_Type Process_Type + syn keyword fortranObjectTflows A M vector b Sol Nat Pet Process +"---------------------------------------------------------------------[T-Flows]- + +" CUDA fortran + syn match fortranTypeCUDA "\" + syn keyword fortranTypeCUDA host global device value + syn keyword fortranTypeCUDA shared constant pinned texture + syn keyword fortranTypeCUDA dim1 dim2 dim3 dim4 + syn keyword fortranTypeCUDA cudadeviceprop cuda_count_kind cuda_stream_kind + syn keyword fortranTypeCUDA cudaEvent cudaFuncAttributes cudaArrayPtr + syn keyword fortranTypeCUDA cudaSymbol cudaChannelFormatDesc cudaPitchedPtr + syn keyword fortranTypeCUDA cudaExtent cudaMemcpy3DParms + syn keyword fortranTypeCUDA cudaFuncCachePreferNone cudaFuncCachePreferShared + syn keyword fortranTypeCUDA cudaFuncCachePreferL1 cudaLimitStackSize + syn keyword fortranTypeCUDA cudaLimitPrintfSize cudaLimitMallocHeapSize + syn keyword fortranTypeCUDA cudaSharedMemBankSizeDefault cudaSharedMemBankSizeFourByte cudaSharedMemBankSizeEightByte + syn keyword fortranTypeCUDA cudaEventDefault cudaEventBlockingSync cudaEventDisableTiming + syn keyword fortranTypeCUDA cudaMemcpyHostToDevice cudaMemcpyDeviceToHost + syn keyword fortranTypeCUDA cudaMemcpyDeviceToDevice + syn keyword fortranTypeCUDA cudaErrorNotReady cudaSuccess cudaErrorInvalidValue + syn keyword fortranTypeCUDA c_devptr + + syn match fortranStringCUDA "blockidx%[xyz]" + syn match fortranStringCUDA "blockdim%[xyz]" + syn match fortranStringCUDA "griddim%[xyz]" + syn match fortranStringCUDA "threadidx%[xyz]" + + syn keyword fortranIntrinsicCUDA warpsize syncthreads syncthreads_and syncthreads_count syncthreads_or threadfence threadfence_block threadfence_system gpu_time allthreads anythread ballot + syn keyword fortranIntrinsicCUDA atomicadd atomicsub atomicmax atomicmin atomicand atomicor atomicxor atomicexch atomicinc atomicdec atomiccas sizeof __shfl __shfl_up __shfl_down __shfl_xor + syn keyword fortranIntrinsicCUDA cudaChooseDevice cudaDeviceGetCacheConfig cudaDeviceGetLimit cudaDeviceGetSharedMemConfig cudaDeviceReset cudaDeviceSetCacheConfig cudaDeviceSetLimit cudaDeviceSetSharedMemConfig cudaDeviceSynchronize cudaGetDevice cudaGetDeviceCount cudaGetDeviceProperties cudaSetDevice cudaSetDeviceFlags cudaSetValidDevices + syn keyword fortranIntrinsicCUDA cudaThreadExit cudaThreadSynchronize cudaGetLastError cudaGetErrorString cudaPeekAtLastError cudaStreamCreate cudaStreamDestroy cudaStreamQuery cudaStreamSynchronize cudaStreamWaitEvent cudaEventCreate cudaEventCreateWithFlags cudaEventDestroy cudaEventElapsedTime cudaEventQuery cudaEventRecord cudaEventSynchronize + syn keyword fortranIntrinsicCUDA cudaFuncGetAttributes cudaFuncSetCacheConfig cudaFuncSetSharedMemConfig cudaSetDoubleForDevice cudaSetDoubleForHost cudaFree cudaFreeArray cudaFreeHost cudaGetSymbolAddress cudaGetSymbolSize + syn keyword fortranIntrinsicCUDA cudaHostAlloc cudaHostGetDevicePointer cudaHostGetFlags cudaHostRegister cudaHostUnregister cudaMalloc cudaMallocArray cudaMallocHost cudaMallocPitch cudaMalloc3D cudaMalloc3DArray + syn keyword fortranIntrinsicCUDA cudaMemcpy cudaMemcpyArraytoArray cudaMemcpyAsync cudaMemcpyFromArray cudaMemcpyFromSymbol cudaMemcpyFromSymbolAsync cudaMemcpyPeer cudaMemcpyPeerAsync cudaMemcpyToArray cudaMemcpyToSymbol cudaMemcpyToSymbolAsync cudaMemcpy2D cudaMemcpy2DArrayToArray cudaMemcpy2DAsync cudaMemcpy2DFromArray cudaMemcpy2DToArray cudaMemcpy3D cudaMemcpy3DAsync + syn keyword fortranIntrinsicCUDA cudaMemGetInfo cudaMemset cudaMemset2D cudaMemset3D cudaDeviceCanAccessPeer cudaDeviceDisablePeerAccess cudaDeviceEnablePeerAccess cudaPointerGetAttributes cudaDriverGetVersion cudaRuntimeGetVersion + + syn region none matchgroup=fortranType start="<<<" end=">>>" contains=ALLBUT,none +endif + +syn cluster fortranCommentGroup contains=fortranTodo + +if (b:fortran_fixed_source == 1) + if !exists("fortran_have_tabs") + " Fixed format requires a textwidth of 72 for code, + " but some vendor extensions allow longer lines + if exists("fortran_extended_line_length") + syn match fortranSerialNumber excludenl "^.\{133,}$"lc=132 + elseif exists("fortran_cardimage_line_length") + syn match fortranSerialNumber excludenl "^.\{81,}$"lc=80 + else + syn match fortranSerialNumber excludenl "^.\{73,}$"lc=72 + endif + "Flag left margin errors + syn match fortranLabelError "^.\{-,4}[^0-9 ]" contains=fortranTab + syn match fortranLabelError "^.\{4}\d\S" + endif + syn match fortranComment excludenl "^[!c*].*$" contains=@fortranCommentGroup,@spell + syn match fortranLeftMargin transparent "^ \{5}" + syn match fortranContinueMark display "^.\{5}\S"lc=5 +else + syn match fortranContinueMark display "&" +endif + +syn match fortranComment excludenl "!.*$" contains=@fortranCommentGroup,@spell +syn match fortranOpenMP excludenl "^\s*!\$\(OMP\)\=&\=\s.*$" + +"cpp is often used with Fortran +syn match cPreProc "^\s*#\s*\(define\|ifdef\)\>.*" +syn match cPreProc "^\s*#\s*\(elif\|if\)\>.*" +syn match cPreProc "^\s*#\s*\(ifndef\|undef\)\>.*" +syn match cPreCondit "^\s*#\s*\(else\|endif\)\>.*" +syn region cIncluded contained start=+"[^("]+ skip=+\\\\\|\\"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber +"syn region cIncluded contained start=+"[^("]+ skip=+\\\\\|\\"+ end=+"+ +syn match cIncluded contained "<[^>]*>" +syn match cInclude "^\s*#\s*include\>\s*["<]" contains=cIncluded + +"Synchronising limits assume that comment and continuation lines are not mixed +if exists("fortran_fold") || exists("fortran_more_precise") + syn sync fromstart +elseif (b:fortran_fixed_source == 0) + syn sync linecont "&" minlines=30 +else + syn sync minlines=30 +endif + +if exists("fortran_fold") + + if (b:fortran_fixed_source == 1) + syn region fortranProgram transparent fold keepend start="^\s*program\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\\)\=\|$\)" contains=ALLBUT,fortranModule + syn region fortranModule transparent fold keepend start="^\s*submodule\s\+(\a\w*\s*\(:\a\w*\s*\)*)\s*\z\(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\\)\=\|$\)" contains=ALLBUT,fortranProgram,fortranModule + syn region fortranModule transparent fold keepend start="^\s*module\s\+\(procedure\)\@!\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\\)\=\|$\)" contains=ALLBUT,fortranProgram + syn region fortranFunction transparent fold keepend extend start="^\s*\(elemental \|pure \|impure \|module \|recursive \)\=\s*\(\(\(real \|integer \|logical \|complex \|double \s*precision \)\s*\((\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\|type\s\+(\s*\w\+\s*) \|character \((\(\s*len\s*=\)\=\s*\d\+\s*)\|(\(\s*kind\s*=\)\=\s*\w\+\s*)\)\=\)\=\s*function\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\\)\=\)" contains=ALLBUT,fortranProgram,fortranModule + syn region fortranSubroutine transparent fold keepend extend start="^\s*\(elemental \|pure \|impure \|module \|recursive \)\=\s*subroutine\s\+\z(\a\w*\)" skip="^\([!c*]\|\s*#\).*$" excludenl end="\\)\=\)" contains=ALLBUT,fortranProgram,fortranModule + syn region fortranBlockData transparent fold keepend start="\ Date: Sat, 25 Mar 2023 09:08:24 +0100 Subject: [PATCH 136/223] Found a proper way to deal with \ for Nvidia On branch bojan_more_robust_communicator Changes to be committed: modified: Sources/Convert/Convert_Mod/Logo_Con.f90 modified: Sources/Convert/makefile modified: Sources/Divide/Divide_Mod/Logo_Div.f90 modified: Sources/Divide/makefile modified: Sources/Generate/Generate_Mod/Logo_Gen.f90 modified: Sources/Generate/makefile modified: Sources/Process/Process_Mod/Logo_Pro.f90 modified: Sources/Process/makefile --- Sources/Convert/Convert_Mod/Logo_Con.f90 | 14 ++++++++------ Sources/Convert/makefile | 2 +- Sources/Divide/Divide_Mod/Logo_Div.f90 | 15 +++++++-------- Sources/Divide/makefile | 2 +- Sources/Generate/Generate_Mod/Logo_Gen.f90 | 12 ++++++------ Sources/Generate/makefile | 2 +- Sources/Process/Process_Mod/Logo_Pro.f90 | 16 +++++++--------- Sources/Process/makefile | 2 +- 8 files changed, 32 insertions(+), 33 deletions(-) diff --git a/Sources/Convert/Convert_Mod/Logo_Con.f90 b/Sources/Convert/Convert_Mod/Logo_Con.f90 index 674e0ee61..6d03530d0 100644 --- a/Sources/Convert/Convert_Mod/Logo_Con.f90 +++ b/Sources/Convert/Convert_Mod/Logo_Con.f90 @@ -1,5 +1,7 @@ !==============================================================================! subroutine Logo_Con(Convert) +!------------------------------------------------------------------------------! + implicit none !---------------------------------[Arguments]----------------------------------! class(Convert_Type) :: Convert !------------------------[Avoid unused parent warning]-------------------------! @@ -9,12 +11,12 @@ subroutine Logo_Con(Convert) print *,'#===================================' // & '====================================' print *,'#' - print *,'# ______________________ ____ ________ __ __ _________ ' - print *,'# \__ ___/\_ _____/| | \_____ \/ \ / \/ _____/ ' - print *,'# | | | __) | | / | \ \/\/ /\_____ \ ' - print *,'# | | | \ | |___/ | \ / / \ ' - print *,'# |____| \___ / |_______ \_______ /\__/\ / /_______ / ' - print *,'# \/ \/ \/ \/ \/ ' + print *,'# ______________________ ____ ________ __ __ _________' + print *,'# \__ ___/\_ _____/| | \_____ \/ \ / \/ _____/' + print *,'# | | | __) | | / | \ \/\/ /\_____ \' + print *,'# | | | \ | |___/ | \ / / \' + print *,'# |____| \___ / |_______ \_______ /\__/\ / /_______ /' + print *,'# \/ \/ \/ \/ \/' print *,'# _____ __' print *,'# / ___/__ ___ _ _____ ____/ /_' print *,'# / /__/ _ \/ _ \ |/ / -_) __/ __/' diff --git a/Sources/Convert/makefile b/Sources/Convert/makefile index 3f360328c..55de3b7ff 100644 --- a/Sources/Convert/makefile +++ b/Sources/Convert/makefile @@ -127,7 +127,7 @@ else ifeq ($(FORTRAN), nvidia) else FC = $(FCOMP) endif - OPT_F_COMP = -module $(DIR_MODULE) -cpp + OPT_F_COMP = -module $(DIR_MODULE) -cpp -Mbackslash ifeq ($(DEBUG), yes) OPT_F_COMP += -O0 -g else diff --git a/Sources/Divide/Divide_Mod/Logo_Div.f90 b/Sources/Divide/Divide_Mod/Logo_Div.f90 index 0e11dc583..43db3a25d 100644 --- a/Sources/Divide/Divide_Mod/Logo_Div.f90 +++ b/Sources/Divide/Divide_Mod/Logo_Div.f90 @@ -1,8 +1,7 @@ !==============================================================================! subroutine Logo_Div(Divide) !------------------------------------------------------------------------------! -!----------------------------------[Modules]-----------------------------------! - use Const_Mod + implicit none !---------------------------------[Arguments]----------------------------------! class(Divide_Type) :: Divide !------------------------[Avoid unused parent warning]-------------------------! @@ -12,12 +11,12 @@ subroutine Logo_Div(Divide) print *,'#===================================' // & '====================================' print *,'#' - print *,'# ______________________ ____ ________ __ __ _________ ' - print *,'# \__ ___/\_ _____/| | \_____ \/ \ / \/ _____/ ' - print *,'# | | | __) | | / | \ \/\/ /\_____ \ ' - print *,'# | | | \ | |___/ | \ / / \ ' - print *,'# |____| \___ / |_______ \_______ /\__/\ / /_______ / ' - print *,'# \/ \/ \/ \/ \/ ' + print *,'# ______________________ ____ ________ __ __ _________' + print *,'# \__ ___/\_ _____/| | \_____ \/ \ / \/ _____/' + print *,'# | | | __) | | / | \ \/\/ /\_____ \' + print *,'# | | | \ | |___/ | \ / / \' + print *,'# |____| \___ / |_______ \_______ /\__/\ / /_______ /' + print *,'# \/ \/ \/ \/ \/' print *,'# ___ _ _ __' print *,'# / _ \(_) __(_)__/ /__' print *,'# / // / / |/ / / _ / -_)' diff --git a/Sources/Divide/makefile b/Sources/Divide/makefile index 1120c24ac..f96aabc95 100644 --- a/Sources/Divide/makefile +++ b/Sources/Divide/makefile @@ -126,7 +126,7 @@ else ifeq ($(FORTRAN), nvidia) else FC = $(FCOMP) endif - OPT_F_COMP = -module $(DIR_MODULE) -cpp + OPT_F_COMP = -module $(DIR_MODULE) -cpp -Mbackslash ifeq ($(DEBUG), yes) OPT_F_COMP += -O0 -g else diff --git a/Sources/Generate/Generate_Mod/Logo_Gen.f90 b/Sources/Generate/Generate_Mod/Logo_Gen.f90 index dbe9af663..d0d6bfdda 100644 --- a/Sources/Generate/Generate_Mod/Logo_Gen.f90 +++ b/Sources/Generate/Generate_Mod/Logo_Gen.f90 @@ -11,12 +11,12 @@ subroutine Logo_Gen(Generate) print *,'#===================================' // & '====================================' print *,'#' - print *,'# ______________________ ____ ________ __ __ _________ ' - print *,'# \__ ___/\_ _____/| | \_____ \/ \ / \/ _____/ ' - print *,'# | | | __) | | / | \ \/\/ /\_____ \ ' - print *,'# | | | \ | |___/ | \ / / \ ' - print *,'# |____| \___ / |_______ \_______ /\__/\ / /_______ / ' - print *,'# \/ \/ \/ \/ \/ ' + print *,'# ______________________ ____ ________ __ __ _________' + print *,'# \__ ___/\_ _____/| | \_____ \/ \ / \/ _____/' + print *,'# | | | __) | | / | \ \/\/ /\_____ \' + print *,'# | | | \ | |___/ | \ / / \' + print *,'# |____| \___ / |_______ \_______ /\__/\ / /_______ /' + print *,'# \/ \/ \/ \/ \/' print *,'# _____ __' print *,'# / ___/__ ___ ___ _______ _/ /____' print *,'# / (_ / -_) _ \/ -_) __/ _ `/ __/ -_)' diff --git a/Sources/Generate/makefile b/Sources/Generate/makefile index 497936e78..0f4a4b94f 100644 --- a/Sources/Generate/makefile +++ b/Sources/Generate/makefile @@ -127,7 +127,7 @@ else ifeq ($(FORTRAN), nvidia) else FC = $(FCOMP) endif - OPT_F_COMP = -module $(DIR_MODULE) -cpp + OPT_F_COMP = -module $(DIR_MODULE) -cpp -Mbackslash ifeq ($(DEBUG), yes) OPT_F_COMP += -O0 -g else diff --git a/Sources/Process/Process_Mod/Logo_Pro.f90 b/Sources/Process/Process_Mod/Logo_Pro.f90 index 8b786bb2e..3f39d6837 100644 --- a/Sources/Process/Process_Mod/Logo_Pro.f90 +++ b/Sources/Process/Process_Mod/Logo_Pro.f90 @@ -1,9 +1,7 @@ !==============================================================================! subroutine Logo_Pro(Process) !------------------------------------------------------------------------------! -!----------------------------------[Modules]-----------------------------------! - use Const_Mod - use Solver_Mod, only: PETSC_ACTIVE, this_proc + implicit none !---------------------------------[Arguments]----------------------------------! class(Process_Type) :: Process !------------------------[Avoid unused parent warning]-------------------------! @@ -14,12 +12,12 @@ subroutine Logo_Pro(Process) print *,'#===================================' // & '====================================' print *,'#' - print *,'# ______________________ ____ ________ __ __ _________ ' - print *,'# \__ ___/\_ _____/| | \_____ \/ \ / \/ _____/ ' - print *,'# | | | __) | | / | \ \/\/ /\_____ \ ' - print *,'# | | | \ | |___/ | \ / / \ ' - print *,'# |____| \___ / |_______ \_______ /\__/\ / /_______ / ' - print *,'# \/ \/ \/ \/ \/ ' + print *,'# ______________________ ____ ________ __ __ _________' + print *,'# \__ ___/\_ _____/| | \_____ \/ \ / \/ _____/' + print *,'# | | | __) | | / | \ \/\/ /\_____ \' + print *,'# | | | \ | |___/ | \ / / \' + print *,'# |____| \___ / |_______ \_______ /\__/\ / /_______ /' + print *,'# \/ \/ \/ \/ \/' print *,'# ___' print *,'# / _ \_______ _______ ___ ___' print *,'# / ___/ __/ _ \/ __/ -_|_-<(_-<' diff --git a/Sources/Process/makefile b/Sources/Process/makefile index 61c2b45eb..fcd52d1c6 100644 --- a/Sources/Process/makefile +++ b/Sources/Process/makefile @@ -136,7 +136,7 @@ else ifeq ($(FORTRAN), nvidia) else FC = $(FCOMP) endif - OPT_F_COMP = -module $(DIR_MODULE) -cpp + OPT_F_COMP = -module $(DIR_MODULE) -cpp -Mbackslash ifeq ($(DEBUG), yes) OPT_F_COMP += -O0 -g else From 7056a19c53b479ebb4b5525bb713705ec5d91000 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 25 Mar 2023 09:27:44 +0100 Subject: [PATCH 137/223] For compilation with Nvidia Fortran On branch bojan_more_robust_communicator modified: Convert/Convert_Mod/Load_Fluent.f90 --- Sources/Convert/Convert_Mod/Load_Fluent.f90 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Sources/Convert/Convert_Mod/Load_Fluent.f90 b/Sources/Convert/Convert_Mod/Load_Fluent.f90 index f7381267a..625fe2c84 100644 --- a/Sources/Convert/Convert_Mod/Load_Fluent.f90 +++ b/Sources/Convert/Convert_Mod/Load_Fluent.f90 @@ -9,7 +9,9 @@ subroutine Load_Fluent(Convert, Grid, file_name) type(Grid_Type) :: Grid character(SL) :: file_name !----------------------------------[Calling]-----------------------------------! +# ifdef __NVCOMPILER_LLVM__ integer :: ftell ! needed for Nvidia compiler +# endif !------------------------------[Local parameters]------------------------------! integer, parameter :: MIXED_ZONE = 0 integer, parameter :: CELL_TRI = 1 From 970f297b551bc54201567237f09f64376256d7d4 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 25 Mar 2023 09:28:16 +0100 Subject: [PATCH 138/223] Prescribed intention in many procedures On branch bojan_more_robust_communicator modified: Shared/Comm_Mod/Parallel/Close_File.f90 modified: Shared/Comm_Mod/Parallel/Create_New_Types.f90 modified: Shared/Comm_Mod/Parallel/Read_Bnd_Real.f90 modified: Shared/Comm_Mod/Parallel/Read_Cell_Real.f90 modified: Shared/Comm_Mod/Parallel/Read_Int.f90 modified: Shared/Comm_Mod/Parallel/Read_Int_Array.f90 modified: Shared/Comm_Mod/Parallel/Read_Log.f90 modified: Shared/Comm_Mod/Parallel/Read_Log_Array.f90 modified: Shared/Comm_Mod/Parallel/Read_Real.f90 modified: Shared/Comm_Mod/Parallel/Read_Real_Array.f90 modified: Shared/Comm_Mod/Parallel/Read_Text.f90 modified: Shared/Comm_Mod/Parallel/Write_Int.f90 modified: Shared/Comm_Mod/Parallel/Write_Int_Array.f90 modified: Shared/Comm_Mod/Parallel/Write_Log.f90 modified: Shared/Comm_Mod/Parallel/Write_Log_Array.f90 modified: Shared/Comm_Mod/Parallel/Write_Real.f90 modified: Shared/Comm_Mod/Parallel/Write_Real_Array.f90 modified: Shared/Comm_Mod/Parallel/Write_Text.f90 modified: Shared/Comm_Mod/Sequential/Close_File.f90 modified: Shared/Comm_Mod/Sequential/Create_New_Types.f90 modified: Shared/Comm_Mod/Sequential/Read_Bnd_Real.f90 modified: Shared/Comm_Mod/Sequential/Read_Cell_Real.f90 modified: Shared/Comm_Mod/Sequential/Read_Int.f90 modified: Shared/Comm_Mod/Sequential/Read_Int_Array.f90 modified: Shared/Comm_Mod/Sequential/Read_Log.f90 modified: Shared/Comm_Mod/Sequential/Read_Log_Array.f90 modified: Shared/Comm_Mod/Sequential/Read_Real.f90 modified: Shared/Comm_Mod/Sequential/Read_Real_Array.f90 modified: Shared/Comm_Mod/Sequential/Read_Text.f90 modified: Shared/Comm_Mod/Sequential/Write_Int.f90 modified: Shared/Comm_Mod/Sequential/Write_Int_Array.f90 modified: Shared/Comm_Mod/Sequential/Write_Log.f90 modified: Shared/Comm_Mod/Sequential/Write_Log_Array.f90 modified: Shared/Comm_Mod/Sequential/Write_Real.f90 modified: Shared/Comm_Mod/Sequential/Write_Real_Array.f90 modified: Shared/Comm_Mod/Sequential/Write_Text.f90 --- Sources/Shared/Comm_Mod/Parallel/Close_File.f90 | 4 ++-- Sources/Shared/Comm_Mod/Parallel/Create_New_Types.f90 | 2 +- Sources/Shared/Comm_Mod/Parallel/Read_Bnd_Real.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Parallel/Read_Cell_Real.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Parallel/Read_Int.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Parallel/Read_Int_Array.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Parallel/Read_Log.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Parallel/Read_Log_Array.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Parallel/Read_Real.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Parallel/Read_Real_Array.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Parallel/Read_Text.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Parallel/Write_Int.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Parallel/Write_Int_Array.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Parallel/Write_Log.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Parallel/Write_Log_Array.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Parallel/Write_Real.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Parallel/Write_Real_Array.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Parallel/Write_Text.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Sequential/Close_File.f90 | 4 ++-- Sources/Shared/Comm_Mod/Sequential/Create_New_Types.f90 | 2 +- Sources/Shared/Comm_Mod/Sequential/Read_Bnd_Real.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Sequential/Read_Cell_Real.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Sequential/Read_Int.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Sequential/Read_Int_Array.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Sequential/Read_Log.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Sequential/Read_Log_Array.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Sequential/Read_Real.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Sequential/Read_Real_Array.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Sequential/Read_Text.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Sequential/Write_Int.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Sequential/Write_Int_Array.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Sequential/Write_Log.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Sequential/Write_Log_Array.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Sequential/Write_Real.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Sequential/Write_Real_Array.f90 | 8 ++++---- Sources/Shared/Comm_Mod/Sequential/Write_Text.f90 | 8 ++++---- 36 files changed, 134 insertions(+), 134 deletions(-) diff --git a/Sources/Shared/Comm_Mod/Parallel/Close_File.f90 b/Sources/Shared/Comm_Mod/Parallel/Close_File.f90 index 0abac663c..622be8ffb 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Close_File.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Close_File.f90 @@ -5,8 +5,8 @@ subroutine Close_File(Comm, fh) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - type(Mpi_File) :: fh ! file handle + class(Comm_Type), intent(in) :: Comm + type(Mpi_File), intent(inout) :: fh ! file handle !-----------------------------------[Locals]-----------------------------------! integer :: error !------------------------[Avoid unused parent warning]-------------------------! diff --git a/Sources/Shared/Comm_Mod/Parallel/Create_New_Types.f90 b/Sources/Shared/Comm_Mod/Parallel/Create_New_Types.f90 index 3a6fe14fa..186029253 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Create_New_Types.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Create_New_Types.f90 @@ -5,7 +5,7 @@ subroutine Create_New_Types(Comm) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm + class(Comm_Type), intent(inout) :: Comm !-----------------------------------[Locals]-----------------------------------! integer :: error = 0 !==============================================================================! diff --git a/Sources/Shared/Comm_Mod/Parallel/Read_Bnd_Real.f90 b/Sources/Shared/Comm_Mod/Parallel/Read_Bnd_Real.f90 index 3fd3059ce..9a7c9126a 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Read_Bnd_Real.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Read_Bnd_Real.f90 @@ -5,10 +5,10 @@ subroutine Read_Bnd_Real(Comm, fh, array, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - type(Mpi_File) :: fh ! file handle - real :: array(:) - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + type(Mpi_File), intent(in) :: fh ! file handle + real, intent(out) :: array(:) + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: error = 0 !==============================================================================! diff --git a/Sources/Shared/Comm_Mod/Parallel/Read_Cell_Real.f90 b/Sources/Shared/Comm_Mod/Parallel/Read_Cell_Real.f90 index 644086b96..e55edfe0e 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Read_Cell_Real.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Read_Cell_Real.f90 @@ -5,10 +5,10 @@ subroutine Read_Cell_Real(Comm, fh, array, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - type(Mpi_File) :: fh ! file handle - real :: array(:) - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + type(Mpi_File), intent(in) :: fh ! file handle + real, dimension(:), intent(out) :: array(:) ! array to read + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: error = 0 !==============================================================================! diff --git a/Sources/Shared/Comm_Mod/Parallel/Read_Int.f90 b/Sources/Shared/Comm_Mod/Parallel/Read_Int.f90 index 548f065fd..cb6ea48e8 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Read_Int.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Read_Int.f90 @@ -5,10 +5,10 @@ subroutine Read_Int(Comm, fh, num, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - type(Mpi_File) :: fh ! file handle - integer :: num ! number to read - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + type(Mpi_File), intent(in) :: fh ! file handle + integer, intent(out) :: num ! number to read + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: error = 0 !------------------------[Avoid unused parent warning]-------------------------! diff --git a/Sources/Shared/Comm_Mod/Parallel/Read_Int_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Read_Int_Array.f90 index 4b95bfe49..a4a22a363 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Read_Int_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Read_Int_Array.f90 @@ -5,10 +5,10 @@ subroutine Read_Int_Array(Comm, fh, arr, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - type(Mpi_File) :: fh ! file handle - integer, dimension(:) :: arr ! array to read - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + type(Mpi_File), intent(in) :: fh ! file handle + integer, dimension(:), intent(out) :: arr ! array to read + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: length integer :: error = 0 diff --git a/Sources/Shared/Comm_Mod/Parallel/Read_Log.f90 b/Sources/Shared/Comm_Mod/Parallel/Read_Log.f90 index 4dbc9703f..8cd64fee8 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Read_Log.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Read_Log.f90 @@ -5,10 +5,10 @@ subroutine Read_Log(Comm, fh, var, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - type(Mpi_File) :: fh ! file handle - logical :: var ! variable to read - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + type(Mpi_File), intent(in) :: fh ! file handle + logical, intent(out) :: var ! variable to read + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: error = 0 !------------------------[Avoid unused parent warning]-------------------------! diff --git a/Sources/Shared/Comm_Mod/Parallel/Read_Log_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Read_Log_Array.f90 index 59a496e77..3d536afbc 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Read_Log_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Read_Log_Array.f90 @@ -5,10 +5,10 @@ subroutine Read_Log_Array(Comm, fh, arr, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - type(Mpi_File) :: fh ! file handle - logical, dimension(:) :: arr ! array to read - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + type(Mpi_File), intent(in) :: fh ! file handle + logical, dimension(:), intent(out) :: arr ! array to read + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: length integer :: error = 0 diff --git a/Sources/Shared/Comm_Mod/Parallel/Read_Real.f90 b/Sources/Shared/Comm_Mod/Parallel/Read_Real.f90 index 13c79fc22..280b745df 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Read_Real.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Read_Real.f90 @@ -5,10 +5,10 @@ subroutine Read_Real(Comm, fh, num, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - type(Mpi_File) :: fh ! file handle - real :: num ! number to write out - integer(DP) :: disp ! diplacement in bytes + class(Comm_Type), intent(in) :: Comm + type(Mpi_File), intent(in) :: fh ! file handle + real, intent(out) :: num ! number to write out + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: error = 0 !------------------------[Avoid unused parent warning]-------------------------! diff --git a/Sources/Shared/Comm_Mod/Parallel/Read_Real_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Read_Real_Array.f90 index 39ed4858e..f49c982ff 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Read_Real_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Read_Real_Array.f90 @@ -5,10 +5,10 @@ subroutine Read_Real_Array(Comm, fh, arr, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - type(Mpi_File) :: fh ! file handle - real, dimension(:) :: arr ! array to read - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + type(Mpi_File), intent(in) :: fh ! file handle + real, dimension(:), intent(out) :: arr ! array to read + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: length integer :: error = 0 diff --git a/Sources/Shared/Comm_Mod/Parallel/Read_Text.f90 b/Sources/Shared/Comm_Mod/Parallel/Read_Text.f90 index 380f75e1e..2276b9459 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Read_Text.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Read_Text.f90 @@ -5,10 +5,10 @@ subroutine Read_Text(Comm, fh, text_in, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - type(Mpi_File) :: fh ! file handle - character :: text_in*(*) ! text to write out - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + type(Mpi_File), intent(in) :: fh ! file handle + character, intent(out) :: text_in*(*) ! text to read in + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: leng integer :: error = 0 diff --git a/Sources/Shared/Comm_Mod/Parallel/Write_Int.f90 b/Sources/Shared/Comm_Mod/Parallel/Write_Int.f90 index e2617c5c0..765c7d10b 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Write_Int.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Write_Int.f90 @@ -5,10 +5,10 @@ subroutine Write_Int(Comm, fh, num, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - type(Mpi_File) :: fh ! file handle - integer :: num ! number to write out - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + type(Mpi_File), intent(in) :: fh ! file handle + integer, intent(in) :: num ! variable to write out + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: error = 0 !------------------------[Avoid unused parent warning]-------------------------! diff --git a/Sources/Shared/Comm_Mod/Parallel/Write_Int_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Write_Int_Array.f90 index 3bf261363..73b59be27 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Write_Int_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Write_Int_Array.f90 @@ -5,10 +5,10 @@ subroutine Write_Int_Array(Comm, fh, arr, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - type(Mpi_File) :: fh ! file handle - integer, dimension(:) :: arr ! array to write out - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + type(Mpi_File), intent(in) :: fh ! file handle + integer, dimension(:), intent(in) :: arr ! variable to write out + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: length integer :: error = 0 diff --git a/Sources/Shared/Comm_Mod/Parallel/Write_Log.f90 b/Sources/Shared/Comm_Mod/Parallel/Write_Log.f90 index 0c90caf3c..daacdb85a 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Write_Log.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Write_Log.f90 @@ -5,10 +5,10 @@ subroutine Write_Log(Comm, fh, var, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - type(Mpi_File) :: fh ! file handle - logical :: var ! variable to write out - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + type(Mpi_File), intent(in) :: fh ! file handle + logical, intent(in) :: var ! variable to write out + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: error = 0 !------------------------[Avoid unused parent warning]-------------------------! diff --git a/Sources/Shared/Comm_Mod/Parallel/Write_Log_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Write_Log_Array.f90 index 8a3284de0..89a575f0a 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Write_Log_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Write_Log_Array.f90 @@ -5,10 +5,10 @@ subroutine Write_Log_Array(Comm, fh, arr, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - type(Mpi_File) :: fh ! file handle - logical, dimension(:) :: arr ! array to write out - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + type(Mpi_File), intent(in) :: fh ! file handle + logical, dimension(:), intent(in) :: arr ! variable to write out + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: length integer :: error = 0 diff --git a/Sources/Shared/Comm_Mod/Parallel/Write_Real.f90 b/Sources/Shared/Comm_Mod/Parallel/Write_Real.f90 index 8d4b5af55..4e16b835a 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Write_Real.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Write_Real.f90 @@ -5,10 +5,10 @@ subroutine Write_Real(Comm, fh, num, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - type(Mpi_File) :: fh ! file handle - real :: num ! number to write out - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + type(Mpi_File), intent(in) :: fh ! file handle + real, intent(in) :: num ! number to write out + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: error = 0 !------------------------[Avoid unused parent warning]-------------------------! diff --git a/Sources/Shared/Comm_Mod/Parallel/Write_Real_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Write_Real_Array.f90 index 12ae10d4e..d9975f3d8 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Write_Real_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Write_Real_Array.f90 @@ -5,10 +5,10 @@ subroutine Write_Real_Array(Comm, fh, arr, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - type(Mpi_File) :: fh ! file handle - real, dimension(:) :: arr ! array to write out - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + type(Mpi_File), intent(in) :: fh ! file handle + real, dimension(:), intent(in) :: arr ! array to write out + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: length integer :: error = 0 diff --git a/Sources/Shared/Comm_Mod/Parallel/Write_Text.f90 b/Sources/Shared/Comm_Mod/Parallel/Write_Text.f90 index 8748041ad..6ca453c57 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Write_Text.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Write_Text.f90 @@ -5,10 +5,10 @@ subroutine Write_Text(Comm, fh, text_out, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - type(Mpi_File) :: fh ! file handle - character :: text_out*(*) ! text to write out - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + type(Mpi_File), intent(in) :: fh ! file handle + character, intent(in) :: text_out*(*) ! text to write out + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: leng integer :: error = 0 diff --git a/Sources/Shared/Comm_Mod/Sequential/Close_File.f90 b/Sources/Shared/Comm_Mod/Sequential/Close_File.f90 index 9ad6d8803..ee7106724 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Close_File.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Close_File.f90 @@ -5,8 +5,8 @@ subroutine Close_File(Comm, fh) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: fh ! file handle + class(Comm_Type), intent(in) :: Comm + integer, intent(inout) :: fh ! file handle !------------------------[Avoid unused parent warning]-------------------------! Unused(Comm) !==============================================================================! diff --git a/Sources/Shared/Comm_Mod/Sequential/Create_New_Types.f90 b/Sources/Shared/Comm_Mod/Sequential/Create_New_Types.f90 index a189141ab..7c17ac020 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Create_New_Types.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Create_New_Types.f90 @@ -5,7 +5,7 @@ subroutine Create_New_Types(Comm) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm + class(Comm_Type), intent(inout) :: Comm !------------------------[Avoid unused parent warning]-------------------------! Unused(Comm) !==============================================================================! diff --git a/Sources/Shared/Comm_Mod/Sequential/Read_Bnd_Real.f90 b/Sources/Shared/Comm_Mod/Sequential/Read_Bnd_Real.f90 index 8b93b1317..828530165 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Read_Bnd_Real.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Read_Bnd_Real.f90 @@ -5,10 +5,10 @@ subroutine Read_Bnd_Real(Comm, fh, array, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: fh ! file handle - real :: array(:) - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: fh ! file handle + real, intent(out) :: array(:) + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: c !==============================================================================! diff --git a/Sources/Shared/Comm_Mod/Sequential/Read_Cell_Real.f90 b/Sources/Shared/Comm_Mod/Sequential/Read_Cell_Real.f90 index 8d132a353..2bf170b3f 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Read_Cell_Real.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Read_Cell_Real.f90 @@ -5,10 +5,10 @@ subroutine Read_Cell_Real(Comm, fh, array, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: fh ! file handle - real :: array(:) - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: fh ! file handle + real, dimension(:), intent(out) :: array(:) ! array to read + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: c !==============================================================================! diff --git a/Sources/Shared/Comm_Mod/Sequential/Read_Int.f90 b/Sources/Shared/Comm_Mod/Sequential/Read_Int.f90 index 33642249a..b6c908f11 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Read_Int.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Read_Int.f90 @@ -5,10 +5,10 @@ subroutine Read_Int(Comm, fh, num, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: fh ! file handle - integer :: num ! number to read - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: fh ! file handle + integer, intent(out) :: num ! number to read + integer(DP), intent(inout) :: disp ! displacement in bytes !------------------------[Avoid unused parent warning]-------------------------! Unused(Comm) !==============================================================================! diff --git a/Sources/Shared/Comm_Mod/Sequential/Read_Int_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Read_Int_Array.f90 index 070c0fdef..699506080 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Read_Int_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Read_Int_Array.f90 @@ -5,10 +5,10 @@ subroutine Read_Int_Array(Comm, fh, arr, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: fh ! file handle - integer, dimension(:) :: arr ! array to read - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: fh ! file handle + integer, dimension(:), intent(out) :: arr ! array to read + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: length !------------------------[Avoid unused parent warning]-------------------------! diff --git a/Sources/Shared/Comm_Mod/Sequential/Read_Log.f90 b/Sources/Shared/Comm_Mod/Sequential/Read_Log.f90 index 757002e63..5495158ee 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Read_Log.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Read_Log.f90 @@ -5,10 +5,10 @@ subroutine Read_Log(Comm, fh, var, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: fh ! file handle - logical :: var ! variable to read - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: fh ! file handle + logical, intent(out) :: var ! variable to read + integer(DP), intent(inout) :: disp ! displacement in bytes !------------------------[Avoid unused parent warning]-------------------------! Unused(Comm) !==============================================================================! diff --git a/Sources/Shared/Comm_Mod/Sequential/Read_Log_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Read_Log_Array.f90 index ac17e0055..69ceafd96 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Read_Log_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Read_Log_Array.f90 @@ -5,10 +5,10 @@ subroutine Read_Log_Array(Comm, fh, arr, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: fh ! file handle - logical, dimension(:) :: arr ! array to read - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: fh ! file handle + logical, dimension(:), intent(out) :: arr ! array to read + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: length !------------------------[Avoid unused parent warning]-------------------------! diff --git a/Sources/Shared/Comm_Mod/Sequential/Read_Real.f90 b/Sources/Shared/Comm_Mod/Sequential/Read_Real.f90 index 141af67fd..ef4cd9d1a 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Read_Real.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Read_Real.f90 @@ -5,10 +5,10 @@ subroutine Read_Real(Comm, fh, num, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: fh ! file handle - real :: num ! number to read - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: fh ! file handle + real, intent(out) :: num ! number to write out + integer(DP), intent(inout) :: disp ! displacement in bytes !------------------------[Avoid unused parent warning]-------------------------! Unused(Comm) !==============================================================================! diff --git a/Sources/Shared/Comm_Mod/Sequential/Read_Real_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Read_Real_Array.f90 index 5d5051438..dc54bd159 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Read_Real_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Read_Real_Array.f90 @@ -5,10 +5,10 @@ subroutine Read_Real_Array(Comm, fh, arr, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: fh ! file handle - real, dimension(:) :: arr ! array to read - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: fh ! file handle + real, dimension(:), intent(out) :: arr ! array to read + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: length !------------------------[Avoid unused parent warning]-------------------------! diff --git a/Sources/Shared/Comm_Mod/Sequential/Read_Text.f90 b/Sources/Shared/Comm_Mod/Sequential/Read_Text.f90 index 0b1e5412d..9afbea360 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Read_Text.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Read_Text.f90 @@ -5,10 +5,10 @@ subroutine Read_Text(Comm, fh, text_in, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: fh ! file handle - character :: text_in*(*) ! text to write out - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: fh ! file handle + character, intent(out) :: text_in*(*) ! text to read in + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: leng !------------------------[Avoid unused parent warning]-------------------------! diff --git a/Sources/Shared/Comm_Mod/Sequential/Write_Int.f90 b/Sources/Shared/Comm_Mod/Sequential/Write_Int.f90 index 724b3888f..406f98483 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Write_Int.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Write_Int.f90 @@ -5,10 +5,10 @@ subroutine Write_Int(Comm, fh, num, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: fh ! file handle - integer :: num ! number to write out - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: fh ! file handle + integer, intent(in) :: num ! variable to write out + integer(DP), intent(inout) :: disp ! displacement in bytes !------------------------[Avoid unused parent warning]-------------------------! Unused(Comm) !==============================================================================! diff --git a/Sources/Shared/Comm_Mod/Sequential/Write_Int_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Write_Int_Array.f90 index f16f0cd4b..97f2eb514 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Write_Int_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Write_Int_Array.f90 @@ -5,10 +5,10 @@ subroutine Write_Int_Array(Comm, fh, arr, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: fh ! file handle - integer, dimension(:) :: arr ! array to write out - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: fh ! file handle + integer, dimension(:), intent(in) :: arr ! variable to write out + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: length !------------------------[Avoid unused parent warning]-------------------------! diff --git a/Sources/Shared/Comm_Mod/Sequential/Write_Log.f90 b/Sources/Shared/Comm_Mod/Sequential/Write_Log.f90 index 382d615d0..c8b3a98ae 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Write_Log.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Write_Log.f90 @@ -5,10 +5,10 @@ subroutine Write_Log(Comm, fh, var, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: fh ! file handle - logical :: var ! variable to write out - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: fh ! file handle + logical, intent(in) :: var ! variable to write out + integer(DP), intent(inout) :: disp ! displacement in bytes !------------------------[Avoid unused parent warning]-------------------------! Unused(Comm) !==============================================================================! diff --git a/Sources/Shared/Comm_Mod/Sequential/Write_Log_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Write_Log_Array.f90 index ca8eb9420..6a5b062f5 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Write_Log_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Write_Log_Array.f90 @@ -5,10 +5,10 @@ subroutine Write_Log_Array(Comm, fh, arr, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: fh ! file handle - logical, dimension(:) :: arr ! array to write out - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: fh ! file handle + logical, dimension(:), intent(in) :: arr ! variable to write out + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: length !------------------------[Avoid unused parent warning]-------------------------! diff --git a/Sources/Shared/Comm_Mod/Sequential/Write_Real.f90 b/Sources/Shared/Comm_Mod/Sequential/Write_Real.f90 index dc0843545..f32bb4530 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Write_Real.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Write_Real.f90 @@ -5,10 +5,10 @@ subroutine Write_Real(Comm, fh, num, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: fh ! file handle - real :: num ! number to write out - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: fh ! file handle + real, intent(in) :: num ! number to write out + integer(DP), intent(inout) :: disp ! displacement in bytes !------------------------[Avoid unused parent warning]-------------------------! Unused(Comm) !==============================================================================! diff --git a/Sources/Shared/Comm_Mod/Sequential/Write_Real_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Write_Real_Array.f90 index 2c8138e14..0a44e2699 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Write_Real_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Write_Real_Array.f90 @@ -5,10 +5,10 @@ subroutine Write_Real_Array(Comm, fh, arr, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: fh ! file handle - real, dimension(:) :: arr ! array to write out - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: fh ! file handle + real, dimension(:), intent(in) :: arr ! array to write out + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: length !------------------------[Avoid unused parent warning]-------------------------! diff --git a/Sources/Shared/Comm_Mod/Sequential/Write_Text.f90 b/Sources/Shared/Comm_Mod/Sequential/Write_Text.f90 index 852aed8b4..bca2cba6d 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Write_Text.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Write_Text.f90 @@ -5,10 +5,10 @@ subroutine Write_Text(Comm, fh, text_out, disp) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: fh ! file handle - character :: text_out*(*) ! text to write out - integer(DP) :: disp ! displacement in bytes + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: fh ! file handle + character, intent(in) :: text_out*(*) ! text to write out + integer(DP), intent(inout) :: disp ! displacement in bytes !-----------------------------------[Locals]-----------------------------------! integer :: leng !------------------------[Avoid unused parent warning]-------------------------! From 4750135441e5207315359ba6d60375f4dc175f35 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 25 Mar 2023 11:24:40 +0100 Subject: [PATCH 139/223] Added Nvidia compiler On branch bojan_more_robust_communicator modified: Tests/test_build.sh --- Tests/test_build.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Tests/test_build.sh b/Tests/test_build.sh index ea5bcd0e9..daa1a01ad 100755 --- a/Tests/test_build.sh +++ b/Tests/test_build.sh @@ -1676,6 +1676,10 @@ function chose_test { FCOMP="mpiifort" DEBUG="no" elif [ $FORTRAN == "intel" ]; then + FORTRAN="nvidia" + FCOMP="" + DEBUG="no" + elif [ $FORTRAN == "nvidia" ]; then FORTRAN="gnu" FCOMP="" DEBUG="no" @@ -1729,6 +1733,14 @@ else echo "# compiler. In that case, purge the Intel environment." echo "# to get rid of the Python from Intel compiler." fi + if [ $FORTRAN == "nvidia" ]; then + echo "# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" + echo "# Remark: When using Nvidia Fortran, please make sure that you are" + echo "# using version 4 of the OpenMPI library." + echo "#" + echo "# For most installations, you should adjust the link mpi in" + echo "# directory /opt/nvidia/hpc_sdk/Linux_x86_64/23.1/comm_libs" + fi echo "#--------------------------------------------------------------------" echo "" echo " Chose the type of test you want to perform:" From cf0fbaad227e0128770a29135b0c92e41b48abc8 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 25 Mar 2023 11:27:14 +0100 Subject: [PATCH 140/223] Introduced object Global for global communication On branch bojan_more_robust_communicator modified: Sources/Process/Backup_Mod/Save_Swarm.f90 modified: Sources/Process/Bulk_Mod/Monitoring_Planes_Areas.f90 modified: Sources/Process/Eddies_Mod/Gather_Bnd_Cells.f90 modified: Sources/Process/Field_Mod/Gradients/Grad_Gauss_Variable.f90 modified: Sources/Process/Field_Mod/Utilities/Calculate_Bulk_Fluxes.f90 modified: Sources/Process/Field_Mod/Utilities/Potential_Initialization.f90 modified: Sources/Process/Field_Mod/Utilities/Report_Volume_Balance.f90 modified: Sources/Process/Front_Mod/Compress_Front_Vertices.f90 modified: Sources/Process/Front_Mod/Compute_Distance_Function_And_Vof.f90 modified: Sources/Process/Front_Mod/Find_Sides.f90 modified: Sources/Process/Front_Mod/Print_Front_Statistics.f90 modified: Sources/Process/Interface_Mod/Create.f90 modified: Sources/Process/Interface_Mod/To_Buffer.f90 modified: Sources/Process/Monitor_Mod/Initialize.f90 modified: Sources/Process/Native_Mod/Bicg.f90 modified: Sources/Process/Native_Mod/Cg.f90 modified: Sources/Process/Native_Mod/Normalized_Root_Mean_Square.f90 modified: Sources/Process/Native_Mod/Root_Mean_Square.f90 modified: Sources/Process/Point_Mod/Find_Nearest_Cell.f90 modified: Sources/Process/Process_Mod/Balance_Volume.f90 modified: Sources/Process/Process_Mod/Compute_Momentum.f90 modified: Sources/Process/Process_Mod/Compute_Pressure.f90 modified: Sources/Process/Process_Mod/Correct_Velocity.f90 modified: Sources/Process/Process_Mod/Initialize_Variables.f90 modified: Sources/Process/Process_Mod/Update_Boundary_Values.f90 modified: Sources/Process/Surf_Mod/Compress_Surf_Vertices.f90 modified: Sources/Process/Surf_Mod/Distribute_Cell_Coords.f90 modified: Sources/Process/Surf_Mod/Distribute_Mesh.f90 modified: Sources/Process/Surf_Mod/Distribute_Smooth.f90 modified: Sources/Process/Swarm_Mod/Advance_Particles.f90 modified: Sources/Process/Swarm_Mod/Exchange_Particles.f90 modified: Sources/Process/Swarm_Mod/Print_Statistics.f90 modified: Sources/Process/Vof_Mod/Core/Compute_Vof.f90 modified: Sources/Process/Vof_Mod/Core/Initialize_From_Stl.f90 modified: Sources/Process/Vof_Mod/Core/Max_Courant_Number.f90 modified: Sources/Process/Vof_Mod/Utilities/Mass_Transfer_Added_Volume.f90 modified: Sources/Shared/Comm_Mod.f90 modified: Sources/Shared/Comm_Mod/Parallel/Exchange_Int_Array.f90 modified: Sources/Shared/Comm_Mod/Parallel/Exchange_Log_Array.f90 modified: Sources/Shared/Comm_Mod/Parallel/Exchange_Real_Array.f90 modified: Sources/Shared/Comm_Mod/Parallel/Global_Lor_Log.f90 modified: Sources/Shared/Comm_Mod/Parallel/Global_Lor_Log_Array.f90 modified: Sources/Shared/Comm_Mod/Parallel/Global_Max_Int.f90 modified: Sources/Shared/Comm_Mod/Parallel/Global_Max_Real.f90 modified: Sources/Shared/Comm_Mod/Parallel/Global_Min_Int.f90 modified: Sources/Shared/Comm_Mod/Parallel/Global_Min_Real.f90 modified: Sources/Shared/Comm_Mod/Parallel/Global_Sum_Int.f90 modified: Sources/Shared/Comm_Mod/Parallel/Global_Sum_Int_Array.f90 modified: Sources/Shared/Comm_Mod/Parallel/Global_Sum_Real.f90 modified: Sources/Shared/Comm_Mod/Parallel/Global_Sum_Real_Array.f90 modified: Sources/Shared/Comm_Mod/Parallel/Sendrecv_Int_Arrays.f90 modified: Sources/Shared/Comm_Mod/Parallel/Sendrecv_Log_Arrays.f90 modified: Sources/Shared/Comm_Mod/Parallel/Sendrecv_Real_Arrays.f90 modified: Sources/Shared/Comm_Mod/Parallel/Start.f90 modified: Sources/Shared/Comm_Mod/Sequential/Global_Lor_Log.f90 modified: Sources/Shared/Comm_Mod/Sequential/Global_Lor_Log_Array.f90 modified: Sources/Shared/Comm_Mod/Sequential/Global_Max_Int.f90 modified: Sources/Shared/Comm_Mod/Sequential/Global_Max_Real.f90 modified: Sources/Shared/Comm_Mod/Sequential/Global_Min_Int.f90 modified: Sources/Shared/Comm_Mod/Sequential/Global_Min_Real.f90 modified: Sources/Shared/Comm_Mod/Sequential/Global_Sum_Int.f90 modified: Sources/Shared/Comm_Mod/Sequential/Global_Sum_Int_Array.f90 modified: Sources/Shared/Comm_Mod/Sequential/Global_Sum_Real.f90 modified: Sources/Shared/Comm_Mod/Sequential/Global_Sum_Real_Array.f90 modified: Sources/Shared/Comm_Mod/Sequential/Start.f90 modified: Sources/Shared/Comm_Mod/Shared/First_Proc.f90 modified: Sources/Shared/Comm_Mod/Shared/N_Procs.f90 modified: Sources/Shared/Comm_Mod/Shared/Parallel_Run.f90 modified: Sources/Shared/Comm_Mod/Shared/Sequential_Run.f90 modified: Sources/Shared/Comm_Mod/Shared/This_Proc.f90 modified: Sources/Shared/Grid_Mod/Bounding_Box.f90 modified: Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 modified: Sources/Shared/Grid_Mod/Calculate_Global_Volumes.f90 modified: Sources/Shared/Grid_Mod/Exchange_Cells_Real.f90 modified: Sources/Shared/Grid_Mod/Find_Nodes_Cells.f90 modified: Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 modified: Sources/Shared/Grid_Mod/Form_Maps_For_Backup.f90 modified: Sources/Shared/Grid_Mod/Print_Grid_Statistics.f90 modified: Sources/Shared/Profiler_Mod/Statistics.f90 modified: Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/End_Of_Time_Step.f90 modified: Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/Save_Results.f90 modified: Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/End_Of_Time_Step.f90 modified: Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/Save_Results.f90 modified: Tests/Laminar/Cavity/Thermally_Driven/Conjugate/User_Mod/End_Of_Time_Step.f90 modified: Tests/Laminar/Cylinder/Vertical/User_Mod/Beginning_Of_Iteration.f90 modified: Tests/Laminar/Cylinder/Vertical/User_Mod/Save_Results.f90 modified: Tests/Laminar/Flat_Plate/User_Mod/Plain_Nu.f90 modified: Tests/Laminar/Flat_Plate/User_Mod/Plain_Profiles.f90 modified: Tests/Laminar/Membrane/2_Domains/User_Mod/Beginning_Of_Iteration.f90 modified: Tests/Laminar/Membrane/2_Domains/User_Mod/Interface_Exchange.f90 modified: Tests/Laminar/Membrane/2_Domains/User_Mod/To_Buffer.f90 modified: Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/End_Of_Time_Step.f90 modified: Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/Save_Results.f90 modified: Tests/Les/Channel_Re_Tau_180/User_Mod/Save_Results.f90 modified: Tests/Les/Forrest/User_Mod/End_Of_Time_Step.f90 modified: Tests/Les/Forrest/User_Mod/Save_Results.f90 modified: Tests/Les/Pipe_Re_Tau_180/User_Mod/End_Of_Time_Step.f90 modified: Tests/Les/Pipe_Re_Tau_180/User_Mod/Save_Results.f90 modified: Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 modified: Tests/Manual/Conjugate/User_Mod/End_Of_Time_Step.f90 modified: Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 modified: Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Profiles.f90 modified: Tests/Manual/Inflows/Option_4/User_Mod/End_Of_Time_Step.f90 modified: Tests/Manual/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 modified: Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Cf_St.f90 modified: Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Profiles.f90 modified: Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Save_Results.f90 modified: Tests/Rans/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 modified: Tests/Rans/Channel_Re_Tau_590/Uniform_Mesh/User_Mod/Save_Results.f90 modified: Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 modified: Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Profiles.f90 modified: Tests/Rans/Pipe_Re_Tau_550/User_Mod/Save_Results.f90 modified: Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 modified: Tests/Swarm/Channel_Re_Tau_590/User_Mod/End_Of_Time_Step.f90 modified: Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Results.f90 modified: Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Swarm.f90 modified: Tests/Vof/Dam_Break_3d/User_Mod/End_Of_Time_Step.f90 modified: Tests/Vof/Dam_Break_3d/User_Mod/Initialize_Variables.f90 modified: Tests/Vof/Pie/User_Mod/End_Of_Time_Step.f90 modified: Tests/Vof/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 modified: Tests/Vof/Spurious/User_Mod/End_Of_Time_Step.f90 modified: Tests/Vof/Vertical_Tube/User_Mod/End_Of_Time_Step.f90 --- Sources/Process/Backup_Mod/Save_Swarm.f90 | 8 ++-- .../Bulk_Mod/Monitoring_Planes_Areas.f90 | 6 +-- .../Process/Eddies_Mod/Gather_Bnd_Cells.f90 | 18 +++---- .../Gradients/Grad_Gauss_Variable.f90 | 4 +- .../Utilities/Calculate_Bulk_Fluxes.f90 | 6 +-- .../Utilities/Potential_Initialization.f90 | 18 +++---- .../Utilities/Report_Volume_Balance.f90 | 2 +- .../Front_Mod/Compress_Front_Vertices.f90 | 2 +- .../Compute_Distance_Function_And_Vof.f90 | 4 +- Sources/Process/Front_Mod/Find_Sides.f90 | 10 ++-- .../Front_Mod/Print_Front_Statistics.f90 | 28 +++++------ Sources/Process/Interface_Mod/Create.f90 | 32 ++++++------- Sources/Process/Interface_Mod/To_Buffer.f90 | 4 +- Sources/Process/Monitor_Mod/Initialize.f90 | 2 +- Sources/Process/Native_Mod/Bicg.f90 | 8 ++-- Sources/Process/Native_Mod/Cg.f90 | 8 ++-- .../Normalized_Root_Mean_Square.f90 | 6 +-- .../Process/Native_Mod/Root_Mean_Square.f90 | 2 +- .../Process/Point_Mod/Find_Nearest_Cell.f90 | 4 +- .../Process/Process_Mod/Balance_Volume.f90 | 16 +++---- .../Process/Process_Mod/Compute_Momentum.f90 | 2 +- .../Process/Process_Mod/Compute_Pressure.f90 | 8 ++-- .../Process/Process_Mod/Correct_Velocity.f90 | 6 +-- .../Process_Mod/Initialize_Variables.f90 | 18 +++---- .../Process_Mod/Update_Boundary_Values.f90 | 8 ++-- .../Surf_Mod/Compress_Surf_Vertices.f90 | 2 +- .../Surf_Mod/Distribute_Cell_Coords.f90 | 8 ++-- Sources/Process/Surf_Mod/Distribute_Mesh.f90 | 18 +++---- .../Process/Surf_Mod/Distribute_Smooth.f90 | 10 ++-- .../Process/Swarm_Mod/Advance_Particles.f90 | 4 +- .../Process/Swarm_Mod/Exchange_Particles.f90 | 6 +-- .../Process/Swarm_Mod/Print_Statistics.f90 | 18 +++---- Sources/Process/Vof_Mod/Core/Compute_Vof.f90 | 2 +- .../Vof_Mod/Core/Initialize_From_Stl.f90 | 2 +- .../Vof_Mod/Core/Max_Courant_Number.f90 | 2 +- .../Utilities/Mass_Transfer_Added_Volume.f90 | 2 +- Sources/Shared/Comm_Mod.f90 | 13 ++++- .../Comm_Mod/Parallel/Exchange_Int_Array.f90 | 4 +- .../Comm_Mod/Parallel/Exchange_Log_Array.f90 | 4 +- .../Comm_Mod/Parallel/Exchange_Real_Array.f90 | 4 +- .../Comm_Mod/Parallel/Global_Lor_Log.f90 | 7 ++- .../Parallel/Global_Lor_Log_Array.f90 | 9 ++-- .../Comm_Mod/Parallel/Global_Max_Int.f90 | 7 ++- .../Comm_Mod/Parallel/Global_Max_Real.f90 | 7 ++- .../Comm_Mod/Parallel/Global_Min_Int.f90 | 7 ++- .../Comm_Mod/Parallel/Global_Min_Real.f90 | 7 ++- .../Comm_Mod/Parallel/Global_Sum_Int.f90 | 7 ++- .../Parallel/Global_Sum_Int_Array.f90 | 9 ++-- .../Comm_Mod/Parallel/Global_Sum_Real.f90 | 7 ++- .../Parallel/Global_Sum_Real_Array.f90 | 9 ++-- .../Comm_Mod/Parallel/Sendrecv_Int_Arrays.f90 | 4 +- .../Comm_Mod/Parallel/Sendrecv_Log_Arrays.f90 | 4 +- .../Parallel/Sendrecv_Real_Arrays.f90 | 4 +- Sources/Shared/Comm_Mod/Parallel/Start.f90 | 14 +++--- .../Comm_Mod/Sequential/Global_Lor_Log.f90 | 6 ++- .../Sequential/Global_Lor_Log_Array.f90 | 8 ++-- .../Comm_Mod/Sequential/Global_Max_Int.f90 | 6 ++- .../Comm_Mod/Sequential/Global_Max_Real.f90 | 6 ++- .../Comm_Mod/Sequential/Global_Min_Int.f90 | 6 ++- .../Comm_Mod/Sequential/Global_Min_Real.f90 | 6 ++- .../Comm_Mod/Sequential/Global_Sum_Int.f90 | 6 ++- .../Sequential/Global_Sum_Int_Array.f90 | 8 ++-- .../Comm_Mod/Sequential/Global_Sum_Real.f90 | 6 ++- .../Sequential/Global_Sum_Real_Array.f90 | 8 ++-- Sources/Shared/Comm_Mod/Sequential/Start.f90 | 4 +- Sources/Shared/Comm_Mod/Shared/First_Proc.f90 | 2 +- Sources/Shared/Comm_Mod/Shared/N_Procs.f90 | 2 +- .../Shared/Comm_Mod/Shared/Parallel_Run.f90 | 2 +- .../Shared/Comm_Mod/Shared/Sequential_Run.f90 | 2 +- Sources/Shared/Comm_Mod/Shared/This_Proc.f90 | 2 +- Sources/Shared/Grid_Mod/Bounding_Box.f90 | 12 ++--- .../Grid_Mod/Calculate_Face_Geometry.f90 | 8 ++-- .../Grid_Mod/Calculate_Global_Volumes.f90 | 6 +-- .../Shared/Grid_Mod/Exchange_Cells_Real.f90 | 2 +- Sources/Shared/Grid_Mod/Find_Nodes_Cells.f90 | 2 +- Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 | 8 ++-- .../Shared/Grid_Mod/Form_Maps_For_Backup.f90 | 4 +- .../Shared/Grid_Mod/Print_Grid_Statistics.f90 | 34 ++++++------- Sources/Shared/Profiler_Mod/Statistics.f90 | 2 +- .../User_Mod/End_Of_Time_Step.f90 | 2 +- .../Uniform_Mesh/User_Mod/Save_Results.f90 | 48 +++++++++---------- .../User_Mod/End_Of_Time_Step.f90 | 6 +-- .../Channel_Re_2000/User_Mod/Save_Results.f90 | 6 +-- .../Conjugate/User_Mod/End_Of_Time_Step.f90 | 4 +- .../User_Mod/Beginning_Of_Iteration.f90 | 4 +- .../Vertical/User_Mod/Save_Results.f90 | 4 +- .../Laminar/Flat_Plate/User_Mod/Plain_Nu.f90 | 40 ++++++++-------- .../Flat_Plate/User_Mod/Plain_Profiles.f90 | 40 ++++++++-------- .../User_Mod/Beginning_Of_Iteration.f90 | 6 +-- .../2_Domains/User_Mod/Interface_Exchange.f90 | 8 ++-- .../Membrane/2_Domains/User_Mod/To_Buffer.f90 | 4 +- .../User_Mod/End_Of_Time_Step.f90 | 2 +- .../Periodic_Domain/User_Mod/Save_Results.f90 | 38 +++++++-------- .../User_Mod/Save_Results.f90 | 10 ++-- .../Les/Forrest/User_Mod/End_Of_Time_Step.f90 | 2 +- Tests/Les/Forrest/User_Mod/Save_Results.f90 | 38 +++++++-------- .../User_Mod/End_Of_Time_Step.f90 | 2 +- .../Pipe_Re_Tau_180/User_Mod/Save_Results.f90 | 38 +++++++-------- .../User_Mod/Save_Results.f90 | 46 +++++++++--------- .../Conjugate/User_Mod/End_Of_Time_Step.f90 | 4 +- .../User_Mod/Save_Impinging_Jet_Nu.f90 | 18 +++---- .../User_Mod/Save_Impinging_Jet_Profiles.f90 | 26 +++++----- .../Option_4/User_Mod/End_Of_Time_Step.f90 | 14 +++--- .../User_Mod/End_Of_Time_Step.f90 | 6 +-- .../User_Mod/Backstep_Cf_St.f90 | 40 ++++++++-------- .../User_Mod/Backstep_Profiles.f90 | 40 ++++++++-------- .../Rsm/User_Mod/Save_Results.f90 | 42 ++++++++-------- .../Stretched_Mesh/User_Mod/Save_Results.f90 | 44 ++++++++--------- .../Uniform_Mesh/User_Mod/Save_Results.f90 | 44 ++++++++--------- .../User_Mod/Impinging_Jet_Nu.f90 | 20 ++++---- .../User_Mod/Impinging_Jet_Profiles.f90 | 26 +++++----- .../Pipe_Re_Tau_550/User_Mod/Save_Results.f90 | 44 ++++++++--------- .../User_Mod/Save_Results.f90 | 40 ++++++++-------- .../User_Mod/End_Of_Time_Step.f90 | 2 +- .../User_Mod/Save_Results.f90 | 34 ++++++------- .../User_Mod/Save_Swarm.f90 | 30 ++++++------ .../User_Mod/End_Of_Time_Step.f90 | 6 +-- .../User_Mod/Initialize_Variables.f90 | 2 +- Tests/Vof/Pie/User_Mod/End_Of_Time_Step.f90 | 8 ++-- .../User_Mod/End_Of_Time_Step.f90 | 8 ++-- .../Spurious/User_Mod/End_Of_Time_Step.f90 | 24 +++++----- .../User_Mod/End_Of_Time_Step.f90 | 8 ++-- 122 files changed, 764 insertions(+), 703 deletions(-) diff --git a/Sources/Process/Backup_Mod/Save_Swarm.f90 b/Sources/Process/Backup_Mod/Save_Swarm.f90 index 143e8cac9..2a9080f6f 100644 --- a/Sources/Process/Backup_Mod/Save_Swarm.f90 +++ b/Sources/Process/Backup_Mod/Save_Swarm.f90 @@ -69,10 +69,10 @@ subroutine Save_Swarm(Backup, Swarm, disp, vc) !-----------------------! ! Exchange the data ! !-----------------------! - call Comm_Mod_Global_Sum_Int_Array (Swarm % n_particles*Swarm % N_I_VARS, & - Swarm % i_work) - call Comm_Mod_Global_Sum_Real_Array(Swarm % n_particles*Swarm % N_R_VARS, & - Swarm % r_work) + call Global % Sum_Int_Array (Swarm % n_particles*Swarm % N_I_VARS, & + Swarm % i_work) + call Global % Sum_Real_Array(Swarm % n_particles*Swarm % N_R_VARS, & + Swarm % r_work) call Backup % Save_Int_Array(Comm, disp, vc, & 'particle_int_data', & diff --git a/Sources/Process/Bulk_Mod/Monitoring_Planes_Areas.f90 b/Sources/Process/Bulk_Mod/Monitoring_Planes_Areas.f90 index 71d88cb24..b0d3caf10 100644 --- a/Sources/Process/Bulk_Mod/Monitoring_Planes_Areas.f90 +++ b/Sources/Process/Bulk_Mod/Monitoring_Planes_Areas.f90 @@ -69,8 +69,8 @@ subroutine Bulk_Mod_Monitoring_Planes_Areas(bulk, Grid) end do - call Comm_Mod_Global_Sum_Real(bulk % area_x) - call Comm_Mod_Global_Sum_Real(bulk % area_y) - call Comm_Mod_Global_Sum_Real(bulk % area_z) + call Global % Sum_Real(bulk % area_x) + call Global % Sum_Real(bulk % area_y) + call Global % Sum_Real(bulk % area_z) end subroutine diff --git a/Sources/Process/Eddies_Mod/Gather_Bnd_Cells.f90 b/Sources/Process/Eddies_Mod/Gather_Bnd_Cells.f90 index 3eff2599d..68775a41c 100644 --- a/Sources/Process/Eddies_Mod/Gather_Bnd_Cells.f90 +++ b/Sources/Process/Eddies_Mod/Gather_Bnd_Cells.f90 @@ -35,7 +35,7 @@ subroutine Eddies_Mod_Gather_Bnd_Cells(eddies) if(Parallel_Run()) then allocate(n_bnd_cells_proc(N_Procs())); n_bnd_cells_proc(:) = 0; n_bnd_cells_proc(This_Proc()) = eddies % n_bnd_cells - call Comm_Mod_Global_Sum_Int_Array(N_Procs(), n_bnd_cells_proc) + call Global % Sum_Int_Array(N_Procs(), n_bnd_cells_proc) allocate(s_bnd_cell_proc(N_Procs())); s_bnd_cell_proc(:) = 0 do n = 2, N_Procs() @@ -47,7 +47,7 @@ subroutine Eddies_Mod_Gather_Bnd_Cells(eddies) ! Gather coordinates from all processors eddies % n_bnd_cells_glo = eddies % n_bnd_cells - call Comm_Mod_Global_Sum_Int(eddies % n_bnd_cells_glo) + call Global % Sum_Int(eddies % n_bnd_cells_glo) if(First_Proc()) then print '(a,a,i6)', ' # Number of boundary cells at ', & trim(eddies % bc_name), & @@ -74,13 +74,13 @@ subroutine Eddies_Mod_Gather_Bnd_Cells(eddies) eddies % bnd_w (cnt + s_bnd_cell_proc(This_Proc())) = Flow % w % b(c) end if end do - call Comm_Mod_Global_Sum_Real_Array(eddies % n_bnd_cells_glo, eddies % bnd_xc) - call Comm_Mod_Global_Sum_Real_Array(eddies % n_bnd_cells_glo, eddies % bnd_yc) - call Comm_Mod_Global_Sum_Real_Array(eddies % n_bnd_cells_glo, eddies % bnd_zc) - call Comm_Mod_Global_Sum_Real_Array(eddies % n_bnd_cells_glo, eddies % bnd_wd) - call Comm_Mod_Global_Sum_Real_Array(eddies % n_bnd_cells_glo, eddies % bnd_u) - call Comm_Mod_Global_Sum_Real_Array(eddies % n_bnd_cells_glo, eddies % bnd_v) - call Comm_Mod_Global_Sum_Real_Array(eddies % n_bnd_cells_glo, eddies % bnd_w) + call Global % Sum_Real_Array(eddies % n_bnd_cells_glo, eddies % bnd_xc) + call Global % Sum_Real_Array(eddies % n_bnd_cells_glo, eddies % bnd_yc) + call Global % Sum_Real_Array(eddies % n_bnd_cells_glo, eddies % bnd_zc) + call Global % Sum_Real_Array(eddies % n_bnd_cells_glo, eddies % bnd_wd) + call Global % Sum_Real_Array(eddies % n_bnd_cells_glo, eddies % bnd_u) + call Global % Sum_Real_Array(eddies % n_bnd_cells_glo, eddies % bnd_v) + call Global % Sum_Real_Array(eddies % n_bnd_cells_glo, eddies % bnd_w) !-------------------------------------------------------! ! Find position of the inlet plane ! diff --git a/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Variable.f90 b/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Variable.f90 index 7eba97e6f..532488d5d 100644 --- a/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Variable.f90 +++ b/Sources/Process/Field_Mod/Gradients/Grad_Gauss_Variable.f90 @@ -31,7 +31,7 @@ subroutine Grad_Gauss_Variable(Flow, phi) phi_f_o(:) = 0.0 norm = max(maxval(phi % n) - minval(phi % n), MICRO) - call Comm_Mod_Global_Max_Real(norm) + call Global % Max_Real(norm) !-------------------------------! ! Start iterative procedure ! @@ -57,7 +57,7 @@ subroutine Grad_Gauss_Variable(Flow, phi) !$omp end parallel do res = res / norm - call Comm_Mod_Global_Max_Real(res) + call Global % Max_Real(res) if(res < Flow % gauss_tol) exit diff --git a/Sources/Process/Field_Mod/Utilities/Calculate_Bulk_Fluxes.f90 b/Sources/Process/Field_Mod/Utilities/Calculate_Bulk_Fluxes.f90 index 8889aa0ba..e485a072d 100644 --- a/Sources/Process/Field_Mod/Utilities/Calculate_Bulk_Fluxes.f90 +++ b/Sources/Process/Field_Mod/Utilities/Calculate_Bulk_Fluxes.f90 @@ -73,9 +73,9 @@ subroutine Calculate_Bulk_Fluxes(Flow, v_flux) end do - call Comm_Mod_Global_Sum_Real(bulk % flux_x) - call Comm_Mod_Global_Sum_Real(bulk % flux_y) - call Comm_Mod_Global_Sum_Real(bulk % flux_z) + call Global % Sum_Real(bulk % flux_x) + call Global % Sum_Real(bulk % flux_y) + call Global % Sum_Real(bulk % flux_z) ! Bulk velocities. Units: [kg/s] / [kg/m^3] / [m^2] = [m/s] bulk % u = bulk % flux_x / (bulk % area_x + TINY) diff --git a/Sources/Process/Field_Mod/Utilities/Potential_Initialization.f90 b/Sources/Process/Field_Mod/Utilities/Potential_Initialization.f90 index 2ffd517b1..33c1cf0bb 100644 --- a/Sources/Process/Field_Mod/Utilities/Potential_Initialization.f90 +++ b/Sources/Process/Field_Mod/Utilities/Potential_Initialization.f90 @@ -268,7 +268,7 @@ subroutine Potential_Initialization(Flow, Sol) log_dist(c) = Grid % wall_dist(c) end do dist_min = minval(log_dist(1:Grid % n_cells)) - call Comm_Mod_Global_Min_Real(dist_min) + call Global % Min_Real(dist_min) !------------------------------------------------------! ! Set distances from the wall to friendlier values ! @@ -306,17 +306,17 @@ subroutine Potential_Initialization(Flow, Sol) c2 = Grid % faces_c(2,s) if(c2 < 0) then if(Grid % Bnd_Cond_Type( c2) .eq. INFLOW) then - vol_in_real = vol_in_real + ( u % n(c2)*Grid % sx(s) & - + v % n(c2)*Grid % sy(s) & - + w % n(c2)*Grid % sz(s) ) - vol_in_fake = vol_in_fake + ( u % n(c1)*Grid % sx(s) & - + v % n(c1)*Grid % sy(s) & - + w % n(c1)*Grid % sz(s) ) + vol_in_real = vol_in_real + ( u % n(c2) * Grid % sx(s) & + + v % n(c2) * Grid % sy(s) & + + w % n(c2) * Grid % sz(s) ) + vol_in_fake = vol_in_fake + ( u % n(c1) * Grid % sx(s) & + + v % n(c1) * Grid % sy(s) & + + w % n(c1) * Grid % sz(s) ) end if end if end do - call Comm_Mod_Global_Sum_Real(vol_in_real) - call Comm_Mod_Global_Sum_Real(vol_in_fake) + call Global % Sum_Real(vol_in_real) + call Global % Sum_Real(vol_in_fake) !-------------------------------------------------! ! Correct velocities to more realistic values ! diff --git a/Sources/Process/Field_Mod/Utilities/Report_Volume_Balance.f90 b/Sources/Process/Field_Mod/Utilities/Report_Volume_Balance.f90 index 67f2ccb52..78a9acf4b 100644 --- a/Sources/Process/Field_Mod/Utilities/Report_Volume_Balance.f90 +++ b/Sources/Process/Field_Mod/Utilities/Report_Volume_Balance.f90 @@ -22,7 +22,7 @@ subroutine Report_Volume_Balance(Flow, Sol, curr_dt, ini) ! Compute global volume imbalance src = sum(b(1:Grid % n_cells - Grid % Comm % n_buff_cells)) - call Comm_Mod_Global_Sum_Real(src) + call Global % Sum_Real(src) ! Print it out if(First_Proc()) then diff --git a/Sources/Process/Front_Mod/Compress_Front_Vertices.f90 b/Sources/Process/Front_Mod/Compress_Front_Vertices.f90 index a86a4fb8c..83b7d5f2a 100644 --- a/Sources/Process/Front_Mod/Compress_Front_Vertices.f90 +++ b/Sources/Process/Front_Mod/Compress_Front_Vertices.f90 @@ -112,7 +112,7 @@ subroutine Compress_Front_Vertices(Front, verbose) nv = n_vert nv_tot = n_vert if(Front % mesh_divided) then - call Comm_Mod_Global_Sum_Int(nv_tot) + call Global % Sum_Int(nv_tot) end if if(verbose .and. First_Proc()) then print '(a40,i8)', ' # Compressed number of vertices: ', nv_tot diff --git a/Sources/Process/Front_Mod/Compute_Distance_Function_And_Vof.f90 b/Sources/Process/Front_Mod/Compute_Distance_Function_And_Vof.f90 index cfcc75e1a..e07d12462 100644 --- a/Sources/Process/Front_Mod/Compute_Distance_Function_And_Vof.f90 +++ b/Sources/Process/Front_Mod/Compute_Distance_Function_And_Vof.f90 @@ -96,8 +96,8 @@ subroutine Compute_Distance_Function_And_Vof(Front, cell_dist, vof) end do ! through vertices - call Comm_Mod_Global_Min_Real(min_d) - call Comm_Mod_Global_Max_Real(max_d) + call Global % Min_Real(min_d) + call Global % Max_Real(max_d) !----------------------------------------------------------------------! ! Transform the distances into what Mijail calls \phi in his paper ! diff --git a/Sources/Process/Front_Mod/Find_Sides.f90 b/Sources/Process/Front_Mod/Find_Sides.f90 index 20a2a3194..bd48d8379 100644 --- a/Sources/Process/Front_Mod/Find_Sides.f90 +++ b/Sources/Process/Front_Mod/Find_Sides.f90 @@ -51,8 +51,8 @@ subroutine Find_Sides(Front, verbose) ne_tot = ne ns_tot = n_side if(Front % mesh_divided) then - call Comm_Mod_Global_Sum_Int(ne_tot) - call Comm_Mod_Global_Sum_Int(ns_tot) + call Global % Sum_Int(ne_tot) + call Global % Sum_Int(ns_tot) end if if(First_Proc()) then print '(a40,i8)', ' # Number of elements: ', ne_tot @@ -196,9 +196,9 @@ subroutine Find_Sides(Front, verbose) cnt_two_tot = cnt_two cnt_one_tot = cnt_one if(Front % mesh_divided) then - call Comm_Mod_Global_Sum_Int(ns_tot) - call Comm_Mod_Global_Sum_Int(cnt_two_tot) - call Comm_Mod_Global_Sum_Int(cnt_one_tot) + call Global % Sum_Int(ns_tot) + call Global % Sum_Int(cnt_two_tot) + call Global % Sum_Int(cnt_one_tot) end if if(First_Proc()) then diff --git a/Sources/Process/Front_Mod/Print_Front_Statistics.f90 b/Sources/Process/Front_Mod/Print_Front_Statistics.f90 index 35fbf82b3..570e8304a 100644 --- a/Sources/Process/Front_Mod/Print_Front_Statistics.f90 +++ b/Sources/Process/Front_Mod/Print_Front_Statistics.f90 @@ -30,7 +30,7 @@ subroutine Print_Front_Statistics(Front) nv_tot = nv if(Front % mesh_divided) then - call Comm_Mod_Global_Sum_Int(nv_tot) + call Global % Sum_Int(nv_tot) end if !--------------------------! @@ -58,8 +58,8 @@ subroutine Print_Front_Statistics(Front) max_rat = max(max_rat, max_l/min_l) min_rat = min(min_rat, max_l/min_l) end do - call Comm_Mod_Global_Max_Real(max_rat) - call Comm_Mod_Global_Min_Real(min_rat) + call Global % Max_Real(max_rat) + call Global % Min_Real(min_rat) !------------------------! ! Total surface area ! @@ -69,7 +69,7 @@ subroutine Print_Front_Statistics(Front) tot_area = tot_area + Elem(e) % area end do if(Front % mesh_divided) then - call Comm_Mod_Global_Sum_Real(tot_area) + call Global % Sum_Real(tot_area) end if !--------------------------------! @@ -77,15 +77,15 @@ subroutine Print_Front_Statistics(Front) !--------------------------------! nne_s = minval(Vert(1:nv) % nne) nne_e = maxval(Vert(1:nv) % nne) - call Comm_Mod_Global_Min_Int(nne_s) - call Comm_Mod_Global_Max_Int(nne_e) + call Global % Min_Int(nne_s) + call Global % Max_Int(nne_e) allocate(nne(nne_s:nne_e)); nne = 0.0 do v = 1, nv nne(Vert(v) % nne) = nne(Vert(v) % nne) + 1.0 end do if(Front % mesh_divided) then do item = nne_s, nne_e - call Comm_Mod_Global_Sum_Real(nne(item)) + call Global % Sum_Real(nne(item)) end do end if @@ -96,20 +96,20 @@ subroutine Print_Front_Statistics(Front) n_verts_tot = Front % n_verts n_sides_tot = Front % n_sides if(Front % mesh_divided) then - call Comm_Mod_Global_Sum_Int(n_elems_tot) - call Comm_Mod_Global_Sum_Int(n_verts_tot) - call Comm_Mod_Global_Sum_Int(n_sides_tot) + call Global % Sum_Int(n_elems_tot) + call Global % Sum_Int(n_verts_tot) + call Global % Sum_Int(n_sides_tot) end if max_l = maxval(side(1:ns) % length) min_l = minval(side(1:ns) % length) - call Comm_Mod_Global_Max_Real(max_l) - call Comm_Mod_Global_Min_Real(min_l) + call Global % Max_Real(max_l) + call Global % Min_Real(min_l) max_a = maxval(Elem(1:ne) % area) min_a = minval(Elem(1:ne) % area) - call Comm_Mod_Global_Max_Real(max_a) - call Comm_Mod_Global_Min_Real(min_a) + call Global % Max_Real(max_a) + call Global % Min_Real(min_a) if(First_Proc()) then diff --git a/Sources/Process/Interface_Mod/Create.f90 b/Sources/Process/Interface_Mod/Create.f90 index d13e361b1..f94ce60dd 100644 --- a/Sources/Process/Interface_Mod/Create.f90 +++ b/Sources/Process/Interface_Mod/Create.f90 @@ -149,8 +149,8 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) !------------------------------------------! n1_tot = n1 n2_tot = n2 - call Comm_Mod_Global_Sum_Int(n1_tot) - call Comm_Mod_Global_Sum_Int(n2_tot) + call Global % Sum_Int(n1_tot) + call Global % Sum_Int(n2_tot) if(n1_tot .ne. n2_tot) then if(First_Proc()) then @@ -189,8 +189,8 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) off_2(1:N_Procs()) = 0 off_1(This_Proc()) = n1 off_2(This_Proc()) = n2 - call Comm_Mod_Global_Sum_Int_Array(N_Procs(), off_1) - call Comm_Mod_Global_Sum_Int_Array(N_Procs(), off_2) + call Global % Sum_Int_Array(N_Procs(), off_1) + call Global % Sum_Int_Array(N_Procs(), off_2) do p = N_Procs(), 2, -1 off_1(p) = sum(off_1(1:p-1)) @@ -279,18 +279,18 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) !----------------------------------------------------------! ! Distribute interface coordinates over all processors ! !----------------------------------------------------------! - call Comm_Mod_Global_Sum_Real_Array(n_tot, xf_1(1:n_tot)) - call Comm_Mod_Global_Sum_Real_Array(n_tot, yf_1(1:n_tot)) - call Comm_Mod_Global_Sum_Real_Array(n_tot, zf_1(1:n_tot)) - call Comm_Mod_Global_Sum_Real_Array(n_tot, xf_2(1:n_tot)) - call Comm_Mod_Global_Sum_Real_Array(n_tot, yf_2(1:n_tot)) - call Comm_Mod_Global_Sum_Real_Array(n_tot, zf_2(1:n_tot)) - call Comm_Mod_Global_Sum_Int_Array (n_tot, ic_1(1:n_tot)) - call Comm_Mod_Global_Sum_Int_Array (n_tot, ib_1(1:n_tot)) - call Comm_Mod_Global_Sum_Int_Array (n_tot, ip_1(1:n_tot)) - call Comm_Mod_Global_Sum_Int_Array (n_tot, ic_2(1:n_tot)) - call Comm_Mod_Global_Sum_Int_Array (n_tot, ib_2(1:n_tot)) - call Comm_Mod_Global_Sum_Int_Array (n_tot, ip_2(1:n_tot)) + call Global % Sum_Real_Array(n_tot, xf_1(1:n_tot)) + call Global % Sum_Real_Array(n_tot, yf_1(1:n_tot)) + call Global % Sum_Real_Array(n_tot, zf_1(1:n_tot)) + call Global % Sum_Real_Array(n_tot, xf_2(1:n_tot)) + call Global % Sum_Real_Array(n_tot, yf_2(1:n_tot)) + call Global % Sum_Real_Array(n_tot, zf_2(1:n_tot)) + call Global % Sum_Int_Array (n_tot, ic_1(1:n_tot)) + call Global % Sum_Int_Array (n_tot, ib_1(1:n_tot)) + call Global % Sum_Int_Array (n_tot, ip_1(1:n_tot)) + call Global % Sum_Int_Array (n_tot, ic_2(1:n_tot)) + call Global % Sum_Int_Array (n_tot, ib_2(1:n_tot)) + call Global % Sum_Int_Array (n_tot, ip_2(1:n_tot)) ! Sort interfaces from domain 1 carrying ! information of cells surrounding it along diff --git a/Sources/Process/Interface_Mod/To_Buffer.f90 b/Sources/Process/Interface_Mod/To_Buffer.f90 index 35a5b3dec..e12e8f6d0 100644 --- a/Sources/Process/Interface_Mod/To_Buffer.f90 +++ b/Sources/Process/Interface_Mod/To_Buffer.f90 @@ -62,8 +62,8 @@ subroutine Interface_Mod_To_Buffer(inter, var1, var2, v, boundary) end do ! Here we exchange (global sum) of phi_1 and phi_2 - call Comm_Mod_Global_Sum_Real_Array(n_tot, inter % phi_1(1:n_tot,v)) - call Comm_Mod_Global_Sum_Real_Array(n_tot, inter % phi_2(1:n_tot,v)) + call Global % Sum_Real_Array(n_tot, inter % phi_1(1:n_tot,v)) + call Global % Sum_Real_Array(n_tot, inter % phi_2(1:n_tot,v)) end if diff --git a/Sources/Process/Monitor_Mod/Initialize.f90 b/Sources/Process/Monitor_Mod/Initialize.f90 index a78da38d0..0792a67c4 100644 --- a/Sources/Process/Monitor_Mod/Initialize.f90 +++ b/Sources/Process/Monitor_Mod/Initialize.f90 @@ -83,7 +83,7 @@ subroutine Initialize(Monitor, Flow, restart, domain) ! Check if smaller distance is found on another processor if(Parallel_Run()) then min_dist_all = min_dist(m) - call Comm_Mod_Global_Min_Real(min_dist_all) + call Global % Min_Real(min_dist_all) ! If there is, erase Monitoring point at this_proc if(abs(min_dist_all - min_dist(m)) >= TINY) then diff --git a/Sources/Process/Native_Mod/Bicg.f90 b/Sources/Process/Native_Mod/Bicg.f90 index 1a670e95e..0e1bce90d 100644 --- a/Sources/Process/Native_Mod/Bicg.f90 +++ b/Sources/Process/Native_Mod/Bicg.f90 @@ -57,8 +57,8 @@ subroutine Bicg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) end do !$omp end parallel do - call Comm_Mod_Global_Sum_Real(sum_a) - call Comm_Mod_Global_Sum_Int (sum_n) ! this is stored somewhere, check + call Global % Sum_Real(sum_a) + call Global % Sum_Int (sum_n) ! this is stored somewhere, check sum_a = sum_a / sum_n fn = 1.0 / sum_a @@ -139,7 +139,7 @@ subroutine Bicg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) rho = rho + q1(i) * r2(i) end do !$omp end parallel do - call Comm_Mod_Global_Sum_Real(rho) + call Global % Sum_Real(rho) if(iter .eq. 1) then !$omp parallel do private(i) shared(p1, q1, p2, q2) @@ -186,7 +186,7 @@ subroutine Bicg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) alfa = alfa + p2(i) * q1(i) end do !$omp end parallel do - call Comm_Mod_Global_Sum_Real(alfa) + call Global % Sum_Real(alfa) alfa = rho / alfa !--------------------! diff --git a/Sources/Process/Native_Mod/Cg.f90 b/Sources/Process/Native_Mod/Cg.f90 index 682107bb4..e2a522fae 100644 --- a/Sources/Process/Native_Mod/Cg.f90 +++ b/Sources/Process/Native_Mod/Cg.f90 @@ -56,8 +56,8 @@ subroutine Cg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) end do !$omp end parallel do - call Comm_Mod_Global_Sum_Real(sum_a) - call Comm_Mod_Global_Sum_Int (sum_n) ! this is stored somewhere, check + call Global % Sum_Real(sum_a) + call Global % Sum_Int (sum_n) ! this is stored somewhere, check sum_a = sum_a / sum_n fn = 1.0 / sum_a @@ -136,7 +136,7 @@ subroutine Cg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) rho = rho + q1(i) * r1(i) end do !$omp end parallel do - call Comm_Mod_Global_Sum_Real(rho) + call Global % Sum_Real(rho) if(iter .eq. 1) then !$omp parallel do private(i) shared(p1, q1) @@ -177,7 +177,7 @@ subroutine Cg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) end do !$omp end parallel do - call Comm_Mod_Global_Sum_Real(alfa) + call Global % Sum_Real(alfa) alfa = rho / alfa !---------------------! diff --git a/Sources/Process/Native_Mod/Normalized_Root_Mean_Square.f90 b/Sources/Process/Native_Mod/Normalized_Root_Mean_Square.f90 index 5eb94fcfe..d1a4357f6 100644 --- a/Sources/Process/Native_Mod/Normalized_Root_Mean_Square.f90 +++ b/Sources/Process/Native_Mod/Normalized_Root_Mean_Square.f90 @@ -33,7 +33,7 @@ real function Normalized_Root_Mean_Square(Nat, ni, r, A, x, norm) end do !$omp end parallel do - call Comm_Mod_Global_Sum_Real(rms) + call Global % Sum_Real(rms) rms = sqrt(rms) ! Normalize it with absolute values of the unknown @@ -52,8 +52,8 @@ real function Normalized_Root_Mean_Square(Nat, ni, r, A, x, norm) x_min = 0.0 x_max = norm endif - call Comm_Mod_Global_Min_Real(x_min) - call Comm_Mod_Global_Max_Real(x_max) + call Global % Min_Real(x_min) + call Global % Max_Real(x_max) ! Create a plateau for very small sources and values if( (x_max-x_min) < NANO .and. rms < NANO ) then diff --git a/Sources/Process/Native_Mod/Root_Mean_Square.f90 b/Sources/Process/Native_Mod/Root_Mean_Square.f90 index 44635ee23..f731febea 100644 --- a/Sources/Process/Native_Mod/Root_Mean_Square.f90 +++ b/Sources/Process/Native_Mod/Root_Mean_Square.f90 @@ -23,7 +23,7 @@ real function Root_Mean_Square(Nat, ni, r) rms = rms + r(i)**2 end do !$omp end parallel do - call Comm_Mod_Global_Sum_Real(rms) + call Global % Sum_Real(rms) rms = sqrt(rms) Root_Mean_Square = rms diff --git a/Sources/Process/Point_Mod/Find_Nearest_Cell.f90 b/Sources/Process/Point_Mod/Find_Nearest_Cell.f90 index f125ac434..9cadb7fb3 100644 --- a/Sources/Process/Point_Mod/Find_Nearest_Cell.f90 +++ b/Sources/Process/Point_Mod/Find_Nearest_Cell.f90 @@ -133,7 +133,7 @@ subroutine Find_Nearest_Cell(Point, n_parts_in_buffers, locally) Point % cell = cc min_dc_glob = min_dc if(Parallel_Run() .and. .not. local) then - call Comm_Mod_Global_Min_Real(min_dc_glob) + call Global % Min_Real(min_dc_glob) end if Point % proc = 0 @@ -176,7 +176,7 @@ subroutine Find_Nearest_Cell(Point, n_parts_in_buffers, locally) !-----------------------------------------! min_db_glob = min_db if(Parallel_Run() .and. .not. local) then - call Comm_Mod_Global_Min_Real(min_db_glob) + call Global % Min_Real(min_db_glob) end if end if ! closest node is (not) known diff --git a/Sources/Process/Process_Mod/Balance_Volume.f90 b/Sources/Process/Process_Mod/Balance_Volume.f90 index 89b78a4b2..a281ca708 100644 --- a/Sources/Process/Process_Mod/Balance_Volume.f90 +++ b/Sources/Process/Process_Mod/Balance_Volume.f90 @@ -96,8 +96,8 @@ subroutine Balance_Volume(Process, Flow, Vof) end do end if end do - call Comm_Mod_Global_Sum_Real(vol_outflow) - call Comm_Mod_Global_Sum_Real(area_outflow) + call Global % Sum_Real(vol_outflow) + call Global % Sum_Real(area_outflow) !------------------------------------------------------! ! ! @@ -154,10 +154,10 @@ subroutine Balance_Volume(Process, Flow, Vof) end if ! flow has pressure - call Comm_Mod_Global_Sum_Real(bulk % vol_in) - call Comm_Mod_Global_Sum_Real(bulk % vol_out) - call Comm_Mod_Global_Sum_Real(bulk % area_in) - call Comm_Mod_Global_Sum_Real(bulk % area_out) + call Global % Sum_Real(bulk % vol_in) + call Global % Sum_Real(bulk % vol_out) + call Global % Sum_Real(bulk % area_in) + call Global % Sum_Real(bulk % area_out) ! Avoid divisions by zero for the cases without any fluid motion fac = 1.0 @@ -207,7 +207,7 @@ subroutine Balance_Volume(Process, Flow, Vof) end do ! region ! Holy mackrele: summ it up over all processors - call Comm_Mod_Global_Sum_Real(bulk % vol_out) + call Global % Sum_Real(bulk % vol_out) !-------------------------------------------------! ! Something is coming out from real outflows, ! @@ -249,7 +249,7 @@ subroutine Balance_Volume(Process, Flow, Vof) end do ! regions ! Holy mackrele: summ it up over all processors - call Comm_Mod_Global_Sum_Real(bulk % vol_out) ! not checked + call Global % Sum_Real(bulk % vol_out) ! not checked end if diff --git a/Sources/Process/Process_Mod/Compute_Momentum.f90 b/Sources/Process/Process_Mod/Compute_Momentum.f90 index d6cac074d..f5ec60daa 100644 --- a/Sources/Process/Process_Mod/Compute_Momentum.f90 +++ b/Sources/Process/Process_Mod/Compute_Momentum.f90 @@ -172,7 +172,7 @@ subroutine Compute_Momentum(Process, Flow, Turb, Vof, Por, Sol, curr_dt, ini) do c = -Grid % n_bnd_cells, Grid % n_cells vel_max = max(vel_max, sqrt(ui % n(c)**2 + uj % n(c)**2 + uk % n(c)**2)) end do - call Comm_Mod_Global_Max_Real(vel_max) + call Global % Max_Real(vel_max) ! Old values (o) and older than old (oo) if(.not. Flow % inside_piso_loop) then diff --git a/Sources/Process/Process_Mod/Compute_Pressure.f90 b/Sources/Process/Process_Mod/Compute_Pressure.f90 index f809c9fdf..ce18624b2 100644 --- a/Sources/Process/Process_Mod/Compute_Pressure.f90 +++ b/Sources/Process/Process_Mod/Compute_Pressure.f90 @@ -81,8 +81,8 @@ subroutine Compute_Pressure(Process, Flow, Vof, Sol, curr_dt, ini) p_max = max(p_max, p % n(c)) p_min = min(p_min, p % n(c)) end do - call Comm_Mod_Global_Max_Real(p_max) - call Comm_Mod_Global_Min_Real(p_min) + call Global % Max_Real(p_max) + call Global % Min_Real(p_min) ! Normalize pressure with the maximum of pressure difference, ! value defined in control file and pressure drops. @@ -239,8 +239,8 @@ subroutine Compute_Pressure(Process, Flow, Vof, Sol, curr_dt, ini) p_max = maxval(p % n(1:Grid % n_cells)) p_min = minval(p % n(1:Grid % n_cells)) - call Comm_Mod_Global_Max_Real(p_max) - call Comm_Mod_Global_Min_Real(p_min) + call Global % Max_Real(p_max) + call Global % Min_Real(p_min) p % n(:) = p % n(:) - 0.5*(p_max+p_min) diff --git a/Sources/Process/Process_Mod/Correct_Velocity.f90 b/Sources/Process/Process_Mod/Correct_Velocity.f90 index b5b70886a..cdd6f4f47 100644 --- a/Sources/Process/Process_Mod/Correct_Velocity.f90 +++ b/Sources/Process/Process_Mod/Correct_Velocity.f90 @@ -100,7 +100,7 @@ subroutine Correct_Velocity(Process, Flow, Vof, Sol, curr_dt, ini) do c = 1, Grid % n_cells - Grid % Comm % n_buff_cells Flow % vol_res = max(Flow % vol_res, abs(b(c))) end do - call Comm_Mod_Global_Max_Real(Flow % vol_res) + call Global % Max_Real(Flow % vol_res) !------------------------------! ! Calculate the CFL number ! @@ -126,8 +126,8 @@ subroutine Correct_Velocity(Process, Flow, Vof, Sol, curr_dt, ini) Flow % pe_max = max( Flow % pe_max, pe_t ) end if end do - call Comm_Mod_Global_Max_Real(Flow % cfl_max) - call Comm_Mod_Global_Max_Real(Flow % pe_max) + call Global % Max_Real(Flow % cfl_max) + call Global % Max_Real(Flow % pe_max) if (Flow % p_m_coupling == SIMPLE) then call Info_Mod_Iter_Fill_At(1, 5, 'dum', -1, Flow % vol_res) diff --git a/Sources/Process/Process_Mod/Initialize_Variables.f90 b/Sources/Process/Process_Mod/Initialize_Variables.f90 index 26f313588..88a80f578 100644 --- a/Sources/Process/Process_Mod/Initialize_Variables.f90 +++ b/Sources/Process/Process_Mod/Initialize_Variables.f90 @@ -473,15 +473,15 @@ subroutine Initialize_Variables(Process, Flow, Turb, Vof, Swarm, Sol) end if end do - call Comm_Mod_Global_Sum_Int(n_wall) - call Comm_Mod_Global_Sum_Int(n_inflow) - call Comm_Mod_Global_Sum_Int(n_outflow) - call Comm_Mod_Global_Sum_Int(n_symmetry) - call Comm_Mod_Global_Sum_Int(n_heated_wall) - call Comm_Mod_Global_Sum_Int(n_convect) - call Comm_Mod_Global_Sum_Int(n_pressure) - call Comm_Mod_Global_Sum_Real(bulk % vol_in) - call Comm_Mod_Global_Sum_Real(area) + call Global % Sum_Int(n_wall) + call Global % Sum_Int(n_inflow) + call Global % Sum_Int(n_outflow) + call Global % Sum_Int(n_symmetry) + call Global % Sum_Int(n_heated_wall) + call Global % Sum_Int(n_convect) + call Global % Sum_Int(n_pressure) + call Global % Sum_Real(bulk % vol_in) + call Global % Sum_Real(area) !----------------------------------------------------------------------! ! This parameter, has_pressure_outlet, is used in Compute_Pressure ! diff --git a/Sources/Process/Process_Mod/Update_Boundary_Values.f90 b/Sources/Process/Process_Mod/Update_Boundary_Values.f90 index fafdf65e7..60f217131 100644 --- a/Sources/Process/Process_Mod/Update_Boundary_Values.f90 +++ b/Sources/Process/Process_Mod/Update_Boundary_Values.f90 @@ -319,8 +319,8 @@ subroutine Update_Boundary_Values(Process, Flow, Turb, Vof, update) !-----------------------------------------------! ! Integrate (summ) heated area, and heat up ! !-----------------------------------------------! - call Comm_Mod_Global_Sum_Real(Flow % heat) - call Comm_Mod_Global_Sum_Real(Flow % heated_area) + call Global % Sum_Real(Flow % heat) + call Global % Sum_Real(Flow % heated_area) Flow % heat_flux = Flow % heat / max(Flow % heated_area, TINY) end if ! update energy and heat transfer @@ -411,8 +411,8 @@ subroutine Update_Boundary_Values(Process, Flow, Turb, Vof, update) !-----------------------------------------------! ! Integrate (summ) heated area, and heat up ! !-----------------------------------------------! - call Comm_Mod_Global_Sum_Real(Flow % heat) - call Comm_Mod_Global_Sum_Real(Flow % heated_area) + call Global % Sum_Real(Flow % heat) + call Global % Sum_Real(Flow % heated_area) Flow % heat_flux = Flow % heat / max(Flow % heated_area, TINY) end if ! update energy and heat transfer diff --git a/Sources/Process/Surf_Mod/Compress_Surf_Vertices.f90 b/Sources/Process/Surf_Mod/Compress_Surf_Vertices.f90 index 12b5df2e8..402fd75bf 100644 --- a/Sources/Process/Surf_Mod/Compress_Surf_Vertices.f90 +++ b/Sources/Process/Surf_Mod/Compress_Surf_Vertices.f90 @@ -107,7 +107,7 @@ subroutine Compress_Surf_Vertices(Surf, verbose) nv = n_vert nv_tot = n_vert if(Surf % mesh_divided) then - call Comm_Mod_Global_Sum_Int(nv_tot) + call Global % Sum_Int(nv_tot) end if if(verbose .and. First_Proc()) then print '(a40,i8)', ' # Compressed number of vertices: ', nv_tot diff --git a/Sources/Process/Surf_Mod/Distribute_Cell_Coords.f90 b/Sources/Process/Surf_Mod/Distribute_Cell_Coords.f90 index ba8869595..4a77f79f7 100644 --- a/Sources/Process/Surf_Mod/Distribute_Cell_Coords.f90 +++ b/Sources/Process/Surf_Mod/Distribute_Cell_Coords.f90 @@ -43,10 +43,10 @@ subroutine Distribute_Cell_Coords(Surf) end do - call Comm_Mod_Global_Sum_Real_Array(nv, Surf % buff_x) - call Comm_Mod_Global_Sum_Real_Array(nv, Surf % buff_y) - call Comm_Mod_Global_Sum_Real_Array(nv, Surf % buff_z) - call Comm_Mod_Global_Sum_Int_Array (nv, Surf % buff_n) + call Global % Sum_Real_Array(nv, Surf % buff_x) + call Global % Sum_Real_Array(nv, Surf % buff_y) + call Global % Sum_Real_Array(nv, Surf % buff_z) + call Global % Sum_Int_Array (nv, Surf % buff_n) do v = 1, nv Surf % Vert(v) % cell_x = Surf % buff_x(v) / Surf % buff_n(v) diff --git a/Sources/Process/Surf_Mod/Distribute_Mesh.f90 b/Sources/Process/Surf_Mod/Distribute_Mesh.f90 index 2cd0a1f77..ee322757d 100644 --- a/Sources/Process/Surf_Mod/Distribute_Mesh.f90 +++ b/Sources/Process/Surf_Mod/Distribute_Mesh.f90 @@ -48,8 +48,8 @@ subroutine Distribute_Mesh(Surf, verbose) nv_proc(This_Proc()) = nv ne_proc(This_Proc()) = ne - call Comm_Mod_Global_Sum_Int_Array(N_Procs(), nv_proc) - call Comm_Mod_Global_Sum_Int_Array(N_Procs(), ne_proc) + call Global % Sum_Int_Array(N_Procs(), nv_proc) + call Global % Sum_Int_Array(N_Procs(), ne_proc) nv_tot = sum(nv_proc(1:N_Procs())) ne_tot = sum(ne_proc(1:N_Procs())) @@ -95,15 +95,15 @@ subroutine Distribute_Mesh(Surf, verbose) end do ! Summ the buffer arrays for coordinates up - call Comm_Mod_Global_Sum_Real_Array(nv_tot, Surf % buff_x) - call Comm_Mod_Global_Sum_Real_Array(nv_tot, Surf % buff_y) - call Comm_Mod_Global_Sum_Real_Array(nv_tot, Surf % buff_z) + call Global % Sum_Real_Array(nv_tot, Surf % buff_x) + call Global % Sum_Real_Array(nv_tot, Surf % buff_y) + call Global % Sum_Real_Array(nv_tot, Surf % buff_z) ! Summ the buffer arrays for elements' vertices up - call Comm_Mod_Global_Sum_Int_Array(ne_tot, Surf % buff_i) - call Comm_Mod_Global_Sum_Int_Array(ne_tot, Surf % buff_j) - call Comm_Mod_Global_Sum_Int_Array(ne_tot, Surf % buff_k) - call Comm_Mod_Global_Sum_Int_Array(ne_tot, Surf % buff_n) + call Global % Sum_Int_Array(ne_tot, Surf % buff_i) + call Global % Sum_Int_Array(ne_tot, Surf % buff_j) + call Global % Sum_Int_Array(ne_tot, Surf % buff_k) + call Global % Sum_Int_Array(ne_tot, Surf % buff_n) ! Fetch coordinates from all vertices do j = 1, nv_tot diff --git a/Sources/Process/Surf_Mod/Distribute_Smooth.f90 b/Sources/Process/Surf_Mod/Distribute_Smooth.f90 index b2f5af6af..3af46a5dc 100644 --- a/Sources/Process/Surf_Mod/Distribute_Smooth.f90 +++ b/Sources/Process/Surf_Mod/Distribute_Smooth.f90 @@ -47,11 +47,11 @@ subroutine Distribute_Smooth(Surf, smooth) end do - call Comm_Mod_Global_Sum_Real_Array(nv, Surf % buff_v) - call Comm_Mod_Global_Sum_Real_Array(nv, Surf % buff_x) - call Comm_Mod_Global_Sum_Real_Array(nv, Surf % buff_y) - call Comm_Mod_Global_Sum_Real_Array(nv, Surf % buff_z) - call Comm_Mod_Global_Sum_Int_Array (nv, Surf % buff_n) + call Global % Sum_Real_Array(nv, Surf % buff_v) + call Global % Sum_Real_Array(nv, Surf % buff_x) + call Global % Sum_Real_Array(nv, Surf % buff_y) + call Global % Sum_Real_Array(nv, Surf % buff_z) + call Global % Sum_Int_Array (nv, Surf % buff_n) do v = 1, nv Surf % Vert(v) % smooth = Surf % buff_v(v) / Surf % buff_n(v) diff --git a/Sources/Process/Swarm_Mod/Advance_Particles.f90 b/Sources/Process/Swarm_Mod/Advance_Particles.f90 index d96dbe188..b900a005c 100644 --- a/Sources/Process/Swarm_Mod/Advance_Particles.f90 +++ b/Sources/Process/Swarm_Mod/Advance_Particles.f90 @@ -127,7 +127,7 @@ subroutine Swarm_Mod_Advance_Particles(Swarm, n, n_stat_p, first_dt_p) end do ! through particles ! Exchange particles for parallel version; if needed - call Comm_Mod_Global_Sum_Int(n_parts_in_buffers) + call Global % Sum_Int(n_parts_in_buffers) if(n_parts_in_buffers > 0) then call Swarm_Mod_Exchange_Particles(Swarm) end if @@ -162,7 +162,7 @@ subroutine Swarm_Mod_Advance_Particles(Swarm, n, n_stat_p, first_dt_p) end do ! through particles ! Exchange particles for parallel version; if needed - call Comm_Mod_Global_Sum_Int(n_parts_in_buffers) + call Global % Sum_Int(n_parts_in_buffers) if(n_parts_in_buffers > 0) then call Swarm_Mod_Exchange_Particles(Swarm) end if diff --git a/Sources/Process/Swarm_Mod/Exchange_Particles.f90 b/Sources/Process/Swarm_Mod/Exchange_Particles.f90 index 8a0103872..c5e5ae086 100644 --- a/Sources/Process/Swarm_Mod/Exchange_Particles.f90 +++ b/Sources/Process/Swarm_Mod/Exchange_Particles.f90 @@ -73,13 +73,13 @@ subroutine Swarm_Mod_Exchange_Particles(Swarm) !-----------------------! ! Exchange the data ! !-----------------------! - call Comm_Mod_Global_Sum_Int_Array ( & + call Global % Sum_Int_Array ( & Swarm % n_particles * Swarm % N_I_VARS, & Swarm % i_work) - call Comm_Mod_Global_Lor_Log_Array ( & + call Global % Lor_Log_Array ( & Swarm % n_particles * Swarm % N_L_VARS, & Swarm % l_work) - call Comm_Mod_Global_Sum_Real_Array( & + call Global % Sum_Real_Array( & Swarm % n_particles * Swarm % N_R_VARS, & Swarm % r_work) diff --git a/Sources/Process/Swarm_Mod/Print_Statistics.f90 b/Sources/Process/Swarm_Mod/Print_Statistics.f90 index e50c8cf91..9ddecce5b 100644 --- a/Sources/Process/Swarm_Mod/Print_Statistics.f90 +++ b/Sources/Process/Swarm_Mod/Print_Statistics.f90 @@ -40,12 +40,12 @@ subroutine Swarm_Mod_Print_Statistics(Swarm) max_st = max(max_st, Part % st) end if end do - call Comm_Mod_Global_Sum_Real(avg_cfl) - call Comm_Mod_Global_Sum_Real(avg_st) - call Comm_Mod_Global_Sum_Real(avg_re) - call Comm_Mod_Global_Max_Real(max_cfl) - call Comm_Mod_Global_Max_Real(max_re) - call Comm_Mod_Global_Max_Real(max_st) + call Global % Sum_Real(avg_cfl) + call Global % Sum_Real(avg_st) + call Global % Sum_Real(avg_re) + call Global % Max_Real(max_cfl) + call Global % Max_Real(max_re) + call Global % Max_Real(max_st) avg_cfl = avg_cfl / real(Swarm % n_particles) avg_re = avg_re / real(Swarm % n_particles) avg_st = avg_st / real(Swarm % n_particles) @@ -60,9 +60,9 @@ subroutine Swarm_Mod_Print_Statistics(Swarm) n_ref = n_ref + nint(Swarm % n_reflected(c)) end if end do - call Comm_Mod_Global_Sum_Int(n_dep) - call Comm_Mod_Global_Sum_Int(n_esc) - call Comm_Mod_Global_Sum_Int(n_ref) + call Global % Sum_Int(n_dep) + call Global % Sum_Int(n_esc) + call Global % Sum_Int(n_ref) !-----------------------------------! ! Print some data on the screen ! diff --git a/Sources/Process/Vof_Mod/Core/Compute_Vof.f90 b/Sources/Process/Vof_Mod/Core/Compute_Vof.f90 index d7fd11374..9cd9c8d03 100644 --- a/Sources/Process/Vof_Mod/Core/Compute_Vof.f90 +++ b/Sources/Process/Vof_Mod/Core/Compute_Vof.f90 @@ -164,7 +164,7 @@ subroutine Compute_Vof(Vof, Sol, dt, curr_dt) wrong_vf = 1 end if - call Comm_Mod_Global_Sum_Int(wrong_vf) + call Global % Sum_Int(wrong_vf) if(wrong_vf == 0) then goto 1 diff --git a/Sources/Process/Vof_Mod/Core/Initialize_From_Stl.f90 b/Sources/Process/Vof_Mod/Core/Initialize_From_Stl.f90 index e45633a92..77bedd8c6 100644 --- a/Sources/Process/Vof_Mod/Core/Initialize_From_Stl.f90 +++ b/Sources/Process/Vof_Mod/Core/Initialize_From_Stl.f90 @@ -391,7 +391,7 @@ subroutine Initialize_From_Stl(Vof) end do ! Flood fill still going, go back - call Comm_Mod_Global_Lor_Log(flooding) + call Global % Lor_Log(flooding) if(flooding) goto 1 if(First_Proc()) print '(a)', ' done!' diff --git a/Sources/Process/Vof_Mod/Core/Max_Courant_Number.f90 b/Sources/Process/Vof_Mod/Core/Max_Courant_Number.f90 index 6aec1fe4a..d8895b1a5 100644 --- a/Sources/Process/Vof_Mod/Core/Max_Courant_Number.f90 +++ b/Sources/Process/Vof_Mod/Core/Max_Courant_Number.f90 @@ -85,7 +85,7 @@ subroutine Max_Courant_Number(Vof, dt, interf, courant_max) do c = 1, Grid % n_cells courant_max = max(c_d(c), courant_max) end do - call Comm_Mod_Global_Max_Real(courant_max) + call Global % Max_Real(courant_max) else ! interf = 0 diff --git a/Sources/Process/Vof_Mod/Utilities/Mass_Transfer_Added_Volume.f90 b/Sources/Process/Vof_Mod/Utilities/Mass_Transfer_Added_Volume.f90 index 0c40db66f..b43f54db6 100644 --- a/Sources/Process/Vof_Mod/Utilities/Mass_Transfer_Added_Volume.f90 +++ b/Sources/Process/Vof_Mod/Utilities/Mass_Transfer_Added_Volume.f90 @@ -41,6 +41,6 @@ subroutine Mass_Transfer_Added_Volume(Vof, added_vol) end do ! Take global summ - call Comm_Mod_Global_Sum_Real(added_vol) + call Global % Sum_Real(added_vol) end subroutine diff --git a/Sources/Shared/Comm_Mod.f90 b/Sources/Shared/Comm_Mod.f90 index 6d666730d..7883df6bb 100644 --- a/Sources/Shared/Comm_Mod.f90 +++ b/Sources/Shared/Comm_Mod.f90 @@ -102,13 +102,24 @@ module Comm_Mod procedure :: Sendrecv_Log_Arrays procedure :: Sendrecv_Real_Arrays + ! Global + procedure :: Lor_Log + procedure :: Lor_Log_Array + procedure :: Max_Int + procedure :: Max_Real + procedure :: Min_Int + procedure :: Min_Real + procedure :: Sum_Int + procedure :: Sum_Int_Array + procedure :: Sum_Real + procedure :: Sum_Real_Array end type !------------------------------------------------------------------------! ! A big global communicator, introduced essentiall to give access to ! ! private variables n_processors and this_processor to other objects ! !------------------------------------------------------------------------! - type(Comm_Type) :: Communicator + type(Comm_Type) :: Global ! These communication types will depend on precision #if T_FLOWS_MPI == 1 diff --git a/Sources/Shared/Comm_Mod/Parallel/Exchange_Int_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Exchange_Int_Array.f90 index f0f8fd458..f2f2729c9 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Exchange_Int_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Exchange_Int_Array.f90 @@ -19,8 +19,8 @@ subroutine Exchange_Int_Array(Comm, length, phi, dest) !==============================================================================! ! Form send and receive tags - stag = Communicator % n_processors * Communicator % this_processor + dest - rtag = Communicator % n_processors * dest + Communicator % this_processor + stag = Global % n_processors * Global % this_processor + dest + rtag = Global % n_processors * dest + Global % this_processor call Mpi_Sendrecv_Replace(phi(1), & ! buffer length, & ! length diff --git a/Sources/Shared/Comm_Mod/Parallel/Exchange_Log_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Exchange_Log_Array.f90 index 8a39fb1d8..9cbe75607 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Exchange_Log_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Exchange_Log_Array.f90 @@ -19,8 +19,8 @@ subroutine Exchange_Log_Array(Comm, length, phi, dest) !==============================================================================! ! Form send and receive tags - stag = Communicator % n_processors * Communicator % this_processor + dest - rtag = Communicator % n_processors * dest + Communicator % this_processor + stag = Global % n_processors * Global % this_processor + dest + rtag = Global % n_processors * dest + Global % this_processor call Mpi_Sendrecv_Replace(phi(1), & ! buffer length, & ! length diff --git a/Sources/Shared/Comm_Mod/Parallel/Exchange_Real_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Exchange_Real_Array.f90 index d47f55be5..c90c6cace 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Exchange_Real_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Exchange_Real_Array.f90 @@ -19,8 +19,8 @@ subroutine Exchange_Real_Array(Comm, length, phi, dest) !==============================================================================! ! Form send and receive tags - stag = Communicator % n_processors * Communicator % this_processor + dest - rtag = Communicator % n_processors * dest + Communicator % this_processor + stag = Global % n_processors * Global % this_processor + dest + rtag = Global % n_processors * dest + Global % this_processor call Mpi_Sendrecv_Replace(phi(1), & ! buffer length, & ! length diff --git a/Sources/Shared/Comm_Mod/Parallel/Global_Lor_Log.f90 b/Sources/Shared/Comm_Mod/Parallel/Global_Lor_Log.f90 index f543d4413..984b4425d 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Global_Lor_Log.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Global_Lor_Log.f90 @@ -1,14 +1,17 @@ !==============================================================================! - subroutine Comm_Mod_Global_Lor_Log(phi) + subroutine Lor_Log(Global, phi) !------------------------------------------------------------------------------! ! Estimates logical or over all processors. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - logical :: phi + class(Comm_Type), intent(in) :: Global + logical, intent(inout) :: phi !-----------------------------------[Locals]-----------------------------------! logical :: phi_new integer :: error +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Global) !==============================================================================! call Mpi_Allreduce(phi, & ! send buffer diff --git a/Sources/Shared/Comm_Mod/Parallel/Global_Lor_Log_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Global_Lor_Log_Array.f90 index 7cbc91cfc..843870372 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Global_Lor_Log_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Global_Lor_Log_Array.f90 @@ -1,14 +1,17 @@ !==============================================================================! - subroutine Comm_Mod_Global_Lor_Log_Array(n, phi) + subroutine Lor_Log_Array(Global, n, phi) !------------------------------------------------------------------------------! ! Estimates logical or over all processors. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer, intent(in) :: n - logical, intent(inout) :: phi(n) + class(Comm_Type), intent(in) :: Global + integer, intent(in) :: n + logical, intent(inout) :: phi(n) !-----------------------------------[Locals]-----------------------------------! integer :: error +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Global) !==============================================================================! call Mpi_Allreduce(MPI_IN_PLACE, & ! indicate that send and recv are same diff --git a/Sources/Shared/Comm_Mod/Parallel/Global_Max_Int.f90 b/Sources/Shared/Comm_Mod/Parallel/Global_Max_Int.f90 index 788e54872..61d4fde5c 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Global_Max_Int.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Global_Max_Int.f90 @@ -1,14 +1,17 @@ !==============================================================================! - subroutine Comm_Mod_Global_Max_Int(phi) + subroutine Max_Int(Global, phi) !------------------------------------------------------------------------------! ! Estimates global max among all processors. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer :: phi + class(Comm_Type), intent(in) :: Global + integer, intent(inout) :: phi !-----------------------------------[Locals]-----------------------------------! integer :: phi_new integer :: error +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Global) !==============================================================================! call Mpi_Allreduce(phi, & ! send buffer diff --git a/Sources/Shared/Comm_Mod/Parallel/Global_Max_Real.f90 b/Sources/Shared/Comm_Mod/Parallel/Global_Max_Real.f90 index e6b1a73e6..b17f5fca5 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Global_Max_Real.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Global_Max_Real.f90 @@ -1,14 +1,17 @@ !==============================================================================! - subroutine Comm_Mod_Global_Max_Real(phi) + subroutine Max_Real(Global, phi) !------------------------------------------------------------------------------! ! Estimates global maximum among all processors. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real :: phi + class(Comm_Type), intent(in) :: Global + real, intent(inout) :: phi !-----------------------------------[Locals]-----------------------------------! real :: phi_new integer :: error +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Global) !==============================================================================! call Mpi_Allreduce(phi, & ! send buffer diff --git a/Sources/Shared/Comm_Mod/Parallel/Global_Min_Int.f90 b/Sources/Shared/Comm_Mod/Parallel/Global_Min_Int.f90 index 34ad9ea93..ecad6b00c 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Global_Min_Int.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Global_Min_Int.f90 @@ -1,14 +1,17 @@ !==============================================================================! - subroutine Comm_Mod_Global_Min_Int(phi) + subroutine Min_Int(Global, phi) !------------------------------------------------------------------------------! ! Estimates global min among all processors. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer :: phi + class(Comm_Type), intent(in) :: Global + integer, intent(inout) :: phi !-----------------------------------[Locals]-----------------------------------! integer :: phi_new integer :: error +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Global) !==============================================================================! call Mpi_Allreduce(phi, & ! send buffer diff --git a/Sources/Shared/Comm_Mod/Parallel/Global_Min_Real.f90 b/Sources/Shared/Comm_Mod/Parallel/Global_Min_Real.f90 index f3fbdca09..1b2f6c445 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Global_Min_Real.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Global_Min_Real.f90 @@ -1,14 +1,17 @@ !==============================================================================! - subroutine Comm_Mod_Global_Min_Real(phi) + subroutine Min_Real(Global, phi) !------------------------------------------------------------------------------! ! Estimates global minimum among all processors. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real :: phi + class(Comm_Type), intent(in) :: Global + real, intent(inout) :: phi !-----------------------------------[Locals]-----------------------------------! real :: phi_new integer :: error +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Global) !==============================================================================! call Mpi_Allreduce(phi, & ! send buffer diff --git a/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Int.f90 b/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Int.f90 index c8fec3db9..bcfb7deee 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Int.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Int.f90 @@ -1,14 +1,17 @@ !==============================================================================! - subroutine Comm_Mod_Global_Sum_Int(phi) + subroutine Sum_Int(Global, phi) !------------------------------------------------------------------------------! ! Estimates global summ among all processors. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer :: phi + class(Comm_Type), intent(in) :: Global + integer, intent(inout) :: phi !-----------------------------------[Locals]-----------------------------------! integer :: phi_new integer :: error +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Global) !==============================================================================! call Mpi_Allreduce(phi, & ! send buffer diff --git a/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Int_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Int_Array.f90 index ee8a1b083..b743315d8 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Int_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Int_Array.f90 @@ -1,14 +1,17 @@ !==============================================================================! - subroutine Comm_Mod_Global_Sum_Int_Array(n, phi) + subroutine Sum_Int_Array(Global, n, phi) !------------------------------------------------------------------------------! ! Estimates global sum over all processors. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer, intent(in) :: n - integer, intent(inout) :: phi(n) + class(Comm_Type), intent(in) :: Global + integer, intent(in) :: n + integer, intent(inout) :: phi(n) !-----------------------------------[Locals]-----------------------------------! integer :: error +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Global) !==============================================================================! call Mpi_Allreduce(MPI_IN_PLACE, & ! indicate that send and recv are same diff --git a/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Real.f90 b/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Real.f90 index b457ee061..01ef20167 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Real.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Real.f90 @@ -1,14 +1,17 @@ !==============================================================================! - subroutine Comm_Mod_Global_Sum_Real(phi) + subroutine Sum_Real(Global, phi) !------------------------------------------------------------------------------! ! Estimates global sum over all processors. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real :: phi + class(Comm_Type), intent(in) :: Global + real, intent(inout) :: phi !-----------------------------------[Locals]-----------------------------------! real :: phi_new integer :: error +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Global) !==============================================================================! call Mpi_Allreduce(phi, & ! send buffer diff --git a/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Real_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Real_Array.f90 index de9a443c0..a3497565d 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Real_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Real_Array.f90 @@ -1,14 +1,17 @@ !==============================================================================! - subroutine Comm_Mod_Global_Sum_Real_Array(n, phi) + subroutine Sum_Real_Array(Global, n, phi) !------------------------------------------------------------------------------! ! Estimates global sum over all processors. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer, intent(in) :: n - real, intent(inout) :: phi(n) + class(Comm_Type), intent(in) :: Global + integer, intent(in) :: n + real, intent(inout) :: phi(n) !-----------------------------------[Locals]-----------------------------------! integer :: error +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Global) !==============================================================================! call Mpi_Allreduce(MPI_IN_PLACE, & ! indicate that send and recv are same diff --git a/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Int_Arrays.f90 b/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Int_Arrays.f90 index e17e7a900..4ed25f549 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Int_Arrays.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Int_Arrays.f90 @@ -20,8 +20,8 @@ subroutine Sendrecv_Int_Arrays(Comm, len_s, phi_s, & !==============================================================================! ! Form send and receive tags - stag = Communicator % n_processors * Communicator % this_processor + dest - rtag = Communicator % n_processors * dest + Communicator % this_processor + stag = Global % n_processors * Global % this_processor + dest + rtag = Global % n_processors * dest + Global % this_processor call Mpi_Sendrecv(phi_s(1), & ! send buffer len_s, & ! send length diff --git a/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Log_Arrays.f90 b/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Log_Arrays.f90 index a7239bc8a..40ff81d7e 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Log_Arrays.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Log_Arrays.f90 @@ -20,8 +20,8 @@ subroutine Sendrecv_Log_Arrays(Comm, len_s, phi_s, & !==============================================================================! ! Form send and receive tags - stag = Communicator % n_processors * Communicator % this_processor + dest - rtag = Communicator % n_processors * dest + Communicator % this_processor + stag = Global % n_processors * Global % this_processor + dest + rtag = Global % n_processors * dest + Global % this_processor call Mpi_Sendrecv(phi_s(1), & ! send buffer len_s, & ! send length diff --git a/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Real_Arrays.f90 b/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Real_Arrays.f90 index 9b94bc040..1ae563f36 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Real_Arrays.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Sendrecv_Real_Arrays.f90 @@ -20,8 +20,8 @@ subroutine Sendrecv_Real_Arrays(Comm, len_s, phi_s, & !==============================================================================! ! Form send and receive tags - stag = Communicator % n_processors * Communicator % this_processor + dest - rtag = Communicator % n_processors * dest + Communicator % this_processor + stag = Global % n_processors * Global % this_processor + dest + rtag = Global % n_processors * dest + Global % this_processor call Mpi_Sendrecv(phi_s(1), & ! send buffer len_s, & ! send length diff --git a/Sources/Shared/Comm_Mod/Parallel/Start.f90 b/Sources/Shared/Comm_Mod/Parallel/Start.f90 index 38fc0c0b9..cdb715e81 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Start.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Start.f90 @@ -13,18 +13,18 @@ subroutine Comm_Mod_Start call Mpi_Init(error) ! Get number of processors - call Mpi_Comm_Size(MPI_COMM_WORLD, Communicator % n_processors, error) + call Mpi_Comm_Size(MPI_COMM_WORLD, Global % n_processors, error) ! Get current processor number - call Mpi_Comm_Rank(MPI_COMM_WORLD, Communicator % this_processor, error) + call Mpi_Comm_Rank(MPI_COMM_WORLD, Global % this_processor, error) ! Use Fortran counting - from 1 - Communicator % this_processor = Communicator % this_processor + 1 + Global % this_processor = Global % this_processor + 1 ! But if run is sequential, set the only processor to zero - if(Communicator % n_processors .eq. 1) then - Communicator % n_processors = 0 - Communicator % this_processor = 0 + if(Global % n_processors .eq. 1) then + Global % n_processors = 0 + Global % this_processor = 0 endif ! Set proper types for communication @@ -37,7 +37,7 @@ subroutine Comm_Mod_Start ! Make sure that integers are 32-bit if(IP .eq. DP) then - if(Communicator % this_processor < 2) then + if(Global % this_processor < 2) then print *, '# Error - 64 bit integers are not supported!' print *, '# This error is critical, exiting!' call Comm_Mod_End diff --git a/Sources/Shared/Comm_Mod/Sequential/Global_Lor_Log.f90 b/Sources/Shared/Comm_Mod/Sequential/Global_Lor_Log.f90 index 191bb03b7..7857c02e8 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Global_Lor_Log.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Global_Lor_Log.f90 @@ -1,12 +1,14 @@ !==============================================================================! - subroutine Comm_Mod_Global_Lor_Log(phi) + subroutine Lor_Log(Global, phi) !------------------------------------------------------------------------------! ! Dummy function for sequential compilation. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - logical :: phi + class(Comm_Type), intent(in) :: Global + logical, intent(inout) :: phi !------------------------[Avoid unused parent warning]-------------------------! + Unused(Global) Unused(phi) !==============================================================================! diff --git a/Sources/Shared/Comm_Mod/Sequential/Global_Lor_Log_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Global_Lor_Log_Array.f90 index 59ebbd1d7..88b8b3942 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Global_Lor_Log_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Global_Lor_Log_Array.f90 @@ -1,13 +1,15 @@ !==============================================================================! - subroutine Comm_Mod_Global_Lor_Log_Array(n, phi) + subroutine Lor_Log_Array(Global, n, phi) !------------------------------------------------------------------------------! ! Dummy function for sequential runs. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer :: n - logical :: phi(n) + class(Comm_Type), intent(in) :: Global + integer, intent(in) :: n + logical, intent(inout) :: phi(n) !------------------------[Avoid unused parent warning]-------------------------! + Unused(Global) Unused(n) Unused(phi) !==============================================================================! diff --git a/Sources/Shared/Comm_Mod/Sequential/Global_Max_Int.f90 b/Sources/Shared/Comm_Mod/Sequential/Global_Max_Int.f90 index 32a985a6d..b3dd5e89d 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Global_Max_Int.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Global_Max_Int.f90 @@ -1,12 +1,14 @@ !==============================================================================! - subroutine Comm_Mod_Global_Max_Int(phi) + subroutine Max_Int(Global, phi) !------------------------------------------------------------------------------! ! Dummy function for sequential compilation. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer :: phi + class(Comm_Type), intent(in) :: Global + integer, intent(inout) :: phi !------------------------[Avoid unused parent warning]-------------------------! + Unused(Global) Unused(phi) !==============================================================================! diff --git a/Sources/Shared/Comm_Mod/Sequential/Global_Max_Real.f90 b/Sources/Shared/Comm_Mod/Sequential/Global_Max_Real.f90 index 83eefba74..e84a24f0f 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Global_Max_Real.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Global_Max_Real.f90 @@ -1,12 +1,14 @@ !==============================================================================! - subroutine Comm_Mod_Global_Max_Real(phi) + subroutine Max_Real(Global, phi) !------------------------------------------------------------------------------! ! Dummy function for sequential runs. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real :: phi + class(Comm_Type), intent(in) :: Global + real, intent(inout) :: phi !------------------------[Avoid unused parent warning]-------------------------! + Unused(Global) Unused(phi) !==============================================================================! diff --git a/Sources/Shared/Comm_Mod/Sequential/Global_Min_Int.f90 b/Sources/Shared/Comm_Mod/Sequential/Global_Min_Int.f90 index a28baa583..77bfc5a3c 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Global_Min_Int.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Global_Min_Int.f90 @@ -1,12 +1,14 @@ !==============================================================================! - subroutine Comm_Mod_Global_Min_Int(phi) + subroutine Min_Int(Global, phi) !------------------------------------------------------------------------------! ! Dummy function for sequential compilation. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer :: phi + class(Comm_Type), intent(in) :: Global + integer, intent(inout) :: phi !------------------------[Avoid unused parent warning]-------------------------! + Unused(Global) Unused(phi) !==============================================================================! diff --git a/Sources/Shared/Comm_Mod/Sequential/Global_Min_Real.f90 b/Sources/Shared/Comm_Mod/Sequential/Global_Min_Real.f90 index 3fc32caea..4643f109d 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Global_Min_Real.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Global_Min_Real.f90 @@ -1,12 +1,14 @@ !==============================================================================! - subroutine Comm_Mod_Global_Min_Real(phi) + subroutine Min_Real(Global, phi) !------------------------------------------------------------------------------! ! Dummy function for sequential runs. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real :: phi + class(Comm_Type), intent(in) :: Global + real, intent(inout) :: phi !------------------------[Avoid unused parent warning]-------------------------! + Unused(Global) Unused(phi) !==============================================================================! diff --git a/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Int.f90 b/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Int.f90 index 547a32e31..55ac0b279 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Int.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Int.f90 @@ -1,12 +1,14 @@ !==============================================================================! - subroutine Comm_Mod_Global_Sum_Int(phi) + subroutine Sum_Int(Global, phi) !------------------------------------------------------------------------------! ! Dummy function for sequential runs. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer :: phi + class(Comm_Type), intent(in) :: Global + integer, intent(inout) :: phi !------------------------[Avoid unused parent warning]-------------------------! + Unused(Global) Unused(phi) !==============================================================================! diff --git a/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Int_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Int_Array.f90 index 0e95a9037..bc84532cb 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Int_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Int_Array.f90 @@ -1,13 +1,15 @@ !==============================================================================! - subroutine Comm_Mod_Global_Sum_Int_Array(n, phi) + subroutine Sum_Int_Array(Global, n, phi) !------------------------------------------------------------------------------! ! Dummy function for sequential runs. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer :: n - integer :: phi(n) + class(Comm_Type), intent(in) :: Global + integer, intent(in) :: n + integer, intent(inout) :: phi(n) !------------------------[Avoid unused parent warning]-------------------------! + Unused(Global) Unused(n) Unused(phi) !==============================================================================! diff --git a/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Real.f90 b/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Real.f90 index 5a53406e4..109d1efa1 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Real.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Real.f90 @@ -1,12 +1,14 @@ !==============================================================================! - subroutine Comm_Mod_Global_Sum_Real(phi) + subroutine Sum_Real(Global, phi) !------------------------------------------------------------------------------! ! Dummy function for sequential runs. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real :: phi + class(Comm_Type), intent(in) :: Global + real, intent(inout) :: phi !------------------------[Avoid unused parent warning]-------------------------! + Unused(Global) Unused(phi) !==============================================================================! diff --git a/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Real_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Real_Array.f90 index 659f2f7de..d24dfc061 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Real_Array.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Global_Sum_Real_Array.f90 @@ -1,13 +1,15 @@ !==============================================================================! - subroutine Comm_Mod_Global_Sum_Real_Array(n, phi) + subroutine Sum_Real_Array(Global, n, phi) !------------------------------------------------------------------------------! ! Dummy function for sequential runs. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer :: n - real :: phi(n) + class(Comm_Type), intent(in) :: Global + integer, intent(in) :: n + real, intent(inout) :: phi(n) !------------------------[Avoid unused parent warning]-------------------------! + Unused(Global) Unused(n) Unused(phi) !==============================================================================! diff --git a/Sources/Shared/Comm_Mod/Sequential/Start.f90 b/Sources/Shared/Comm_Mod/Sequential/Start.f90 index a331bac07..af1a68ece 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Start.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Start.f90 @@ -9,8 +9,8 @@ subroutine Comm_Mod_Start integer, allocatable :: seeds(:) !==============================================================================! - Communicator % this_processor = 0 - Communicator % n_processors = 0 + Global % this_processor = 0 + Global % n_processors = 0 call random_seed(size = n) allocate(seeds(n)); seeds(:) = 12321 diff --git a/Sources/Shared/Comm_Mod/Shared/First_Proc.f90 b/Sources/Shared/Comm_Mod/Shared/First_Proc.f90 index 24fecfb29..ab15a5b6d 100644 --- a/Sources/Shared/Comm_Mod/Shared/First_Proc.f90 +++ b/Sources/Shared/Comm_Mod/Shared/First_Proc.f90 @@ -4,6 +4,6 @@ pure logical function First_Proc() implicit none !==============================================================================! - First_Proc = Communicator % this_processor < 2 + First_Proc = Global % this_processor < 2 end function diff --git a/Sources/Shared/Comm_Mod/Shared/N_Procs.f90 b/Sources/Shared/Comm_Mod/Shared/N_Procs.f90 index 6f7200baa..dcba61449 100644 --- a/Sources/Shared/Comm_Mod/Shared/N_Procs.f90 +++ b/Sources/Shared/Comm_Mod/Shared/N_Procs.f90 @@ -4,6 +4,6 @@ pure integer function N_Procs() implicit none !==============================================================================! - N_Procs = Communicator % n_processors + N_Procs = Global % n_processors end function diff --git a/Sources/Shared/Comm_Mod/Shared/Parallel_Run.f90 b/Sources/Shared/Comm_Mod/Shared/Parallel_Run.f90 index a0995949e..7e1475be2 100644 --- a/Sources/Shared/Comm_Mod/Shared/Parallel_Run.f90 +++ b/Sources/Shared/Comm_Mod/Shared/Parallel_Run.f90 @@ -4,6 +4,6 @@ pure logical function Parallel_Run() implicit none !==============================================================================! - Parallel_Run = Communicator % n_processors > 2 + Parallel_Run = Global % n_processors > 2 end function diff --git a/Sources/Shared/Comm_Mod/Shared/Sequential_Run.f90 b/Sources/Shared/Comm_Mod/Shared/Sequential_Run.f90 index c24614417..ad507371e 100644 --- a/Sources/Shared/Comm_Mod/Shared/Sequential_Run.f90 +++ b/Sources/Shared/Comm_Mod/Shared/Sequential_Run.f90 @@ -4,6 +4,6 @@ pure logical function Sequential_Run() implicit none !==============================================================================! - Sequential_Run = Communicator % n_processors < 2 + Sequential_Run = Global % n_processors < 2 end function diff --git a/Sources/Shared/Comm_Mod/Shared/This_Proc.f90 b/Sources/Shared/Comm_Mod/Shared/This_Proc.f90 index be6bcbca9..0a5fcac3f 100644 --- a/Sources/Shared/Comm_Mod/Shared/This_Proc.f90 +++ b/Sources/Shared/Comm_Mod/Shared/This_Proc.f90 @@ -4,6 +4,6 @@ pure integer function This_Proc() implicit none !==============================================================================! - This_Proc = Communicator % this_processor + This_Proc = Global % this_processor end function diff --git a/Sources/Shared/Grid_Mod/Bounding_Box.f90 b/Sources/Shared/Grid_Mod/Bounding_Box.f90 index c4a6cd6d5..9882c2865 100644 --- a/Sources/Shared/Grid_Mod/Bounding_Box.f90 +++ b/Sources/Shared/Grid_Mod/Bounding_Box.f90 @@ -20,12 +20,12 @@ subroutine Bounding_Box(Grid, xmin, ymin, zmin, xmax, ymax, zmax) ymax = maxval(Grid % yn(1:nn)) zmax = maxval(Grid % zn(1:nn)) - call Comm_Mod_Global_Min_Real(xmin) - call Comm_Mod_Global_Min_Real(ymin) - call Comm_Mod_Global_Min_Real(zmin) + call Global % Min_Real(xmin) + call Global % Min_Real(ymin) + call Global % Min_Real(zmin) - call Comm_Mod_Global_Max_Real(xmax) - call Comm_Mod_Global_Max_Real(ymax) - call Comm_Mod_Global_Max_Real(zmax) + call Global % Max_Real(xmax) + call Global % Max_Real(ymax) + call Global % Max_Real(zmax) end subroutine diff --git a/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 b/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 index 8ca55645e..bffa20ed9 100644 --- a/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 +++ b/Sources/Shared/Grid_Mod/Calculate_Face_Geometry.f90 @@ -169,8 +169,8 @@ subroutine Calculate_Face_Geometry(Grid) min_d = min(min_d, d_s) max_d = max(max_d, d_s) end do - call Comm_Mod_Global_Min_Real(min_d) - call Comm_Mod_Global_Max_Real(max_d) + call Global % Min_Real(min_d) + call Global % Max_Real(max_d) if(First_Proc() .and. Grid % n_shadows > 0) then print '(a,f9.3)', ' # Minimum distance stored in shadow faces: ', min_d print '(a,f9.3)', ' # Maximum distance stored in shadow faces: ', max_d @@ -230,8 +230,8 @@ subroutine Calculate_Face_Geometry(Grid) max_d = max(max_d, d_s) end if end do - call Comm_Mod_Global_Min_Real(min_d) - call Comm_Mod_Global_Max_Real(max_d) + call Global % Min_Real(min_d) + call Global % Max_Real(max_d) if(First_Proc() .and. Grid % n_shadows > 0) then print '(a,f9.3)', ' # Minimum corrected distance at shadows: ', min_d print '(a,f9.3)', ' # Maximum corrected distance at shadows: ', max_d diff --git a/Sources/Shared/Grid_Mod/Calculate_Global_Volumes.f90 b/Sources/Shared/Grid_Mod/Calculate_Global_Volumes.f90 index 7d4b590c1..2da704bf2 100644 --- a/Sources/Shared/Grid_Mod/Calculate_Global_Volumes.f90 +++ b/Sources/Shared/Grid_Mod/Calculate_Global_Volumes.f90 @@ -21,8 +21,8 @@ subroutine Calculate_Global_Volumes(Grid) end do ! Make them global (over all processors) - call Comm_Mod_Global_Max_Real(Grid % max_vol) - call Comm_Mod_Global_Min_Real(Grid % min_vol) - call Comm_Mod_Global_Sum_Real(Grid % tot_vol) + call Global % Max_Real(Grid % max_vol) + call Global % Min_Real(Grid % min_vol) + call Global % Sum_Real(Grid % tot_vol) end subroutine diff --git a/Sources/Shared/Grid_Mod/Exchange_Cells_Real.f90 b/Sources/Shared/Grid_Mod/Exchange_Cells_Real.f90 index ec2aaac07..7d47a17a7 100644 --- a/Sources/Shared/Grid_Mod/Exchange_Cells_Real.f90 +++ b/Sources/Shared/Grid_Mod/Exchange_Cells_Real.f90 @@ -97,7 +97,7 @@ subroutine Exchange_Cells_Real(Grid, phi, caller) end do ! What if it is needed on some other processor - call Comm_Mod_Global_Max_Int(needed) + call Global % Max_Int(needed) if(First_Proc()) then if(needed .eq. YES) then diff --git a/Sources/Shared/Grid_Mod/Find_Nodes_Cells.f90 b/Sources/Shared/Grid_Mod/Find_Nodes_Cells.f90 index 114388dc7..02be3f565 100644 --- a/Sources/Shared/Grid_Mod/Find_Nodes_Cells.f90 +++ b/Sources/Shared/Grid_Mod/Find_Nodes_Cells.f90 @@ -47,7 +47,7 @@ subroutine Find_Nodes_Cells(Grid) ! Allocate memory for cells surrounding each node if(run .eq. 1) then max_n_cells = maxval(Grid % nodes_n_cells) - call Comm_Mod_Global_Max_Int(max_n_cells) + call Global % Max_Int(max_n_cells) allocate(Grid % nodes_c(1:max_n_cells, 1:Grid % n_nodes)) allocate(cell_list(max_n_cells*2)); cell_list(:) = 0 end if diff --git a/Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 b/Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 index af43b988d..805680f0a 100644 --- a/Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 +++ b/Sources/Shared/Grid_Mod/Form_Cells_Comm.f90 @@ -102,7 +102,7 @@ subroutine Form_Cells_Comm(Grid) ! Allocate memory for matrix with needed cells ! !--------------------------------------------------! n_max_buff_cells = Grid % Comm % n_buff_cells - call Comm_Mod_Global_Max_Int(n_max_buff_cells) + call Global % Max_Int(n_max_buff_cells) allocate(need_cell(n_max_buff_cells, N_Procs())); need_cell(:,:) = 0 allocate(from_proc(n_max_buff_cells, N_Procs())); from_proc(:,:) = 0 @@ -124,8 +124,8 @@ subroutine Form_Cells_Comm(Grid) !----------------------------------------------! need_cell = reshape(need_cell, (/n_max_buff_cells*N_Procs(), 1/)) from_proc = reshape(from_proc, (/n_max_buff_cells*N_Procs(), 1/)) - call Comm_Mod_Global_Sum_Int_Array(n_max_buff_cells*N_Procs(), need_cell) - call Comm_Mod_Global_Sum_Int_Array(n_max_buff_cells*N_Procs(), from_proc) + call Global % Sum_Int_Array(n_max_buff_cells*N_Procs(), need_cell) + call Global % Sum_Int_Array(n_max_buff_cells*N_Procs(), from_proc) need_cell = reshape(need_cell, (/n_max_buff_cells, N_Procs()/)) from_proc = reshape(from_proc, (/n_max_buff_cells, N_Procs()/)) @@ -285,7 +285,7 @@ subroutine Form_Cells_Comm(Grid) n_fail = n_fail + 1 end if end do - call Comm_Mod_Global_Sum_Int(n_fail) + call Global % Sum_Int(n_fail) if(n_fail .gt. 0) then call Message % Error(55, & 'Ouch, this hurts. Formation of communication ' // & diff --git a/Sources/Shared/Grid_Mod/Form_Maps_For_Backup.f90 b/Sources/Shared/Grid_Mod/Form_Maps_For_Backup.f90 index 67988d8cc..0090a02dd 100644 --- a/Sources/Shared/Grid_Mod/Form_Maps_For_Backup.f90 +++ b/Sources/Shared/Grid_Mod/Form_Maps_For_Backup.f90 @@ -47,8 +47,8 @@ subroutine Form_Maps_For_Backup(Grid) ! Initialize total number of cells Grid % Comm % nc_tot = Grid % Comm % nc_sub Grid % Comm % nb_tot = Grid % Comm % nb_sub - call Comm_Mod_Global_Sum_Int(Grid % Comm % nc_tot) - call Comm_Mod_Global_Sum_Int(Grid % Comm % nb_tot) + call Global % Sum_Int(Grid % Comm % nc_tot) + call Global % Sum_Int(Grid % Comm % nb_tot) ! Allocate memory for mapping matrices allocate(Grid % Comm % cell_map (Grid % Comm % nc_sub)) diff --git a/Sources/Shared/Grid_Mod/Print_Grid_Statistics.f90 b/Sources/Shared/Grid_Mod/Print_Grid_Statistics.f90 index 7508ce112..0ab27d8e2 100644 --- a/Sources/Shared/Grid_Mod/Print_Grid_Statistics.f90 +++ b/Sources/Shared/Grid_Mod/Print_Grid_Statistics.f90 @@ -63,12 +63,12 @@ subroutine Print_Grid_Statistics(Grid) end if end do - call Comm_Mod_Global_Sum_Int(n_faces) - call Comm_Mod_Global_Sum_Int(n_shadows) - call Comm_Mod_Global_Sum_Int(n_tri) - call Comm_Mod_Global_Sum_Int(n_quad) - call Comm_Mod_Global_Sum_Int(n_polg) - call Comm_Mod_Global_Max_Int(max_n_polg) + call Global % Sum_Int(n_faces) + call Global % Sum_Int(n_shadows) + call Global % Sum_Int(n_tri) + call Global % Sum_Int(n_quad) + call Global % Sum_Int(n_polg) + call Global % Max_Int(max_n_polg) if(First_Proc()) then print '(a)', ' #- - - - - - - - - - - - - - - - - - - - - - - - - - - -' @@ -127,17 +127,17 @@ subroutine Print_Grid_Statistics(Grid) end if end do - call Comm_Mod_Global_Sum_Int(n_bnd_cells) - call Comm_Mod_Global_Sum_Int(n_cells) - call Comm_Mod_Global_Sum_Int(n_tri) - call Comm_Mod_Global_Sum_Int(n_quad) - call Comm_Mod_Global_Sum_Int(n_polg) - call Comm_Mod_Global_Sum_Int(n_tet) - call Comm_Mod_Global_Sum_Int(n_pyr) - call Comm_Mod_Global_Sum_Int(n_wed) - call Comm_Mod_Global_Sum_Int(n_hex) - call Comm_Mod_Global_Sum_Int(n_polh) - call Comm_Mod_Global_Max_Int(max_n_polh) + call Global % Sum_Int(n_bnd_cells) + call Global % Sum_Int(n_cells) + call Global % Sum_Int(n_tri) + call Global % Sum_Int(n_quad) + call Global % Sum_Int(n_polg) + call Global % Sum_Int(n_tet) + call Global % Sum_Int(n_pyr) + call Global % Sum_Int(n_wed) + call Global % Sum_Int(n_hex) + call Global % Sum_Int(n_polh) + call Global % Max_Int(max_n_polh) if(First_Proc()) then print '(a)', ' #- - - - - - - - - - - - - - - - - - - - - - - - - - - -' diff --git a/Sources/Shared/Profiler_Mod/Statistics.f90 b/Sources/Shared/Profiler_Mod/Statistics.f90 index c1415ae23..73c3cc792 100644 --- a/Sources/Shared/Profiler_Mod/Statistics.f90 +++ b/Sources/Shared/Profiler_Mod/Statistics.f90 @@ -26,7 +26,7 @@ subroutine Statistics(Profiler, indent) ! Compute average time spent in functions over all processors if(Parallel_Run()) then do i_fun=1, Profiler % n_functions - call Comm_Mod_Global_Sum_Real(Profiler % funct_time(i_fun)) + call Global % Sum_Real(Profiler % funct_time(i_fun)) Profiler % funct_time(i_fun) = Profiler % funct_time(i_fun) / N_Procs() end do end if diff --git a/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/End_Of_Time_Step.f90 b/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/End_Of_Time_Step.f90 index ea456bc59..2247a798e 100644 --- a/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/End_Of_Time_Step.f90 @@ -106,7 +106,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & vmax = max(vmax, abs(v % n(c))) vmax = max(vmax, abs(w % n(c))) end do - call Comm_Mod_Global_Max_Real(vmax) + call Global % Max_Real(vmax) do c = 1, Grid % n_cells v % n(c) = v % n(c) / vmax / 10.0 w % n(c) = w % n(c) / vmax / 10.0 diff --git a/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/Save_Results.f90 b/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/Save_Results.f90 index 6f72960bf..469813201 100644 --- a/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/Save_Results.f90 +++ b/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/Save_Results.f90 @@ -173,32 +173,32 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) ! Average over all processors do pl=1, n_prob-1 - call Comm_Mod_Global_Sum_Int(n_count(pl)) + call Global % Sum_Int(n_count(pl)) - call Comm_Mod_Global_Sum_Real(wall_p(pl)) + call Global % Sum_Real(wall_p(pl)) - call Comm_Mod_Global_Sum_Real(u_p(pl)) - call Comm_Mod_Global_Sum_Real(v_p(pl)) - call Comm_Mod_Global_Sum_Real(w_p(pl)) + call Global % Sum_Real(u_p(pl)) + call Global % Sum_Real(v_p(pl)) + call Global % Sum_Real(w_p(pl)) - call Comm_Mod_Global_Sum_Real(uu_p (pl)) - call Comm_Mod_Global_Sum_Real(vv_p (pl)) - call Comm_Mod_Global_Sum_Real(ww_p (pl)) - call Comm_Mod_Global_Sum_Real(uw_p (pl)) - call Comm_Mod_Global_Sum_Real(uw_mod_p(pl)) - call Comm_Mod_Global_Sum_Real(kin_p (pl)) - call Comm_Mod_Global_Sum_Real(eps_p (pl)) - call Comm_Mod_Global_Sum_Real(vis_t_p (pl)) - call Comm_Mod_Global_Sum_Real(y_plus_p(pl)) + call Global % Sum_Real(uu_p (pl)) + call Global % Sum_Real(vv_p (pl)) + call Global % Sum_Real(ww_p (pl)) + call Global % Sum_Real(uw_p (pl)) + call Global % Sum_Real(uw_mod_p(pl)) + call Global % Sum_Real(kin_p (pl)) + call Global % Sum_Real(eps_p (pl)) + call Global % Sum_Real(vis_t_p (pl)) + call Global % Sum_Real(y_plus_p(pl)) count = count + n_count(pl) if(Flow % heat_transfer) then - call Comm_Mod_Global_Sum_Real(t_p (pl)) - call Comm_Mod_Global_Sum_Real(t2_p(pl)) - call Comm_Mod_Global_Sum_Real(ut_p(pl)) - call Comm_Mod_Global_Sum_Real(vt_p(pl)) - call Comm_Mod_Global_Sum_Real(wt_p(pl)) + call Global % Sum_Real(t_p (pl)) + call Global % Sum_Real(t2_p(pl)) + call Global % Sum_Real(ut_p(pl)) + call Global % Sum_Real(vt_p(pl)) + call Global % Sum_Real(wt_p(pl)) end if end do @@ -262,9 +262,9 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Comm_Mod_Wait if(Flow % heat_flux > 0.0) then - call Comm_Mod_Global_Min_Real(t_inf) + call Global % Min_Real(t_inf) else - call Comm_Mod_Global_Max_Real(t_inf) + call Global % Max_Real(t_inf) end if do s = 1, Grid % n_faces @@ -282,9 +282,9 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if end do - call Comm_Mod_Global_Sum_Real(t_wall) - call Comm_Mod_Global_Sum_Real(nu_mean) - call Comm_Mod_Global_Sum_Int(n_points) + call Global % Sum_Real(t_wall) + call Global % Sum_Real(nu_mean) + call Global % Sum_Int(n_points) call Comm_Mod_Wait diff --git a/Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/End_Of_Time_Step.f90 b/Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/End_Of_Time_Step.f90 index 04b31ef17..ae181a5dd 100644 --- a/Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/End_Of_Time_Step.f90 @@ -82,17 +82,17 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & end do if( abs(bulk % flux_x_o) >= TINY ) then - call Comm_Mod_Global_Sum_Real(tau_wall_x) + call Global % Sum_Real(tau_wall_x) bulk % p_drop_x = bulk % p_drop_x & + tau_wall_x / Grid % tot_vol ! [kg/m^2/s^2] end if if( abs(bulk % flux_y_o) >= TINY ) then - call Comm_Mod_Global_Sum_Real(tau_wall_y) + call Global % Sum_Real(tau_wall_y) bulk % p_drop_y = bulk % p_drop_y & + tau_wall_y / Grid % tot_vol ! [kg/m^2/s^2] end if if( abs(bulk % flux_z_o) >= TINY ) then - call Comm_Mod_Global_Sum_Real(tau_wall_z) + call Global % Sum_Real(tau_wall_z) bulk % p_drop_z = bulk % p_drop_z & + tau_wall_z / Grid % tot_vol ! [kg/m^2/s^2] end if diff --git a/Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/Save_Results.f90 b/Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/Save_Results.f90 index 5e6b8cfd1..af348d101 100644 --- a/Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/Save_Results.f90 +++ b/Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/Save_Results.f90 @@ -92,9 +92,9 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) ! Average over all processors do i = 1, n-1 - call Comm_Mod_Global_Sum_Int (n_count(i)) - call Comm_Mod_Global_Sum_Real(y_p(i)) - call Comm_Mod_Global_Sum_Real(u_p(i)) + call Global % Sum_Int (n_count(i)) + call Global % Sum_Real(y_p(i)) + call Global % Sum_Real(u_p(i)) end do call Comm_Mod_Wait diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/User_Mod/End_Of_Time_Step.f90 b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/User_Mod/End_Of_Time_Step.f90 index bf0726e94..d56329089 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/User_Mod/End_Of_Time_Step.f90 @@ -53,8 +53,8 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & !-----------------------------------------------! ! Integrate (summ) heated area, and heat up ! !-----------------------------------------------! - call Comm_Mod_Global_Sum_Real(area) - call Comm_Mod_Global_Sum_Real(nu) + call Global % Sum_Real(area) + call Global % Sum_Real(nu) !-------------------------------------------------! ! Compute averaged Nussel number and print it ! diff --git a/Tests/Laminar/Cylinder/Vertical/User_Mod/Beginning_Of_Iteration.f90 b/Tests/Laminar/Cylinder/Vertical/User_Mod/Beginning_Of_Iteration.f90 index 956982ef2..f6acbf05c 100644 --- a/Tests/Laminar/Cylinder/Vertical/User_Mod/Beginning_Of_Iteration.f90 +++ b/Tests/Laminar/Cylinder/Vertical/User_Mod/Beginning_Of_Iteration.f90 @@ -44,8 +44,8 @@ subroutine User_Mod_Beginning_Of_Iteration(Flow, Turb, Vof, Swarm, n, time) end if end do - call Comm_Mod_Global_Sum_Real(area_in) - call Comm_Mod_Global_Sum_Real(vol_in) + call Global % Sum_Real(area_in) + call Global % Sum_Real(vol_in) vel_in = vol_in / area_in ! if(First_Proc()) then diff --git a/Tests/Laminar/Cylinder/Vertical/User_Mod/Save_Results.f90 b/Tests/Laminar/Cylinder/Vertical/User_Mod/Save_Results.f90 index 13bf60a45..73f6a5d60 100644 --- a/Tests/Laminar/Cylinder/Vertical/User_Mod/Save_Results.f90 +++ b/Tests/Laminar/Cylinder/Vertical/User_Mod/Save_Results.f90 @@ -82,8 +82,8 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if end do - call Comm_Mod_Global_Sum_Real(nuss_mean) - call Comm_Mod_Global_Sum_Int(n_points) + call Global % Sum_Real(nuss_mean) + call Global % Sum_Int(n_points) call Comm_Mod_Wait diff --git a/Tests/Laminar/Flat_Plate/User_Mod/Plain_Nu.f90 b/Tests/Laminar/Flat_Plate/User_Mod/Plain_Nu.f90 index b8c7aeac7..ef6fd3ef8 100644 --- a/Tests/Laminar/Flat_Plate/User_Mod/Plain_Nu.f90 +++ b/Tests/Laminar/Flat_Plate/User_Mod/Plain_Nu.f90 @@ -131,30 +131,30 @@ subroutine User_Mod_Plain_Nu(Flow, Turb, ts) ! Average over all processors do pl=1, n_prob - call Comm_Mod_Global_Sum_Int(n_count(pl)) - call Comm_Mod_Global_Sum_Real(um_p(pl)) - call Comm_Mod_Global_Sum_Real(vm_p(pl)) - call Comm_Mod_Global_Sum_Real(wm_p(pl)) - call Comm_Mod_Global_Sum_Real(uu_p(pl)) - call Comm_Mod_Global_Sum_Real(vv_p(pl)) - call Comm_Mod_Global_Sum_Real(ww_p(pl)) - call Comm_Mod_Global_Sum_Real(uv_p(pl)) - call Comm_Mod_Global_Sum_Real(uw_p(pl)) - call Comm_Mod_Global_Sum_Real(vw_p(pl)) - call Comm_Mod_Global_Sum_Real(v1_p(pl)) - call Comm_Mod_Global_Sum_Real(v2_p(pl)) - call Comm_Mod_Global_Sum_Real(v3_p(pl)) - call Comm_Mod_Global_Sum_Real(v4_p(pl)) - call Comm_Mod_Global_Sum_Real(v5_p(pl)) + call Global % Sum_Int(n_count(pl)) + call Global % Sum_Real(um_p(pl)) + call Global % Sum_Real(vm_p(pl)) + call Global % Sum_Real(wm_p(pl)) + call Global % Sum_Real(uu_p(pl)) + call Global % Sum_Real(vv_p(pl)) + call Global % Sum_Real(ww_p(pl)) + call Global % Sum_Real(uv_p(pl)) + call Global % Sum_Real(uw_p(pl)) + call Global % Sum_Real(vw_p(pl)) + call Global % Sum_Real(v1_p(pl)) + call Global % Sum_Real(v2_p(pl)) + call Global % Sum_Real(v3_p(pl)) + call Global % Sum_Real(v4_p(pl)) + call Global % Sum_Real(v5_p(pl)) count = count + n_count(pl) if(Flow % heat_transfer) then - call Comm_Mod_Global_Sum_Real(tm_p(pl)) - call Comm_Mod_Global_Sum_Real(tt_p(pl)) - call Comm_Mod_Global_Sum_Real(ut_p(pl)) - call Comm_Mod_Global_Sum_Real(vt_p(pl)) - call Comm_Mod_Global_Sum_Real(wt_p(pl)) + call Global % Sum_Real(tm_p(pl)) + call Global % Sum_Real(tt_p(pl)) + call Global % Sum_Real(ut_p(pl)) + call Global % Sum_Real(vt_p(pl)) + call Global % Sum_Real(wt_p(pl)) end if end do diff --git a/Tests/Laminar/Flat_Plate/User_Mod/Plain_Profiles.f90 b/Tests/Laminar/Flat_Plate/User_Mod/Plain_Profiles.f90 index 75e2e4571..6a9a936af 100644 --- a/Tests/Laminar/Flat_Plate/User_Mod/Plain_Profiles.f90 +++ b/Tests/Laminar/Flat_Plate/User_Mod/Plain_Profiles.f90 @@ -147,30 +147,30 @@ subroutine User_Mod_Plain_Profiles(Flow, Turb, ts) ! Average over all processors do pl=1, n_prob - call Comm_Mod_Global_Sum_Int(n_count(pl)) - call Comm_Mod_Global_Sum_Real(um_p(pl)) - call Comm_Mod_Global_Sum_Real(vm_p(pl)) - call Comm_Mod_Global_Sum_Real(wm_p(pl)) - call Comm_Mod_Global_Sum_Real(uu_p(pl)) - call Comm_Mod_Global_Sum_Real(vv_p(pl)) - call Comm_Mod_Global_Sum_Real(ww_p(pl)) - call Comm_Mod_Global_Sum_Real(uv_p(pl)) - call Comm_Mod_Global_Sum_Real(uw_p(pl)) - call Comm_Mod_Global_Sum_Real(vw_p(pl)) - call Comm_Mod_Global_Sum_Real(v1_p(pl)) - call Comm_Mod_Global_Sum_Real(v2_p(pl)) - call Comm_Mod_Global_Sum_Real(v3_p(pl)) - call Comm_Mod_Global_Sum_Real(v4_p(pl)) - call Comm_Mod_Global_Sum_Real(v5_p(pl)) + call Global % Sum_Int(n_count(pl)) + call Global % Sum_Real(um_p(pl)) + call Global % Sum_Real(vm_p(pl)) + call Global % Sum_Real(wm_p(pl)) + call Global % Sum_Real(uu_p(pl)) + call Global % Sum_Real(vv_p(pl)) + call Global % Sum_Real(ww_p(pl)) + call Global % Sum_Real(uv_p(pl)) + call Global % Sum_Real(uw_p(pl)) + call Global % Sum_Real(vw_p(pl)) + call Global % Sum_Real(v1_p(pl)) + call Global % Sum_Real(v2_p(pl)) + call Global % Sum_Real(v3_p(pl)) + call Global % Sum_Real(v4_p(pl)) + call Global % Sum_Real(v5_p(pl)) count = count + n_count(pl) if(Flow % heat_transfer) then - call Comm_Mod_Global_Sum_Real(tm_p(pl)) - call Comm_Mod_Global_Sum_Real(tt_p(pl)) - call Comm_Mod_Global_Sum_Real(ut_p(pl)) - call Comm_Mod_Global_Sum_Real(vt_p(pl)) - call Comm_Mod_Global_Sum_Real(wt_p(pl)) + call Global % Sum_Real(tm_p(pl)) + call Global % Sum_Real(tt_p(pl)) + call Global % Sum_Real(ut_p(pl)) + call Global % Sum_Real(vt_p(pl)) + call Global % Sum_Real(wt_p(pl)) end if end do diff --git a/Tests/Laminar/Membrane/2_Domains/User_Mod/Beginning_Of_Iteration.f90 b/Tests/Laminar/Membrane/2_Domains/User_Mod/Beginning_Of_Iteration.f90 index 31024b9ab..27f810942 100644 --- a/Tests/Laminar/Membrane/2_Domains/User_Mod/Beginning_Of_Iteration.f90 +++ b/Tests/Laminar/Membrane/2_Domains/User_Mod/Beginning_Of_Iteration.f90 @@ -154,9 +154,9 @@ subroutine User_Mod_Beginning_Of_Iteration(Flow, Turb, Vof, Swarm, n, time) end do ! Positive for evaporation, negative for condensation - call Comm_Mod_Global_Sum_Real(t_int_acc) - call Comm_Mod_Global_Sum_Real(m_evap_acc) - call Comm_Mod_Global_Sum_Real(area_acc) + call Global % Sum_Real(t_int_acc) + call Global % Sum_Real(m_evap_acc) + call Global % Sum_Real(area_acc) m_evap_avg = m_evap_acc / area_acc t_int_avg = t_int_acc / area_acc if(First_Proc()) then diff --git a/Tests/Laminar/Membrane/2_Domains/User_Mod/Interface_Exchange.f90 b/Tests/Laminar/Membrane/2_Domains/User_Mod/Interface_Exchange.f90 index af70417dc..7a349c300 100644 --- a/Tests/Laminar/Membrane/2_Domains/User_Mod/Interface_Exchange.f90 +++ b/Tests/Laminar/Membrane/2_Domains/User_Mod/Interface_Exchange.f90 @@ -301,10 +301,10 @@ subroutine User_Mod_Interface_Exchange(inter, Flow, Turb, Vof, Swarm, n_dom) end do end do - call Comm_Mod_Global_Sum_Real(mem_j_diff_acc) - call Comm_Mod_Global_Sum_Real(mem_j_heat_acc) - call Comm_Mod_Global_Sum_Real(t_int_acc) - call Comm_Mod_Global_Sum_Real(area_acc) + call Global % Sum_Real(mem_j_diff_acc) + call Global % Sum_Real(mem_j_heat_acc) + call Global % Sum_Real(t_int_acc) + call Global % Sum_Real(area_acc) mem_j_diff_avg = mem_j_diff_acc / area_acc mem_j_heat_avg = mem_j_heat_acc / area_acc t_int_avg = t_int_acc / area_acc diff --git a/Tests/Laminar/Membrane/2_Domains/User_Mod/To_Buffer.f90 b/Tests/Laminar/Membrane/2_Domains/User_Mod/To_Buffer.f90 index 35a5b3dec..e12e8f6d0 100644 --- a/Tests/Laminar/Membrane/2_Domains/User_Mod/To_Buffer.f90 +++ b/Tests/Laminar/Membrane/2_Domains/User_Mod/To_Buffer.f90 @@ -62,8 +62,8 @@ subroutine Interface_Mod_To_Buffer(inter, var1, var2, v, boundary) end do ! Here we exchange (global sum) of phi_1 and phi_2 - call Comm_Mod_Global_Sum_Real_Array(n_tot, inter % phi_1(1:n_tot,v)) - call Comm_Mod_Global_Sum_Real_Array(n_tot, inter % phi_2(1:n_tot,v)) + call Global % Sum_Real_Array(n_tot, inter % phi_1(1:n_tot,v)) + call Global % Sum_Real_Array(n_tot, inter % phi_2(1:n_tot,v)) end if diff --git a/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/End_Of_Time_Step.f90 b/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/End_Of_Time_Step.f90 index c07a0344a..cc321ef58 100644 --- a/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/End_Of_Time_Step.f90 @@ -133,7 +133,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & vmax = max(vmax, abs(v % n(c))) vmax = max(vmax, abs(w % n(c))) end do - call Comm_Mod_Global_Max_Real(vmax) + call Global % Max_Real(vmax) do c = 1, Grid % n_cells v % n(c) = v % n(c) / vmax / 5.0 v % o(c) = v % o(c) / vmax / 5.0 diff --git a/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/Save_Results.f90 b/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/Save_Results.f90 index b01f1f84d..eb977c373 100644 --- a/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/Save_Results.f90 +++ b/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/Save_Results.f90 @@ -158,27 +158,27 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) ! Average over all processors do pl=1, n_prob-1 - call Comm_Mod_Global_Sum_Int(n_count(pl)) + call Global % Sum_Int(n_count(pl)) - call Comm_Mod_Global_Sum_Real(wall_p(pl)) + call Global % Sum_Real(wall_p(pl)) - call Comm_Mod_Global_Sum_Real(u_p(pl)) - call Comm_Mod_Global_Sum_Real(v_p(pl)) - call Comm_Mod_Global_Sum_Real(w_p(pl)) + call Global % Sum_Real(u_p(pl)) + call Global % Sum_Real(v_p(pl)) + call Global % Sum_Real(w_p(pl)) - call Comm_Mod_Global_Sum_Real(uu_p(pl)) - call Comm_Mod_Global_Sum_Real(vv_p(pl)) - call Comm_Mod_Global_Sum_Real(ww_p(pl)) - call Comm_Mod_Global_Sum_Real(uw_p(pl)) + call Global % Sum_Real(uu_p(pl)) + call Global % Sum_Real(vv_p(pl)) + call Global % Sum_Real(ww_p(pl)) + call Global % Sum_Real(uw_p(pl)) count = count + n_count(pl) if(Flow % heat_transfer) then - call Comm_Mod_Global_Sum_Real(t_p (pl)) - call Comm_Mod_Global_Sum_Real(t2_p(pl)) - call Comm_Mod_Global_Sum_Real(ut_p(pl)) - call Comm_Mod_Global_Sum_Real(vt_p(pl)) - call Comm_Mod_Global_Sum_Real(wt_p(pl)) + call Global % Sum_Real(t_p (pl)) + call Global % Sum_Real(t2_p(pl)) + call Global % Sum_Real(ut_p(pl)) + call Global % Sum_Real(vt_p(pl)) + call Global % Sum_Real(wt_p(pl)) end if end do @@ -232,9 +232,9 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Comm_Mod_Wait if(Flow % heat_flux > 0.0) then - call Comm_Mod_Global_Min_Real(t_inf) + call Global % Min_Real(t_inf) else - call Comm_Mod_Global_Max_Real(t_inf) + call Global % Max_Real(t_inf) end if do s = 1, Grid % n_faces @@ -252,9 +252,9 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if end do - call Comm_Mod_Global_Sum_Real(t_wall) - call Comm_Mod_Global_Sum_Real(nu_mean) - call Comm_Mod_Global_Sum_Int(n_points) + call Global % Sum_Real(t_wall) + call Global % Sum_Real(nu_mean) + call Global % Sum_Int(n_points) call Comm_Mod_Wait diff --git a/Tests/Les/Channel_Re_Tau_180/User_Mod/Save_Results.f90 b/Tests/Les/Channel_Re_Tau_180/User_Mod/Save_Results.f90 index a92a2c7e5..85cf21189 100644 --- a/Tests/Les/Channel_Re_Tau_180/User_Mod/Save_Results.f90 +++ b/Tests/Les/Channel_Re_Tau_180/User_Mod/Save_Results.f90 @@ -192,11 +192,11 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) ! Average over all processors do pl=1, n_prob-1 - call Comm_Mod_Global_Sum_Int(n_count2(pl)) - call Comm_Mod_Global_Sum_Real(wall_p(pl)) - call Comm_Mod_Global_Sum_Real(u_p(pl)) - call Comm_Mod_Global_Sum_Real(v_p(pl)) - call Comm_Mod_Global_Sum_Real(w_p(pl)) + call Global % Sum_Int(n_count2(pl)) + call Global % Sum_Real(wall_p(pl)) + call Global % Sum_Real(u_p(pl)) + call Global % Sum_Real(v_p(pl)) + call Global % Sum_Real(w_p(pl)) counter2 = counter2 + n_count2(pl) end do diff --git a/Tests/Les/Forrest/User_Mod/End_Of_Time_Step.f90 b/Tests/Les/Forrest/User_Mod/End_Of_Time_Step.f90 index eaa92d287..5d3c0f2cb 100644 --- a/Tests/Les/Forrest/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Les/Forrest/User_Mod/End_Of_Time_Step.f90 @@ -133,7 +133,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & vmax = max(vmax, abs(v % n(c))) vmax = max(vmax, abs(w % n(c))) end do - call Comm_Mod_Global_Max_Real(vmax) + call Global % Max_Real(vmax) do c = 1, Grid % n_cells v % n(c) = v % n(c) / vmax / 5.0 v % o(c) = v % o(c) / vmax / 5.0 diff --git a/Tests/Les/Forrest/User_Mod/Save_Results.f90 b/Tests/Les/Forrest/User_Mod/Save_Results.f90 index 4c9102cfc..ae6c7e814 100644 --- a/Tests/Les/Forrest/User_Mod/Save_Results.f90 +++ b/Tests/Les/Forrest/User_Mod/Save_Results.f90 @@ -181,32 +181,32 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) ! Average over all processors do pl=1, n_prob-1 - call Comm_Mod_Global_Sum_Int(n_count(pl)) + call Global % Sum_Int(n_count(pl)) - call Comm_Mod_Global_Sum_Real(wall_p(pl)) + call Global % Sum_Real(wall_p(pl)) - call Comm_Mod_Global_Sum_Real(u_p(pl)) - call Comm_Mod_Global_Sum_Real(v_p(pl)) - call Comm_Mod_Global_Sum_Real(w_p(pl)) + call Global % Sum_Real(u_p(pl)) + call Global % Sum_Real(v_p(pl)) + call Global % Sum_Real(w_p(pl)) - call Comm_Mod_Global_Sum_Real(uu_p (pl)) - call Comm_Mod_Global_Sum_Real(vv_p (pl)) - call Comm_Mod_Global_Sum_Real(ww_p (pl)) - call Comm_Mod_Global_Sum_Real(uw_p (pl)) - call Comm_Mod_Global_Sum_Real(uw_mod_p(pl)) - call Comm_Mod_Global_Sum_Real(kin_p (pl)) - call Comm_Mod_Global_Sum_Real(eps_p (pl)) - call Comm_Mod_Global_Sum_Real(lai_p (pl)) - call Comm_Mod_Global_Sum_Real(y_plus_p(pl)) + call Global % Sum_Real(uu_p (pl)) + call Global % Sum_Real(vv_p (pl)) + call Global % Sum_Real(ww_p (pl)) + call Global % Sum_Real(uw_p (pl)) + call Global % Sum_Real(uw_mod_p(pl)) + call Global % Sum_Real(kin_p (pl)) + call Global % Sum_Real(eps_p (pl)) + call Global % Sum_Real(lai_p (pl)) + call Global % Sum_Real(y_plus_p(pl)) count = count + n_count(pl) if(Flow % heat_transfer) then - call Comm_Mod_Global_Sum_Real(t_p (pl)) - call Comm_Mod_Global_Sum_Real(t2_p(pl)) - call Comm_Mod_Global_Sum_Real(ut_p(pl)) - call Comm_Mod_Global_Sum_Real(vt_p(pl)) - call Comm_Mod_Global_Sum_Real(wt_p(pl)) + call Global % Sum_Real(t_p (pl)) + call Global % Sum_Real(t2_p(pl)) + call Global % Sum_Real(ut_p(pl)) + call Global % Sum_Real(vt_p(pl)) + call Global % Sum_Real(wt_p(pl)) end if end do diff --git a/Tests/Les/Pipe_Re_Tau_180/User_Mod/End_Of_Time_Step.f90 b/Tests/Les/Pipe_Re_Tau_180/User_Mod/End_Of_Time_Step.f90 index 694c5fa85..c1350cef8 100644 --- a/Tests/Les/Pipe_Re_Tau_180/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Les/Pipe_Re_Tau_180/User_Mod/End_Of_Time_Step.f90 @@ -119,7 +119,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & vmax = max(vmax, abs(u % n(c))) vmax = max(vmax, abs(v % n(c))) end do - call Comm_Mod_Global_Max_Real(vmax) + call Global % Max_Real(vmax) do c = 1, Grid % n_cells u % n(c) = u % n(c) / vmax / 10.0 v % n(c) = v % n(c) / vmax / 10.0 diff --git a/Tests/Les/Pipe_Re_Tau_180/User_Mod/Save_Results.f90 b/Tests/Les/Pipe_Re_Tau_180/User_Mod/Save_Results.f90 index b082572ac..0e3f50139 100644 --- a/Tests/Les/Pipe_Re_Tau_180/User_Mod/Save_Results.f90 +++ b/Tests/Les/Pipe_Re_Tau_180/User_Mod/Save_Results.f90 @@ -174,27 +174,27 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) ! Average over all processors do pl=1, n_prob-1 - call Comm_Mod_Global_Sum_Int(n_count(pl)) + call Global % Sum_Int(n_count(pl)) - call Comm_Mod_Global_Sum_Real(wall_p(pl)) + call Global % Sum_Real(wall_p(pl)) - call Comm_Mod_Global_Sum_Real(u_p(pl)) - call Comm_Mod_Global_Sum_Real(v_p(pl)) - call Comm_Mod_Global_Sum_Real(w_p(pl)) + call Global % Sum_Real(u_p(pl)) + call Global % Sum_Real(v_p(pl)) + call Global % Sum_Real(w_p(pl)) - call Comm_Mod_Global_Sum_Real(uu_p(pl)) - call Comm_Mod_Global_Sum_Real(vv_p(pl)) - call Comm_Mod_Global_Sum_Real(ww_p(pl)) - call Comm_Mod_Global_Sum_Real(uw_p(pl)) + call Global % Sum_Real(uu_p(pl)) + call Global % Sum_Real(vv_p(pl)) + call Global % Sum_Real(ww_p(pl)) + call Global % Sum_Real(uw_p(pl)) count = count + n_count(pl) if(Flow % heat_transfer) then - call Comm_Mod_Global_Sum_Real(t_p(pl)) - call Comm_Mod_Global_Sum_Real(t2_p(pl)) - call Comm_Mod_Global_Sum_Real(ut_p(pl)) - call Comm_Mod_Global_Sum_Real(vt_p(pl)) - call Comm_Mod_Global_Sum_Real(wt_p(pl)) + call Global % Sum_Real(t_p(pl)) + call Global % Sum_Real(t2_p(pl)) + call Global % Sum_Real(ut_p(pl)) + call Global % Sum_Real(vt_p(pl)) + call Global % Sum_Real(wt_p(pl)) end if end do @@ -247,9 +247,9 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Comm_Mod_Wait if(Flow % heat_flux > 0.0) then - call Comm_Mod_Global_Min_Real(t_inf) + call Global % Min_Real(t_inf) else - call Comm_Mod_Global_Max_Real(t_inf) + call Global % Max_Real(t_inf) end if do s = 1, Grid % n_faces @@ -267,9 +267,9 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if end do - call Comm_Mod_Global_Sum_Real(t_wall) - call Comm_Mod_Global_Sum_Real(nu_mean) - call Comm_Mod_Global_Sum_Int(n_points) + call Global % Sum_Real(t_wall) + call Global % Sum_Real(nu_mean) + call Global % Sum_Int(n_points) call Comm_Mod_Wait diff --git a/Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 b/Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 index d24e8cf95..690a17870 100644 --- a/Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 +++ b/Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 @@ -212,36 +212,36 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) ! Average over all processors do pl=1, n_prob-1 - call Comm_Mod_Global_Sum_Int(n_count(pl)) + call Global % Sum_Int(n_count(pl)) - call Comm_Mod_Global_Sum_Real(wall_p(pl)) + call Global % Sum_Real(wall_p(pl)) - call Comm_Mod_Global_Sum_Real(tz_p(pl)) - call Comm_Mod_Global_Sum_Real(ti_p(pl)) - call Comm_Mod_Global_Sum_Real(w_p(pl)) + call Global % Sum_Real(tz_p(pl)) + call Global % Sum_Real(ti_p(pl)) + call Global % Sum_Real(w_p(pl)) - call Comm_Mod_Global_Sum_Real(uu_p(pl)) - call Comm_Mod_Global_Sum_Real(vv_p(pl)) - call Comm_Mod_Global_Sum_Real(ww_p(pl)) - call Comm_Mod_Global_Sum_Real(uw_p(pl)) - call Comm_Mod_Global_Sum_Real(kin_p(pl)) - call Comm_Mod_Global_Sum_Real(kin_mod_p(pl)) - call Comm_Mod_Global_Sum_Real(var_1(pl)) - call Comm_Mod_Global_Sum_Real(var_2(pl)) - call Comm_Mod_Global_Sum_Real(var_3(pl)) + call Global % Sum_Real(uu_p(pl)) + call Global % Sum_Real(vv_p(pl)) + call Global % Sum_Real(ww_p(pl)) + call Global % Sum_Real(uw_p(pl)) + call Global % Sum_Real(kin_p(pl)) + call Global % Sum_Real(kin_mod_p(pl)) + call Global % Sum_Real(var_1(pl)) + call Global % Sum_Real(var_2(pl)) + call Global % Sum_Real(var_3(pl)) count = count + n_count(pl) if(Flow % heat_transfer) then - call Comm_Mod_Global_Sum_Real(t_p(pl)) - call Comm_Mod_Global_Sum_Real(t2_p(pl)) - call Comm_Mod_Global_Sum_Real(t2_mod_p(pl)) - call Comm_Mod_Global_Sum_Real(ut_p(pl)) - call Comm_Mod_Global_Sum_Real(vt_p(pl)) - call Comm_Mod_Global_Sum_Real(wt_p(pl)) - call Comm_Mod_Global_Sum_Real(ut_mod(pl)) - call Comm_Mod_Global_Sum_Real(vt_mod(pl)) - call Comm_Mod_Global_Sum_Real(wt_mod(pl)) + call Global % Sum_Real(t_p(pl)) + call Global % Sum_Real(t2_p(pl)) + call Global % Sum_Real(t2_mod_p(pl)) + call Global % Sum_Real(ut_p(pl)) + call Global % Sum_Real(vt_p(pl)) + call Global % Sum_Real(wt_p(pl)) + call Global % Sum_Real(ut_mod(pl)) + call Global % Sum_Real(vt_mod(pl)) + call Global % Sum_Real(wt_mod(pl)) end if end do diff --git a/Tests/Manual/Conjugate/User_Mod/End_Of_Time_Step.f90 b/Tests/Manual/Conjugate/User_Mod/End_Of_Time_Step.f90 index fa8c2c248..853650ed0 100644 --- a/Tests/Manual/Conjugate/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Manual/Conjugate/User_Mod/End_Of_Time_Step.f90 @@ -53,8 +53,8 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & !-----------------------------------------------! ! Integrate (summ) heated area, and heat up ! !-----------------------------------------------! - call Comm_Mod_Global_Sum_Real(area) - call Comm_Mod_Global_Sum_Real(nu) + call Global % Sum_Real(area) + call Global % Sum_Real(nu) !-------------------------------------------------! ! Compute averaged Nussel number and print it ! diff --git a/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 b/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 index 63293efea..746e18747 100644 --- a/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 +++ b/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 @@ -111,18 +111,18 @@ subroutine Save_Impinging_Jet_Nu(Turb, ts) ! Average over all processors ! !---------------------------------! do i = 1, n_prob - call Comm_Mod_Global_Sum_Int(n_count(i)) + call Global % Sum_Int(n_count(i)) - call Comm_Mod_Global_Sum_Real(u_s(i)) - call Comm_Mod_Global_Sum_Real(v_s(i)) - call Comm_Mod_Global_Sum_Real(w_s(i)) + call Global % Sum_Real(u_s(i)) + call Global % Sum_Real(v_s(i)) + call Global % Sum_Real(w_s(i)) - call Comm_Mod_Global_Sum_Real(z_s(i)) - call Comm_Mod_Global_Sum_Real(tau_s(i)) - call Comm_Mod_Global_Sum_Real(q_s(i)) + call Global % Sum_Real(z_s(i)) + call Global % Sum_Real(tau_s(i)) + call Global % Sum_Real(q_s(i)) - call Comm_Mod_Global_Sum_Real(r_s(i)) - call Comm_Mod_Global_Sum_Real(t_s(i)) + call Global % Sum_Real(r_s(i)) + call Global % Sum_Real(t_s(i)) end do do i = 1, n_prob diff --git a/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Profiles.f90 b/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Profiles.f90 index d858d433f..8cbce171e 100644 --- a/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Profiles.f90 +++ b/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Profiles.f90 @@ -148,19 +148,19 @@ subroutine Save_Impinging_Jet_Profiles(Turb, ts) ! Average over all processors ! !---------------------------------! do i = 1, n_prob - call Comm_Mod_Global_Sum_Int(n_count(i)) - - call Comm_Mod_Global_Sum_Real(u_p(i)) - call Comm_Mod_Global_Sum_Real(v_p(i)) - call Comm_Mod_Global_Sum_Real(w_p(i)) - call Comm_Mod_Global_Sum_Real(zm_p(i)) - - call Comm_Mod_Global_Sum_Real(kin_p(i)) - call Comm_Mod_Global_Sum_Real(eps_p(i)) - call Comm_Mod_Global_Sum_Real(vis_p(i)) - call Comm_Mod_Global_Sum_Real(zet_p(i)) - call Comm_Mod_Global_Sum_Real(f22_p(i)) - call Comm_Mod_Global_Sum_Real(t_p(i)) + call Global % Sum_Int(n_count(i)) + + call Global % Sum_Real(u_p(i)) + call Global % Sum_Real(v_p(i)) + call Global % Sum_Real(w_p(i)) + call Global % Sum_Real(zm_p(i)) + + call Global % Sum_Real(kin_p(i)) + call Global % Sum_Real(eps_p(i)) + call Global % Sum_Real(vis_p(i)) + call Global % Sum_Real(zet_p(i)) + call Global % Sum_Real(f22_p(i)) + call Global % Sum_Real(t_p(i)) end do do i = 1, n_prob diff --git a/Tests/Manual/Inflows/Option_4/User_Mod/End_Of_Time_Step.f90 b/Tests/Manual/Inflows/Option_4/User_Mod/End_Of_Time_Step.f90 index da67cab3d..ec357760b 100644 --- a/Tests/Manual/Inflows/Option_4/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Manual/Inflows/Option_4/User_Mod/End_Of_Time_Step.f90 @@ -64,12 +64,12 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & zmin = min(zmin, Grid % zn(n)); zmax = max(zmax, Grid % zn(n)) end do end do - call Comm_Mod_Global_Min_Real(xmin) - call Comm_Mod_Global_Min_Real(ymin) - call Comm_Mod_Global_Min_Real(zmin) - call Comm_Mod_Global_Max_Real(xmax) - call Comm_Mod_Global_Max_Real(ymax) - call Comm_Mod_Global_Max_Real(zmax) + call Global % Min_Real(xmin) + call Global % Min_Real(ymin) + call Global % Min_Real(zmin) + call Global % Max_Real(xmax) + call Global % Max_Real(ymax) + call Global % Max_Real(zmax) lx = xmax - xmin ly = ymax - ymin lz = zmax - zmin @@ -161,7 +161,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & vmax = max(vmax, abs(v % n(c))) vmax = max(vmax, abs(w % n(c))) end do - call Comm_Mod_Global_Max_Real(vmax) + call Global % Max_Real(vmax) do c = 1, Grid % n_cells v % n(c) = v % n(c) / vmax v % o(c) = v % o(c) / vmax diff --git a/Tests/Manual/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 b/Tests/Manual/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 index c83cac3e5..3a7b6d625 100644 --- a/Tests/Manual/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Manual/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 @@ -36,9 +36,9 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & rise_velocity = rise_velocity + Flow % w % n(c) * fun % n(c) * Grid % vol(c) end do - call Comm_Mod_Global_Sum_Real(b_volume) - call Comm_Mod_Global_Sum_Real(c_position) - call Comm_Mod_Global_Sum_Real(rise_velocity) + call Global % Sum_Real(b_volume) + call Global % Sum_Real(c_position) + call Global % Sum_Real(rise_velocity) ! Write to file if (First_Proc()) then diff --git a/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Cf_St.f90 b/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Cf_St.f90 index bfc374812..6f19d61bf 100644 --- a/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Cf_St.f90 +++ b/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Cf_St.f90 @@ -131,30 +131,30 @@ subroutine User_Mod_Backstep_Cf_St(Flow, Turb, ts) ! Average over all processors do pl=1, n_prob - call Comm_Mod_Global_Sum_Int(n_count(pl)) - call Comm_Mod_Global_Sum_Real(um_p(pl)) - call Comm_Mod_Global_Sum_Real(vm_p(pl)) - call Comm_Mod_Global_Sum_Real(wm_p(pl)) - call Comm_Mod_Global_Sum_Real(uu_p(pl)) - call Comm_Mod_Global_Sum_Real(vv_p(pl)) - call Comm_Mod_Global_Sum_Real(ww_p(pl)) - call Comm_Mod_Global_Sum_Real(uv_p(pl)) - call Comm_Mod_Global_Sum_Real(uw_p(pl)) - call Comm_Mod_Global_Sum_Real(vw_p(pl)) - call Comm_Mod_Global_Sum_Real(v1_p(pl)) - call Comm_Mod_Global_Sum_Real(v2_p(pl)) - call Comm_Mod_Global_Sum_Real(v3_p(pl)) - call Comm_Mod_Global_Sum_Real(v4_p(pl)) - call Comm_Mod_Global_Sum_Real(v5_p(pl)) + call Global % Sum_Int(n_count(pl)) + call Global % Sum_Real(um_p(pl)) + call Global % Sum_Real(vm_p(pl)) + call Global % Sum_Real(wm_p(pl)) + call Global % Sum_Real(uu_p(pl)) + call Global % Sum_Real(vv_p(pl)) + call Global % Sum_Real(ww_p(pl)) + call Global % Sum_Real(uv_p(pl)) + call Global % Sum_Real(uw_p(pl)) + call Global % Sum_Real(vw_p(pl)) + call Global % Sum_Real(v1_p(pl)) + call Global % Sum_Real(v2_p(pl)) + call Global % Sum_Real(v3_p(pl)) + call Global % Sum_Real(v4_p(pl)) + call Global % Sum_Real(v5_p(pl)) count = count + n_count(pl) if(Flow % heat_transfer) then - call Comm_Mod_Global_Sum_Real(tm_p(pl)) - call Comm_Mod_Global_Sum_Real(tt_p(pl)) - call Comm_Mod_Global_Sum_Real(ut_p(pl)) - call Comm_Mod_Global_Sum_Real(vt_p(pl)) - call Comm_Mod_Global_Sum_Real(wt_p(pl)) + call Global % Sum_Real(tm_p(pl)) + call Global % Sum_Real(tt_p(pl)) + call Global % Sum_Real(ut_p(pl)) + call Global % Sum_Real(vt_p(pl)) + call Global % Sum_Real(wt_p(pl)) end if end do diff --git a/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Profiles.f90 b/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Profiles.f90 index 496156ee9..680d2ba5f 100644 --- a/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Profiles.f90 +++ b/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Profiles.f90 @@ -159,30 +159,30 @@ subroutine User_Mod_Backstep_Profiles(Flow, Turb, ts) ! Average over all processors do pl=1, n_prob - call Comm_Mod_Global_Sum_Int(n_count(pl)) - call Comm_Mod_Global_Sum_Real(um_p(pl)) - call Comm_Mod_Global_Sum_Real(vm_p(pl)) - call Comm_Mod_Global_Sum_Real(wm_p(pl)) - call Comm_Mod_Global_Sum_Real(uu_p(pl)) - call Comm_Mod_Global_Sum_Real(vv_p(pl)) - call Comm_Mod_Global_Sum_Real(ww_p(pl)) - call Comm_Mod_Global_Sum_Real(uv_p(pl)) - call Comm_Mod_Global_Sum_Real(uw_p(pl)) - call Comm_Mod_Global_Sum_Real(vw_p(pl)) - call Comm_Mod_Global_Sum_Real(v1_p(pl)) - call Comm_Mod_Global_Sum_Real(v2_p(pl)) - call Comm_Mod_Global_Sum_Real(v3_p(pl)) - call Comm_Mod_Global_Sum_Real(v4_p(pl)) - call Comm_Mod_Global_Sum_Real(v5_p(pl)) + call Global % Sum_Int(n_count(pl)) + call Global % Sum_Real(um_p(pl)) + call Global % Sum_Real(vm_p(pl)) + call Global % Sum_Real(wm_p(pl)) + call Global % Sum_Real(uu_p(pl)) + call Global % Sum_Real(vv_p(pl)) + call Global % Sum_Real(ww_p(pl)) + call Global % Sum_Real(uv_p(pl)) + call Global % Sum_Real(uw_p(pl)) + call Global % Sum_Real(vw_p(pl)) + call Global % Sum_Real(v1_p(pl)) + call Global % Sum_Real(v2_p(pl)) + call Global % Sum_Real(v3_p(pl)) + call Global % Sum_Real(v4_p(pl)) + call Global % Sum_Real(v5_p(pl)) count = count + n_count(pl) if(Flow % heat_transfer) then - call Comm_Mod_Global_Sum_Real(tm_p(pl)) - call Comm_Mod_Global_Sum_Real(tt_p(pl)) - call Comm_Mod_Global_Sum_Real(ut_p(pl)) - call Comm_Mod_Global_Sum_Real(vt_p(pl)) - call Comm_Mod_Global_Sum_Real(wt_p(pl)) + call Global % Sum_Real(tm_p(pl)) + call Global % Sum_Real(tt_p(pl)) + call Global % Sum_Real(ut_p(pl)) + call Global % Sum_Real(vt_p(pl)) + call Global % Sum_Real(wt_p(pl)) end if end do diff --git a/Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Save_Results.f90 b/Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Save_Results.f90 index 91c3980d6..a564f8e05 100644 --- a/Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Save_Results.f90 @@ -162,29 +162,29 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) ! Average over all processors do pl=1, n_prob-1 - call Comm_Mod_Global_Sum_Int(n_count(pl)) + call Global % Sum_Int(n_count(pl)) - call Comm_Mod_Global_Sum_Real(wall_p(pl)) + call Global % Sum_Real(wall_p(pl)) - call Comm_Mod_Global_Sum_Real(u_p(pl)) - call Comm_Mod_Global_Sum_Real(v_p(pl)) - call Comm_Mod_Global_Sum_Real(w_p(pl)) + call Global % Sum_Real(u_p(pl)) + call Global % Sum_Real(v_p(pl)) + call Global % Sum_Real(w_p(pl)) - call Comm_Mod_Global_Sum_Real(kin_p(pl)) - call Comm_Mod_Global_Sum_Real(eps_p(pl)) - call Comm_Mod_Global_Sum_Real(uu_p(pl)) - call Comm_Mod_Global_Sum_Real(vv_p(pl)) - call Comm_Mod_Global_Sum_Real(ww_p(pl)) - call Comm_Mod_Global_Sum_Real(uw_p(pl)) + call Global % Sum_Real(kin_p(pl)) + call Global % Sum_Real(eps_p(pl)) + call Global % Sum_Real(uu_p(pl)) + call Global % Sum_Real(vv_p(pl)) + call Global % Sum_Real(ww_p(pl)) + call Global % Sum_Real(uw_p(pl)) count = count + n_count(pl) if(Flow % heat_transfer) then - call Comm_Mod_Global_Sum_Real(t_p(pl)) - call Comm_Mod_Global_Sum_Real(tt_p(pl)) - call Comm_Mod_Global_Sum_Real(ut_p(pl)) - call Comm_Mod_Global_Sum_Real(vt_p(pl)) - call Comm_Mod_Global_Sum_Real(wt_p(pl)) + call Global % Sum_Real(t_p(pl)) + call Global % Sum_Real(tt_p(pl)) + call Global % Sum_Real(ut_p(pl)) + call Global % Sum_Real(vt_p(pl)) + call Global % Sum_Real(wt_p(pl)) end if end do @@ -239,9 +239,9 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Comm_Mod_Wait if(Flow % heat_flux > 0.0) then - call Comm_Mod_Global_Min_Real(t_inf) + call Global % Min_Real(t_inf) else - call Comm_Mod_Global_Max_Real(t_inf) + call Global % Max_Real(t_inf) end if do s = 1, Grid % n_faces @@ -259,9 +259,9 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if end do - call Comm_Mod_Global_Sum_Real(t_wall) - call Comm_Mod_Global_Sum_Real(nu_mean) - call Comm_Mod_Global_Sum_Int(n_points) + call Global % Sum_Real(t_wall) + call Global % Sum_Real(nu_mean) + call Global % Sum_Int(n_points) call Comm_Mod_Wait diff --git a/Tests/Rans/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 b/Tests/Rans/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 index 3eafed35e..2360151ef 100644 --- a/Tests/Rans/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 @@ -170,31 +170,31 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) ! Average over all processors do pl=1, n_prob-1 - call Comm_Mod_Global_Sum_Int(n_count(pl)) + call Global % Sum_Int(n_count(pl)) - call Comm_Mod_Global_Sum_Real(wall_p(pl)) + call Global % Sum_Real(wall_p(pl)) - call Comm_Mod_Global_Sum_Real(u_p(pl)) - call Comm_Mod_Global_Sum_Real(v_p(pl)) - call Comm_Mod_Global_Sum_Real(w_p(pl)) + call Global % Sum_Real(u_p(pl)) + call Global % Sum_Real(v_p(pl)) + call Global % Sum_Real(w_p(pl)) - call Comm_Mod_Global_Sum_Real(kin_p (pl)) - call Comm_Mod_Global_Sum_Real(eps_p (pl)) - call Comm_Mod_Global_Sum_Real(uw_p (pl)) - call Comm_Mod_Global_Sum_Real(vis_t_p (pl)) - call Comm_Mod_Global_Sum_Real(y_plus_p(pl)) + call Global % Sum_Real(kin_p (pl)) + call Global % Sum_Real(eps_p (pl)) + call Global % Sum_Real(uw_p (pl)) + call Global % Sum_Real(vis_t_p (pl)) + call Global % Sum_Real(y_plus_p(pl)) - call Comm_Mod_Global_Sum_Real(f22_p (pl)) - call Comm_Mod_Global_Sum_Real(zeta_p(pl)) + call Global % Sum_Real(f22_p (pl)) + call Global % Sum_Real(zeta_p(pl)) count = count + n_count(pl) if(Flow % heat_transfer) then - call Comm_Mod_Global_Sum_Real(t_p (pl)) - call Comm_Mod_Global_Sum_Real(t2_p(pl)) - call Comm_Mod_Global_Sum_Real(ut_p(pl)) - call Comm_Mod_Global_Sum_Real(vt_p(pl)) - call Comm_Mod_Global_Sum_Real(wt_p(pl)) + call Global % Sum_Real(t_p (pl)) + call Global % Sum_Real(t2_p(pl)) + call Global % Sum_Real(ut_p(pl)) + call Global % Sum_Real(vt_p(pl)) + call Global % Sum_Real(wt_p(pl)) end if end do @@ -258,9 +258,9 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Comm_Mod_Wait if(Flow % heat_flux> 0.0) then - call Comm_Mod_Global_Min_Real(t_inf) + call Global % Min_Real(t_inf) else - call Comm_Mod_Global_Max_Real(t_inf) + call Global % Max_Real(t_inf) end if do s = 1, Grid % n_faces @@ -278,9 +278,9 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if end do - call Comm_Mod_Global_Sum_Real(t_wall) - call Comm_Mod_Global_Sum_Real(nu_mean) - call Comm_Mod_Global_Sum_Int(n_points) + call Global % Sum_Real(t_wall) + call Global % Sum_Real(nu_mean) + call Global % Sum_Int(n_points) call Comm_Mod_Wait diff --git a/Tests/Rans/Channel_Re_Tau_590/Uniform_Mesh/User_Mod/Save_Results.f90 b/Tests/Rans/Channel_Re_Tau_590/Uniform_Mesh/User_Mod/Save_Results.f90 index 043c36316..09cf4a7b2 100644 --- a/Tests/Rans/Channel_Re_Tau_590/Uniform_Mesh/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Channel_Re_Tau_590/Uniform_Mesh/User_Mod/Save_Results.f90 @@ -170,31 +170,31 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) ! Average over all processors do pl=1, n_prob-1 - call Comm_Mod_Global_Sum_Int(n_count(pl)) + call Global % Sum_Int(n_count(pl)) - call Comm_Mod_Global_Sum_Real(wall_p(pl)) + call Global % Sum_Real(wall_p(pl)) - call Comm_Mod_Global_Sum_Real(u_p(pl)) - call Comm_Mod_Global_Sum_Real(v_p(pl)) - call Comm_Mod_Global_Sum_Real(w_p(pl)) + call Global % Sum_Real(u_p(pl)) + call Global % Sum_Real(v_p(pl)) + call Global % Sum_Real(w_p(pl)) - call Comm_Mod_Global_Sum_Real(kin_p (pl)) - call Comm_Mod_Global_Sum_Real(eps_p (pl)) - call Comm_Mod_Global_Sum_Real(uw_p (pl)) - call Comm_Mod_Global_Sum_Real(vis_t_p (pl)) - call Comm_Mod_Global_Sum_Real(y_plus_p(pl)) + call Global % Sum_Real(kin_p (pl)) + call Global % Sum_Real(eps_p (pl)) + call Global % Sum_Real(uw_p (pl)) + call Global % Sum_Real(vis_t_p (pl)) + call Global % Sum_Real(y_plus_p(pl)) - call Comm_Mod_Global_Sum_Real(f22_p (pl)) - call Comm_Mod_Global_Sum_Real(zeta_p(pl)) + call Global % Sum_Real(f22_p (pl)) + call Global % Sum_Real(zeta_p(pl)) count = count + n_count(pl) if(Flow % heat_transfer) then - call Comm_Mod_Global_Sum_Real(t_p (pl)) - call Comm_Mod_Global_Sum_Real(t2_p(pl)) - call Comm_Mod_Global_Sum_Real(ut_p(pl)) - call Comm_Mod_Global_Sum_Real(vt_p(pl)) - call Comm_Mod_Global_Sum_Real(wt_p(pl)) + call Global % Sum_Real(t_p (pl)) + call Global % Sum_Real(t2_p(pl)) + call Global % Sum_Real(ut_p(pl)) + call Global % Sum_Real(vt_p(pl)) + call Global % Sum_Real(wt_p(pl)) end if end do @@ -258,9 +258,9 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Comm_Mod_Wait if(Flow % heat_flux> 0.0) then - call Comm_Mod_Global_Min_Real(t_inf) + call Global % Min_Real(t_inf) else - call Comm_Mod_Global_Max_Real(t_inf) + call Global % Max_Real(t_inf) end if do s = 1, Grid % n_faces @@ -278,9 +278,9 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if end do - call Comm_Mod_Global_Sum_Real(t_wall) - call Comm_Mod_Global_Sum_Real(nu_mean) - call Comm_Mod_Global_Sum_Int(n_points) + call Global % Sum_Real(t_wall) + call Global % Sum_Real(nu_mean) + call Global % Sum_Int(n_points) call Comm_Mod_Wait diff --git a/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 b/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 index d3cba4ff3..67d799551 100644 --- a/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 +++ b/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 @@ -112,20 +112,20 @@ subroutine User_Mod_Impinging_Jet_Nu(Turb, ts) ! Average over all processors ! !---------------------------------! do i = 1, n_prob - call Comm_Mod_Global_Sum_Int(n_count(i)) + call Global % Sum_Int(n_count(i)) - call Comm_Mod_Global_Sum_Real(u_p(i)) - call Comm_Mod_Global_Sum_Real(v_p(i)) - call Comm_Mod_Global_Sum_Real(w_p(i)) + call Global % Sum_Real(u_p(i)) + call Global % Sum_Real(v_p(i)) + call Global % Sum_Real(w_p(i)) - call Comm_Mod_Global_Sum_Real(z_p(i)) - call Comm_Mod_Global_Sum_Real(tau_p(i)) - call Comm_Mod_Global_Sum_Real(q_p(i)) + call Global % Sum_Real(z_p(i)) + call Global % Sum_Real(tau_p(i)) + call Global % Sum_Real(q_p(i)) - call Comm_Mod_Global_Sum_Real(r_p(i)) - call Comm_Mod_Global_Sum_Real(t_p(i)) + call Global % Sum_Real(r_p(i)) + call Global % Sum_Real(t_p(i)) -! call Comm_Mod_Global_Sum_Real_Array(8, (/u_p (i), & +! call Global % Sum_Real_Array(8, (/u_p (i), & ! v_p (i), & ! w_p (i), & ! z_p (i), & diff --git a/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Profiles.f90 b/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Profiles.f90 index 50b0c7221..15de91b21 100644 --- a/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Profiles.f90 +++ b/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Profiles.f90 @@ -149,19 +149,19 @@ subroutine User_Mod_Impinging_Jet_Profiles(Turb, ts) ! Average over all processors ! !---------------------------------! do i = 1, n_prob - call Comm_Mod_Global_Sum_Int(n_count(i)) - - call Comm_Mod_Global_Sum_Real(u_p(i)) - call Comm_Mod_Global_Sum_Real(v_p(i)) - call Comm_Mod_Global_Sum_Real(w_p(i)) - call Comm_Mod_Global_Sum_Real(zm_p(i)) - - call Comm_Mod_Global_Sum_Real(kin_p(i)) - call Comm_Mod_Global_Sum_Real(eps_p(i)) - call Comm_Mod_Global_Sum_Real(vis_p(i)) - call Comm_Mod_Global_Sum_Real(zet_p(i)) - call Comm_Mod_Global_Sum_Real(f22_p(i)) - call Comm_Mod_Global_Sum_Real(t_p(i)) + call Global % Sum_Int(n_count(i)) + + call Global % Sum_Real(u_p(i)) + call Global % Sum_Real(v_p(i)) + call Global % Sum_Real(w_p(i)) + call Global % Sum_Real(zm_p(i)) + + call Global % Sum_Real(kin_p(i)) + call Global % Sum_Real(eps_p(i)) + call Global % Sum_Real(vis_p(i)) + call Global % Sum_Real(zet_p(i)) + call Global % Sum_Real(f22_p(i)) + call Global % Sum_Real(t_p(i)) end do do i = 1, n_prob diff --git a/Tests/Rans/Pipe_Re_Tau_550/User_Mod/Save_Results.f90 b/Tests/Rans/Pipe_Re_Tau_550/User_Mod/Save_Results.f90 index 3cd16e5f7..f0a0fa31d 100644 --- a/Tests/Rans/Pipe_Re_Tau_550/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Pipe_Re_Tau_550/User_Mod/Save_Results.f90 @@ -175,31 +175,31 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) ! Average over all processors do pl=1, n_prob-1 - call Comm_Mod_Global_Sum_Int(n_count(pl)) + call Global % Sum_Int(n_count(pl)) - call Comm_Mod_Global_Sum_Real(wall_p(pl)) + call Global % Sum_Real(wall_p(pl)) - call Comm_Mod_Global_Sum_Real(u_p(pl)) - call Comm_Mod_Global_Sum_Real(v_p(pl)) - call Comm_Mod_Global_Sum_Real(w_p(pl)) + call Global % Sum_Real(u_p(pl)) + call Global % Sum_Real(v_p(pl)) + call Global % Sum_Real(w_p(pl)) - call Comm_Mod_Global_Sum_Real(kin_p(pl)) - call Comm_Mod_Global_Sum_Real(eps_p(pl)) - call Comm_Mod_Global_Sum_Real(uw_p(pl)) - call Comm_Mod_Global_Sum_Real(vis_t_p(pl)) - call Comm_Mod_Global_Sum_Real(y_plus_p(pl)) + call Global % Sum_Real(kin_p(pl)) + call Global % Sum_Real(eps_p(pl)) + call Global % Sum_Real(uw_p(pl)) + call Global % Sum_Real(vis_t_p(pl)) + call Global % Sum_Real(y_plus_p(pl)) - call Comm_Mod_Global_Sum_Real(f22_p(pl)) - call Comm_Mod_Global_Sum_Real(zeta_p(pl)) + call Global % Sum_Real(f22_p(pl)) + call Global % Sum_Real(zeta_p(pl)) count = count + n_count(pl) if(Flow % heat_transfer) then - call Comm_Mod_Global_Sum_Real(t_p(pl)) - call Comm_Mod_Global_Sum_Real(tt_p(pl)) - call Comm_Mod_Global_Sum_Real(ut_p(pl)) - call Comm_Mod_Global_Sum_Real(vt_p(pl)) - call Comm_Mod_Global_Sum_Real(wt_p(pl)) + call Global % Sum_Real(t_p(pl)) + call Global % Sum_Real(tt_p(pl)) + call Global % Sum_Real(ut_p(pl)) + call Global % Sum_Real(vt_p(pl)) + call Global % Sum_Real(wt_p(pl)) end if end do @@ -264,9 +264,9 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Comm_Mod_Wait if(Flow % heat_flux > 0.0) then - call Comm_Mod_Global_Min_Real(t_inf) + call Global % Min_Real(t_inf) else - call Comm_Mod_Global_Max_Real(t_inf) + call Global % Max_Real(t_inf) end if do s = 1, Grid % n_faces @@ -283,9 +283,9 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if end do - call Comm_Mod_Global_Sum_Real(t_wall) - call Comm_Mod_Global_Sum_Real(nu_mean) - call Comm_Mod_Global_Sum_Int(n_points) + call Global % Sum_Real(t_wall) + call Global % Sum_Real(nu_mean) + call Global % Sum_Int(n_points) call Comm_Mod_Wait diff --git a/Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 b/Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 index f6e03d845..b09800dbb 100644 --- a/Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 @@ -185,33 +185,33 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) ! Average over all processors do pl=1, n_prob-1 - call Comm_Mod_Global_Sum_Int(n_count(pl)) + call Global % Sum_Int(n_count(pl)) - call Comm_Mod_Global_Sum_Real(wall_p(pl)) + call Global % Sum_Real(wall_p(pl)) - call Comm_Mod_Global_Sum_Real(tz_p(pl)) - call Comm_Mod_Global_Sum_Real(ti_p(pl)) - call Comm_Mod_Global_Sum_Real(w_p(pl)) + call Global % Sum_Real(tz_p(pl)) + call Global % Sum_Real(ti_p(pl)) + call Global % Sum_Real(w_p(pl)) - call Comm_Mod_Global_Sum_Real(uu_p(pl)) - call Comm_Mod_Global_Sum_Real(vv_p(pl)) - call Comm_Mod_Global_Sum_Real(ww_p(pl)) - call Comm_Mod_Global_Sum_Real(uw_p(pl)) - call Comm_Mod_Global_Sum_Real(kin_p(pl)) - call Comm_Mod_Global_Sum_Real(kin_mod_p(pl)) + call Global % Sum_Real(uu_p(pl)) + call Global % Sum_Real(vv_p(pl)) + call Global % Sum_Real(ww_p(pl)) + call Global % Sum_Real(uw_p(pl)) + call Global % Sum_Real(kin_p(pl)) + call Global % Sum_Real(kin_mod_p(pl)) count = count + n_count(pl) if(Flow % heat_transfer) then - call Comm_Mod_Global_Sum_Real(t_p(pl)) - call Comm_Mod_Global_Sum_Real(t2_p(pl)) - call Comm_Mod_Global_Sum_Real(t2_mod_p(pl)) - call Comm_Mod_Global_Sum_Real(ut_p(pl)) - call Comm_Mod_Global_Sum_Real(vt_p(pl)) - call Comm_Mod_Global_Sum_Real(wt_p(pl)) - call Comm_Mod_Global_Sum_Real(ut_mod(pl)) - call Comm_Mod_Global_Sum_Real(vt_mod(pl)) - call Comm_Mod_Global_Sum_Real(wt_mod(pl)) + call Global % Sum_Real(t_p(pl)) + call Global % Sum_Real(t2_p(pl)) + call Global % Sum_Real(t2_mod_p(pl)) + call Global % Sum_Real(ut_p(pl)) + call Global % Sum_Real(vt_p(pl)) + call Global % Sum_Real(wt_p(pl)) + call Global % Sum_Real(ut_mod(pl)) + call Global % Sum_Real(vt_mod(pl)) + call Global % Sum_Real(wt_mod(pl)) end if end do diff --git a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/End_Of_Time_Step.f90 b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/End_Of_Time_Step.f90 index 20c18e2d0..032810536 100644 --- a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/End_Of_Time_Step.f90 @@ -248,7 +248,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & vmax = max(vmax, abs(v % n(c))) vmax = max(vmax, abs(w % n(c))) end do - call Comm_Mod_Global_Max_Real(vmax) + call Global % Max_Real(vmax) do c = 1, Grid % n_cells v % n(c) = v % n(c) / vmax / 5.0 v % o(c) = v % o(c) / vmax / 5.0 diff --git a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Results.f90 b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Results.f90 index b5051f8e5..d88b9749f 100644 --- a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Results.f90 +++ b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Results.f90 @@ -158,27 +158,27 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, curr_dt, domain) ! Average over all processors do pl=1, n_prob-1 - call Comm_Mod_Global_Sum_Int(n_count(pl)) + call Global % Sum_Int(n_count(pl)) - call Comm_Mod_Global_Sum_Real(wall_p(pl)) + call Global % Sum_Real(wall_p(pl)) - call Comm_Mod_Global_Sum_Real(u_p(pl)) - call Comm_Mod_Global_Sum_Real(v_p(pl)) - call Comm_Mod_Global_Sum_Real(w_p(pl)) + call Global % Sum_Real(u_p(pl)) + call Global % Sum_Real(v_p(pl)) + call Global % Sum_Real(w_p(pl)) - call Comm_Mod_Global_Sum_Real(uu_p(pl)) - call Comm_Mod_Global_Sum_Real(vv_p(pl)) - call Comm_Mod_Global_Sum_Real(ww_p(pl)) - call Comm_Mod_Global_Sum_Real(uw_p(pl)) + call Global % Sum_Real(uu_p(pl)) + call Global % Sum_Real(vv_p(pl)) + call Global % Sum_Real(ww_p(pl)) + call Global % Sum_Real(uw_p(pl)) - call Comm_Mod_Global_Sum_Real(uw_mod_p(pl)) - call Comm_Mod_Global_Sum_Real(kin_p (pl)) - call Comm_Mod_Global_Sum_Real(eps_p (pl)) - call Comm_Mod_Global_Sum_Real(zeta_p (pl)) - call Comm_Mod_Global_Sum_Real(f22_p (pl)) - call Comm_Mod_Global_Sum_Real(vis_t_p (pl)) - call Comm_Mod_Global_Sum_Real(y_plus_p(pl)) - call Comm_Mod_Global_Sum_Real(ww_mod_p(pl)) + call Global % Sum_Real(uw_mod_p(pl)) + call Global % Sum_Real(kin_p (pl)) + call Global % Sum_Real(eps_p (pl)) + call Global % Sum_Real(zeta_p (pl)) + call Global % Sum_Real(f22_p (pl)) + call Global % Sum_Real(vis_t_p (pl)) + call Global % Sum_Real(y_plus_p(pl)) + call Global % Sum_Real(ww_mod_p(pl)) end do call Comm_Mod_Wait diff --git a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Swarm.f90 b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Swarm.f90 index fa1f1c60c..65f251485 100644 --- a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Swarm.f90 +++ b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Swarm.f90 @@ -172,24 +172,24 @@ subroutine User_Mod_Save_Swarm(Flow, Turb, Vof, Swarm, curr_dt, domain) do pl = 1, n_prob-1 ! Carrier Flow - call Comm_Mod_Global_Sum_Int(n_count2(pl)) - call Comm_Mod_Global_Sum_Real(wall_p(pl)) - call Comm_Mod_Global_Sum_Real(u_p(pl)) - call Comm_Mod_Global_Sum_Real(v_p(pl)) - call Comm_Mod_Global_Sum_Real(w_p(pl)) + call Global % Sum_Int(n_count2(pl)) + call Global % Sum_Real(wall_p(pl)) + call Global % Sum_Real(u_p(pl)) + call Global % Sum_Real(v_p(pl)) + call Global % Sum_Real(w_p(pl)) - call Comm_Mod_Global_Sum_Real(vis_t_p (pl)) - call Comm_Mod_Global_Sum_Real(y_plus_p(pl)) + call Global % Sum_Real(vis_t_p (pl)) + call Global % Sum_Real(y_plus_p(pl)) ! Swarm - call Comm_Mod_Global_Sum_Int(n_states(pl)) - call Comm_Mod_Global_Sum_Real(u_pp(pl)) - call Comm_Mod_Global_Sum_Real(v_pp(pl)) - call Comm_Mod_Global_Sum_Real(w_pp(pl)) - call Comm_Mod_Global_Sum_Real(uu_pp(pl)) - call Comm_Mod_Global_Sum_Real(vv_pp(pl)) - call Comm_Mod_Global_Sum_Real(ww_pp(pl)) - call Comm_Mod_Global_Sum_Real(uw_pp(pl)) + call Global % Sum_Int(n_states(pl)) + call Global % Sum_Real(u_pp(pl)) + call Global % Sum_Real(v_pp(pl)) + call Global % Sum_Real(w_pp(pl)) + call Global % Sum_Real(uu_pp(pl)) + call Global % Sum_Real(vv_pp(pl)) + call Global % Sum_Real(ww_pp(pl)) + call Global % Sum_Real(uw_pp(pl)) end do call Comm_Mod_Wait diff --git a/Tests/Vof/Dam_Break_3d/User_Mod/End_Of_Time_Step.f90 b/Tests/Vof/Dam_Break_3d/User_Mod/End_Of_Time_Step.f90 index d840c7576..7c578dddd 100644 --- a/Tests/Vof/Dam_Break_3d/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Vof/Dam_Break_3d/User_Mod/End_Of_Time_Step.f90 @@ -78,7 +78,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, n, n_stat_t, & end do do i_probe = 1, N_PROBE - call Comm_Mod_Global_Max_Real(h_probe(i_probe)) + call Global % Max_Real(h_probe(i_probe)) end do ! Pressure probes: @@ -95,7 +95,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, n, n_stat_t, & end do do i_probe = 1, size(nod_probe) - call Comm_Mod_Global_Max_Real(p_probe(i_probe)) + call Global % Max_Real(p_probe(i_probe)) end do !---------------------! @@ -107,7 +107,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, n, n_stat_t, & b_volume = b_volume + Grid % vol(c) * fun % n(c) end do - call Comm_Mod_Global_Sum_Real(b_volume) + call Global % Sum_Real(b_volume) ! Write to file if (First_Proc()) then diff --git a/Tests/Vof/Dam_Break_3d/User_Mod/Initialize_Variables.f90 b/Tests/Vof/Dam_Break_3d/User_Mod/Initialize_Variables.f90 index 6bb2bf060..f466bbf08 100644 --- a/Tests/Vof/Dam_Break_3d/User_Mod/Initialize_Variables.f90 +++ b/Tests/Vof/Dam_Break_3d/User_Mod/Initialize_Variables.f90 @@ -84,7 +84,7 @@ subroutine User_Mod_Initialize_Variables(Flow, Turb, Vof, Swarm, Sol) do i_probe = 1, N_PROBE glo_dist = p_dist(i_probe) - call Comm_Mod_Global_Min_Real(glo_dist) + call Global % Min_Real(glo_dist) if(.not. Math % Approx_Real( glo_dist, & p_dist(i_probe), TINY)) then diff --git a/Tests/Vof/Pie/User_Mod/End_Of_Time_Step.f90 b/Tests/Vof/Pie/User_Mod/End_Of_Time_Step.f90 index ed6b7fbed..dafbf85e0 100644 --- a/Tests/Vof/Pie/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Vof/Pie/User_Mod/End_Of_Time_Step.f90 @@ -48,10 +48,10 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & rise_vel_int = rise_vel_int + Flow % v % n(c) * fun % n(c) * Grid % vol(c) end do - call Comm_Mod_Global_Sum_Real(b_volume) - call Comm_Mod_Global_Sum_Real(surface) - call Comm_Mod_Global_Sum_Real(y_pos_cen) - call Comm_Mod_Global_Sum_Real(rise_vel_int) + call Global % Sum_Real(b_volume) + call Global % Sum_Real(surface) + call Global % Sum_Real(y_pos_cen) + call Global % Sum_Real(rise_vel_int) y_pos_cen = y_pos_cen / b_volume rise_vel_int = rise_vel_int / b_volume rise_vel_cen = (y_pos_cen - y_pos_cen_old) / Flow % dt diff --git a/Tests/Vof/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 b/Tests/Vof/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 index 511947dda..9ae36fba4 100644 --- a/Tests/Vof/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Vof/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 @@ -47,10 +47,10 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & rise_velocity = rise_velocity + Flow % w % n(c) * fun % n(c) * Grid % vol(c) end do - call Comm_Mod_Global_Sum_Real(b_volume) - call Comm_Mod_Global_Sum_Real(surface) - call Comm_Mod_Global_Sum_Real(c_position) - call Comm_Mod_Global_Sum_Real(rise_velocity) + call Global % Sum_Real(b_volume) + call Global % Sum_Real(surface) + call Global % Sum_Real(c_position) + call Global % Sum_Real(rise_velocity) ! Write to file if (First_Proc()) then diff --git a/Tests/Vof/Spurious/User_Mod/End_Of_Time_Step.f90 b/Tests/Vof/Spurious/User_Mod/End_Of_Time_Step.f90 index 08ce9007b..d5b51a516 100644 --- a/Tests/Vof/Spurious/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Vof/Spurious/User_Mod/End_Of_Time_Step.f90 @@ -53,8 +53,8 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, n, & min_vfrac = minval(fun % n(1:Grid % n_cells - Grid % Comm % n_buff_cells)) max_vfrac = maxval(fun % n(1:Grid % n_cells - Grid % Comm % n_buff_cells)) - call Comm_Mod_Global_Min_Real(min_vfrac) - call Comm_Mod_Global_Max_Real(max_vfrac) + call Global % Min_Real(min_vfrac) + call Global % Max_Real(max_vfrac) n_tot_cells = Grid % n_cells - Grid % Comm % n_buff_cells @@ -79,24 +79,24 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, n, & end do - call Comm_Mod_Global_Sum_Real(a_vof) + call Global % Sum_Real(a_vof) - call Comm_Mod_Global_Sum_Int(n_tot_cells) - call Comm_Mod_Global_Sum_Real(u_rms) + call Global % Sum_Int(n_tot_cells) + call Global % Sum_Real(u_rms) u_rms = sqrt(1.0 / real(n_tot_cells) * u_rms) u_max = maxval(sum_v1(1:Grid % n_cells - Grid % Comm % n_buff_cells)) - call Comm_Mod_Global_Max_Real(u_max) + call Global % Max_Real(u_max) p_max = maxval(Flow % p % n(1:Grid % n_cells - Grid % Comm % n_buff_cells)) p_min = minval(Flow % p % n(1:Grid % n_cells - Grid % Comm % n_buff_cells)) - call Comm_Mod_Global_Max_Real(p_max) - call Comm_Mod_Global_Min_Real(p_min) + call Global % Max_Real(p_max) + call Global % Min_Real(p_min) - call Comm_Mod_Global_Sum_Real(p_in) - call Comm_Mod_Global_Sum_Real(p_out) - call Comm_Mod_Global_Sum_Real(a_in) - call Comm_Mod_Global_Sum_Real(a_out) + call Global % Sum_Real(p_in) + call Global % Sum_Real(p_out) + call Global % Sum_Real(a_in) + call Global % Sum_Real(a_out) p_in = p_in / a_in p_out = p_out / a_out diff --git a/Tests/Vof/Vertical_Tube/User_Mod/End_Of_Time_Step.f90 b/Tests/Vof/Vertical_Tube/User_Mod/End_Of_Time_Step.f90 index 9da77d839..6e63eee2d 100644 --- a/Tests/Vof/Vertical_Tube/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Vof/Vertical_Tube/User_Mod/End_Of_Time_Step.f90 @@ -43,10 +43,10 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & rise_velocity = rise_velocity + Flow % w % n(c) * fun % n(c) * Grid % vol(c) end do - call Comm_Mod_Global_Sum_Real(b_volume) - call Comm_Mod_Global_Sum_Real(surface) - call Comm_Mod_Global_Sum_Real(c_position) - call Comm_Mod_Global_Sum_Real(rise_velocity) + call Global % Sum_Real(b_volume) + call Global % Sum_Real(surface) + call Global % Sum_Real(c_position) + call Global % Sum_Real(rise_velocity) if (First_Proc()) then ! !with circularity: From f205dbb89b7c42e8996a1ccfb8d60adc0b99dd77 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 25 Mar 2023 11:35:09 +0100 Subject: [PATCH 141/223] Fixed PETSc compilation On branch bojan_more_robust_communicator modified: Petsc_Mod/True/Create_Petsc.f90 --- Sources/Process/Petsc_Mod/True/Create_Petsc.f90 | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Sources/Process/Petsc_Mod/True/Create_Petsc.f90 b/Sources/Process/Petsc_Mod/True/Create_Petsc.f90 index 1d7892cd5..e83187de3 100644 --- a/Sources/Process/Petsc_Mod/True/Create_Petsc.f90 +++ b/Sources/Process/Petsc_Mod/True/Create_Petsc.f90 @@ -31,18 +31,18 @@ subroutine Create_Petsc(Pet, Nat, Grid) allocate(Pet % glo(-Grid % n_bnd_cells:Grid % n_cells)) Pet % glo(:) = 0 - if(n_proc < 2) then + if(Sequential_Run()) then Pet % glo(1:Grid % n_cells) = Grid % Comm % cell_glo(1:Grid % n_cells) - 1 else start = 1 ! first row - allocate(all_lower_ms(n_proc)); ! allocate array for all m_lowers - all_lower_ms(:) = 0 ! important to initialize to zero + allocate(all_lower_ms(N_Procs())); ! allocate array for all m_lowers + all_lower_ms(:) = 0 ! important to initialize to zero ! Distribute m_lowers among all processors - all_lower_ms(this_proc) = Pet % m_lower - call Comm_Mod_Global_Sum_Int_Array(n_proc, all_lower_ms) + all_lower_ms(This_Proc()) = Pet % m_lower + call Comm_Mod_Global_Sum_Int_Array(N_Procs(), all_lower_ms) - start = sum(all_lower_ms(1:this_proc)) - Pet % m_lower + start = sum(all_lower_ms(1:This_Proc())) - Pet % m_lower ! Distribute global numbers over other processors do i = 1, Pet % m_lower @@ -87,7 +87,7 @@ subroutine Create_Petsc(Pet, Nat, Grid) do i = 1, Pet % m_lower do j = Nat % A % row(i), Nat % A % row(i+1)-1 k = Nat % A % col(j) - if(Grid % Comm % cell_proc(k) .eq. this_proc) then + if(Grid % Comm % cell_proc(k) .eq. This_Proc()) then Pet % d_nnz(i) = Pet % d_nnz(i) + 1 else Pet % o_nnz(i) = Pet % o_nnz(i) + 1 From c9639d2493f3716788790e4ea67b7d4b1f3a6d48 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 25 Mar 2023 11:38:39 +0100 Subject: [PATCH 142/223] Added Nvidia compiler - again. Go figure. On branch bojan_more_robust_communicator modified: test_build.sh --- Tests/test_build.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Tests/test_build.sh b/Tests/test_build.sh index ea5bcd0e9..daa1a01ad 100755 --- a/Tests/test_build.sh +++ b/Tests/test_build.sh @@ -1676,6 +1676,10 @@ function chose_test { FCOMP="mpiifort" DEBUG="no" elif [ $FORTRAN == "intel" ]; then + FORTRAN="nvidia" + FCOMP="" + DEBUG="no" + elif [ $FORTRAN == "nvidia" ]; then FORTRAN="gnu" FCOMP="" DEBUG="no" @@ -1729,6 +1733,14 @@ else echo "# compiler. In that case, purge the Intel environment." echo "# to get rid of the Python from Intel compiler." fi + if [ $FORTRAN == "nvidia" ]; then + echo "# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" + echo "# Remark: When using Nvidia Fortran, please make sure that you are" + echo "# using version 4 of the OpenMPI library." + echo "#" + echo "# For most installations, you should adjust the link mpi in" + echo "# directory /opt/nvidia/hpc_sdk/Linux_x86_64/23.1/comm_libs" + fi echo "#--------------------------------------------------------------------" echo "" echo " Chose the type of test you want to perform:" From 655addf51f2f15bd4a5d2db125a17787dcdc2ee0 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 25 Mar 2023 12:09:03 +0100 Subject: [PATCH 143/223] Updated T-Flows syntax file. On branch bojan_more_robust_communicator modified: Documentation/fortran.vim --- Documentation/fortran.vim | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Documentation/fortran.vim b/Documentation/fortran.vim index f8c869241..8e1b9b75b 100644 --- a/Documentation/fortran.vim +++ b/Documentation/fortran.vim @@ -359,12 +359,12 @@ if b:fortran_dialect == "f08" syn keyword fortranConstant HYBRID_LES_RANS HYBRID_LES_PRANDTL STABILIZED SGDH GGDH AFM syn keyword fortranConstant SWITCH_DISTANCE SWITCH_VELOCITY " After the constants, I have alternating definitions of types and objects derived from them - syn keyword fortranTypeTflows Domain_Type Generate_Type Convert_Type Grid_Type - syn keyword fortranObjectTflows Dom Generate Convert Grid Prim Dual + syn keyword fortranTypeTflows Domain_Type Generate_Type Convert_Type Divide_Type Grid_Type + syn keyword fortranObjectTflows Dom Generate Convert Divide Grid Prim Dual syn keyword fortranTypeTflows Math_Type Sort_Type File_Type String_Type Work_Type Tokenizer_Type syn keyword fortranObjectTflows Math Sort File String Work Line Tok syn keyword fortranTypeTflows Comm_Type Backup_Type Field_Type Turb_Type Vof_Type Swarm_Type - syn keyword fortranObjectTflows Comm World Backup Bac Flow Fld Turb Tur Vof Swarm Swr + syn keyword fortranObjectTflows Comm Global Backup Bac Flow Fld Turb Tur Vof Swarm Swr syn keyword fortranObjectTflows This_Proc N_Procs First_Proc Sequential_Run Parallel_Run syn keyword fortranTypeTflows Front_Type Surf_Type Elem_Type Vert_Type Particle_Type syn keyword fortranObjectTflows Front Surf Elem Vert Part From cc0cd9f67422715f084802bd04d61fb20aeae47a Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 25 Mar 2023 15:27:27 +0100 Subject: [PATCH 144/223] Little updates to T-Flows syntax file On branch bojan_more_robust_communicator modified: fortran.vim --- Documentation/fortran.vim | 427 ++++++++++++++++++++------------------ 1 file changed, 220 insertions(+), 207 deletions(-) diff --git a/Documentation/fortran.vim b/Documentation/fortran.vim index 8e1b9b75b..fdc5ef2a5 100644 --- a/Documentation/fortran.vim +++ b/Documentation/fortran.vim @@ -160,12 +160,13 @@ syn keyword fortranIntrinsicR alog alog10 amax0 amax1 amin0 amin1 amod cabs cco " Intrinsics provided by some vendors syn keyword fortranExtraIntrinsic algama cdabs cdcos cdexp cdlog cdsin cdsqrt cqabs cqcos cqexp cqlog cqsin cqsqrt dcmplx dconjg derf derfc dfloat dgamma dimag dlgama iqint qabs qacos qasin qatan qatan2 qcmplx qconjg qcos qcosh qdim qerf qerfc qexp qgamma qimag qlgama qlog qlog10 qmax1 qmin1 qmod qnint qsign qsin qsinh qsqrt qtan qtanh -syn keyword fortranIntrinsic abs acos aimag aint anint asin atan atan2 char cmplx conjg cos cosh exp ichar index int log log10 max min nint sign sin sinh sqrt tan tanh -syn match fortranIntrinsic "\" -syn match fortranType "\" +syn keyword fortranKeyword abs acos aimag aint anint asin atan atan2 char cmplx conjg cos cosh exp +syn keyword fortranKeyword ichar index int log log10 max min nint sign sin sinh sqrt tan tanh +syn match fortranIntrinsic "\" +syn match fortranType "\" "Numbers of various sorts " Integers @@ -208,19 +209,19 @@ if exists("fortran_more_precise") syn match fortranTarget display "\(\" endif -syn keyword fortranTypeR external -syn keyword fortranIOR format -syn match fortranKeywordR "\" -syn match fortranKeyword "^\s*\d\+\s\+continue\>" -syn match fortranKeyword "\" -syn match fortranKeywordDel "\" +syn match fortranKeyword "^\s*\d\+\s\+continue\>" +syn match fortranKeyword "\" +syn match fortranKeywordDel "\" -syn keyword fortranType none +syn match fortranType "\" +syn keyword fortranType none syn keyword fortranStructure private public intent optional syn keyword fortranStructure pointer target allocatable @@ -244,33 +245,39 @@ syn region fortranString start=+"+ end=+"+ contains=fortranLeftMargin,fortranCon syn keyword fortranIO pad position action delim readwrite syn keyword fortranIO eor advance nml -syn keyword fortranIntrinsic adjustl adjustr all allocated any associated bit_size btest ceiling count cshift date_and_time digits dot_product eoshift epsilon exponent floor fraction huge iand ibclr ibits ibset ieor ior ishft ishftc lbound len_trim matmul maxexponent maxloc maxval merge minexponent minloc minval modulo mvbits nearest pack precision present product radix random_number random_seed range repeat reshape rrspacing -syn keyword fortranIntrinsic scale scan selected_int_kind selected_real_kind set_exponent shape size spacing spread sum system_clock tiny transpose trim ubound unpack verify -syn match fortranIntrinsic "\\(\s*\.\)\@!"me=s+3 -syn match fortranIntrinsic "\\s*[(,]"me=s+4 - -syn match fortranUnitHeader "\" -syn keyword fortranIOR namelist -syn keyword fortranConditionalR while -syn keyword fortranIntrinsicR achar iachar transfer - -syn keyword fortranInclude include -syn keyword fortranStorageClassR sequence +syn keyword fortranKeyword adjustl adjustr all allocated any associated bit_size btest +syn keyword fortranKeyword ceiling count cshift date_and_time digits dot_product eoshift +syn keyword fortranKeyword epsilon exponent floor fraction huge iand ibclr ibits ibset +syn keyword fortranKeyword ieor ior ishft ishftc lbound len_trim matmul maxexponent +syn keyword fortranKeyword maxloc maxval merge minexponent minloc minval modulo mvbits +syn keyword fortranKeyword nearest pack precision present product radix random_number +syn keyword fortranKeyword random_seed range repeat reshape rrspacing +syn keyword fortranIntrinsic scale scan selected_int_kind selected_real_kind set_exponent shape size spacing spread sum system_clock tiny transpose trim ubound unpack verify +syn match fortranIntrinsic "\\(\s*\.\)\@!"me=s+3 +syn match fortranIntrinsic "\\s*[(,]"me=s+4 + +syn match fortranUnitHeader "\" +syn keyword fortranIOR namelist +syn keyword fortranConditionalR while +syn keyword fortranIntrinsicR achar iachar transfer + +syn keyword fortranInclude include +syn keyword fortranStorageClassR sequence syn match fortranConditional "\" -syn match fortranType "\" -syn match fortranType "\" -syn match fortranType "\" +syn keyword fortranRepeat forall +syn match fortranRepeat "\" +syn match fortranType "\" +syn match fortranType "\" +syn match fortranType "\" if exists("fortran_more_precise") syn match fortranConstructName "\(\" endif if b:fortran_dialect == "f08" " F2003 - syn keyword fortranIntrinsic command_argument_count get_command get_command_argument get_environment_variable is_iostat_end is_iostat_eor move_alloc new_line selected_char_kind same_type_as extends_type_of + syn keyword fortranKeyword command_argument_count get_command get_command_argument get_environment_variable + syn keyword fortranKeyword is_iostat_end is_iostat_eor move_alloc new_line selected_char_kind same_type_as + syn keyword fortranKeyword extends_type_of " ISO_C_binding - syn keyword fortranConstant c_null_char c_alert c_backspace c_form_feed c_new_line c_carriage_return c_horizontal_tab c_vertical_tab - syn keyword fortranConstant c_int c_short c_long c_long_long c_signed_char c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr - syn keyword fortranIntrinsic iso_c_binding c_loc c_funloc c_associated c_f_pointer c_f_procpointer - syn keyword fortranType c_ptr c_funptr + syn keyword fortranConstant c_null_char c_alert c_backspace c_form_feed c_new_line c_carriage_return + syn keyword fortranConstant c_horizontal_tab c_vertical_tab c_int c_short c_long c_long_long c_signed_char + syn keyword fortranConstant c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t + syn keyword fortranConstant c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t + syn keyword fortranConstant c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex + syn keyword fortranConstatn c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr + syn keyword fortranIntrinsic iso_c_binding c_loc c_funloc c_associated c_f_pointer c_f_procpointer + syn keyword fortranType c_ptr c_funptr " ISO_Fortran_env - syn keyword fortranConstant iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit + syn keyword fortranConstant iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit " IEEE_arithmetic - syn keyword fortranIntrinsic ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode - - syn keyword fortranReadWrite flush wait - syn keyword fortranIO decimal round iomsg - syn keyword fortranType asynchronous nopass non_overridable pass protected volatile extends import - syn keyword fortranType non_intrinsic value bind deferred generic final enumerator - syn match fortranType "\" - syn match fortranType "\" - syn match fortranType "\" - syn match fortranType "\" - syn match fortranConditional "\" - syn match fortranUnitHeader "\" - syn match fortranOperator "\([\|]\)" + syn keyword fortranIntrinsic ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode + + syn keyword fortranReadWrite flush wait + syn keyword fortranIO decimal round iomsg + syn keyword fortranType asynchronous nopass non_overridable pass protected volatile extends import + syn keyword fortranType non_intrinsic value bind deferred generic final enumerator + syn match fortranType "\" + syn match fortranType "\" + syn match fortranType "\" + syn match fortranType "\" + syn match fortranConditional "\" + syn match fortranUnitHeader "\" + syn match fortranOperator "\([\|]\)" " F2008 - syn keyword fortranIntrinsic acosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2 - syn keyword fortranIntrinsic atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits - syn keyword fortranIntrinsic bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image - syn keyword fortranIO newunit - syn keyword fortranType contiguous - syn keyword fortranRepeat concurrent + syn keyword fortranIntrinsic acosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2 + syn keyword fortranIntrinsic atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits + syn keyword fortranIntrinsic bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image + syn keyword fortranIO newunit + syn keyword fortranType contiguous + syn keyword fortranRepeat concurrent "=====================================================================[T-Flows]= " T-Flows specific - syn match fortranTypeTflows "\" + syn match fortranTypeTflows "\" " Start with constants from Const_Mod: - syn keyword fortranConstant PROGRAM_NAME - syn keyword fortranConstant VL SL DL MSI DP SP IP LP RP - syn keyword fortranConstant YOCTO ZEPTO ATTO FEMTO PICO NANO MICRO MILI - syn keyword fortranConstant YOTTA ZETTA EXA PETA TERA GIGA MEGA KILO - syn keyword fortranConstant HUGE TINY HUGE_INT EULER PI - syn keyword fortranConstant ONE_THIRD TWO_THIRDS ONE_SIXTH - syn keyword fortranConstant MD MAX_VARS_INTERFACE + syn keyword fortranConstant PROGRAM_NAME + syn keyword fortranConstant VL SL DL MSI DP SP IP LP RP + syn keyword fortranConstant YOCTO ZEPTO ATTO FEMTO PICO NANO MICRO MILI + syn keyword fortranConstant YOTTA ZETTA EXA PETA TERA GIGA MEGA KILO + syn keyword fortranConstant HUGE TINY HUGE_INT EULER PI + syn keyword fortranConstant ONE_THIRD TWO_THIRDS ONE_SIXTH + syn keyword fortranConstant MD MAX_VARS_INTERFACE " Constants related to indentation (O think they are defined in a few places - bad! - syn keyword fortranConstant IN_0 IN_1 IN_2 IN_3 IN_4 IN_5 + syn keyword fortranConstant IN_0 IN_1 IN_2 IN_3 IN_4 IN_5 " Constants from Numerics_Mod - syn keyword fortranConstant UPWIND CENTRAL LUDS QUICK SMART GAMMA - syn keyword fortranConstant MINMOD BLENDED SUPERBEE AVL_SMART CICSAM STACS - syn keyword fortranConstant LINEAR PARABOLIC RUNGE_KUTTA_3 - syn keyword fortranConstant SIMPLE PISO CHOI - syn keyword fortranConstant LEAST_SQUARES GAUSS_THEOREM + syn keyword fortranConstant UPWIND CENTRAL LUDS QUICK SMART GAMMA + syn keyword fortranConstant MINMOD BLENDED SUPERBEE AVL_SMART CICSAM STACS + syn keyword fortranConstant LINEAR PARABOLIC RUNGE_KUTTA_3 + syn keyword fortranConstant SIMPLE PISO CHOI + syn keyword fortranConstant LEAST_SQUARES GAUSS_THEOREM " Constants from Turb_Mod - syn keyword fortranConstant NO_TURBULENCE_MODEL DNS LES_SMAGORINSKY LES_DYNAMIC - syn keyword fortranConstant LES_WALE LES_TVM K_EPS K_EPS_ZETA_F DES_SPALART - syn keyword fortranConstant SPALART_ALLMARAS RSM_HANJALIC_JAKIRLIC RSM_MANCEAU_HANJALIC - syn keyword fortranConstant HYBRID_LES_RANS HYBRID_LES_PRANDTL STABILIZED SGDH GGDH AFM - syn keyword fortranConstant SWITCH_DISTANCE SWITCH_VELOCITY + syn keyword fortranConstant NO_TURBULENCE_MODEL DNS LES_SMAGORINSKY LES_DYNAMIC + syn keyword fortranConstant LES_WALE LES_TVM K_EPS K_EPS_ZETA_F DES_SPALART + syn keyword fortranConstant SPALART_ALLMARAS RSM_HANJALIC_JAKIRLIC RSM_MANCEAU_HANJALIC + syn keyword fortranConstant HYBRID_LES_RANS HYBRID_LES_PRANDTL STABILIZED SGDH GGDH AFM + syn keyword fortranConstant SWITCH_DISTANCE SWITCH_VELOCITY " After the constants, I have alternating definitions of types and objects derived from them - syn keyword fortranTypeTflows Domain_Type Generate_Type Convert_Type Divide_Type Grid_Type - syn keyword fortranObjectTflows Dom Generate Convert Divide Grid Prim Dual - syn keyword fortranTypeTflows Math_Type Sort_Type File_Type String_Type Work_Type Tokenizer_Type - syn keyword fortranObjectTflows Math Sort File String Work Line Tok - syn keyword fortranTypeTflows Comm_Type Backup_Type Field_Type Turb_Type Vof_Type Swarm_Type - syn keyword fortranObjectTflows Comm Global Backup Bac Flow Fld Turb Tur Vof Swarm Swr - syn keyword fortranObjectTflows This_Proc N_Procs First_Proc Sequential_Run Parallel_Run - syn keyword fortranTypeTflows Front_Type Surf_Type Elem_Type Vert_Type Particle_Type - syn keyword fortranObjectTflows Front Surf Elem Vert Part - syn keyword fortranTypeTflows Monitor_Type Results_Type Porosity_Type Profiler_Type Message_Type - syn keyword fortranObjectTflows Monitor Results Por Profiler Message - syn keyword fortranTypeTflows Var_Type - syn keyword fortranObjectTflows u v w t kin eps zeta f22 uu vv ww uv vw uw ut vt wt t2 vis - syn keyword fortranTypeTflows Matrix_Type Vector_Type Solver_Type Native_Type Petsc_Type Process_Type - syn keyword fortranObjectTflows A M vector b Sol Nat Pet Process + syn keyword fortranTypeTflows Domain_Type Generate_Type Convert_Type Divide_Type Grid_Type + syn keyword fortranObjectTflows Dom Generate Convert Divide Grid Prim Dual + syn keyword fortranTypeTflows Math_Type Sort_Type File_Type String_Type Work_Type Tokenizer_Type + syn keyword fortranObjectTflows Math Sort File String Work Line Tok + syn keyword fortranTypeTflows Comm_Type Backup_Type Field_Type Turb_Type Vof_Type Swarm_Type + syn keyword fortranObjectTflows Comm Global Backup Bac Flow Fld Turb Tur Vof Swarm Swr + syn keyword fortranObjectTflows This_Proc N_Procs First_Proc Sequential_Run Parallel_Run + syn keyword fortranTypeTflows Front_Type Surf_Type Elem_Type Vert_Type Particle_Type + syn keyword fortranObjectTflows Front Surf Elem Vert Part + syn keyword fortranTypeTflows Monitor_Type Results_Type Porosity_Type Profiler_Type Message_Type + syn keyword fortranObjectTflows Monitor Results Por Profiler Message + syn keyword fortranTypeTflows Var_Type + syn keyword fortranObjectTflows u v w t kin eps zeta f22 uu vv ww uv vw uw ut vt wt t2 vis + syn keyword fortranTypeTflows Matrix_Type Vector_Type Solver_Type Native_Type Petsc_Type Process_Type + syn keyword fortranObjectTflows A M vector b Sol Nat Pet Process "---------------------------------------------------------------------[T-Flows]- " CUDA fortran - syn match fortranTypeCUDA "\" - syn keyword fortranTypeCUDA host global device value - syn keyword fortranTypeCUDA shared constant pinned texture - syn keyword fortranTypeCUDA dim1 dim2 dim3 dim4 - syn keyword fortranTypeCUDA cudadeviceprop cuda_count_kind cuda_stream_kind - syn keyword fortranTypeCUDA cudaEvent cudaFuncAttributes cudaArrayPtr - syn keyword fortranTypeCUDA cudaSymbol cudaChannelFormatDesc cudaPitchedPtr - syn keyword fortranTypeCUDA cudaExtent cudaMemcpy3DParms - syn keyword fortranTypeCUDA cudaFuncCachePreferNone cudaFuncCachePreferShared - syn keyword fortranTypeCUDA cudaFuncCachePreferL1 cudaLimitStackSize - syn keyword fortranTypeCUDA cudaLimitPrintfSize cudaLimitMallocHeapSize - syn keyword fortranTypeCUDA cudaSharedMemBankSizeDefault cudaSharedMemBankSizeFourByte cudaSharedMemBankSizeEightByte - syn keyword fortranTypeCUDA cudaEventDefault cudaEventBlockingSync cudaEventDisableTiming - syn keyword fortranTypeCUDA cudaMemcpyHostToDevice cudaMemcpyDeviceToHost - syn keyword fortranTypeCUDA cudaMemcpyDeviceToDevice - syn keyword fortranTypeCUDA cudaErrorNotReady cudaSuccess cudaErrorInvalidValue - syn keyword fortranTypeCUDA c_devptr - - syn match fortranStringCUDA "blockidx%[xyz]" - syn match fortranStringCUDA "blockdim%[xyz]" - syn match fortranStringCUDA "griddim%[xyz]" - syn match fortranStringCUDA "threadidx%[xyz]" + syn match fortranTypeCUDA "\" + syn keyword fortranTypeCUDA host global device value + syn keyword fortranTypeCUDA shared constant pinned texture + syn keyword fortranTypeCUDA dim1 dim2 dim3 dim4 + syn keyword fortranTypeCUDA cudadeviceprop cuda_count_kind cuda_stream_kind + syn keyword fortranTypeCUDA cudaEvent cudaFuncAttributes cudaArrayPtr + syn keyword fortranTypeCUDA cudaSymbol cudaChannelFormatDesc cudaPitchedPtr + syn keyword fortranTypeCUDA cudaExtent cudaMemcpy3DParms + syn keyword fortranTypeCUDA cudaFuncCachePreferNone cudaFuncCachePreferShared + syn keyword fortranTypeCUDA cudaFuncCachePreferL1 cudaLimitStackSize + syn keyword fortranTypeCUDA cudaLimitPrintfSize cudaLimitMallocHeapSize + syn keyword fortranTypeCUDA cudaSharedMemBankSizeDefault cudaSharedMemBankSizeFourByte cudaSharedMemBankSizeEightByte + syn keyword fortranTypeCUDA cudaEventDefault cudaEventBlockingSync cudaEventDisableTiming + syn keyword fortranTypeCUDA cudaMemcpyHostToDevice cudaMemcpyDeviceToHost + syn keyword fortranTypeCUDA cudaMemcpyDeviceToDevice + syn keyword fortranTypeCUDA cudaErrorNotReady cudaSuccess cudaErrorInvalidValue + syn keyword fortranTypeCUDA c_devptr + + syn match fortranStringCUDA "blockidx%[xyz]" + syn match fortranStringCUDA "blockdim%[xyz]" + syn match fortranStringCUDA "griddim%[xyz]" + syn match fortranStringCUDA "threadidx%[xyz]" syn keyword fortranIntrinsicCUDA warpsize syncthreads syncthreads_and syncthreads_count syncthreads_or threadfence threadfence_block threadfence_system gpu_time allthreads anythread ballot syn keyword fortranIntrinsicCUDA atomicadd atomicsub atomicmax atomicmin atomicand atomicor atomicxor atomicexch atomicinc atomicdec atomiccas sizeof __shfl __shfl_up __shfl_down __shfl_xor @@ -440,11 +453,11 @@ syn match fortranComment excludenl "!.*$" contains=@fortranCommentGroup,@spell syn match fortranOpenMP excludenl "^\s*!\$\(OMP\)\=&\=\s.*$" "cpp is often used with Fortran -syn match cPreProc "^\s*#\s*\(define\|ifdef\)\>.*" -syn match cPreProc "^\s*#\s*\(elif\|if\)\>.*" -syn match cPreProc "^\s*#\s*\(ifndef\|undef\)\>.*" -syn match cPreCondit "^\s*#\s*\(else\|endif\)\>.*" -syn region cIncluded contained start=+"[^("]+ skip=+\\\\\|\\"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber +syn match cPreProc "^\s*#\s*\(define\|ifdef\)\>.*" +syn match cPreProc "^\s*#\s*\(elif\|if\)\>.*" +syn match cPreProc "^\s*#\s*\(ifndef\|undef\)\>.*" +syn match cPreCondit "^\s*#\s*\(else\|endif\)\>.*" +syn region cIncluded contained start=+"[^("]+ skip=+\\\\\|\\"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber "syn region cIncluded contained start=+"[^("]+ skip=+\\\\\|\\"+ end=+"+ syn match cIncluded contained "<[^>]*>" syn match cInclude "^\s*#\s*include\>\s*["<]" contains=cIncluded @@ -513,33 +526,33 @@ endif " fortranBlockData " fortran77Loop, fortran90Loop, fortranIfBlock, fortranCase " fortranMultiCommentLines -hi def link fortranKeyword Keyword -hi def link fortranConstructName Identifier -hi def link fortranConditional Conditional -hi def link fortranRepeat Repeat -hi def link fortranTodo Todo -hi def link fortranContinueMark Special -hi def link fortranString String -hi def link fortranNumber Number -hi def link fortranBinary Number -hi def link fortranOctal Number -hi def link fortranHex Number -hi def link fortranOperator Operator -hi def link fortranBoolean Boolean -hi def link fortranLabelError Error -hi def link fortranObsolete Todo -hi def link fortranType Type -hi def link fortranStructure Type -hi def link fortranStorageClass StorageClass +hi def link fortranKeyword Keyword +hi def link fortranConstructName Identifier +hi def link fortranConditional Conditional +hi def link fortranRepeat Repeat +hi def link fortranTodo Todo +hi def link fortranContinueMark Special +hi def link fortranString String +hi def link fortranNumber Number +hi def link fortranBinary Number +hi def link fortranOctal Number +hi def link fortranHex Number +hi def link fortranOperator Operator +hi def link fortranBoolean Boolean +hi def link fortranLabelError Error +hi def link fortranObsolete Todo +hi def link fortranType Type +hi def link fortranStructure Type +hi def link fortranStorageClass StorageClass "=====================================================================[T-Flows]= " Got rid of the special group for call ... " hi def link fortranCall Function "---------------------------------------------------------------------[T-Flows]- -hi def link fortranUnitHeader fortranPreCondit -hi def link fortranReadWrite Keyword -hi def link fortranIO Keyword -hi def link fortranIntrinsic Function -hi def link fortranConstant Constant +hi def link fortranUnitHeader fortranPreCondit +hi def link fortranReadWrite Keyword +hi def link fortranIO Keyword +hi def link fortranIntrinsic Function +hi def link fortranConstant Constant " To stop deleted & obsolescent features being highlighted as Todo items, " comment out the next 5 lines and uncomment the 5 lines after that @@ -555,33 +568,33 @@ hi def link fortranKeywordDel fortranObsolete "hi def link fortranKeywordDel fortranKeyword if b:fortran_dialect == "F" - hi! def link fortranIntrinsicR fortranObsolete - hi! def link fortranUnitHeaderR fortranObsolete - hi! def link fortranTypeR fortranObsolete - hi! def link fortranStorageClassR fortranObsolete - hi! def link fortranOperatorR fortranObsolete - hi! def link fortranInclude fortranObsolete - hi! def link fortranLabelNumber fortranObsolete - hi! def link fortranTarget fortranObsolete - hi! def link fortranFloatIll fortranObsolete - hi! def link fortranIOR fortranObsolete - hi! def link fortranKeywordR fortranObsolete - hi! def link fortranStringR fortranObsolete - hi! def link fortranConditionalR fortranObsolete + hi! def link fortranIntrinsicR fortranObsolete + hi! def link fortranUnitHeaderR fortranObsolete + hi! def link fortranTypeR fortranObsolete + hi! def link fortranStorageClassR fortranObsolete + hi! def link fortranOperatorR fortranObsolete + hi! def link fortranInclude fortranObsolete + hi! def link fortranLabelNumber fortranObsolete + hi! def link fortranTarget fortranObsolete + hi! def link fortranFloatIll fortranObsolete + hi! def link fortranIOR fortranObsolete + hi! def link fortranKeywordR fortranObsolete + hi! def link fortranStringR fortranObsolete + hi! def link fortranConditionalR fortranObsolete else - hi! def link fortranIntrinsicR fortranIntrinsic - hi! def link fortranUnitHeaderR fortranPreCondit - hi! def link fortranTypeR fortranType - hi! def link fortranStorageClassR fortranStorageClass - hi! def link fortranOperatorR fortranOperator - hi! def link fortranInclude Include - hi! def link fortranLabelNumber Special - hi! def link fortranTarget Special - hi! def link fortranFloatIll fortranFloat - hi! def link fortranIOR fortranIO - hi! def link fortranKeywordR fortranKeyword - hi! def link fortranStringR fortranString - hi! def link fortranConditionalR fortranConditional + hi! def link fortranIntrinsicR fortranIntrinsic + hi! def link fortranUnitHeaderR fortranPreCondit + hi! def link fortranTypeR fortranType + hi! def link fortranStorageClassR fortranStorageClass + hi! def link fortranOperatorR fortranOperator + hi! def link fortranInclude Include + hi! def link fortranLabelNumber Special + hi! def link fortranTarget Special + hi! def link fortranFloatIll fortranFloat + hi! def link fortranIOR fortranIO + hi! def link fortranKeywordR fortranKeyword + hi! def link fortranStringR fortranString + hi! def link fortranConditionalR fortranConditional endif "=====================================================================[T-Flows]= @@ -592,22 +605,22 @@ hi def link fortranObjectTflows fortranIntrinsic "---------------------------------------------------------------------[T-Flows]- " CUDA -hi def link fortranIntrinsicCUDA fortranIntrinsic -hi def link fortranTypeCUDA fortranType -hi def link fortranStringCUDA fortranString - -hi def link fortranFormatSpec Identifier -hi def link fortranFloat Float -hi def link fortranPreCondit PreCondit -hi def link cIncluded fortranString -hi def link cInclude Include -hi def link cPreProc PreProc -hi def link cPreCondit PreCondit -hi def link fortranOpenMP PreProc -hi def link fortranParenError Error -hi def link fortranComment Comment -hi def link fortranSerialNumber Todo -hi def link fortranTab Error +hi def link fortranIntrinsicCUDA fortranIntrinsic +hi def link fortranTypeCUDA fortranType +hi def link fortranStringCUDA fortranString + +hi def link fortranFormatSpec Identifier +hi def link fortranFloat Float +hi def link fortranPreCondit PreCondit +hi def link cIncluded fortranString +hi def link cInclude Include +hi def link cPreProc PreProc +hi def link cPreCondit PreCondit +hi def link fortranOpenMP PreProc +hi def link fortranParenError Error +hi def link fortranComment Comment +hi def link fortranSerialNumber Todo +hi def link fortranTab Error " Uncomment the next line if you use extra intrinsics provided by vendors "hi def link fortranExtraIntrinsic Function From c35632bb624735054718bdbdeaae9067a31df4e1 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 26 Mar 2023 14:05:45 +0200 Subject: [PATCH 145/223] Adjusted line widths here and there; not important On branch bojan_more_robust_communicator modified: Shared/Comm_Mod/Parallel/Exchange_Real_Array.f90 modified: Shared/Comm_Mod/Parallel/Global_Max_Real.f90 modified: Shared/Comm_Mod/Parallel/Global_Min_Real.f90 modified: Shared/Comm_Mod/Parallel/Global_Sum_Real.f90 modified: Shared/Comm_Mod/Parallel/Open_File_Write.f90 modified: Shared/Comm_Mod/Parallel/Recv_Real_Array.f90 modified: Shared/Comm_Mod/Parallel/Send_Real_Array.f90 --- .../Comm_Mod/Parallel/Exchange_Real_Array.f90 | 18 +++++++++--------- .../Comm_Mod/Parallel/Global_Max_Real.f90 | 12 ++++++------ .../Comm_Mod/Parallel/Global_Min_Real.f90 | 12 ++++++------ .../Comm_Mod/Parallel/Global_Sum_Real.f90 | 12 ++++++------ .../Comm_Mod/Parallel/Open_File_Write.f90 | 2 +- .../Comm_Mod/Parallel/Recv_Real_Array.f90 | 14 +++++++------- .../Comm_Mod/Parallel/Send_Real_Array.f90 | 14 +++++++------- 7 files changed, 42 insertions(+), 42 deletions(-) diff --git a/Sources/Shared/Comm_Mod/Parallel/Exchange_Real_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Exchange_Real_Array.f90 index c90c6cace..86f3a885f 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Exchange_Real_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Exchange_Real_Array.f90 @@ -22,15 +22,15 @@ subroutine Exchange_Real_Array(Comm, length, phi, dest) stag = Global % n_processors * Global % this_processor + dest rtag = Global % n_processors * dest + Global % this_processor - call Mpi_Sendrecv_Replace(phi(1), & ! buffer - length, & ! length - comm_type_real, & ! datatype - (dest-1), & ! dest, - stag, & ! sendtag, - (dest-1), & ! source, - rtag, & ! recvtag, - MPI_COMM_WORLD, & - status, & + call Mpi_Sendrecv_Replace(phi(1), & ! buffer + length, & ! length + comm_type_real, & ! datatype + (dest-1), & ! dest, + stag, & ! sendtag, + (dest-1), & ! source, + rtag, & ! recvtag, + MPI_COMM_WORLD, & + status, & error) end subroutine diff --git a/Sources/Shared/Comm_Mod/Parallel/Global_Max_Real.f90 b/Sources/Shared/Comm_Mod/Parallel/Global_Max_Real.f90 index b17f5fca5..6c40a85d5 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Global_Max_Real.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Global_Max_Real.f90 @@ -14,12 +14,12 @@ subroutine Max_Real(Global, phi) Unused(Global) !==============================================================================! - call Mpi_Allreduce(phi, & ! send buffer - phi_new, & ! recv buffer - 1, & ! length - comm_type_real, & ! datatype - MPI_MAX, & ! operation - MPI_COMM_WORLD, & + call Mpi_Allreduce(phi, & ! send buffer + phi_new, & ! recv buffer + 1, & ! length + comm_type_real, & ! datatype + MPI_MAX, & ! operation + MPI_COMM_WORLD, & error) phi = phi_new diff --git a/Sources/Shared/Comm_Mod/Parallel/Global_Min_Real.f90 b/Sources/Shared/Comm_Mod/Parallel/Global_Min_Real.f90 index 1b2f6c445..6d90dfc3d 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Global_Min_Real.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Global_Min_Real.f90 @@ -14,12 +14,12 @@ subroutine Min_Real(Global, phi) Unused(Global) !==============================================================================! - call Mpi_Allreduce(phi, & ! send buffer - phi_new, & ! recv buffer - 1, & ! length - comm_type_real, & ! datatype - MPI_MIN, & ! operation - MPI_COMM_WORLD, & + call Mpi_Allreduce(phi, & ! send buffer + phi_new, & ! recv buffer + 1, & ! length + comm_type_real, & ! datatype + MPI_MIN, & ! operation + MPI_COMM_WORLD, & error) phi = phi_new diff --git a/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Real.f90 b/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Real.f90 index 01ef20167..7988be619 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Real.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Global_Sum_Real.f90 @@ -14,12 +14,12 @@ subroutine Sum_Real(Global, phi) Unused(Global) !==============================================================================! - call Mpi_Allreduce(phi, & ! send buffer - phi_new, & ! recv buffer - 1, & ! length - comm_type_real, & ! datatype - MPI_SUM, & ! operation - MPI_COMM_WORLD, & + call Mpi_Allreduce(phi, & ! send buffer + phi_new, & ! recv buffer + 1, & ! length + comm_type_real, & ! datatype + MPI_SUM, & ! operation + MPI_COMM_WORLD, & error) phi = phi_new diff --git a/Sources/Shared/Comm_Mod/Parallel/Open_File_Write.f90 b/Sources/Shared/Comm_Mod/Parallel/Open_File_Write.f90 index d0ed1717c..111faced5 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Open_File_Write.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Open_File_Write.f90 @@ -17,7 +17,7 @@ subroutine Open_File_Write(Comm, fh, file_name) ! Open file with MPI call Mpi_File_Open(MPI_COMM_WORLD, & file_name, & - MPI_MODE_WRONLY + MPI_MODE_CREATE, & + MPI_MODE_WRONLY + MPI_MODE_CREATE, & MPI_INFO_NULL, & fh, & error) diff --git a/Sources/Shared/Comm_Mod/Parallel/Recv_Real_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Recv_Real_Array.f90 index 3da8874aa..0a092cdbb 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Recv_Real_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Recv_Real_Array.f90 @@ -17,13 +17,13 @@ subroutine Recv_Real_Array(Comm, len_r, phi_r, dest) ! Form Receive tags rtag = (n_proc) * dest + this_proc ! tag for receiving - call Mpi_Recv(phi_r(1), & ! receive buffer - len_r, & ! receive length - comm_type_real, & ! datatype - (dest-1), & ! source, - rtag, & ! recvtag, - MPI_COMM_WORLD, & - status, & + call Mpi_Recv(phi_r(1), & ! receive buffer + len_r, & ! receive length + comm_type_real, & ! datatype + (dest-1), & ! source, + rtag, & ! recvtag, + MPI_COMM_WORLD, & + status, & error) end subroutine diff --git a/Sources/Shared/Comm_Mod/Parallel/Send_Real_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Send_Real_Array.f90 index ec1b21a0d..b2acfbfe2 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Send_Real_Array.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Send_Real_Array.f90 @@ -19,13 +19,13 @@ subroutine Send_Real_Array(Comm, len_s, phi_s, dest) ! Form send tag stag = (n_proc) * this_proc + dest ! tag for sending - call Mpi_Send(phi_s(1), & ! send buffer - len_s, & ! send length - comm_type_real, & ! datatype - (dest-1), & ! dest, - stag, & ! sendtag, - MPI_COMM_WORLD, & - status, & + call Mpi_Send(phi_s(1), & ! send buffer + len_s, & ! send length + comm_type_real, & ! datatype + (dest-1), & ! dest, + stag, & ! sendtag, + MPI_COMM_WORLD, & + status, & error) end subroutine From 0f0feb997082117eeb6948803c244b0cf0299231 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 26 Mar 2023 14:53:15 +0200 Subject: [PATCH 146/223] Updated Fortran syntax file a little bit. On branch bojan_more_robust_communicator modified: Documentation/fortran.vim --- Documentation/fortran.vim | 196 +++++++++++++++++++++++++++----------- 1 file changed, 138 insertions(+), 58 deletions(-) diff --git a/Documentation/fortran.vim b/Documentation/fortran.vim index fdc5ef2a5..70580f529 100644 --- a/Documentation/fortran.vim +++ b/Documentation/fortran.vim @@ -1,3 +1,60 @@ +"=====================================================================[T-Flows]= +" The idea here is as follows: +" +" Expand the existing fortran syntax file which comes with vim, with code +" contructs pertinent to T-Flow. Ideally, that should be followed by +" setting or selecting a colorsheme in vim, but defining a color scheme +" seems to be a daunting task. +" +" Rather, fine-tuning of colors in vim is don through .vimrc file, using +" the command highlight (typical format :highlight String ctermfg=Green) +" +" There is a CATCH with setting highlights in .vimrc, though: formatting +" elements in .vimrc should NOT be set in this file!!! (Not sure anymore) +" +" A sample snippet from .vimrc which worked well now follows: +" +" from .vimrc: "---------------------------------------------------------------- +" from .vimrc: " With the following commands, I am trying to tune color scheme +" from .vimrc: " +" from .vimrc: " Commands which might prove to be useful in the future +" from .vimrc: " +" from .vimrc: " Preprocessor directives +" from .vimrc: " :highlight PreProc ctermfg=Red +" from .vimrc: " +" from .vimrc: " Everything else: +" from .vimrc: " :highlight Normal ctermfg=Yellow +" from .vimrc: "---------------------------------------------------------------- +" from .vimrc: +" from .vimrc: " Keyords should be Fortran commands +" from .vimrc: highlight fortranKeyword ctermfg=Yellow +" from .vimrc: +" from .vimrc: " Ghost numbers are not desirable, mark them red +" from .vimrc: highlight fortranNumber ctermfg=Red +" from .vimrc: highlight fortranFloat ctermfg=Red +" from .vimrc: +" from .vimrc: " Constants are better than ghost numbers, mark them blue ... +" from .vimrc: " ... they are safer, they are in effect former ghost numbers +" from .vimrc: highlight fortranConstant ctermfg=Blue +" from .vimrc: +" from .vimrc: " Continuation lines. I like them visible and a bit psychedelic +" from .vimrc: highlight fortranContinueMark ctermfg=Magenta +" from .vimrc: +" from .vimrc: highlight fortranString ctermfg=Gray +" from .vimrc: +" from .vimrc: " Operators ... I don't know, maybe the same as keywords +" from .vimrc: highlight fortranOperator ctermfg=Yellow +" from .vimrc: +" from .vimrc: " Just Comment didn't work, fortranComment did +" from .vimrc: highlight fortranComment ctermfg=LightBlue +" from .vimrc: +" from .vimrc: " Try to over-ride Fortran objects in T-Flows +" from .vimrc: highlight fortranObjectTflows cterm=Bold ctermfg=Green +" from .vimrc: +" from .vimrc: " MPI calls in T-Flows - they are few and far in between, yet dangerous +" from .vimrc: highlight fortranMpiTflows ctermfg=Red +"---------------------------------------------------------------------[T-Flows]- + " Vim syntax file " Language: Fortran 2008 (and older: Fortran 2003, 95, 90, and 77) " Version: (v104) 2021 April 06 @@ -90,43 +147,43 @@ endif "---------------------------------------------------------------------[T-Flows]- if b:fortran_fixed_source == 1 - syn match fortranConstructName "^\s\{6,}\zs\a\w*\ze\s*:" + syn match fortranConstructName "^\s\{6,}\zs\a\w*\ze\s*:" else - syn match fortranConstructName "^\s*\zs\a\w*\ze\s*:" + syn match fortranConstructName "^\s*\zs\a\w*\ze\s*:" endif if exists("fortran_more_precise") - syn match fortranConstructName "\(\" -syn match fortranType "\" -syn match fortranType "\" -syn match fortranType "\" -syn match fortranType "\" -syn match fortranType "\" -syn keyword fortranType intrinsic -syn match fortranType "\" -syn keyword fortranStructure dimension -syn keyword fortranStorageClass parameter save -syn match fortranUnitHeader "\" +syn match fortranUnitHeader "\" +syn match fortranType "\" +syn match fortranType "\" +syn match fortranType "\" +syn match fortranType "\" +syn match fortranType "\" +syn keyword fortranType intrinsic +syn match fortranType "\" +syn keyword fortranStructure dimension +syn keyword fortranStorageClass parameter save +syn match fortranUnitHeader "\" "=====================================================================[T-Flows]= " Got rid of the special group for call ... " syn keyword fortranCall call "---------------------------------------------------------------------[T-Flows]- -syn match fortranUnitHeader "\" -syn match fortranUnitHeader "\" -syn match fortranUnitHeader "\" +syn match fortranUnitHeader "\" +syn match fortranUnitHeader "\" +syn match fortranUnitHeader "\" "=====================================================================[T-Flows]= " ... and added it (call) to the keywords " syn keyword fortranKeyword return stop syn keyword fortranKeyword return stop call "---------------------------------------------------------------------[T-Flows]- -syn keyword fortranConditional else then -syn match fortranConditional "\" -syn match fortranConditionalOb "\" +syn keyword fortranConditional else then +syn match fortranConditional "\" +syn match fortranConditionalOb "\" syn keyword fortranTodo contained todo fixme @@ -153,7 +210,8 @@ endif "=====================================================================[T-Flows]= " Removed name and file from the list below, too often used as variables "---------------------------------------------------------------------[T-Flows]- -syn keyword fortranIO access blank direct exist fmt form formatted iostat named nextrec number opened rec recl sequential status unformatted unit +syn keyword fortranIO access blank direct exist fmt form formatted iostat named +syn keyword fortranIO nextrec number opened rec recl sequential status unformatted unit syn keyword fortranIntrinsicR alog alog10 amax0 amax1 amin0 amin1 amod cabs ccos cexp clog csin csqrt dabs dacos dasin datan datan2 dcos dcosh ddim dexp dint dlog dlog10 dmax1 dmin1 dmod dnint dsign dsin dsinh dsqrt dtan dtanh float iabs idim idint idnint ifix isign max0 max1 min0 min1 sngl @@ -162,9 +220,12 @@ syn keyword fortranExtraIntrinsic algama cdabs cdcos cdexp cdlog cdsin cdsqrt cq syn keyword fortranKeyword abs acos aimag aint anint asin atan atan2 char cmplx conjg cos cosh exp syn keyword fortranKeyword ichar index int log log10 max min nint sign sin sinh sqrt tan tanh -syn match fortranIntrinsic "\" syn match fortranType "\" @@ -223,27 +284,27 @@ syn keyword fortranKeywordDel assign pause syn match fortranType "\" syn keyword fortranType none -syn keyword fortranStructure private public intent optional -syn keyword fortranStructure pointer target allocatable -syn keyword fortranStorageClass in out -syn match fortranStorageClass "\" -syn match fortranUnitHeader "\" -syn keyword fortranUnitHeader use only contains -syn keyword fortranUnitHeader result operator assignment -syn match fortranUnitHeader "\" -syn keyword fortranKeyword allocate deallocate nullify cycle exit -syn match fortranConditional "\" -syn keyword fortranConditional case default where elsewhere +syn match fortranUnitHeader "\" +syn match fortranUnitHeader "\" +syn keyword fortranUnitHeader use only contains +syn keyword fortranUnitHeader result operator assignment +syn match fortranUnitHeader "\" +syn keyword fortranKeyword allocate deallocate nullify cycle exit +syn match fortranConditional "\" +syn keyword fortranConditional case default where elsewhere -syn match fortranOperator "\(\(>\|<\)=\=\|==\|/=\|=\)" -syn match fortranOperator "=>" +syn match fortranOperator "\(\(>\|<\)=\=\|==\|/=\|=\)" +syn match fortranOperator "=>" -syn region fortranString start=+"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber -syn keyword fortranIO pad position action delim readwrite -syn keyword fortranIO eor advance nml +syn region fortranString start=+"+ end=+"+ contains=fortranLeftMargin,fortranContinueMark,fortranSerialNumber +syn keyword fortranIO pad position action delim readwrite +syn keyword fortranIO eor advance nml syn keyword fortranKeyword adjustl adjustr all allocated any associated bit_size btest syn keyword fortranKeyword ceiling count cshift date_and_time digits dot_product eoshift @@ -252,7 +313,12 @@ syn keyword fortranKeyword ieor ior ishft ishftc lbound len_trim matmul maxexp syn keyword fortranKeyword maxloc maxval merge minexponent minloc minval modulo mvbits syn keyword fortranKeyword nearest pack precision present product radix random_number syn keyword fortranKeyword random_seed range repeat reshape rrspacing -syn keyword fortranIntrinsic scale scan selected_int_kind selected_real_kind set_exponent shape size spacing spread sum system_clock tiny transpose trim ubound unpack verify +"=====================================================================[T-Flows]= +" Changed a few more functions from Intrinsic to Fortran keywords +"---------------------------------------------------------------------[T-Flows]- +syn keyword fortranKeyword scale scan selected_int_kind selected_real_kind set_exponent +syn keyword fortranKeyword shape size spacing spread sum system_clock tiny transpose +syn keyword fortranKeyword trim ubound unpack verify syn match fortranIntrinsic "\\(\s*\.\)\@!"me=s+3 syn match fortranIntrinsic "\\s*[(,]"me=s+4 @@ -279,18 +345,18 @@ syn keyword fortranIntrinsicR achar iachar transfer syn keyword fortranInclude include syn keyword fortranStorageClassR sequence -syn match fortranConditional "\" syn match fortranType "\" syn match fortranType "\" if exists("fortran_more_precise") - syn match fortranConstructName "\(\" + syn match fortranConstructName "\(\" endif if b:fortran_dialect == "f08" @@ -389,6 +455,19 @@ if b:fortran_dialect == "f08" syn keyword fortranObjectTflows A M vector b Sol Nat Pet Process "---------------------------------------------------------------------[T-Flows]- +"==============================================================[MPI in T-Flows]= +" Here are MPI calls from T-Flows +" Note that they are not set in this file at all, only in the .vimrc + syn match fortranMpiTflows "\" + syn keyword fortranMpiTflows Mpi_Barrier Mpi_Finalize Mpi_Sendrecv_Replace + syn keyword fortranMpiTflows Mpi_Allreduce Mpi_File_Close Mpi_File Mpi_File_Set_View + syn keyword fortranMpiTflows Mpi_Send Mpi_Sendrecv Mpi_Status Mpi_Recv Mpi_Write + syn keyword fortranMpiTflows Mpi_Type_Create_Indexed_Block Mpi_Type_Commit + syn keyword fortranMpiTflows Mpi_File_Open Mpi_File_Read + syn keyword fortranMpiTflows MPI_COMM_WORLD MPI_CHARACTER MPI_INFO_NULL MPI_STATUS_IGNORE MPI_IN_PLACE + syn keyword fortranMpiTflows MPI_LOR MPI_SUM MPI_MAX MPI_MIN MPI_MODE_WRONLY MPI_MODE_CREATE +"--------------------------------------------------------------[MPI in T-Flows]- + " CUDA fortran syn match fortranTypeCUDA "\" syn keyword fortranTypeCUDA host global device value @@ -602,6 +681,7 @@ endif hi def link fortranConstantTflows fortranConstant hi def link fortranTypeTflows fortranType hi def link fortranObjectTflows fortranIntrinsic +hi def link fortranMpiTflows fortranIntrinsic "---------------------------------------------------------------------[T-Flows]- " CUDA From c0354a27e0ba3be0649832868665ebabcb2fb2cb Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 26 Mar 2023 14:53:41 +0200 Subject: [PATCH 147/223] Ditched some unused files. On branch bojan_more_robust_communicator deleted: Sources/Shared/Comm_Mod/Parallel/Recv_Int_Array.f90 deleted: Sources/Shared/Comm_Mod/Parallel/Recv_Log_Array.f90 deleted: Sources/Shared/Comm_Mod/Parallel/Recv_Real_Array.f90 deleted: Sources/Shared/Comm_Mod/Parallel/Send_Int_Array.f90 deleted: Sources/Shared/Comm_Mod/Parallel/Send_Log_Array.f90 deleted: Sources/Shared/Comm_Mod/Parallel/Send_Real_Array.f90 deleted: Sources/Shared/Comm_Mod/Sequential/Recv_Int_Array.f90 deleted: Sources/Shared/Comm_Mod/Sequential/Recv_Log_Array.f90 deleted: Sources/Shared/Comm_Mod/Sequential/Recv_Real_Array.f90 deleted: Sources/Shared/Comm_Mod/Sequential/Send_Int_Array.f90 deleted: Sources/Shared/Comm_Mod/Sequential/Send_Log_Array.f90 deleted: Sources/Shared/Comm_Mod/Sequential/Send_Real_Array.f90 --- .../Comm_Mod/Parallel/Recv_Int_Array.f90 | 29 ----------------- .../Comm_Mod/Parallel/Recv_Log_Array.f90 | 29 ----------------- .../Comm_Mod/Parallel/Recv_Real_Array.f90 | 29 ----------------- .../Comm_Mod/Parallel/Send_Int_Array.f90 | 31 ------------------- .../Comm_Mod/Parallel/Send_Log_Array.f90 | 31 ------------------- .../Comm_Mod/Parallel/Send_Real_Array.f90 | 31 ------------------- .../Comm_Mod/Sequential/Recv_Int_Array.f90 | 19 ------------ .../Comm_Mod/Sequential/Recv_Log_Array.f90 | 19 ------------ .../Comm_Mod/Sequential/Recv_Real_Array.f90 | 19 ------------ .../Comm_Mod/Sequential/Send_Int_Array.f90 | 19 ------------ .../Comm_Mod/Sequential/Send_Log_Array.f90 | 19 ------------ .../Comm_Mod/Sequential/Send_Real_Array.f90 | 19 ------------ 12 files changed, 294 deletions(-) delete mode 100644 Sources/Shared/Comm_Mod/Parallel/Recv_Int_Array.f90 delete mode 100644 Sources/Shared/Comm_Mod/Parallel/Recv_Log_Array.f90 delete mode 100644 Sources/Shared/Comm_Mod/Parallel/Recv_Real_Array.f90 delete mode 100644 Sources/Shared/Comm_Mod/Parallel/Send_Int_Array.f90 delete mode 100644 Sources/Shared/Comm_Mod/Parallel/Send_Log_Array.f90 delete mode 100644 Sources/Shared/Comm_Mod/Parallel/Send_Real_Array.f90 delete mode 100644 Sources/Shared/Comm_Mod/Sequential/Recv_Int_Array.f90 delete mode 100644 Sources/Shared/Comm_Mod/Sequential/Recv_Log_Array.f90 delete mode 100644 Sources/Shared/Comm_Mod/Sequential/Recv_Real_Array.f90 delete mode 100644 Sources/Shared/Comm_Mod/Sequential/Send_Int_Array.f90 delete mode 100644 Sources/Shared/Comm_Mod/Sequential/Send_Log_Array.f90 delete mode 100644 Sources/Shared/Comm_Mod/Sequential/Send_Real_Array.f90 diff --git a/Sources/Shared/Comm_Mod/Parallel/Recv_Int_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Recv_Int_Array.f90 deleted file mode 100644 index a3ca2649b..000000000 --- a/Sources/Shared/Comm_Mod/Parallel/Recv_Int_Array.f90 +++ /dev/null @@ -1,29 +0,0 @@ -!==============================================================================! - subroutine Recv_Int_Array(Comm, len_r, phi_r, dest) -!------------------------------------------------------------------------------! -! Receives an integer array from processor dest. ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: len_r ! receive length - integer :: phi_r(len_r) ! receive buffer - integer :: dest ! destination processor -!-----------------------------------[Locals]-----------------------------------! - integer :: rtag, error - integer :: status(MPI_STATUS_SIZE) -!==============================================================================! - - ! Form Receive tags - rtag = (n_proc) * dest + this_proc ! tag for receiving - - call Mpi_Recv(phi_r(1), & ! receive buffer - len_r, & ! receive length - comm_type_int, & ! datatype - (dest-1), & ! source, - rtag, & ! recvtag, - MPI_COMM_WORLD, & - status, & - error) - - end subroutine diff --git a/Sources/Shared/Comm_Mod/Parallel/Recv_Log_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Recv_Log_Array.f90 deleted file mode 100644 index 667c11116..000000000 --- a/Sources/Shared/Comm_Mod/Parallel/Recv_Log_Array.f90 +++ /dev/null @@ -1,29 +0,0 @@ -!==============================================================================! - subroutine Recv_Log_Array(Comm, len_r, phi_r, dest) -!------------------------------------------------------------------------------! -! Receives a logical array from processor dest. ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: len_r ! receive length - logical :: phi_r(len_r) ! receive buffer - integer :: dest ! destination processor -!-----------------------------------[Locals]-----------------------------------! - integer :: rtag, error - integer :: status(MPI_STATUS_SIZE) -!==============================================================================! - - ! Form Receive tags - rtag = (n_proc) * dest + this_proc ! tag for receiving - - call Mpi_Recv(phi_r(1), & ! receive buffer - len_r, & ! receive length - comm_type_log, & ! datatype - (dest-1), & ! source, - rtag, & ! recvtag, - MPI_COMM_WORLD, & - status, & - error) - - end subroutine diff --git a/Sources/Shared/Comm_Mod/Parallel/Recv_Real_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Recv_Real_Array.f90 deleted file mode 100644 index 0a092cdbb..000000000 --- a/Sources/Shared/Comm_Mod/Parallel/Recv_Real_Array.f90 +++ /dev/null @@ -1,29 +0,0 @@ -!==============================================================================! - subroutine Recv_Real_Array(Comm, len_r, phi_r, dest) -!------------------------------------------------------------------------------! -! Receives a real array from processor dest. ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: len_r ! receive length - real :: phi_r(len_r) ! receive buffer - integer :: dest ! destination processor -!-----------------------------------[Locals]-----------------------------------! - integer :: rtag, error - integer :: status(MPI_STATUS_SIZE) -!==============================================================================! - - ! Form Receive tags - rtag = (n_proc) * dest + this_proc ! tag for receiving - - call Mpi_Recv(phi_r(1), & ! receive buffer - len_r, & ! receive length - comm_type_real, & ! datatype - (dest-1), & ! source, - rtag, & ! recvtag, - MPI_COMM_WORLD, & - status, & - error) - - end subroutine diff --git a/Sources/Shared/Comm_Mod/Parallel/Send_Int_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Send_Int_Array.f90 deleted file mode 100644 index c4edd55a2..000000000 --- a/Sources/Shared/Comm_Mod/Parallel/Send_Int_Array.f90 +++ /dev/null @@ -1,31 +0,0 @@ -!==============================================================================! - subroutine Send_Int_Array(Comm, len_s, phi_s, dest) -!------------------------------------------------------------------------------! -! Sends an integer array to processor dest. ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: len_s ! send length - integer :: phi_s(len_s) ! send buffer - integer :: dest ! destination processor -!-----------------------------------[Locals]-----------------------------------! - integer :: stag, error - integer :: status(MPI_STATUS_SIZE) -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Comm) -!==============================================================================! - - ! Form send tag - stag = (n_proc) * this_proc + dest ! tag for sending - - call Mpi_Send(phi_s(1), & ! send buffer - len_s, & ! send length - comm_type_int, & ! datatype - (dest-1), & ! dest, - stag, & ! sendtag, - MPI_COMM_WORLD, & - status, & - error) - - end subroutine diff --git a/Sources/Shared/Comm_Mod/Parallel/Send_Log_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Send_Log_Array.f90 deleted file mode 100644 index 2d29a9bef..000000000 --- a/Sources/Shared/Comm_Mod/Parallel/Send_Log_Array.f90 +++ /dev/null @@ -1,31 +0,0 @@ -!==============================================================================! - subroutine Send_Log_Array(Comm, len_s, phi_s, dest) -!------------------------------------------------------------------------------! -! Sends a logical array to processor dest. ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: len_s ! send length - logical :: phi_s(len_s) ! send buffer - integer :: dest ! destination processor -!-----------------------------------[Locals]-----------------------------------! - integer :: stag, error - integer :: status(MPI_STATUS_SIZE) -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Comm) -!==============================================================================! - - ! Form send tag - stag = (n_proc) * this_proc + dest ! tag for sending - - call Mpi_Send(phi_s(1), & ! send buffer - len_s, & ! send length - comm_type_log, & ! datatype - (dest-1), & ! dest, - stag, & ! sendtag, - MPI_COMM_WORLD, & - status, & - error) - - end subroutine diff --git a/Sources/Shared/Comm_Mod/Parallel/Send_Real_Array.f90 b/Sources/Shared/Comm_Mod/Parallel/Send_Real_Array.f90 deleted file mode 100644 index b2acfbfe2..000000000 --- a/Sources/Shared/Comm_Mod/Parallel/Send_Real_Array.f90 +++ /dev/null @@ -1,31 +0,0 @@ -!==============================================================================! - subroutine Send_Real_Array(Comm, len_s, phi_s, dest) -!------------------------------------------------------------------------------! -! Sends a real array to processor dest. ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: len_s ! send length - real :: phi_s(len_s) ! send buffer - integer :: dest ! destination processor -!-----------------------------------[Locals]-----------------------------------! - integer :: stag, error - integer :: status(MPI_STATUS_SIZE) -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Comm) -!==============================================================================! - - ! Form send tag - stag = (n_proc) * this_proc + dest ! tag for sending - - call Mpi_Send(phi_s(1), & ! send buffer - len_s, & ! send length - comm_type_real, & ! datatype - (dest-1), & ! dest, - stag, & ! sendtag, - MPI_COMM_WORLD, & - status, & - error) - - end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Recv_Int_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Recv_Int_Array.f90 deleted file mode 100644 index 2018968b3..000000000 --- a/Sources/Shared/Comm_Mod/Sequential/Recv_Int_Array.f90 +++ /dev/null @@ -1,19 +0,0 @@ -!==============================================================================! - subroutine Recv_Int_Array(Comm, len_r, phi_r, dest) -!------------------------------------------------------------------------------! -! Dummy function for sequential compilation. ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: len_r ! receive length - integer :: phi_r(len_r) ! receive buffer - integer :: dest ! destination processor -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Comm) - Unused(len_r) - Unused(phi_r) - Unused(dest) -!==============================================================================! - - end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Recv_Log_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Recv_Log_Array.f90 deleted file mode 100644 index 6ceaf2e6b..000000000 --- a/Sources/Shared/Comm_Mod/Sequential/Recv_Log_Array.f90 +++ /dev/null @@ -1,19 +0,0 @@ -!==============================================================================! - subroutine Recv_Log_Array(Comm, len_r, phi_r, dest) -!------------------------------------------------------------------------------! -! Dummy function for sequential compilation. ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: len_r ! receive length - logical :: phi_r(len_r) ! receive buffer - integer :: dest ! destination processor -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Comm) - Unused(len_r) - Unused(phi_r) - Unused(dest) -!==============================================================================! - - end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Recv_Real_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Recv_Real_Array.f90 deleted file mode 100644 index 019ffab51..000000000 --- a/Sources/Shared/Comm_Mod/Sequential/Recv_Real_Array.f90 +++ /dev/null @@ -1,19 +0,0 @@ -!==============================================================================! - subroutine Recv_Real_Array(Comm, len_r, phi_r, dest) -!------------------------------------------------------------------------------! -! Dummy function for sequential compilation. ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: len_r ! receive length - real :: phi_r(len_r) ! receive buffer - integer :: dest ! destination processor -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Comm) - Unused(len_r) - Unused(phi_r) - Unused(dest) -!==============================================================================! - - end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Send_Int_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Send_Int_Array.f90 deleted file mode 100644 index 2089e1adc..000000000 --- a/Sources/Shared/Comm_Mod/Sequential/Send_Int_Array.f90 +++ /dev/null @@ -1,19 +0,0 @@ -!==============================================================================! - subroutine Send_Int_Array(Comm, len_s, phi_s, dest) -!------------------------------------------------------------------------------! -! Dummy function for sequential compilation. ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: len_s ! send length - integer :: phi_s(len_s) ! send buffer - integer :: dest ! destination processor -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Comm) - Unused(len_s) - Unused(phi_s) - Unused(dest) -!==============================================================================! - - end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Send_Log_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Send_Log_Array.f90 deleted file mode 100644 index 4d18dd50c..000000000 --- a/Sources/Shared/Comm_Mod/Sequential/Send_Log_Array.f90 +++ /dev/null @@ -1,19 +0,0 @@ -!==============================================================================! - subroutine Send_Log_Array(Comm, len_s, phi_s, dest) -!------------------------------------------------------------------------------! -! Dummy function for sequential compilation. ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: len_s ! send length - logical :: phi_s(len_s) ! send buffer - integer :: dest ! destination processor -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Comm) - Unused(len_s) - Unused(phi_s) - Unused(dest) -!==============================================================================! - - end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Send_Real_Array.f90 b/Sources/Shared/Comm_Mod/Sequential/Send_Real_Array.f90 deleted file mode 100644 index 0c052ce75..000000000 --- a/Sources/Shared/Comm_Mod/Sequential/Send_Real_Array.f90 +++ /dev/null @@ -1,19 +0,0 @@ -!==============================================================================! - subroutine Send_Real_Array(Comm, len_s, phi_s, dest) -!------------------------------------------------------------------------------! -! Dummy function for sequential compilation. ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Comm_Type) :: Comm - integer :: len_s ! send length - real :: phi_s(len_s) ! send buffer - integer :: dest ! destination processor -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Comm) - Unused(len_s) - Unused(phi_s) - Unused(dest) -!==============================================================================! - - end subroutine From 55a7e5c94ceef568a829c6a09d4625f3d2f55b86 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 26 Mar 2023 20:17:05 +0200 Subject: [PATCH 148/223] Little updates. --- Documentation/fortran.vim | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Documentation/fortran.vim b/Documentation/fortran.vim index 70580f529..0b4bbbb39 100644 --- a/Documentation/fortran.vim +++ b/Documentation/fortran.vim @@ -437,6 +437,9 @@ if b:fortran_dialect == "f08" syn keyword fortranConstant SPALART_ALLMARAS RSM_HANJALIC_JAKIRLIC RSM_MANCEAU_HANJALIC syn keyword fortranConstant HYBRID_LES_RANS HYBRID_LES_PRANDTL STABILIZED SGDH GGDH AFM syn keyword fortranConstant SWITCH_DISTANCE SWITCH_VELOCITY +" Constants from Region_Mod + syn keyword fortranConstant INFLOW WALL WALLFL OUTFLOW SYMMETRY CONVECT PRESSURE + syn keyword fortranConstant INSIDE BUFFER PERIODIC_X PERIODIC_Y PERIODIC_Z UNDEFINED " After the constants, I have alternating definitions of types and objects derived from them syn keyword fortranTypeTflows Domain_Type Generate_Type Convert_Type Divide_Type Grid_Type syn keyword fortranObjectTflows Dom Generate Convert Divide Grid Prim Dual @@ -444,15 +447,17 @@ if b:fortran_dialect == "f08" syn keyword fortranObjectTflows Math Sort File String Work Line Tok syn keyword fortranTypeTflows Comm_Type Backup_Type Field_Type Turb_Type Vof_Type Swarm_Type syn keyword fortranObjectTflows Comm Global Backup Bac Flow Fld Turb Tur Vof Swarm Swr + syn keyword fortranTypeTflows Bulk_Type Face_Type + syn keyword fortranObjectTflows bulk v_flux syn keyword fortranObjectTflows This_Proc N_Procs First_Proc Sequential_Run Parallel_Run syn keyword fortranTypeTflows Front_Type Surf_Type Elem_Type Vert_Type Particle_Type syn keyword fortranObjectTflows Front Surf Elem Vert Part syn keyword fortranTypeTflows Monitor_Type Results_Type Porosity_Type Profiler_Type Message_Type syn keyword fortranObjectTflows Monitor Results Por Profiler Message syn keyword fortranTypeTflows Var_Type - syn keyword fortranObjectTflows u v w t kin eps zeta f22 uu vv ww uv vw uw ut vt wt t2 vis + syn keyword fortranObjectTflows u v w ui uj uk p t kin eps zeta f22 uu vv ww uv vw uw ut vt wt t2 vis syn keyword fortranTypeTflows Matrix_Type Vector_Type Solver_Type Native_Type Petsc_Type Process_Type - syn keyword fortranObjectTflows A M vector b Sol Nat Pet Process + syn keyword fortranObjectTflows A M vector x b Sol Nat Pet Process "---------------------------------------------------------------------[T-Flows]- "==============================================================[MPI in T-Flows]= From f312eb8bbd582f3661bc88bace62c663d03c7750 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 26 Mar 2023 21:42:28 +0200 Subject: [PATCH 149/223] Small cosmetic changes. On branch bojan_more_robust_communicator modified: Documentation/fortran.vim modified: Sources/Convert/Convert_Mod.f90 modified: Sources/Generate/Range_Mod.f90 modified: Sources/Generate/Smooths_Mod.f90 modified: Sources/Process/Front_Mod.f90 modified: Sources/Process/Results_Mod/Save_Vtu_Front.f90 modified: Sources/Process/Results_Mod/Save_Vtu_Surf.f90 modified: Sources/Process/Surf_Mod.f90 modified: Sources/Process/Surf_Mod/Check_Side.f90 modified: Sources/Process/Vof_Mod/Utilities/Mass_Transfer_Estimate.f90 --- Documentation/fortran.vim | 32 +++++++------ Sources/Convert/Convert_Mod.f90 | 1 + Sources/Generate/Range_Mod.f90 | 4 +- Sources/Generate/Smooths_Mod.f90 | 2 +- Sources/Process/Front_Mod.f90 | 2 +- .../Process/Results_Mod/Save_Vtu_Front.f90 | 22 ++++----- Sources/Process/Results_Mod/Save_Vtu_Surf.f90 | 48 +++++++++---------- Sources/Process/Surf_Mod.f90 | 30 ++++++------ Sources/Process/Surf_Mod/Check_Side.f90 | 16 +++---- .../Utilities/Mass_Transfer_Estimate.f90 | 12 ++--- 10 files changed, 86 insertions(+), 83 deletions(-) diff --git a/Documentation/fortran.vim b/Documentation/fortran.vim index 0b4bbbb39..7c364820b 100644 --- a/Documentation/fortran.vim +++ b/Documentation/fortran.vim @@ -441,23 +441,25 @@ if b:fortran_dialect == "f08" syn keyword fortranConstant INFLOW WALL WALLFL OUTFLOW SYMMETRY CONVECT PRESSURE syn keyword fortranConstant INSIDE BUFFER PERIODIC_X PERIODIC_Y PERIODIC_Z UNDEFINED " After the constants, I have alternating definitions of types and objects derived from them - syn keyword fortranTypeTflows Domain_Type Generate_Type Convert_Type Divide_Type Grid_Type - syn keyword fortranObjectTflows Dom Generate Convert Divide Grid Prim Dual - syn keyword fortranTypeTflows Math_Type Sort_Type File_Type String_Type Work_Type Tokenizer_Type - syn keyword fortranObjectTflows Math Sort File String Work Line Tok - syn keyword fortranTypeTflows Comm_Type Backup_Type Field_Type Turb_Type Vof_Type Swarm_Type - syn keyword fortranObjectTflows Comm Global Backup Bac Flow Fld Turb Tur Vof Swarm Swr - syn keyword fortranTypeTflows Bulk_Type Face_Type - syn keyword fortranObjectTflows bulk v_flux + syn keyword fortranTypeTflows Domain_Type Point_Type Block_Type Line_Type Range_Type + syn keyword fortranObjectTflows Dom points blocks lines ranges + syn keyword fortranTypeTflows Generate_Type Convert_Type Divide_Type Grid_Type + syn keyword fortranObjectTflows Generate Convert Divide Grid Prim Dual + syn keyword fortranTypeTflows Math_Type Sort_Type File_Type String_Type Work_Type Tokenizer_Type + syn keyword fortranObjectTflows Math Sort File String Work Line Tok + syn keyword fortranTypeTflows Comm_Type Backup_Type Field_Type Turb_Type Vof_Type Swarm_Type + syn keyword fortranObjectTflows Comm Global Backup Bac Flow Fld Turb Tur Vof Swarm Swr + syn keyword fortranTypeTflows Bulk_Type Face_Type + syn keyword fortranObjectTflows bulk v_flux syn keyword fortranObjectTflows This_Proc N_Procs First_Proc Sequential_Run Parallel_Run - syn keyword fortranTypeTflows Front_Type Surf_Type Elem_Type Vert_Type Particle_Type - syn keyword fortranObjectTflows Front Surf Elem Vert Part - syn keyword fortranTypeTflows Monitor_Type Results_Type Porosity_Type Profiler_Type Message_Type - syn keyword fortranObjectTflows Monitor Results Por Profiler Message + syn keyword fortranTypeTflows Front_Type Surf_Type Elem_Type Side_Type Vert_Type Particle_Type + syn keyword fortranObjectTflows Front Surf Elem side Vert Part + syn keyword fortranTypeTflows Monitor_Type Results_Type Porosity_Type Profiler_Type Message_Type + syn keyword fortranObjectTflows Monitor Results Por Profiler Message + syn keyword fortranTypeTflows Matrix_Type Vector_Type Solver_Type Native_Type Petsc_Type Process_Type + syn keyword fortranObjectTflows A M vector Sol Nat Pet Process syn keyword fortranTypeTflows Var_Type - syn keyword fortranObjectTflows u v w ui uj uk p t kin eps zeta f22 uu vv ww uv vw uw ut vt wt t2 vis - syn keyword fortranTypeTflows Matrix_Type Vector_Type Solver_Type Native_Type Petsc_Type Process_Type - syn keyword fortranObjectTflows A M vector x b Sol Nat Pet Process + syn keyword fortranObjectTflows u v w ui uj uk p t kin eps zeta f22 uu vv ww uv vw uw ut vt wt t2 vis "---------------------------------------------------------------------[T-Flows]- "==============================================================[MPI in T-Flows]= diff --git a/Sources/Convert/Convert_Mod.f90 b/Sources/Convert/Convert_Mod.f90 index de1c501bf..1ede22562 100644 --- a/Sources/Convert/Convert_Mod.f90 +++ b/Sources/Convert/Convert_Mod.f90 @@ -22,6 +22,7 @@ module Convert_Mod ! Convert type ! !------------------! type Convert_Type + contains procedure :: Allocate_Memory procedure :: Calculate_Geometry diff --git a/Sources/Generate/Range_Mod.f90 b/Sources/Generate/Range_Mod.f90 index fb78f243d..5ae7219a5 100644 --- a/Sources/Generate/Range_Mod.f90 +++ b/Sources/Generate/Range_Mod.f90 @@ -18,8 +18,8 @@ module Range_Mod ! Enclosing logical cooridnates integer :: is, ie ! start and end in "i" direction - integer :: js, je ! start and end in "i" direction - integer :: ks, ke ! start and end in "i" direction + integer :: js, je ! start and end in "j" direction + integer :: ks, ke ! start and end in "k" direction ! On which face is it ("IMIN", "IMAC", "JMIN", ... character(SL) :: face diff --git a/Sources/Generate/Smooths_Mod.f90 b/Sources/Generate/Smooths_Mod.f90 index c2961ebec..90f9b03d7 100644 --- a/Sources/Generate/Smooths_Mod.f90 +++ b/Sources/Generate/Smooths_Mod.f90 @@ -14,7 +14,7 @@ module Smooths_Mod !-----------------! type Smooths_Type - integer :: n_smooths ! number of smoothing regions + integer :: n_smooths ! number of smoothing regions integer, allocatable :: iters(:) logical, allocatable :: in_x (:), in_y (:), in_z (:) diff --git a/Sources/Process/Front_Mod.f90 b/Sources/Process/Front_Mod.f90 index 23097762b..70f3a2531 100644 --- a/Sources/Process/Front_Mod.f90 +++ b/Sources/Process/Front_Mod.f90 @@ -28,7 +28,7 @@ module Front_Mod integer :: n_verts integer :: n_sides type(Vert_Type), allocatable :: Vert(:) - type(Elem_Type), allocatable :: elem(:) + type(Elem_Type), allocatable :: Elem(:) type(Side_Type), allocatable :: side(:) ! Bounding nodes for each vertex (derives from Isoap usage) diff --git a/Sources/Process/Results_Mod/Save_Vtu_Front.f90 b/Sources/Process/Results_Mod/Save_Vtu_Front.f90 index 984b81ae9..3b79fc0a3 100644 --- a/Sources/Process/Results_Mod/Save_Vtu_Front.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Front.f90 @@ -169,7 +169,7 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) ' format="ascii">' ! Cell topology do e = 1, Front % n_elems - write(f9,'(a,99i9)') IN_5, Front % elem(e) % v(1:Front % elem(e) % nv)-1 + write(f9,'(a,99i9)') IN_5, Front % Elem(e) % v(1:Front % Elem(e) % nv)-1 end do write(f9,'(a,a)') IN_4, '' @@ -182,7 +182,7 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) ' format="ascii">' offset = 0 do e = 1, Front % n_elems - offset = offset + Front % elem(e) % nv + offset = offset + Front % Elem(e) % nv write(f9,'(a,i9)') IN_5, offset end do write(f9,'(a,a)') IN_4, '' @@ -226,7 +226,7 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) write(f9,'(a,a)') IN_4, '' do e = 1, Front % n_elems - write(f9,'(a,i9)') IN_5, Front % elem(e) % nne + write(f9,'(a,i9)') IN_5, Front % Elem(e) % nne end do write(f9,'(a,a)') IN_4, '' @@ -243,9 +243,9 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) ' NumberOfComponents="3" format="ascii">' do e = 1, Front % n_elems write(f9, '(a,1pe16.6e4,1pe16.6e4,1pe16.6e4)') & - IN_5, Front % elem(e) % nx, & - Front % elem(e) % ny, & - Front % elem(e) % nz + IN_5, Front % Elem(e) % nx, & + Front % Elem(e) % ny, & + Front % Elem(e) % nz end do write(f9,'(a,a)') IN_4, '' @@ -261,7 +261,7 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) '' do e = 1, Front % n_elems - write(f9,'(a,1pe16.6e4)') IN_5, Front % elem(e) % area + write(f9,'(a,1pe16.6e4)') IN_5, Front % Elem(e) % area end do write(f9,'(a,a)') IN_4, '' @@ -279,9 +279,9 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) ' NumberOfComponents="3" format="ascii">' do e = 1, Front % n_elems write(f9, '(a,1pe16.6e4,1pe16.6e4,1pe16.6e4)') & - IN_5, Front % elem(e) % xe, & - Front % elem(e) % ye, & - Front % elem(e) % ze + IN_5, Front % Elem(e) % xe, & + Front % Elem(e) % ye, & + Front % Elem(e) % ze end do write(f9,'(a,a)') IN_4, '' @@ -297,7 +297,7 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) '' do e = 1, Front % n_elems - write(f9,'(a,1pe16.6e4)') IN_5, Front % elem(e) % curv + write(f9,'(a,1pe16.6e4)') IN_5, Front % Elem(e) % curv end do write(f9,'(a,a)') IN_4, '' diff --git a/Sources/Process/Results_Mod/Save_Vtu_Surf.f90 b/Sources/Process/Results_Mod/Save_Vtu_Surf.f90 index 6c4ad4101..7897dc815 100644 --- a/Sources/Process/Results_Mod/Save_Vtu_Surf.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Surf.f90 @@ -1,12 +1,12 @@ !==============================================================================! - subroutine Save_Vtu_Surf(Results, surf, time_step) + subroutine Save_Vtu_Surf(Results, Surf, time_step) !------------------------------------------------------------------------------! ! Writes surface vertices in VTU file format (for VisIt and Paraview) ! !------------------------------------------------------------------------------! implicit none !--------------------------------[Arguments]-----------------------------------! class(Results_Type) :: Results - type(Surf_Type), target :: surf + type(Surf_Type), target :: Surf integer :: time_step !----------------------------------[Locals]------------------------------------! type(Vert_Type), pointer :: Vert @@ -28,7 +28,7 @@ subroutine Save_Vtu_Surf(Results, surf, time_step) ! Set precision for plotting (intp and floatp variables) call Vtk_Mod_Set_Precision() - if(surf % n_verts < 1) return + if(Surf % n_verts < 1) return !---------------------------! ! ! @@ -56,8 +56,8 @@ subroutine Save_Vtu_Surf(Results, surf, time_step) write(fu,'(a,a)') IN_1, '' write(fu,'(a,a,i0.0,a,i0.0,a)') & - IN_2, '' + IN_2, '' !------------------------! ! ! @@ -68,8 +68,8 @@ subroutine Save_Vtu_Surf(Results, surf, time_step) write(fu,'(a,a)') IN_4, '' - do v = 1, surf % n_verts - Vert => surf % Vert(v) + do v = 1, Surf % n_verts + Vert => Surf % Vert(v) write(fu, '(a,1pe16.6e4,1pe16.6e4,1pe16.6e4)') & IN_5, Vert % x_n, Vert % y_n, Vert % z_n end do @@ -89,7 +89,7 @@ subroutine Save_Vtu_Surf(Results, surf, time_step) write(fu,'(a,a)') IN_4, '' - do v = 1, surf % n_verts + do v = 1, Surf % n_verts write(fu,'(a,i9)') IN_5, v end do write(fu,'(a,a)') IN_4, '' @@ -100,8 +100,8 @@ subroutine Save_Vtu_Surf(Results, surf, time_step) write(fu,'(a,a)') IN_4, '' - do v = 1, surf % n_verts - write(fu,'(a,i9)') IN_5, surf % Vert(v) % nne + do v = 1, Surf % n_verts + write(fu,'(a,i9)') IN_5, Surf % Vert(v) % nne end do write(fu,'(a,a)') IN_4, '' @@ -111,8 +111,8 @@ subroutine Save_Vtu_Surf(Results, surf, time_step) write(fu,'(a,a)') IN_4, '' - do v = 1, surf % n_verts - Vert => surf % Vert(v) + do v = 1, Surf % n_verts + Vert => Surf % Vert(v) write(fu,'(a,1pe16.6e4)') IN_5, Vert % curv end do write(fu,'(a,a)') IN_4, '' @@ -129,12 +129,12 @@ subroutine Save_Vtu_Surf(Results, surf, time_step) ' Name="connectivity"' // & ' format="ascii">' ! Cell topology - do e = 1, surf % n_elems + do e = 1, Surf % n_elems write(fu,'(a,3i9)') & IN_5, & - surf % elem(e) % v(1)-1, & - surf % elem(e) % v(2)-1, & - surf % elem(e) % v(3)-1 + Surf % Elem(e) % v(1)-1, & + Surf % Elem(e) % v(2)-1, & + Surf % Elem(e) % v(3)-1 end do ! Cell offsets @@ -142,7 +142,7 @@ subroutine Save_Vtu_Surf(Results, surf, time_step) write(fu,'(a,a)') IN_4, '' offset = 0 - do e = 1, surf % n_elems + do e = 1, Surf % n_elems offset = offset + 3 write(fu,'(a,i9)') IN_5, offset end do @@ -151,7 +151,7 @@ subroutine Save_Vtu_Surf(Results, surf, time_step) write(fu,'(a,a)') IN_4, '' write(fu,'(a,a)') IN_4, '' - do e = 1, surf % n_elems + do e = 1, Surf % n_elems write(fu,'(a,i9)') IN_5, VTK_TRIANGLE end do write(fu,'(a,a)') IN_4, '' @@ -172,8 +172,8 @@ subroutine Save_Vtu_Surf(Results, surf, time_step) write(fu,'(a,a)') IN_4, '' - do e = 1, surf % n_elems - write(fu,'(a,i9)') IN_5, surf % elem(e) % nne + do e = 1, Surf % n_elems + write(fu,'(a,i9)') IN_5, Surf % Elem(e) % nne end do write(fu,'(a,a)') IN_4, '' @@ -183,9 +183,9 @@ subroutine Save_Vtu_Surf(Results, surf, time_step) write(fu,'(4a)') IN_4, & '' - do e = 1, surf % n_elems + do e = 1, Surf % n_elems write(fu,'(a,1pe16.6e4,1pe16.6e4,1pe16.6e4)') & - IN_5, surf % elem(e) % nx, surf % elem(e) % ny, surf % elem(e) % nz + IN_5, Surf % Elem(e) % nx, Surf % Elem(e) % ny, Surf % Elem(e) % nz end do write(fu,'(a,a)') IN_4, '' @@ -195,8 +195,8 @@ subroutine Save_Vtu_Surf(Results, surf, time_step) write(fu,'(4a)') IN_4, & '' - do e = 1, surf % n_elems - write(fu,'(a,1pe16.6e4)') IN_5, surf % elem(e) % curv + do e = 1, Surf % n_elems + write(fu,'(a,1pe16.6e4)') IN_5, Surf % Elem(e) % curv end do write(fu,'(a,a)') IN_4, '' diff --git a/Sources/Process/Surf_Mod.f90 b/Sources/Process/Surf_Mod.f90 index 24e4d6003..7e1a2d826 100644 --- a/Sources/Process/Surf_Mod.f90 +++ b/Sources/Process/Surf_Mod.f90 @@ -23,21 +23,21 @@ module Surf_Mod contains - procedure :: Advance_Vertices - procedure :: Allocate_Surf - procedure :: Calculate_Curvatures_From_Edges - procedure :: Calculate_Curvatures_From_Elems - procedure :: Calculate_Curvatures_From_Verts - procedure :: Compress_Surf_Vertices - procedure :: Find_Boundaries - procedure :: Find_Surf_Elements - procedure :: Handle_3_Points - procedure :: Handle_4_Points - procedure :: Handle_5_Points - procedure :: Handle_6_Points - procedure :: Improve_Mesh_Quality - procedure :: Initialize_Surf - procedure :: Place_Surf_At_Value + procedure :: Advance_Vertices + procedure :: Allocate_Surf + procedure :: Calculate_Curvatures_From_Edges + procedure :: Calculate_Curvatures_From_Elems + procedure :: Calculate_Curvatures_From_Verts + procedure :: Compress_Surf_Vertices + procedure :: Find_Boundaries + procedure :: Find_Surf_Elements + procedure :: Handle_3_Points + procedure :: Handle_4_Points + procedure :: Handle_5_Points + procedure :: Handle_6_Points + procedure :: Improve_Mesh_Quality + procedure :: Initialize_Surf + procedure :: Place_Surf_At_Value procedure, private :: Distribute_Mesh procedure, private :: Distribute_Smooth procedure, private :: Distribute_Cell_Coords diff --git a/Sources/Process/Surf_Mod/Check_Side.f90 b/Sources/Process/Surf_Mod/Check_Side.f90 index 8a862ff34..f865ce0b0 100644 --- a/Sources/Process/Surf_Mod/Check_Side.f90 +++ b/Sources/Process/Surf_Mod/Check_Side.f90 @@ -10,26 +10,26 @@ subroutine Check_Side(Surf, s) integer :: s !-----------------------------------[Locals]-----------------------------------! type(Side_Type), pointer :: side - type(Elem_Type), pointer :: elem(:) + type(Elem_Type), pointer :: Elem(:) integer :: a, b, c, d integer :: i_a, j_a, k_a, i_b, j_b, k_b, sum_a, sum_b !==============================================================================! side => Surf % side(s) - elem => Surf % elem + Elem => Surf % Elem a = side % a b = side % b c = side % c d = side % d - i_a = elem(side % ea) % v(1) - j_a = elem(side % ea) % v(2) - k_a = elem(side % ea) % v(3) + i_a = Elem(side % ea) % v(1) + j_a = Elem(side % ea) % v(2) + k_a = Elem(side % ea) % v(3) - i_b = elem(side % eb) % v(1) - j_b = elem(side % eb) % v(2) - k_b = elem(side % eb) % v(3) + i_b = Elem(side % eb) % v(1) + j_b = Elem(side % eb) % v(2) + k_b = Elem(side % eb) % v(3) sum_a = i_a + j_a + k_a - c - d - a sum_b = i_b + j_b + k_b - c - d - b diff --git a/Sources/Process/Vof_Mod/Utilities/Mass_Transfer_Estimate.f90 b/Sources/Process/Vof_Mod/Utilities/Mass_Transfer_Estimate.f90 index 22258b0a9..e59779242 100644 --- a/Sources/Process/Vof_Mod/Utilities/Mass_Transfer_Estimate.f90 +++ b/Sources/Process/Vof_Mod/Utilities/Mass_Transfer_Estimate.f90 @@ -72,14 +72,14 @@ subroutine Mass_Transfer_Estimate(Vof) ! be adjusted accordingly. ! Units: W/(mK) * K/m * m^2 = W Vof % q_int(1,s) = Vof % q_int(1,s) & - + cond_1 * ( t % x(c1) * Vof % Front % elem(e) % sx & - + t % y(c1) * Vof % Front % elem(e) % sy & - + t % z(c1) * Vof % Front % elem(e) % sz) + + cond_1 * ( t % x(c1) * Vof % Front % Elem(e) % sx & + + t % y(c1) * Vof % Front % Elem(e) % sy & + + t % z(c1) * Vof % Front % Elem(e) % sz) Vof % q_int(2,s) = Vof % q_int(2,s) & - + cond_2 * ( t % x(c2) * Vof % Front % elem(e) % sx & - + t % y(c2) * Vof % Front % elem(e) % sy & - + t % z(c2) * Vof % Front % elem(e) % sz) + + cond_2 * ( t % x(c2) * Vof % Front % Elem(e) % sx & + + t % y(c2) * Vof % Front % Elem(e) % sy & + + t % z(c2) * Vof % Front % Elem(e) % sz) end if ! e .ne. 0 end do ! i_ele From d133cb9760be2fd711f98363c124bdf482c3dd91 Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 27 Mar 2023 06:23:37 +0200 Subject: [PATCH 150/223] Little updates On branch bojan_more_robust_communicator modified: Documentation/fortran.vim --- Documentation/fortran.vim | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Documentation/fortran.vim b/Documentation/fortran.vim index 7c364820b..82d2932e7 100644 --- a/Documentation/fortran.vim +++ b/Documentation/fortran.vim @@ -405,16 +405,16 @@ if b:fortran_dialect == "f08" syn match fortranOperator "\([\|]\)" " F2008 - syn keyword fortranIntrinsic acosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2 - syn keyword fortranIntrinsic atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits - syn keyword fortranIntrinsic bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image + syn keyword fortranKeyword acosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn + syn keyword fortranKeyword erf erfc erfc_scaled gamma log_gamma hypot norm2 + syn keyword fortranKeyword atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits + syn keyword fortranKeyword bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image syn keyword fortranIO newunit syn keyword fortranType contiguous syn keyword fortranRepeat concurrent "=====================================================================[T-Flows]= " T-Flows specific - syn match fortranTypeTflows "\" " Start with constants from Const_Mod: syn keyword fortranConstant PROGRAM_NAME syn keyword fortranConstant VL SL DL MSI DP SP IP LP RP @@ -456,16 +456,17 @@ if b:fortran_dialect == "f08" syn keyword fortranObjectTflows Front Surf Elem side Vert Part syn keyword fortranTypeTflows Monitor_Type Results_Type Porosity_Type Profiler_Type Message_Type syn keyword fortranObjectTflows Monitor Results Por Profiler Message - syn keyword fortranTypeTflows Matrix_Type Vector_Type Solver_Type Native_Type Petsc_Type Process_Type - syn keyword fortranObjectTflows A M vector Sol Nat Pet Process + syn keyword fortranTypeTflows Matrix_Type Vector_Type Solver_Type Native_Type Petsc_Type Process_Type + syn keyword fortranObjectTflows A M vector Sol Nat Pet Process syn keyword fortranTypeTflows Var_Type syn keyword fortranObjectTflows u v w ui uj uk p t kin eps zeta f22 uu vv ww uv vw uw ut vt wt t2 vis +" Finally, a few global functions which I don't really like in the code + syn keyword fortranGlobalTflows Adjust_Dim Adjust_First_Dim Swap_Int Swap_Real "---------------------------------------------------------------------[T-Flows]- "==============================================================[MPI in T-Flows]= " Here are MPI calls from T-Flows " Note that they are not set in this file at all, only in the .vimrc - syn match fortranMpiTflows "\" syn keyword fortranMpiTflows Mpi_Barrier Mpi_Finalize Mpi_Sendrecv_Replace syn keyword fortranMpiTflows Mpi_Allreduce Mpi_File_Close Mpi_File Mpi_File_Set_View syn keyword fortranMpiTflows Mpi_Send Mpi_Sendrecv Mpi_Status Mpi_Recv Mpi_Write @@ -476,7 +477,6 @@ if b:fortran_dialect == "f08" "--------------------------------------------------------------[MPI in T-Flows]- " CUDA fortran - syn match fortranTypeCUDA "\" syn keyword fortranTypeCUDA host global device value syn keyword fortranTypeCUDA shared constant pinned texture syn keyword fortranTypeCUDA dim1 dim2 dim3 dim4 @@ -689,6 +689,7 @@ hi def link fortranConstantTflows fortranConstant hi def link fortranTypeTflows fortranType hi def link fortranObjectTflows fortranIntrinsic hi def link fortranMpiTflows fortranIntrinsic +hi def link fortranGlobalTflows Todo "---------------------------------------------------------------------[T-Flows]- " CUDA From 8ec20fde232cabcec6ccc6d736994304e1b3c2f6 Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 27 Mar 2023 10:23:42 +0200 Subject: [PATCH 151/223] Added some files for the laminar heat exchanger On branch bojan_more_robust_communicator new file: divide.1.scr new file: divide.2.scr new file: lower_dom.msh.gz new file: upper_dom.msh.gz --- .../Heat_Exchanger/2_Domains/divide.1.scr | 3 +++ .../Heat_Exchanger/2_Domains/divide.2.scr | 3 +++ .../Heat_Exchanger/2_Domains/lower_dom.msh.gz | Bin 0 -> 1449560 bytes .../Heat_Exchanger/2_Domains/upper_dom.msh.gz | Bin 0 -> 745089 bytes 4 files changed, 6 insertions(+) create mode 100644 Tests/Laminar/Heat_Exchanger/2_Domains/divide.1.scr create mode 100644 Tests/Laminar/Heat_Exchanger/2_Domains/divide.2.scr create mode 100644 Tests/Laminar/Heat_Exchanger/2_Domains/lower_dom.msh.gz create mode 100644 Tests/Laminar/Heat_Exchanger/2_Domains/upper_dom.msh.gz diff --git a/Tests/Laminar/Heat_Exchanger/2_Domains/divide.1.scr b/Tests/Laminar/Heat_Exchanger/2_Domains/divide.1.scr new file mode 100644 index 000000000..97b642a66 --- /dev/null +++ b/Tests/Laminar/Heat_Exchanger/2_Domains/divide.1.scr @@ -0,0 +1,3 @@ +lower_dom +4 + diff --git a/Tests/Laminar/Heat_Exchanger/2_Domains/divide.2.scr b/Tests/Laminar/Heat_Exchanger/2_Domains/divide.2.scr new file mode 100644 index 000000000..eed136899 --- /dev/null +++ b/Tests/Laminar/Heat_Exchanger/2_Domains/divide.2.scr @@ -0,0 +1,3 @@ +upper_dom +4 + diff --git a/Tests/Laminar/Heat_Exchanger/2_Domains/lower_dom.msh.gz b/Tests/Laminar/Heat_Exchanger/2_Domains/lower_dom.msh.gz new file mode 100644 index 0000000000000000000000000000000000000000..47adaa169345041550e143bb56bb5ab7c462370a GIT binary patch literal 1449560 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 z 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≺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

i)bN3OiT9hf#4En&xA2}Cc&0Zx(&0ZQ6(4Ya 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 z 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%0AY^{FOz6C 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

2)Gk)Z))!< zDST27-aCA2^bouNjR}?ct=MFwCj%pvksd$Z3 z0dYNkMO6Cz*q^Z|-y!q|MB$@x$V!+y+Eyu_QoK$jb(H!Zlqk1#jS3u%vzw3;AX;fp zsRC`oaC`4~v``g)xi?>gVbe$ES;*x=&kXQY0I1O{gHKkWJj-&_Ohl9R;Pijo(EOX^ z@j6q{!~$=L?2bct1*~3SgMRRh!X-^L$YYVsbjmJ&Edv_XHT&?UJDZ39Hh66-cYnXg+37N)%+oc$ZZzE`I z|6(N6^o?APiyY6$*3l;?rT+z4=Ji(cy`>dwMKK=3RZHK6idMFgYjB~#WDR)1W4NKx z6J5HdxN+!1Uy<}|mHVU_4k2Dw|0l(?M?>xTghS_Y9sp)si=I!OZK zP?v(gn|CUW#_(~rR(#$+?%T}#P|^Bt_((n)%izOmf(OYW@S!Dlqil!H#EZa)gM+*F zt8ZLMoOgT4saZtCI{u#^Vrv?#EmRd5O^{sfbou;#{2I-F#nb58;?7&ExHeMD(0TP- z`i_JX0-{h(MZZV*q-1oASL<=hk}3m~O{YZ;SD4m;t!I-n&C7eh9F`)Z2p`fGp5P5+ zgaTk|KXQ7RG>oA$2zJ8Y1GYYsf^AJ2mmoP8UF6V&niIuhN=Y%aJE{la=U9m$sk75X&k&g;o1np!ae>hLx^8U#S@_#k=^fTl4;R7lhp_8fkp}%V?0Kog}&e)(qzGvcgPc;JuIVFci12EV_O8iIc8#QuJf;6T1Vk8hGt>>ST6)B}701Bq8S>lV( zgZF0Ep=fSd)#~WkWaG!O`nO=^Nl|KhgTD zE!0+t4|c?N*?9;nMBThg;2ID_U-M1} z9kJGHYPBVk%VDuonA?14+!QnXi+{AN=VML%c%y3VcdEh*U$~7zz5uJp8gdmk0Gf=> z^VT(Fy9Gc2+DIn8LmLf1-~k>Hc%YNq>rFh+LN4|u9^hjaWt(}N>`8cfPiJO$P9s}B z?cdhfxp(|aLG{OsWcWEO+qIzl_v?W6a}hk^THqPUp0$mcnoU+BaDnGHCF{e>E5-a< zHK6x+QF~8cl>`}yoyi1BKQ0kguxzoX#~A26H4o^4WKZq0`aB#Rz!c=i-I6nJ^oX4x zqU`h$9tmVPCaexnBpflYep(I94++D#01-z_U85e^D};b1J*b8cGoS@#265+kd}QFG zKUK7+c0=Uni}XCQ1br&*&Lmm@C~Z7&n<-X$#LdsBu8|li-Z!>(_2|d#(;_$dc@i%! zCzE+t6o7W{-zfUDH42(z47rg|uXA1@_;?YyHSiRKA0Ll*P&HkG@qwyYJ85>mESkS8 zQ#a@`(0%`K`A5m^_KVliLjC!yYx==`atZ(?b)6%JMFf}^#mf}6rCAltBll{T0)VWI zff<7y_NN{UGEn&74ZiiI9Y&I8EDh@WpmCSJDrIRVcvzC1n^RS%zgH!q&p)DO;R!RE z&Ftu)4xCZ*9s-kVMNZV0D2+>|wnAaITy6|m4*)6Eew|*=NtOqY)(dAMG(oKms)uEI zk!@S3y6=`%=(C5Yx#_`pg4C-dQlMKPDdaPuao|X-9{FM^vIJ5Oe+klYL>%)r?T8$XHvKr%?&94(pM@*}P-xf5qFTr~Qe;n=7<1s{*wxLOFwBOhUm+r;=j z>T10`$!>V6@GWh15%oz*AljUUEQ5xGMWL^rIcbQ$z|-~_Q~lQ_RCF>`**NSYKXsc) z-Ul#T4GhUeh!mL@(GUc$0zcqQ*wX8wzE{COB$eZ-!pxULYvB{FXq5p3C-_EDpQEHW zkneLst*%ud_n-@6Q9V{AwAjBll|{!zx_c&nTgX1u;jsrD1rIYCYTPO2pE7Ulz)D?6 z{YJt6q%q%3lk4qUNQD|-S@>&+hhiLwF3Y|q1Ro$J_AwR78kPvn1r3a)kwbkaTDB#V zjE_lIx)2BAjpaJG9v;4vfTKNNaKW}H<1r=Y0b`q)ue?(bE}J0TA?+@CFkg z-elPY?1p%g#1AlmN_KP*N%R2|AXO8Hs)R!&*AY-ZXPo?jEIQE=T1O1mD^NyxWs*GB zoa>ccu5BLV1D(d;^p`_@#^#&9S0R?G?eH-ae^nfJaAZ>G^gFbQ< zly35p-ZmTq8fqNcSPj$>P*o0Vz;{A%EDDm3t}A*#a;}gtBP+VcpcjvEd+;X4$v5#W z&`432MK-i>qP`@H+HVLOxr8p##UGLtTO$;YI1X5i4T6K#o0}^*tV*_i>%5=7-*vcA zl)bTNtn}q}x2;@I0cU5z4ga0EN6)wru(q=jIt|u!xz4waZFCRb2u);Y5{)PqcYbbq z9S!Xjt(R-nYy5l7nue?d-P1Nx9_B&XTsxaG0-$f zYT&7Qzwg~p*g^{7^u@Kf&EO-vjB?3iY}TnH)Ppg&6bW{@xfN00KW>Lz(`V06Yr!I6 zM|JInXS#_LDz(k_&9tRIVc-b|H<~_mdqw4D;JF9>-4YEqnqn!NG<$UJppJ~H^&T{U zgAu#QxxFQAvsDX|cw{@^oJb8G&PqWboD*p!hy9=yX8i9>SIZdHLWVZr2b;im$dMeV z(D45z5y}>Rx-K%xHhdSx63?9jd%`*rn}Q&jsN;JOoOoI88yReun~r13CFXM!6{1}5 zHK?UA+JAuqYlo*{##GqS^6ainAj-cCf||NqwKht1Qu{D1w~=@nj8oq>|W zD(>O4GaFG3Sb`ruE>w!L$t(oPahpa+8cPx;M{1s;gsvgvgwDlIt2_{g|sSI4nb)d+Ej6?>xtQ5@ipC|x}@`SS!c*6g`6!5%md@h~=sZxclw4BtR~PI*f={hN*O)7$9*NVZe(`+2c{=z1|5wjw zQw-{Ybw-ziHNw?Udk%CY_M-8>Y^`4aOCpS^V#u7AhmR#+Hi2}lzu`G~|6vLtkW0tm zDJ>xV6vO0Pl7Wa_8cs40FQQDZQ6vKqpbJ`uA_*{&e>R(u$PTxMD7*p*NH8eyvKmft z1Ta0y8WqN6v~#xIKPO-$atWX1z0W{G6iD%Awo<4ue zbHy6Gs|N5iik*>lV=$>|* z#y`jjn8u+7aqu+|qtK0gQV4$+s1y2m5tZ&ARlC?9N^Z{legO^jRUpDHL!;;{lNx{^s3 zcESIT0<@S+no`jgw3eLr~2Ei?W^pY1vWRwZI4=sY?m0r=x z_hbBPz8@}6ct5(l`}lrH*8qmS#JS?7iN|V#?QX=7NX}@BEThn!+#2lq5e`jrw&GmO zjU!rfn^P%@!aB(2`dE*ZtlyiVmf@_0r=S;6@(vK-xeH3j0|K-U4~-DAyfSDIgJdpu zd^0lC7E%C*ucJCI5WC6Y^D(#pBv4Ho(!yTgJCmX3L-rTwit?xH9!aP%86L?+P^Cw_SmEl~nb;a7Z1-$tCq^$}mI3V;s@ zVK4Bls&SW5E|BJ4tjuzhB;+hW%z(0oI0D2BD6NRyk57Q$H?-g14!I({0TqHMuNI1_9UP6-vn+5f2xr^60gm2~Hd8-3^*G`F7Q z1;^5vU@)eG4F{9;DeOwm*Q7t^akECazOKIjtU|4OO^nl&Tab0Q4~&;a0*)+CB8<%!3wffkRN zOd>5FC4SQ4+vWJg|6U=v%^#>b;@-w5gq^?>;^@vNq%euECY%ahP1G{@YQnPM)#Tq1 z0!xh_?sJvASfob+lr7Zu6cB8XyU z@QdPH;1gA-$|uU+onI7tA)lxyTRu_nohUw0tmA*RC_NGrA}hh}wJ8QZWD0xtj!1m} z57kyCaq#-STh`30Ir!oLpS3Q^4FC}9v7ehRV=zVS0oGBL<0DAKv5B=L^uq1NGK<7s z&;XL2zz4t4mJx0Y$-d<33)0qlNeoCDP4`Qpl+gfiaYqIn1%eZrcHwA`654{pJ>q;? zC~{Bq5?UyeoRsNbx1yoUL z;{cg5gI>5_3OSKzs`<#1H96EUxDn$YAp*}H#sdrKxJ^N1$iW@g(tw<{ zBp5;KM_fzmhhQezm(q{42TDH-Gl{f*ZL?qgOq8)u+dP7A@E*h};uQ3GoPndEvh^iPa)6`oePIJGoN2L+%X2XhVo-4| zaE5c<1#uw|Yf3|}qkGpld33Q1G9<1L9!a*&zrWT&Z*$+$^LMYcKYM*fM#Ir_n<29g zM{UTxU={5hJ^soMZ&lK@H{so{M59B>f;ujLN1v&D{x;8&OBXW~=vS5F%XE$O|7KZ3WhcY?z14S}WM6G?L`uq~c1v!P_J?-hVKIY_-AI?kSNS7);h` z+eA(+gqx+X@7hG<47ZPSAS32?Kgbyfwj}e1J+I~nNhws~fwf3}H$VB`K!ReEEFsd#(w7mHwb_92%FdHUx^En)MxjOSJTVwIJ#xPu&aJ*4Oaqp4BA_gDQ)u$HDAb zyT0L%pvHB;l_IV|eFVrn*AQBK9!76k;iu}?eFVu)NwIc)`n-o=UkOEzVo|UNCl)M1 zz^@H%ix~4moWLbqLeem_k3zpcCMHff^t_-6Ek|%{fI>@WdhGmNI*kj_eqf7A@j2xD z_v^>{Hx&P%L`;YKIyTTXkpZW%`!I;3pg@G7yX!0Y$m!MN0pPQYB&8qh*{N3iP-^S5`Ity(*`jsiI|O6bjTr?GCj z#F7<`HN~NvEjE|P3d!*{hyM}@8l`7UYshKVEGElsL`h*ybh%hjfrnZ~xH{|%=AFqa z__*NS2RV&lE#h!$Fr-o2;sOA`hqZ>=-wq-`Y0;npOr zP$Rk1Nhq-)cP+9NA~t3QshSSok8a8wqJ85luORrYYQV z89<R&B@<%4O^O-~VvY<@e=zoEX1j0T!=`~@a~ zAIbU7%G}{8pGaQZb;>Q=d64|m%BT_xg{>yy*^ z6D$Zye&jH+JF9blkRbJIbMPy#t&SAddAS>Y*6X}LVXEFNg>R>N$|%K7jbV6~_%u>F zlpGYj+iIns>ZYIQ=g+K2UGni5 zcptvW@*JNw%&nBG2^;qC6h^fhU*V;(U-3#LD4`W6ltR9qd{qy=NfNAw;R+-aDbH!f z%cP*)HsgT~5AB6ETE)olNQ;(05#zzMn)yGyAopEr$$z>@r z5>2e7YHD~P|2h2{LI`K!hqq-`n1x~F&=hodDK=R#7h_gTzm%=QBVTPmh(YK#_1&UL zI2AOBhDnn>k8@ZD(-agSujP75Po!THbkqwQMsxN{k%Nkn3muE@S&GN)JAkid%w^dn z2ASV~h;!;3)tQwKlGU*EZLW~Tbm`r{#Yxu=X;}>(BUrYhNnDzW(rt{b4 z=VFfB#tApi#ll909U)(bAsR?b{ae;VfbsQICDD)2p)T0Pk7surW`Um$5>3I3tPERLR{o0JP0uFW# zKJs&Is%>9ilz~!o;iJ!DyUge@YNuzA8y^>Tt$HtzYg4w*e}BK=4%;njr;NX|DZu6I zUi(+}K6AYrO$`Tw*6&sP*5@(&Dv7xzB zVo-l!(aM{*J-3XhoHg{UfSsM4&)_qXu~J$^s;cGrduET#+8pUI&})|X*~Q-l`*m%4 zc;}YkoVd`zZe{WUd57BDju_b)#4J_%uHDtpxxdI-sk;WQWyF_1>X=@s*t*)rCVqJD z$@aDklifAZq91!CK1?uB`u_dX+Y{AizF*AD2_&~aT5owb{@TNg>V4$;#|-;AmG&1d zqHYeSBfNd(Ef;-y=+a~bayqoL8#+%M@z&6&@ep;Jdpg3)w?IFlgk3!&?bcGIHtm## zo72b7yXew6uKa-a;tyT6x+Yf#o!yZWc=Dn4*@o!g!CK{4Z*5=Pda}7Mw|}Sk-7MMI zzK`tAp617=miN_`crR-(D!q3pe`0OR*Lr<#gHN7D=Aj#sJ@ULnYqv>dR=sZ?quSwn zQ={{BkA{8b0fwyNBGoqEn=|0|(Uo^{@*Q{2&`$8asSdwiF6oZVn77SxM*5wemyfIA zM#zFkH(z~t{iM$J%gbE!+v4I)kAl{ky3|j*2D`##kKw~>(udsNZxFHYcJ0RkxMcG5 z7H`>|(qGM@-ekC?!yS`vMOwV0>>kACU#M=m@eZz(9O*x;sn@Q!PP*%5YITsBRBQT# zC64wx2JYHwvGsv;$w7^vSrG*{T@!Z5=9&d+q>TAw7QAEY@~sb|JlYEVwW?3p+=#V~ ze8Jq`xK;P{_6HgPssyEjovIyN-6&MXp6LK`r*($@atOfRruxD{@L}-;`h6^ z&VqU{rJNqb+E~O|AAG^Qc*Jecs++eW*uB+TLHgBA2Zjc!?JVrG2_N$IS%qe8?3lu| z6-Q4-F*nYUaa8%VZmVJTfx!W?N7YOHXQl5Sq<4#XE8v-p!0=u7J*!t&2WBtQl&F(X ze74xl+GTjIFl&PdNYe7TRk-ec)S)YdB1>-Eia60)EnmGq+i4l=-FBsC3ma-)Y1-8K zAIkYM#6{_R-%F|LAo&5lmYu$j$~MfiTk?LywTNDbH6C`hx9qzcc-dx^Pu&`u!UHx+ z9aC2faFcWACk4~1m`PbfGb@9NApT0#6 z&shA$`hCdwv#6lj?Og5sXSKO4j)eo)DD_O;_bzqvq6zx-6Rr*aA(^|w>Zsx{d334c zp26!GB8Th>a?qWQwfC)56ZHG5N;T~($=@@0(+LSZfB11;T)^3W>hYDE6k1ajf1iEt zq7jqm;`T*ENOP+H0n>9JvOi$KQ-vs^n7_bY^uz2YL^E4J`T2EG#p5eo7VArj2?)nX zX4heD&{dB3$A|ICuIMU9@|wKgiO>PUv+rLtT3S}eIGJv_T|n7+wNOOUd8nr4UV$m- zNB&r-j^qRZF~mS;68fPmFogSKs9nG9h})=esHn(20bMSGnR|r=96-1C{h}9mkKQXN zk+O+lmK34yuO%h&SzrNq?~p)oPQTd#!-1b+;^XnpXYLi<>kzk-s4!Dt;2GdxDLNi; z@ITNmbWy0COKkgVrqf%ArD8U~BDCrJiqLN}g+>ZW1BPa@Mb$Y(&QO z3jsg>vGTzD(G6&uDkZ2i0aOTnYlFxCss4dmd>*>sOZ`CqH>n@SA9TeLz;#i{<10ZZ z{o~o?cSj*_`ir zCEv4^PY$Uc=+}HDNfR&bJ3r54Ch`ee&-ap9Q+0U{UZ4S8ZyY@+LDw{w@41rixgI_L zA9ZgY$kp=xfh&qiv{*}2k~V885-QQ6eMh1qp=2prmZDN9TahK&cP-RKwj?53i%8jt zifc`Fe$ULD^M0T1z1`bgKELnp_n$E{&om7 z+xJe*mAkD_?Kv54tXxb_-7{sx4a196@xk7;DSp4)>&(UadUPL)b4lNi*I|5tT+OdD zUCA+h0pEMGSKbvfJNqeUqm-Xl-~NV>1z+ogD+_w9zxut|XK3JD@3)xa zOUk*phM_I3=v$5#`n~hg%;t0Xww6z22pG@YR2uAaFdRKTC>kN3| z#^5ePUPC(%2RzDeApI*n3Oan49lc51nc-+pteZICJ;)gdtDw(pFYGt#h-37`AeK~* zuqhJ82J$c3M|$P*WD^!8(gb3VX6T(A0+|C<4bkJDWuuhSkk%CC1knGFrs%XYDBJVh z9Hc1CnqS6gyc+$`ISmvjX3F`!G{Ghk+gZa*iamo-B7Jy`o3)+px5|$k$h2LC;RZo2 z4k|~%RfuQ}Y1xC}wu6hAN=c&WfnBvwr_#TnAAiGiv4etp(;x*Rhu~B1(a!uQi0(H= zmCe>La(;o7(mK|>ldGI_Cy{W*QDMnW@n{>Y;<`zRBB`^wn*VmA!|!Y$65f0Umruo^ z%okaRk&@tG?PfLOk2Oe>(BXsFd{!Mh46^AG*{&^q!jtTIhpgp>Nk&{THEG!T=|ZU< zqjLiI$-10SKc_ohiRiP~rwi`vHFZ*-h!J~ssT@)~JzF0EHq zPN1a*aup3_nwu$$9P^0DW^gSwVRNl$h^B-Cu2y!Rw|&K~y>U1Y5vE~Ahaca zJKX4(gJeez_l70;g%6{H)(&fV_u|4zHlaKF@wP>S#On32{8)%?Hqi$RzCSU1Z+$bC zZSUv>BB^vkK!jWJ+&;=cgR4Qye!}1hDET0T$Rl67=*BenQc zpA14bts~Y}cDvk&O^n3COBut1+2ku4TAe*GHeGrGPQwtwbY3H+u#ZQ~_znhx9-{o< z>WYR82D56GoXQE-490P^%zSyW_45*0f|~Rl4^H(4FF=H%UCGWbz1(P5sW_zXP7~Vt zZxW{}FI#@WsRpcY!Jn+PxQa-s!k!uo!8ew|0`t}@V+j1|M&4}U0SYbDY~?;^Z9dtyziBuQpL_fu!IT0iSpI+82xc&i$$meQfYQM%@FrT&f7>W1kWx-ixKmB= z@-Y`%=ncWJ{7cia0iFw{eF=D4Y~p)7cnG|tAi?xgW9S;0Zryz33u7aVOU?!qFBaVZ z>+eJ8T=JO?tF(t&r3?XZhKIx%rtKOosXSDV*yxPHvC(3jGQ^ZG&OPNheME??g~`et zT+bJJV|e#cye99y>q0t)cP+#w)%4g|1pL46QFvK}6`=*d+n8p9p@Albp^cIZ;|I+j zZ&Iub(86d%iHtW05-di8AmanA`||F#AQ+~V2U_wyR3@}SL?8HrVwj`NH7h&Ds60#d zsHerbpfTpCvOzgPh305F+;kqdUO49Xab;ygEtmo$Wcc*((wgA%7Zk^TO-pQ#H8Iib zV=-ZWB=Dd?q+_VuP$e&iwBmjXp43|Lf-x*mAcbpYr4xc6Ul* zqqM_fcj-vD5m0dj*Kzw??TgLwcFhj1IyskK|NmQNEn|xYPX0(W>>zAKhvfF&Wm{ws z7?x#`88@u#@IV|Z32szQz-pry=F;#P;iYIAfxIDtd6vjp1X|tStxj%5mL&7$=qzDS znUnBc-%J(e$iNupNKRQ+OT)S^@;mmS+}l{4T7q-(FV-NlA?|vSasjFID##O|Zc0 z+CbmomgzXO)!G0HZFH1C!KIt9|wBJEV=N$X7TnA_83RF%W&Ir>2EAiJ5OccneE` z(0cF|mXx^%!CUB&H*3LL8d=7(1#jtK8805ZrH5s&ZQv~~EPLGrZ&7bPd=|m&dQ6gA z{5~=BUrwXVtW@;(q~uNvM1klEGEb%A{4974XGySlZ0ab7og7>OpT|a8Dj;t;y9d0* zwbLaU3pC>uELm@Jk1>wPH(o*x65>%xoM(wDavtskvVte=kYn-Lk%b@gD=d7zSOaki zsrT^_@tt)Wuxm@b4-r&GUHH+N@T)bl$1rje(@bj$#6iglm?!Tp;Tm}dKjyQAL14a~ z#SmfJnH3L_7uw!eC3}}8DMItBENOno5~+c3n6Qjgd3T=8GN;!9M~f7XUiYmu4_%Aa z<`Fw_XpO`H-vIrwICcZ!;10-CSb+7vA~#~`Y+e^S+?pP`;*o7GcNe1%e1&C?jjG7U zXyLBDhgFwwT}0XAEpjrJ05_2Uo`$1l5_>#CUdFP=E##d)7U%aYr5_P{V3v_8H_wZC zzRlh%un}`HU2QInpIalt4mHkM@Wr&RYu_NP_bV=poPcb2wiGX$0ul381NI^B9mGy1 z_TVR;hP*_~83}mV7E{Ysd>-5_XV|a!99wT`p2BQ5Vcg zlRHl0T0E0wphsZZUOL5EsW$(fT5(av_#@lj z;*f6vpEu+9?S*A!L$dK>j0KmX^_3Hv!e5d-6ULnft5SE=4sXPb4zPab$G#^4a-~do zsr~9bB-}j~Yh_oia`8NlhXc0IHm?D)% zgd9={;FD!Vgj^IS?{27ALWCRzUSoe+kEo1#%2mvXD0oiY4I+xb(U`=J^Op;WoqjjT z@U$L-_CIL+h%4yuW3Jy%TCU3wVSOQ`Uf$xu;4_b~Il&^P9a1JNixj)Cr=X=KdY_rg z9}e3;Z(TikwBiMzP+b~DoKGI$rb+A(d1`uU1wLk5Fduv0@HChd5WN{A;XiKV6@Mn7 zCT0|Vo?tm9_xr9&^!?u*aY%Gka_;>4wdwOI=g+3Oi~KEJD^jswUov4U1>7Qn{ie~L z$1f5|;>@Ms2f-U3u^aZ=9}|3-Z?l6d#di0663$D)*`#WE?dQ6#+#+BBBodR@jgbRNps(SgPo7d~W7OAn0ILg49;)-l13CON^1^0X^Ioewyl4?pNXk9IR zDq_nv;T`j{)W2ls)#=N}7VwUu#9StO-3DURLnr|N~xbtW2BB!bz@(f4f8Jp_CGp6{GgVelK z1?4|+P6Uyfef=E4Me|Zvq}2-K6v4EvpQERUqRDfu|H3 z5gb6oUl1?6tX+9W>v6`7faabgPwK4V}sC4UK zb%Qut0&6>dwgk!v3<<(ZHQ5s6H8La!FGVK60WQQ9-~qN?)DKJB!G9)=Cz0C5d$2~J zH<70ZoQ9U?Z9UAP<@v&tr~NTQ9;ec3N%nlT=Y7T=1c1?$2$i64YSTNFf-|3%BAZ_0 z>wVLe&n`x`^Ll-?y^u3%D9Y5lL$;ko*|q_BgAlRpG&{8DBZ$BP3232)5P`i)!A~*= z69c9|3(b4-SDpmTjiV!8ix~ zDEv?$kN_f7?xW72zcVQ$_ALQHL_E?_pWq{+XO(MRLr&CpNeb@XOd*8#-=@^)$l#F$ ziEsq>;81mg5cJ?!^Iej)9h!q3zM)JxA^n3n`4z=(e|TxtJ}RzAn3rdn`{4_T7f??q z$iteW^qlyV9bMD0g-$u|;wo}wb~G_&^ic31SuT?Ls2)F=dX4MK;JMq= zO_HwK$qMfE+ewUCkO?bP+QS@0rDpM{(`&HW<~8Fb;~IMz)0x~KmorDTF=RAgFiCG` zcWk-Cn6cB1tS*vQkga-*{%F?hJWDNCdXRF0U_MLR82uJz2YC)h+7?IMV6iZbZDnb0 zZ8x(B&qikltfdXbd}g_F!dZ&>qgGf~QHuEsSbY6u0wO$w?*Q`?>Ki{%|k{9ejkJUX5j62PF(1>J~NkHT*6J>WGB4t zMms^6?9Hp~eeCd156qL^LmtU5J%lCn?no#5`S%3)cxVFPLADpkW;|1fHsding6fEz zlJI-7X)y)i_Y89Xwo$Zg4*{jC?LRF-z7U)18o~5qztEDl?Rd^^00jJ8gP~n@Lm@++ z7=4CG05{ksVbeBidom30WwAaElBYf3G>wgWNziyj!;@ke*@tAk#;97^d5_pfR{j~^ zZ>H2z&-8dcYVc)GE{`+NFS zxEPcZ6X1sR5dzX1YbHrL7;ZBnODyP^$x|jQ{En=hmbiuNb7}`_i7UEyq)R6eAf3!F zn%WaOlT^Rl$kfzsPOkML6)!Vd{YEF=i{D9}sk{~lEmzt?N@mviKcB3_9=6qZ*p?i! z5B;A{)rs3lpwDZ;T-~RFG30@{=0Vn&yHw;c*>_ctRXT}c1ReKA8{egZ71WU>aH|-XDo{W>0x*rhVVjI$UWK{@Oh z#>3>O982bN&7fu$iv>UKV36Y1Rg@$7L#;^?|E%#;CzkAu%;!3YKZ##jTLPpK50IU4 z%sCMYgMam!Bq7J-`EMFLO0Adte1m6IUPa(=QTutj4WBL%XYr}i^&iEej|N);ARHYx zp(tC05`jl){@q~P%mByF5T3yePwS*`O=M3Su^_Fv<_EUP)%i)ay(T$?+*4r_413mV z)F0ya`Z~r}DL&Kl)tb-_jmulymfdp9q6u_s!V)4hM_k`Z1ekA+hLCiWdGE7L1J5Vj z>})_`9O^qI7vNQdB6}p!rfJNEh^_f{6v&PO5w`3Qv0*gIzBrDgSQ#9fe6vSd(uTvkW6YByQNP;E2w!KgtN!iUaoc#Y@Mv*fC6w(z9mXo_o)R6 zfkC`-uRy7`aq!rHhFw(FRlJu9hZ5K;!fU2ZVd79YMkW<}>b&gGT2u%}FB)~Pir;OY z8z3Hxausmvvgn{Xu69=5OUHj#OW*C*u(k_X(m?dyGOnUQ@#H)B9Sg0*oF~O5V;(@= z2GZN?a7+SAyR$=;6D&X>ZloQWbQcs7XO45k%Xf89USlX&0ey?*IXwxbN~>3JhLI2)TcjaJujU zka)RM79St#elc~~wf0Jz*~psK9S5dc7>}<((W42T8a-6fAveE~(1FIeVb8WB6gfT9 zLf*ZoSAI2WMBa-YIp+JWkcABl0{qo10uH%<-FVFbOzB}i)#&V+@nNEZyXbU^D@;1) z|CEw+BwNzcGg*!G*nHZ}p%NKc61o9V)U=HJEyY7m#$+$sA?G1H9V{;^o+m4L4A$ogtm9(`@B~*8 zX;xPwo42=2E=4MFYt7#z)TrCKLtw?=_>m_^C)Rpe+3?6AT78-#sXk-AQ7wadQ`aY* zXEcc(db_ypb!|B>_7sayG!B+EjCumZIrsTTd4q&>;X zDKS`fF5*XuYH3<}_@rDX%F zQhCY-CgHhp2&M)+QP1V-7vp>?`XtC?gi;-DnG_^yH}~_4B0>PyXfAr32dEWE?a`ot z5|N?M)QGETz>fl8L=nMfuk+dEEq~O3aCLOzfF{940GYq!s+_>)YHH8oTG7zR;u>Dc z;QB`$1kG7ot?bxb^BUQ@7MHSg{V%x+!B+5KJWnilnZrZ>IqEJV1{g%@}6Mzj2~@ zNh`RA6jIU_sRANA+)l|(YxOe9 zO?&?WZTSsONz@tfKWPnPbLf3$a&m!4Y8d~xnH0>UC4Of>gFdT;;wH4<8I4YWzkm~X z@2dyJ;RdyJ7^4sYSYbo} zM@<7`O@q7QDL6#MmY5ulHwPe6biIpl7yxz`a*V$@jUf}lApE2hNu%iBlu!s>P_<;h zY`8#sOoYYSD?QG_zUnE?A`m+`I086_(PTA_j?O7T3x^a>PQ{mgh^qS!GkXSU%iE$A z#e%_UpOcHWDmoNgIDIO@3|(j_nD>Nd_b9Y;u~Eju;`5;Wjvfcv;Yb%fN+1?uSFu20 z$#aY1XyiuxCT^oKcsl;S6g)TN>=nl`e4BcVVQ@SIel@pjkha1pBL&U1!X#EpI5t@#qX`&Ey9y~o` z=E%9r0dKIBXxF)L()52cX$ZXV;Fa6cF5dQ-Z>z>%T=qh?vcrd8GDN0R3AQpPG9iu^ zpVy@G?B<|wIkCLc<476@S~41KTPg6=Z;2O!j64n{FLve{9@1cks&?vBd@8V}U(ba? z-WhkV?7S33@Vh&$Ed&wxd^sF(io>46R;7_j#sq+H@(B1ST6guWC(I>J1+)AE1 z`3nuV5G(It!R^23h`eXBl22QH>^>UVV1YpxI#(e3zwN-tmRf8A8q*mKgQ@QUrARFP zA9Uz)C{7#GcU@)qE>xf?9Vndke!IGl@h?VgVm?Mwiz!wp-VDGp;5`h$KSdt_KRg8} zL3kKV!7H2yV!eubL_9QS4kfpfiURtroPbO)Oy8qN!OwOu?qxGNhJ>3#KG*12^CPT# zD3}_9Fk=$rES|$nra$ca1km!g3I3x=SPF0khJ-QM47KuP8EPpfFx2{kNmNLc4NDCs zqj2;i8A#!%4ea|>tWZ@2Q^aUY`-s>L=EO(YGytQCcPr@_7bY&?WRh8MtBTQg;0%qU z+u@qoDT(dWnX=*loGFLaURfG(XQF?Xd_b|g>H&H82Wt|k@bjLyq{xdF>U2nQ@~Lox zED6>l(aMug+p1aLgyvGM;OlVVy?uuwvt^K^a%WUDMaN)>kJ0WNTA;gw zwdH5;rhy$so)e9s&ym{z1U|a-IRZ3yXWXH!F#}v>7lIFX`dG8=bQZYfA9lhsz9686 z0x}N5Ru&b6tt@u6={ZbuZKJ}_S1lXEXI0WN^iNwI z)J*en6O`8JRC)k5#7O{v(p6wyME5G>dhea2qUew3m@FYx%9aKtQFG2wVfjoraKI?+ z$Q7*43TaWtpv())K51l)vV8gM!m|AJ`nEx~TUP8IaczCncM)ia3`GMXQ04fR9jq+p zxg8HML4>r!CFvHIWTYJ70lNh35E!VJNEqdxU>G19l^u zhiNcVc~%P~{^Mak=s+PE%4nzUq<|DP)y+SF6SL%1kjU6^Cei* zNoa);8I{<~?edfdwQCk})^@XaP4m3bs%pmpQQdP*x7& z+U_qTMFI&sp50$=Q{oqiF$vn@Nvwn*Jl7i1NJ0%{r$`Ymb}AE5#6U**CkXkMLr>R3 zGIe(QTMB|HDJcL%xzv>|bnt5M8_DuynUa|XGug#t(~>z>E*Jc{kvNTMLhAs6RW~Ry z1cQu6_ZOC6$_Y%t!VO>zSSI@sJJ%}Mwm*{d2iyn4dlc8IW@Q`da_~%h-Tx%i*9ONN zJ91Z4cpiO3psQX6ZWK8q<0AmxKU!P9S|7)x5K2FQpDfCe+z6=kH=Th_o>D-JX zLKIbpRLc46Z?_S%(}`AGZV_M}@d{C_zONr}c6oHPx%kzc%;x+EL{zyUh&NsuddCHd zFq@4Mipg)Yt>4Lr+N?1)dHc?pqI|q$tgf!ooIGIre21=arkelRO#`lGg|Va#E#T}X zVIn%NMg32jtVHW5kqKTQ_6PDRL`2x2ImPyU@ z5O#dPxtwpSfk-Oac(>Q2^G#7PItaH*t^}M-^-g?uWD55k zSzxy@8d9sms(v+x-$HG=-wI&Zx|2IV?EYi8m9!qEWVbgg4B*@>tlg|RBbJUT z0JD^DqkAc1Hxo}Y4uAW!*d=QiIK!-f3Ck4o%)i&*k(JDLCfg_JK$tu)OK&R;#wpk6 zeM2HAq4z0Fj*KcyLA9gP@L8j-FXK~TUmi&bi0- zXS7@u4axqjK`}iUZL}ybD3RF#zg(fm7F5PD?+axj2#m`UvAQT?H-;69r<8{bZs|Nq zd6e7jsinB1Y;LkBMHn)`jbTW6K}SR*SprLX6}i#7R!x62*_mVJmBMd1>Q95S&6d35SiNjj zVdU9Gp{s!phxW3ODd%tYhpsf&I>({DEcbd?YC`A=b1essxyw%Zg%mr4E;HBK$|1W< z?W0+|7ySo$VSyUBk(B^G$o-*v^j#Q*{lUWv-QXAg|-P#8sC@g^#tz`UO?; zRX#+zzW;c#verpsNuEt!`}OhbBP+x`Gdw`f@Y#KzBmAYGAHN~zKRdjw_w$GOYZedp ztbTuDe&xZ!4xZ1sYR|+o+uI^aOGB+YrhWS|(0FZq<4S7@OY7&c&#fF=EE7J9x1I1f znx842`Y}D>WV3j3bzq2UlA3F_x4mg@ZqSUzB$=`{@g(SUc^{@Vro>*qr1DqaxpHL& zM@n;?Y9l^WHCnn&acXJg{~TuRQ?g$_+)vFCCg*Q`9CGei(l6~z6K?XiG%E1S(;OL> zKR2aCZ8!94+;nIwnbh%4$lmtQvmoIn*K-xMuQ(d-$u!n{bC8iMD{ZoWlhk45_hhM> zUbgqe;|neC+q&(u=H8;I7A5l7)R#Li=}~%J(oiQo1>@UmLS8I-dR~8I+rynVTF*;* zc^pmnWn7I}`peh5gt%=q_APoot_oV)7u)q%$?da_-ORZlNWp2C45+i*?3F_yQ@<)JTQO8xqHjbA3ZjQsd;=clyer*@Z&*DqQ9 zb|J7>;1YD&%5d)@*>M?W>1!Y5ZL?}TDPwurd=$)^_~g^-Mo$^bi{?Dn1wG6zES}$Z zY}NVa9IK@>Le$21eHmF>_&MaDm0SADl_Mk8eH4G^uFrq>{%B3#q*jq(9VtSwE0wg~ zcwLm<@abz!Sy7eU&8d6z6wJy;y|gX2u)h5@=k?i?opPhMIjy|HpJ(<(-8^HjmZyvT zz9?zNx9yliLMp0mAgzs)h#;H}5!ohEz-_&QG4 z*A1??_UXQ&=X`GG=k2y{x1FxrP-|4@*A(X}+jvWSrSMGKINO)@+cbo)Hl_AGQsiFX z=>p@dx3pLE>xF1WaHdpu$1m*G6g4;DbK>g*dR2G7q)vRO=&8o-Mg|@(+Fbjju6f{O z{kOEIyec9`H`l)8=9pimQB+HYa%+rwi3$$g6?T~Lxh=d<9b08QZ0Nn+>p(4Bv6v{lF?0fBDvB!jC&{mv?`BWjMC%TM71S(n1`ED-J zoXI(Sp(d2F2*h!3$awK&aK%eVq{J@gm%Vg$(9nvDaQ0XRihHe^$vKi^2@Kon;WVdFTudA2>+kRyp0^jOyi|wRKu% zRCMmX*P1eWOezMy1SJlCxZ>&b@&$T^zWbui?1Amjg$w;HxeZgNzwq=opV)Y3AFSt> zMesm^)AMmRxD)XcO|SFY)cE+@^9!$>#mDN4aU~Zu_wAvAisK2lJiA}gp@;n@ex*y) zu+T%eh6J6&FUA3Bo;-S#Yvqv&c(j3M@GXVlg$u2yhozBmx1A;`QvwVvF;l6DK(yeY zk1sFRVAHAOUb;L;%$U(=yk-9NBV9yfwPn*~IjXv7J6}iHobFbr5o+Ceabj%AT>DK* z>}KiQ4gq$r{p|01%ja&tscq<*2}k@aff}Kb+Pk;d&ABBRYHvSfLv2&0_c8YpuMf&M z#<_Gsd6VOVwSFJ0#|sk~Cd&y8x6!ezzCz@yNngCkGJ9XiMl8E`B3h#OQO*aEez?u%;mdH3DlWca`!{rokvwT=m13PYpgFbqSrPrE(?Bn-WC!^*p z_=@GLy>j;-7x?IQz*YHO+e^ZBubbV&9p4tKu-ALcYlyMUcMnXoADDYhW}bYKSo)>i z-}r5~t#*|NNnL@bgo2#@MU8_kb3R-;`p`zeJG59M^Zb)jNA%D5K}?MajgM2XW)R|< zr){}zv7U;TR_-pT)*z!=1|8nK+)Or|($rHo8FVz`6zpg^7bn^en^#NIfn{7>nNcCL zVi^SPH$q_DWJ=B@Y7H~{IBl+6%-UwFvYlTsmv@Odi&N7ay^9IiHpLM``0Hej??18= zgr!>7zH4Q$TV`k9ol6|ZlL3pgl6WmHr#jSIsMfE8sFh~CLR%iQmmSlOB zOgVq5HSZ?q_rs9~<)YzA@8EQJ7(!0*#nl)tNV4QEP|Jc#mLmjWYy`rBb*J6v34q&_ zLeq8=qpt0k3YRlw*5+W?DR2vzG-p@Fg=O=Sqb90~D=*W%ysJC8_Flspw9X9@1v0sC zgLVWL&_XV9<3lK1NEPM*T0%-OZfj%b!Zli1^F?_1`aB*d>B4QO)Qyw}9rTWYo0#r5 zK}_U)U$l3^EzKbtU?H?}ORg70 zBD|Dhp<#G%C0tDd9cj6WWmt+pR^Pszo!4V%Wg5%Y>c_J!!LXDhR(34AAxXkRaYy96 z`PcS`8>|Xuf$~o_R1#vZ>9}U1bLfmgYx5Q%j=^4Ejl%`o`2nT@L)PvWO?_|EBZbh^ z%}@14tdEh*<(>eP`_jmqP@r1N?E??7ncjUKC5w_wxGWy_1S7x%fVohn=&p36T?gSk zMQGfaZ%jhDv%3(XJ?>R}Ut}b=`c80zQuOT&5;c4?_7ynI|HPWwH05StH~hpv@yrT% z1oinCBDvdFM;n*or#(Py4<~8eXc~C!*EUVj*$mI&THEIsTjPOh-wiCof**6&o4mC{ zGw2R_fJG;U>P^(b?BGl|U(hp2=UY3oZ*2ii-~nVUPm+i}dMWS4y02HGsfo}@z@}#P zmp(r!frAuE#RocR7!T7r56K|_v_*|q%J_8`pQSb?;kouIV`_lZMl<%*6ysr=LfKR0 zzMrZS^fOae9#XSk-xNIS;tC2KGS6=mf0-b6YYuE-M})x3lMJJe&d7bSZtwQpfY!em zT+rhu^~9eogy*b5rzsS&k#1Kv9%f~1;&Ot|>&pA(ab90z)IBDv+3X(@9Emb^B@Rja z%ZCWy?GNjlQSY+sR%Z}7i7XS#Jg<1|C!q7YE>qd(vD5)p-L5`mlXEsX+~#d>(p;a8 zyXN1CZ*dY{E?7>TWv8}8ym~Ck|Cs=l-}rm>{u{ew&?y5>>X76;D+@D&6DXtJz<9YU zrg(88P@JsOs*g@Ua3!Fq8vqm$jAouHO2`c84I)bi@@fUu0B3wCSGUVXPf4NhRflUP zyX80jzO}zpK0T0gu55Ho7fs_yhE~u5AkUw4f9+2V#Bz*$7nd1O2O^?#FMiN?Vck}+ z2VSjtM%9ybB0w>8nAHs3JL@}UlXc3z>*@<4IT;VFpu}8?j;fui=IithW5*TFlSah;FfXy@5=uPCb?fyz4- zU-~C_C|GFwL?K%FT=-eGxSG-WzVGK-MVn~2+dm$DNVfb+#kD`#@)#8Nn~~XjE{3I^ z0-;d=-?5L=H2BY23bX!nBuegI*?p*mB=?i17!8RuMn4Qy&fO2c1>FZj;iKSZS_Bbd z9XTb>9XSQD7Y<=_$3tD<-merU>??z65~It(2y$X7OKL~@7!954L}AWcxi==3j3y<( z@5#cZV~_=4V3LK$iMF9oayK3VZVU}!^Pm#p-6w(#ejgH#jLvzYEk|K3O9H%KX)R$d z7cNdsXOVrEc;}eAckve1R9($qgklfTif;218ZK+u0bD)$5)oG!fo&y?BcWyx>6V+V zH!Uu%6s;`o7$&NK*v%vVVu|Ku8Pk9igD=>dq~=|8INd$lzv#S(!o8Lv2Y0_{O8Ki zjAi4}&{=~t{sYF@_va#G{Ul?pLB=?f%YS00N@Ws$Aw-$_!vOw?jVmUYoC+^XqyyXc z8gX%|;UcN^@sQ;gQnDDRsA{y@$#qX!{rl$ky>(q@z;*8Qd3YzJ!Tqm@jt$^uG2i%Q z8~LQQo1OBmqcdt`gl@@%)jk#N1-SXE#5U604nH7xhdy$%vbI--n_LOsbFz0s&uhpC zrIpWkwm0=nhocHH!N4J@iB8NLaoy`+{1o8CPV28MqO$B= zPgZ!`w8(=P2WRFzx;j{XtLv3lO<C8h^Q~!Aljeby>)L+Bm_`mFcRR4*FF|P2sBX{((boZJf z^x)ibE(8BM_# z{ZO?sCPvj*|HPzTXTfH;hO;3ukzJ>~(xnvu8{LOQrP%FRR0$<2wl0vS%4m|IO!~i@ z6nSrO1l->Eks?q@!qy%ZjiG&U>6s~;se+pQPy`?%P1oL_+Gd|Xx{7Z+piM>=UDJrl zqpEADx)oGd?PJ}Fiw5B!eG;h2C@WeGS`ne;S2uJvWoC<eOq&Xam->=_!U zh9ry@{J&`RKC7Gpw{+&wrg4@1;}(P??JU7iI1)L6(g^)z*tZQTcK0LOL$P5!dIzvG zS~B!(&Jq$KMK`>xQ?wkd7^>LGhk~xosZ^Ct+HwYoj{J65XlxSTl?cs;KAp6VexCv#A{+5Ka8?)mcV+ItM2U%Uw2R{IXbgZL~N|xgKP1mZbD{%43 zaV0Df`3)3qh@1mMV|;_E$XW$tAsm!JRpc(%Sx7l}fX-epm0hp$XC25jt`yza=HRb3 zauF`KmR5{RSg)ubcdQQ;ufYC9oN@8WIoQUB$7vWI+XR>7Y)K2UtIT1!@3g{msnF8m z_!s4{C@KZpn*eXWC1E&R>JFVr!#Ap@Mtm`Rql)eO0Tg`8fg}C-BtVADH*QsX>mLk7 zd6Q2XEf(4MiN;w2V$O}U%x?h}*3vR>@g1GBkjM;6Gwu**L{ADvYd90}AEXKoLVJNHT*+ z@|&RoGtWKZG_$Vjfii30ad~Unoe9glRm;JhK{m1U8M}X7s8`bEiskvuTynRF$%dsA zyFR?L)(;g3;-b_c;RaKu5P>q&&o_bjhb^b!{5I^+qf_X^WD^`Fi`goJPfTK~3@4Hw zeV9BR4n>g5$YFw1W^+KYFAq%7j2MD%cbzP#N?W#j#JrryP*iO~@Kh^}XSX8K4v`cdDS0ky83ktsbKn+- zBu21|HDV_i|SJatVv%!W3>(`ZtuJduuIQC zHRr4uO95Tqye8H0+u@ZW;X!b~!!zz!;hZEWebuH;3-m^b5FhGD*aFomvqjO8kee-7 z9};6i>;xLnf#G)@6=A@KE?tqod>Vr%d7sCZOzL?V5~x&%hT#xf_@LKc4g2AI=vdjF zZDvLVoJM@p!4~X_#rce*;f5spXz(E&5UAxOL1gk5!^qL{oB8MjSyI2(A>ZA#u-6lA zZ9VQsht+@&!uHWi+1M^>O@n@IgoHd5K1Xmn{ zXh6(`%4celhGF_)@Qc~rEb4I3&ti!L1=BHXkz%rQCQ}OERr&oS8kuY{FDmM!22vOX zFPT6>v5LqsMO<&r7UVC7lEP|G6qVikqP*#x`|1Pe!6f`H&V_vIg$uEFCe!$*4|UN$ zYWbe}uJ3CeeBX<@f`m%2H~W*5Vp~as8(4Z1jg(Gsk%!T`4ZE4$_djk`OY_Z#K>Btj z{Xno8Lg(*V&)dk`G2+T*_!u4Mr((EvG|m~#LNF5xR}(5VDWpu=1W|(o9mz()O^8lE z3Q_k%t$ms&6%#t$hVx&Yz?O#f%h9I6G>H~h_M780t|TRZ|GSxViCJg|TvE)J3?nFxG=jwrxb>iePj z@h4N4fs4z&M%F5&E_yM}zZSOkCqMR{KhDS4^MA8L*S3X}C~6pLg~F>VE^0EcXg-Za z08*?DlqH}$5MunOLs|I*{rj8G&CEr{H0ZvI^vI+jKegA(W|S^E7$A463<1W5k@OE` zaF}SZ4gk0|HkdvcjJVpSMbe1{AEWt=^o)vz*CKW7R6tuZB{8 zh(mACJsd)h>5JJ@Yz-iRN} zD+_6Y0TI3D0&~GZDLm%VlOpd;&V$HSU=oE)Wy|4-o5v9)&|CM24J$wCS_t3#yEL%m zbSwJi-|oY31M}-ddN8_B!%g90J9;8jqZ!T#UWCs9 z^zw-}9u#~!=>QUl69wSNy#a2)rh#52!lHp*_`srpUnat$fnFv;(U?$#-Yo&*GTuA! zC#~@CX>>jTy=%gHAwgP5)ocV8sXk1HZ;0Q|w(?||BmaG?SM2rRx3FN!45j|>S{l|1 z1xVE1+?a#OyGHXUiHQM#dyk{X4ff4id--Y<^$LG;WADX=zYHjvMz zxufiAZ5OowD9O1%0-z1$t>CbUY)9qY=q+`q=dd^hdMN$L=|mwGex1Z8(2JEby#R{Q zlX`jg&Zk~ow8I+02WB6WV4f_4ARNwYg7CD-m=u%Ekm9E&^)RJ?`<(xpAd-SYRFr95 z=u77VP^J~AQ@b5yT3=Sp|<*ccP#oe{R`Y|hNwiJ;kxt*E2BN0W(BS3!hX{G(*N9$yU?g<*GEk!UtCf z4U%jvHo=mhI7362B1n?0@Nuz=+VHkMgch!{@X07F2Lwu0FXxbf_(BZ4TKOR1M()K~gj7u}e-q&1`nZoKiz%vbR$4Y;%N^(FUuWI&9bjD$w>O$&s-%T7(|KM7HiA_hPI zP@#8_?^t7iGXdr|);!M|qka&_g*Q!`fF3K9|QYl#peO((!>`^c|t z1um7RQ+gkfF!4q5ukadGRHQV>{K~C6r-j{Q@H71~7m@yF@WPl746VytobBMPSFB&v zE-W@Src_SH~|>4b6L9bvkKKMGzFn0_Gx-sfNcwD_%Ny@aBJ!i@(H9V;GN*|opyhH~C1 zKi@?4sg6Bs0)4-j8gyuYtGr2^WaSsI5MRu+zn>39Uhd;`yocX~Ta^>}hP~Oa*`F&@3rLwe#@G$dPGBe^}ciSuH z5s8p3K%&!>M93CAuAbGDL|_Y$h^9-%vgrO%=f~pPAY>hD|H9{r(yUkKd86xaWRYAzuyA2?Tkc9OXAxY8duqM;yZ){P4{f&N zyLK248nf#zo@FzDyLjsSQQr}0b=>nY5#J!hK2jQ-uQ`(~0bH^ABMBgFN4W_SSQ zcvva2>M-~bgm_rT$F`R*{!No@D!4Wn>A4vNxryCt6qoefnc064?r%+0LwC>j0NR{K zFRWM%TYRhDMr_&Uu)whZ3_%!rnpJyiYq;PyiK_&-_)=6Kq|hwnEM?yM8mN zRb|gdEGH~4_+gjWLmPOHJ=&rc;0-J}+nziEw^Zkj3a6Gr5571R>9HAe2iHOu7!T*L zmI9!fmIjUum|8wak+p1aSB{qMD&kt~!krn;q6>zX*vqC1_ci(F&ZJiyre<@8VFLt# zzrlUYj~=<`9qw3Qa31IT_-*Q2kx1}GIuMD`3D!cNxT9uHn229wkNgTQi6RrBFPE?- zLf`U0UPkd`baolxm*!J5k+=-9NFWO2EGiqs)!*I0KxGoVp!Y1w${P=u_3=}V@svlM zlf1qkc@3Zf?+N_Ic;r%1YN#RrOMl57)*^BcdD}fgv}2>4kKe&B!bji&mnthcDJ$Ti z66!DU%lm((Q#9HJy-glLp`OTo)65qvgQY%awpNYf*Cn!%)t+tq5niGV4vm*L-|sBj zdOU?~6%vFfm{ug!NxWB+Wgy9|`5tcQ+t8GY)jKxxqxawA6@%|0{Rvrh&CSg9<7LPL zUlU?Xw6gn7o?v-o2QWNrUO>mM`xvx%I#Ocza)KEssFc`@XumJzdB+3`oNB@kpT zT{+`*es`~?e}hI#d=~l@kSx6DCC2ilN+*-O444D1)gptp4Hid@KJ8|j74ft-A_eJkq!h;BrJm0uSl7koW!eEnur#byHbm61B@8cZ zb7l)4a|mi%X}1P9Vlc~VWHKvOYhp7~PN?g{%!F2n0VE|7UYAbp0#+S_)g0?tz=@d2 zd+O<9F^3?3ix|Cn_5k?w5T!zu0c;@2ivU?`?DMBgF7GiHaNlZ zJ#DEE#$=%+3HbaKZ@n^mVE+Bn7#UcM5fZS*;hj$e1SzmR5cQv(g!m#{#>8dScM{Zd z(wM7lHL@Om8G0)wKCaLj=Qw;9ct21s|JX$XXn=V*>uPhIg4S zd{zi7Mhk8ld;B25USI^Dm5U#lPq9M zR~vVaDcx=9hj5o`CqWHsyY{2s@Z~K>rPD{7mT1&>c}^~N3vJ@#o<3}22Kd6b3}THv zqQzj1msP~>iqQ)078lZqHB5}*OH~WK$;xGC!bhl%2oY-p`NP#0P8nhi8A*AQ@*w=#eyCPg;nmp>Z?H{eS^G4&ZXBM8|?g4a1Phc)xOwbpXPwGwd+W@ z5tCid0-rMM?v(uh1w1Y;A6&W2RAmZ^NsSfUNVNP>ylqkAakMps@puA^oyb0HHC6P*k zLl>A-E-m`_JrNm6<-4go1d4{9)z`M#<}sRJ(a0GcQ*UKTZJ+DHQ=*GZc}Kt?!hcH7nzRlgokf&EvO*KYMAYk82~24zzQmB2J!M!hf$FY z+#@WX$+8A~0PK(n2{wN_Ycf-RZ>AKoOgq7SH3qBSObX#F%OVMtua8Q!f^r5mQT{RV zS>zz7H@H5qq&*cq%DgvfoP4v>g)+~`TG;@va%mzZ?y5Di$2NfM-Avg4b3Qww-1{9> z@O>+)@6v>+-*<(2yQvf1R99}B@>Z;YI$P78X|2yqZ6wA*U4kiVNGSUdx`LW}j9Igc zhke(T!=5!O+L$c`TuZaPuS!l!zOml3LOe=|H&2)-kfXYw{8Gd#7^Ao9O8Bmo$~*k6(pm3!42I9cfJhjv`NqO0 zZrJqTt^|mLG2meu7ktr%Es~X85!eFb|F80J?*QJ~BG7GaY{v`N5}%VdQ&J*f5BpUWBv5wYQ_#)Bj zJ%qh%=#y|g+r`8>2VQaU#@8OTBgk~=q~q;6R$~~HI)oB?z%Zy7Sw-yecn?T)b1Jci z!5p|WwQ($2Eg;Raok3c=IdtrM;tSqW;Y(NHFNxvNq(nAXq=xiE;wHkY7;5}Er`@+s z62A~$1;4_*eU^=Z(t9ebFoO}SFk2(|ei54yS}n?6zzCd)Z7y&oFc*dp)D;Zcl7R0O z7rfeYRU(0|OT(aYB-DX;z7}}kN~IP8RRUIVY|3P-nn=afEEMWqIq?6ol1C<{&o+XeP)k^@mMK_)cXLX)U{Nj?Vp;Sdm4+6qfC%%(8M(=6JuJ-L(EZ4R*41O6Sk;D? z#r!;0+$vf?dx;fG@w=G}g8Ifa17-s#zq;xk z`UsFI*%jBepcrdO3UFoUR}-sj1!-Wm-|$x znO?&?c2z#`X;PVufoHFi9h4ENNMdZ5tA=Wk!bf9l2#Y`kOnE2pj>U6WvY9evi-Dr2 z98q!<`~@F}{E*KW-`=1}EKz@&5frYn8A0`l55~H8UmIYlY_&1gA$?5k8GMk*DU$%7 z;!@k)^U;BUCpAXQeuKg8nko7?5^e1mSSJP}^L=baHDV{jLvXN+Y!#EuuvM`M+g4Q# zjVfF$`+_`^KGAxEJba7r&uo;alRn`fW1Z@-E&i^BbrMjcB<(8MDgXE^*9;A)KRPmr ztc{F1tj&{AWNm~ZVQq}4weem9ej`u$O}ex#ycqx;gM0OyVQHDu6RY*nkvP{PV2q># zJ;(+AuA?Tv->eBy6h8z>d-bRu1ds0?c0+L)rzW*^+u>_SLyuF?@&(qFmzRQ;x8NqC zA{4aT1|geBHgzr{o!Ex+jF?!nE6IwkLW7Vd2q42YQ#vAm#8Z&=v^1u{pcpL;l$o%l zfy*pxX`oPrEseEZ2T6}2bxiFwNY?Y(TUh%JlF!5)|A;a}Pxwj>Lxo}!SSDJ9n1phY zM1AuGe5|K0Xao9TnC9Uw7I`|QMi{Oop=~}Q#R~oTO-UV3sR!>6m{37s) z8h&Dx`5v%(SrWu52Zl;P(T4_EqtCo6pytDkS|iajO6aA)*v5!jnXMQ387^k(XZUs= z-Fh?WE7Y0NZ22xip(Bepj~bMF^f!~kK=Tt+AJ7s_SPW%|EWV@AO{?BYa=3WDgt|v!a_f6oURNG-gd5AdkLao*od@NSe7TrUB}DAWW+ zAld*$P_%Ikq%Af9X)%@p->(@QQOl8o~L+h{uw+sqMw_3~*ZwlSLqiy~S{*=8+TE{UZY(C>I+|OxmBgvcIlx($uYkcHXxS9DZh)*y@#jgAXk1C`MgX!Jv;r#bZFckbo6B#Pum5lv2(-EP2}vn5R~dDXlZ5 z4!ktzGuvVu4O}*Ij5khPvvkk~rSNk`gEKF@cUb8*)m&L&5tr4X=S3-xdtKC@rE;!a zRQDm}a+{0BvqhZpi$)w1-<#*w^u*BmKF5-mIRo}H{A1OhEgIasaF=6w*L~$8Pi19} zaeHjaQg80CIX;$q$dkb%V^ugen7Wm!;qShuhp&&1iWt#!db;T9@Lh&H&0mvVn$~J7PD(pzTT|cZ_WrK3tmQHJ z3D7L5|K#@gl0#vf;C1z9DqjvZX!Jd3zB9<{F|=wA)@YPwcHVy~bM8dtGnJ}?B^srd znj5CanY*2^O{~A+)?J&HHu0;`nB!yX_7o`$JdA2CsW#l?e8Tol{Ry{mA`zm}8C<;5 zdH#2+`#ww5hMbge>M!uJ4X@wh)?IwoRQyF!ec!0MX+;nE4;=bDJ3m)Gt5IA}a(3LS556bieXC32>Y}7(cP2J1 zU6SO`krCB%HB@SLTh;R2jT{HU4dfx5~2JR=Z*)Mzml0B`QYM z<;{j(s|~Rd!`d%>yAdsT@XeZDtM?t%7q%B1pY!efKBtosmbKq5L$h)0+>pI8;~tBv zCv_{Vl{3GkGW*56q-Xr|tb0a7bNlo+OXs;j)5;@mw9-kR_?=ih)S;H zE&j@{Q4;s-bM>Sf*F7DD9Nwt*TG=TLb6l4{q~%Qhwf&uy$M=mrBmA~S2i{C;+F7}K zpT?KZTJ5bbLt;J)yT+~i;OpqL&i->;-7lX7UE`L2@O5xn*FWC!{k1g?nO7y6zFyio z-l^;>k48!OuS->vZj@X1720jwFCY1=Z|im8%aMh{)eb%SJkm8T`@Qc0Cxyos=kM{o zCf8ZXXQ7ezIXyF3@qqlRvAs{C`li9?{W?SEiGJpGjf;8jYwe`)UWM0rq0f0o7-93(Fr4 zPMOFPI3Y1-k-BI1HNno0*JhyB4t4GxXc@F|W?auXqV9dmdjzW#)E!2%N;aCH z*1I}C)LJ+l&8k%A?i=c9Xn9MqI5k_W+4kLjy(4t1)wTk)UN}xwbqMirdn8V7uNC-TnPtLJXm7=W}~_>?2}yI2ZT8TrqD>{TR20%O+Ev;YZBtEC zzjN<>&&>OIKF_{Vy9BeMg8GqKbnLs4YA?=7D;zok$Tc zk4;02CxrEyhZK1|;m+7+gAHYF3aAFH=&$&Xb{{Pw}e>UdL;p zH{cAMU8<7t!?u+Lo4tZzTCsZ6PG-+ zi}&ZTc(noPhzAjX{nB*Jr~FI^O|G-e7CQ4dWD7i}s{fj>B*VrQo489S(E&n{G0$Z zT6x$lKGm`wEvQHJoVfD*w3~I{hofCPa;H4?#D_8#U3?>de^$guBEnL^d9L;KCzOcN z@8|8(f+!JVT}=iX?wUo-YkID7{(AZbAiBOTG{~!YY{RB{5#WAmHl4ez zO`1RyW56DAWDvJy7Oo)kR{DU8jqa%FMGVdklFy;EvbULDXv9M5%Yid_+Gu z&T-@;@7t8rLMJNy5s`_2NMXb1cLtQ@dv}=jnQuk4uKr~(*5vDc8HSg9EmkPOl7)Z> z<~u-y=R3VS{#<5C)=hj;WyASg7@r6ssvxL`qKW|dav>T&+@g43-w#c)b3DOQ>OWY((_)nJz#@G% z4-&9|6%oovzych{gU%3!IWfRN%nj}biSRWF}zPribe16;+>m_pOnDerVErVGX}uz zt+^Cng(4kTESXCIE;ofsIy{V7 z+1l{n0XivexnBN)sp6|f63%|L=p39h{-ZSDs$JCRa;N=vp&B^~|APCY)WZCBQ22jR zl#}b&Itz!_*DYhmhVI82FSwu6_31NNiyxagNLpWOt|LBqet&NK9A@i?m#6U>A@m0t z|1 z`L+B~(S&ofBD-myNSH$m%WtWZ*ob6#ot_*o;P(#@1vE~E5yf%)lG>(?ck#O+_ulL~ zYSa>u(6h0uPWjj_^lr#4f3Tz7XbPlr+Y8}u+bNKpEQkT8ClQcU7GSFhr-)`+h7B{- z<_ue9kHSdl)R6P=*vQMvIJ&i;t?^Yvk3?YAenfTu&xrb)iE2MDW7D+C%1MA%@c3$> zXFHO@A7jUAp(p32Ig!CGs^??GtGC631DD-+M%(682RGr$c~)zE5(?+X@3jyvRMpsz zxDilQtJFv;bi5A<-&sQwcd4G5 zFoG{+;gz7)o6kuseDX4MjQhO-{gm+jYT$V1_cI46P7{Egur!Ot=Ua*>y>RRjI-jbD z5A>>xGc=K{8BZRdm+yrZGMc{kHmp=RHmu{@`HgowwW4EBJ7;&|NlS((8mP+nFY4(| z?Zzt+zK&l^g=%^qBc@CV7@`(7L6qphFT#V9ss4*bCso*!^ItzxWWS=AOw9Q_&`h7v zWO-aHXn>Fs-XQq*kPSoHScH;sm(}@<8+OGO4J4=RSZylg??lePa7wh{EyUV(52Q@n z%YdQj^{ftjrn~mE)_9+S2va$`#AEYkU4QN0d&y`mo#k!@50DZf>&V#oJ+93d$s+XDEDmDmov#uI#>0~eBpsh+`WA5U-8=Lp8E zfmP0MPw|&)!kwuRlki!<+&!@-5!b$LJfV-<(;p)oB;EeU2+@EMAtmyEXD)gY9zjxc zIugH-n<=@JSH|cLg4*tKs3hi*yhCXuzZI`pJikSCYKu0JMkbkZJH z4<5Jwr@-w(fq%Qe8yj~0fqJ7&-i*e~8 z_Kn1Z%8su~YEcnh4TXwJ;;NH+E|WOLtB6);xs78^M+5>#-0l8*WTVb|u}s@}!ndM7 zr;&5YaJu-VFU*JndXmwe!?YjCx@eBVjJjQcwS5Fq6-6ew0Dc5@asHo$27bVZ< z9UkG7ON&WIH%=vkMiZss@XtjqFG!63xuUN>q2y8zbyTzsMRWsGyF%}d>r)XvGxA5 z%wj#IxnFOO(%D&1IJ{p{sN;@gRrv?6W8-B9GEF*?&zv{jc+u8j-3XyX1s7V0pR#~P zK10gJh^zkXieElrfwFw&UKOqau{GoO@K|UtOehwL@3+FU-iH(ZCIkx6Pr^&xP z7llls#toHaIoWle*#_2HcBebXy*2?X)N)&Qr|+g7tF>4^>4`dJ%WBjO0y7k>Ui+U@ zC<^WR5H5)vnIltI|S?pEh z8r=$>{I`**yre^Zp+tuqMu#k0OV?C{^YdiY7Ga4eoRWi~G5YR${zNEAe!G-S4K&(- zF$ZR))UV53lW(uGFx#>}G#H2bUtNlkh0?DK2$5weYJXQgfU8bIRj;4xIfflGGQbGJjr}A{!vZmSri$7tkcw}X6kJ43sn1} znIfT#JO7A**$j=4E?%Xl+6S|=P%uK&zV22%I1T`WDD8s16qiEA2wnKnJ zI{Bc+v=$u8KCL+;z~m~LhO|SWVx80^Pd+}SmA@oFj3x}H=f>~O((e?;>F;8q)0=!x zT+ng}Tkt%#N2jdAxxBjiedUQ+)q})_O4t&GQ97$x5*sB!v}B`VBDTYifBq={W85$3vreUzYI z&YYO2&#!gDOz%&o(a2*GOZSL3Hq@TMzdwyS&F9f8!vpIVm7<~3!?`E4+N!PR(c33`VU@5Oc^7bqZWU#kE{qz3 zLut*Vdgt%{{utX|WF(Zdhf+9ul`u0ae;1CzKSi40IGT(GG1Mp;)crK5g=-G~xUqhMF8At>Qq=9jGF zOp=Y`iEdk^!QhFmJMF<2{biV(K(y3mfoSEs0@2Ru{~;i!e7l?9vAdKwsou9Hn_Ru5 zHRy_6c7>LzUxQxygSgF8_ipl3R|!j?tTNM$Y3f8-W$WaANu7I$Rl-*fWVU7ztC*i1 zAygActdcrhPB>eSSj9tjvuIH0qEZyQ{;9O%<4iFeb`a2hkz@Ymw7Zdj=iidH^;0-- z&rGj3i8FE=z+wMTy5;tR*PCxZBk1$x0vgioR~wbRJ9}P6XZORm&D>PU%Zu-bKdsa^ zYmEx>N2AV}wfg+;pdPB*2T-F#x!eq}2z8I?SSmM*B|ZnPns^#3=LW#ev`k(Pc*RfDlG zg|zhX=RIoo@EJiT6rczX6reEEBPi4=^})YX+6N*&pF%8lnG_Z-cU{L!7i}kacsrEoIcuWc@2&7 z#2$?SmrcYjgS70A(#DQ9$QvNcW1_w+Pw+pUHq#Tx!f6bTTMeqk& zIO~FY?V}U8Z=Bepww9s$Viy|9tXz0UCT{xn`DnCt>&7N`qpM*!0&RRhEhR)F_X11< z)sEJ064Y0v)xS-v|4~r?!EO%$oCN|n)5l^sXmBPhaS_957Z#T2(3E%;pghmVE<3hc zr%bUYK(CRjeepx(G?lRF1ivZRiP|_n)qSMDsOjBK=(;sI!T*!ZWE$+T2)YgbFZR3c|5dT;s0sn#!Y%|Q?ItSYf zLyoc%K+ao;z9M1>a(3MfG-eXMcxkv$4THGkm)W};3D~EE2-utH3D}1R3fQx<`0U+l ztNHBLG6d*l;soe_mOb`3uYLr0oL8R(9_PWS1&;$9G)nsLGwGU2)lK|@j0RDOj!QF6 zPd%p_H1hHmH#X<$m4^4zGA1ngC^+9#zG!zr%K!5e{-I#qM?+cU9o2 zG^B-+1i$}sy5vd)p7d=Ll2ZwD&&I0!57Q|j0u29=PV=6b1qO1joo>l9*59AbQ2gR< zBpZxBA-6=sW#cpqh;=8Ktz%q`#GjB8E8lwZL7coii>3SNhRt}?r>V^Mj;l8(7d4Of zPk8EUmwgUK;)y1$!%htF)jkvwwM{h0XCWH(OSi0fI#GYA75dhxRl4p~2|Gv}@Ii{j zG%XJz7?i{NC8cg97+lN-F|S4t4Bc->3eB(}UFX-*10*DISL3?P63%`~y4}Ad&B_ws z`Jbn;@pG@ny?=r9LZF6W%OT=o{bkE@BIe%Q)QBk4mxEz&#iisCKAbdR<`z<)W7Cax>%pm}E9C(ZLq%1EKW z4WyqwxdL6p`v#hEitU-YEj(}$Y5$)!pPK3I+k@Nx1K+(VAzwa|0JI#;|KuTQ{|qoQ zC_@QY#}Ei;s}c~`Ca8BDSd7+&r2i<_7l&MFF#KsSlnIQSkI3E51P5|=Nb?f!?(5er zf^o;r>Vaj+6Hik?-*rUaeOG4*Z}B4fewogxq88B9b_YTqk0m;O*aCgrmeMg8oL9Y> z=(x=sjChY25iy;*bSyU9m+25VdKTco5vdD-qsI~(4m0h}Bp)Hflp8<{hnRM137EF} z3z*g@3y@~J@Q_B)nC832rd;l3u9*ogT9EX?GgnvrA#J>ombWekJV@5(WuJe}0-;Kt9GL66L zeIEaQN$1uRGn9eHB(9T@T1q*5C*~0|{6hlZV<-^7(iLbB9w^YjOi!ReN{B!McO!uY zvT*_p)-ePc{5}CuA$&8kf@>Dz22lnLqNejAYBb;tzO2UlJJ1N;F4$?mNk`hl2wD~Z z!h0sZaq~3~CzMZ~7(BUw9oW72`^`hbm)3zF`w=^TxERwfX&_~1$wOf0YouFQzXRu) zlCBgx7aGJd(myL-=QE3&=33$D5oF>_cw@B1-$n{q$&ij%aBZ8Yq0+94XkktG*E2zG zBnTYd2`x?S6Y2N})!4P9vjgAhd-#04IRY7RE~-_jc)W+zpb`8C$nTKgSu2nLmJ~or z2@yb&jT1=ts{~$iapVJ~Q$oI{kO(JvXdPq2(sw+Yh1cv#=2=5FZr*W0CC(=${As|{ zfDZ=dfiS20D9y@Jzk&Psc#&m?QY*I2?(=DSlXGHqkL`rRn(sGVULzWGmRMV7&jeUz zAlBaa&`v1nhB~qKy>DVdR+EVruijWAYWQp?nF)VZV47y#CLlI93o~`klZK-4URrp| zEYeV>FLa%#|717$0{#{O3SLM;kO2t`JYqcOMez1~#L@8q#Rx@54E2#J2@4bo9PAM6 zz>y>@@DTlmfRqq{0Cyu$jS?UeClH{{05vHAZncjD0$94BG9@59P@sXC9;i=g@XrZ= zU3F>jAQphTdC+&c6~6mpgw+Glcx|!W{AJtEzmZX7Q5&OTH3!1Z6LvP{4H$U|D^!8+G>FYtSo^B;ent58fbxCQbGVVp8h7=$;5#v@Gwohf)Jxv z1}gs#2*}Kv!h}cYviCECl!^|bov?*B3X7YLB9DJfm)`tw2{ zjzlfaV3h21+#4&o&jL*@amDdSlVb;yxaFj~vzrGppD+l52Hxtp?k-V%3N+?vR@50!Nl$RB}HY7z%ITu zrDY&9Yd`VWhDr&cz#`(YH!|@|(^hZN$VLH0^O<4fvviHF%=T^k|}F z;^?ASSu{~8AzO&Q)$IXwiP*ZZ|q`D6P2^slkVny7sq3N`1knFDV(P zpW@S($%N^xIvhf65EquyZhZO@BUNY6$=nO*WM=F?L=?_&Oi*a~ ziYyV%`Ot<3XaXc?@VNvG;Z~~@>4Ya<$btkH>f^``GI7K9;X@=?IroA$<@fx@4LgaNl~rF{fC}&a8gl z;+j^7XVpuL?q>}$lk$ouAY<1DvY#o=cEHEfz8=25C3L5qVVfE{=aO7CFW7p6GOtYG zfvIgwl?_W0$K8O;Nc;XB^qfv5E!TOeur!>kb!rA!+BUXD*Wz`9Gw*xnxf)UYzy08J zL6Bw^^8oK1I!)M_2jbfg|5O3XNgx9ZPFV|tvz(q?yo5eMfL1n+Z#dukwrd%D!!6rT z<6f)8GtS`~*>F;t$FFKZFr4q^shnwP;AO_98E1A%{mVqseyEz4h;gWz#hnF>Z$wkY%d?{3Dkl^?UOQ0YgncpSOeYXyn%mK#yq7+y&l>ySruR4NEn+8NTJNX2BBInyq8cQN32u!J`3v@4_3zUhY3xvBBG=XsMf-aEdH0C=W z8r0PD)!^@z)fA;bF4e6&KcnzO}(J0|pJWBG#A0)iXPc)s;$7qRE zUetvK+YO^lYkKQ0(aUyz)Kp_X=lPbtHxA5x$t`}F^ThOr;C>@Y7F_FOt=`}Bp<8~h z?9Bldi(;gt8kG`FYkDnQqP-@*gx%V${CrDqg9G(b+lD9PIP~<|)^}Rc+JO#Q=`~I+ zKLqzWTT(8bUtfHc#7B0J_ zjN6Yh&t-N8hjSvzDaNg3*$;hd*LB6@H#Dr$Z>tVEZ8$VczM*1sVxq$*_MY+5o>0n( zdDqY|J#&0`qn8ep)>I5nOw4=DXnB*x9#y-pGv--C!^+F!t!E_^I`_}@YCdFHRFqzy zuGw>@tQTjq^XwYVwm=q(Stwu8bJA&yvR4b&*Rh~{SL(Wn11g8tA52JmDHo?%_*mKB zq|vZA<6bxCva79eFxU4$7kmEsLoq!e%3Sson<)qF6TXdH?RzAY>ucpx5@VSi_1wDQ zdd04W4v8BjDNmN&i|x0uBEZJEb=T3)%~~?P$D(>9TKoD%q%12Pso*R5jI;dBl9%mU zx?YISu)dWU!>DT*TspXP`7q+|ie6H_SpY4vyGN+lPa+;y7-!pp(wI#PZ%KP0q zen2DB%BicRhZ|{ettjcmf+WrYW-rv+!cy*L@Zs8lPPr(9;m0__C`$XI);C z<{10nG_9T@Er(MbM#rv<{NgjY#lVXKnzvcYw^^HM3_MI)`+kd3_uR8RpqGF{x_v-O zowhS7@99okbFIiGXn~>axeO~K=guDE004E#GPcJ~gZ$w9W&XSU53Wy6)joF5GN??i~`@pyhC)sHQxom-EiFIh9Y8cg-zI$aQHbGwxrY z7{DqWpjBZPT)BU%^5a2vCZ9_W`{fKAFr{=VV{XGB2cPt2gOU$s-N~~noork)?TlxP z^9l0LRgIT#v{{y6b@JsE&Q!+shVzcNVy|+pcw995q*8i{$&7Kg9i4ZKYEQ_0Q>7q( zJ6>0GSMB7YQC&-XE1taA{wPDMc4g5hF3uf$R5O+FxM7fs&*|=g0Kc=9r>;#W?LJOw4KY?VC?{@12O zE=^bOzgN`9yjYP(#=`2qPR>)gwU{aLcr%iBd_v+Fi?+#)j%?W@L{p9Qa* zgO~9&b?t-mZZ&CB1BvPJsG=MhWI)9lhDMhM`O4d!%P?@&{u)4yYRv6}-^hLE(anp8 z`(Euly6eU@Hhj8=>qFuCm$L>&xzgMou7CM|!rE-SZY*G!zf-^Bes#9&H9TyXo>`Nx zQxGdOKP2n%+nA_Z^WxKk(|MS6?t5u%f-=13W^Qj6k;$i8$9zO729-u+4ap)Kkn`eY z9tsH7YTJtJLetO_sV(jgs)v&`!K+oWx>*87;WS2vTd{%8YaY?Pzv{)Kal~{w_Y0&7 zQ+rb|mdOMQ(syZTnGo9Vw6shp{2o%Cl;$_}!MyRG^cJU(RlNbhUo#V}EJijb7^o&h zRCw)4s9508b@P<1@ZPI^2y962qou8B>HUJVA@^XdKVIvH`Zn-8-k5y3OejX9H(BD{ zUN^F2%fM@RS$9Z{Xyx>NWK9_A+tTXC@#~L&VRY{YvM8qYee0xRU5a=^jc5~(_`a>M zJ&!nZ*@<`_vE}$aCKU09$f37FH$TTqW1~%llX&Uf2B#bKt`&$e9mCRpC~tE)A*!4zrR zp19hs?>@U+rF7m6RSB!=CJXX^DSfGWR8PlQypy!cTlvd<4rm4E)aEW1O8S%OuL`d$ zPEO1{+=E>=ZTIQlokj~)bHFU!ACscfCK30t3HH zVlDJhB>Rn#;EPxnd{zJio8HtA~ zxh+`;K@#GhSwn34c*s(a0V}EGnQ;k;tQQu$XR7OCfSDdwkUkcY#14T68(lc8fnd>)X4CLe})A;98@nBOEj%-VA$m ztfCr*g;?ss#t}l^Vg$ioN*{RtaGx4M|M|JL=-$6MO}zhJI30gqHXj|x7U4F-?T3tIXUE&Y|2Zi2LzOA5L{tTyd(fLYFmA`+O~XlZv^`U)={ zyD4C!pS#g27t$bfLarnZ;gS!@4m%A7FMW`fX42B`wDfI~Mo$n3n>TyZj_vfu8}RW~ z6a2eJTlqbKUe4i$#P*=uOD&n;i`@MXB4<3k^BB1bhT8%wkMK^ z7V5_|ed$bMiiKjoq*Gin1Sqs0$Q;6Xk3(jG?UUMlJf@*ErrT+Z-q09%(HJQ?2pIXc zjS!M-BUha4>*RzN)h@=d*EUap+Ap9zh+oUCLQZK0AJpA@Vgi~B93Lo%Z<|N>U*#*( z1YePReAN|TBq7IINQpvZV1J?+CUZBU^v7goi@UDkC{qUGQMi9v6_4#?=l3;YbGVf~ zu`I#}J-HBTf-%a*-DhLN`6zMOiOXfX$#8T*qh4pwJ^|ItK`u}KC`SZj`j3EUU?33r zJ07SZDDDUfIcN9gyjJ45Z(EN9zCB{oSRSL{m+7b@ow3SgiwJW=9roti<`4e5OjB(K z?DHmt7K^JBb3Yg2R-!PByH!?r(G%hoMCR04-hL5%1{JPW)2KYc^nS$9ydsTG^`kOE zhR&7PP3Vl!5Z$|HKMs1x6Qm++dtxP3!XC!sVF_{>!2xTxZhn*WF!7t*I%l>%krUN_>g^5$bji;|3m@KrM+ z_Y@7o?@RBr|43nm`uP2c3Mv2W`OQJl1lVVVyap`tTztoNXj00Wb)tK_tg+==xql@+ zgY(J-KX2mJ*&V+zy}bb2q?+S3G53FvHaN1CXmA+Ns&V9GgWi8`IE z_quQ^KWh|%PZb;kZ}W*0bzkKv6yTorr=^XLpZ3U&Cl2|0+r+_IEAuV=S}i3yl&UK` zIVL44Hr>~nkB<`azC+Mu3wcb;9Y+L5PPr+R^sSPpv#>YxlQjf(un1g-TuSt}+^|A~ z`Tir()2a{j*-Ka-H3RXDOw&WeFrRMxF#NwDV*3q&7FuHk$g}nfce~tBjv!>8CEX0aBICh>p=H}m|Ki;=TU*D;2? zevkLiySLi3a?aRgN9mSvdYY$8xuIituNcSTJGW)yo2s7}$7TsH5+!V&4uT6Z$D(nF zjWjYH#2k{0ha`9F`hcA#lHjm!R4&uBF9kd9`A8wjGx+|idS1V$6LVJ(q+e!(mHU4s zNdGM&EQI02K2JS!Q18$iVgt`(V9F8_W}glQ&x=G68<>MBH$)Q~%<8)>-0B5>b3l6E zm|S-wacknbH1O7q1H=Z~`h&Ml49xuinwsCRg==I*al z8Y$$xm-GYA;m}l4o{|nCm-K(3pfM(@t1p_R$8-%7W?pwZh;)S-J&jA}_QHks53)5r zV_o1FofvtD#L^3VCb@|?lQAa0&p2uFD#@qW$Gt7CuC~Qf;V%!?0*3F8JszY_3;cygOOk5D%+x?hsoXYwsE>K`>R_Y7s|wBjF0XPOG6|BMhA z|J~)0qp22O`p*`un>QD2>AQhe%wqTT7tjomkiTP*j)}m(_aWW7VnTtt(R>Ti4FZxN z5F8?bfH4;CEB*ZiemT)_h30w$2{4(@OK(N-GsO@{mXbiSdS4AglPQgBbM zL#bC=^^7WObO3MM*LgP{$D^=6@C4X4n>=C=yaHUa>pclhf2LqLf0VanVm{L}Vi&Ps zzZc+sD`LU_T7fosX~7Z+XGAdY7#1ryFN>JDPsvCjP9;8C>4s4?Y~;gbEmR0=7T=2?h*|<}0a4$GI zx+RvMxyuuR=1-9WOJI~Sfpo|%lc4Rr+=<7RpQfLHetnd@>A{CWmxwROTJl6n!_~PC zZt9vAr*B*RcT02>7DspHWTU4C_iBRAPrWAH@x2Ii#}B!9uo<}&>?1jr$X+xR+_{R9 z{S7sl-9+{mALuqiE|Na)Ee?JD7NzYWkt*JOXsSTtKx6q& zSe1b^RW=;stCA8T7e*Whs<0OJBdRE}E8S{u@OVvAfF*Z|SO1f1!mW6`ZZ@_n>=9&I z%vbGRiq|yvZ9EDqz|V=jhYWNz%Nar0TczapF;-{rKuV5)%RW4i$6rWekSNM6qHx_G z6+G6GSAg1pUANZMvUd?mu++!B7~k3a13DS^_&`Yvf9Ut(N z7##aLh8XKBY777C0(huO&EQ!h>_#1efxmj7x?gm1#ybV8C+8fM2O2V8zd`-K))IXD zI-0=tI|a_aK=i4zJo>1I*@4fkMFt>amJ(w+jGds;Sntw#0)KTg8)4XFL*k?25Z8&h zqsdD%U;a=5?xj2-Xs*?^K!Itx(~$I19xU`G2cItrb{I;GTPGgDS!%tM7GC5{uVuGT(5sz2GDeym!R}PIAhtA7{&dUm#5097A5Qqyrz@aEE@BlA_fb+YBz&8M< zeiZ$8F?ircp;X3LwQo?IZkhL7<9bu2!V8+YJK~YuT#4O+k084}CU$Eb3jS1}>{bX( z!21ocTlR8={pjL6o)s?#Pc`ckPuZV_1~h@#(4e6a7TR|b8`g}6YaMo!4dY+VpbLbl zH(y{VU7$qsb-uu7d-DZI>P&8s1;)t25(y#6FdnLBFbUnlL!u|T_c?jT0wWosPean1 zyeYyb$CGLVQBZKTb}aCv3Q|J;P(g;GJI=sESK0d(xfA7hoFewitP`8``qlFQu`~FP99dwZ%ExB6GNCqG4 zhIt3Owu6txInw;;T(Y^L#&qY3%j3fzrotXK;LGX7wJp95Tt+Mq$= zW1VQISepzuHQ3b=pDUDDspheP)}LEb`% zT>n)<$on$sS)Oabf#T#bluz@{LL*s8^{gr12QoLPlb)3(106_&0(%|#e-a5Qv;LeA z$NEj(&r!@bKvFI$(4@GL_f#yglqPcZ8B0;~qp9+iyugB0k+h?!B2AuPA*z&-Hz9s1 zBqf9wmhR5P%O}Jcls5?&k>y>)EKJC)ORqQE{`@Z%_@)L!b zpXOgq-+Z<`(y;yRayZkBrUV*~IM*zkw!zv!w%0r_i*@#9pI9nl{)uSo7e#lA0jiEd zNou~>s%20Fs|A~g@$DEJlOfuFCU2l*3_aHlBY|bOr3)&et7;0%r+tMlOf|k^FW`ud zeKghHJOkgD2juM(zwsl!!#Kkhhuyak$0sW>P48&pt`2%F?awR@_==+o$(cs1qm}V; z6f6cE*8ACXSgd<^0!YD%qr=+eg##f4tM(J_ssxs|5gisK8Vd`zq6vdx15H>;2wfO! zAx)S}99@`M4ow(*?`gu^3l6ax@dY+JKLt^^ixuP0j&C<8#DQH|ibsZ#$Y?Q271~cl zeF?r^(Nuf;jH?+tU$F~cVe>N@0Zq*>?liup@iyZ8WF;D3#wKW94)qhrt&NP?=i1d7 z83iw;(DpH{E{Y%8^{^e$oUyYFQw4BirG?UX7QmMf_dvD zlU9>CE_m^!yj|p%D)~=r&tFKOdX`QVRys0-DD~?kRhe^2(0qqpt8A+gG}6YHA;d^C z-)t0hwC+nZOPf1F$UpA~VuOQ&`z2K@DjtT;;+QQx1&}2h2cTJD__$Ss9<2**y>ttp z_3y$HNj@_al{|M&6IP1q?NW^5F`qN)G~D|#^b(I+KO_^Cl#kY6WbAt`g?7l_9vmzi zM*{%<5C8x#g8~!)aH9Y~xC7FL0>Dz_0f^c;?H|t!9Cp5C@ZCB}2Rx;4N*u2I%)+lV z9+nsTeGhb5ix!p4mp@?^AK~Kj1l9ptM7vT`)sU6T7<=H)NP@_XuAdYXp=UCGtI{u0 zLqQ{X%?Gm`m`IaH75H5o<>I>C{-g;$XVkR!S-XS5iy2*GNti2rRkXQOuYDn&qi4K6 zpIC65#}N_EU>f@`#ixSGSVzC-l({&48^($AQ{zk#X0_BzjfOySC1EWRU;>^u#|wIn=r>N>vTv>I@L#XeufH6)wHJAoti5 zNKR?>CDii(oEY4|X`OTsy{Rt^Y@*?o%`i87*a##h!}TtwGvm;x_HD%X$>@5{sxo{~ z1$~(4g&jXCd_T$tZrw;t#uuTQ_9mQxOFx~W6uM@N?(|!N&KsixJm~F*GL|C`Pesm6 z-Ma}UtyTD7A?G~f2^Z}?q;2&OgR4`mB{l@{?F-RDNuk4B3F49F$#B`o=_rMGnlxN| zs(D#T5UY-{fvZ|l69}l8sb}EARA=K7VzNzYh97yit`yGC`wF+BloW`KenX8u z+wj4sw-M7y6{@~FZtLQKYhH1`c^{b*1K0FJ;^|RYc)O@+X6llfiy2XMc)O%*tB1`~ zQNR6hB<@*kdcAez;eQ-${ppHZ-Yu_MKgmNRI@Wzy$H=%Cg9CaQqY@(3>wNrSIk>z9BGt}%{6&fx zZx4}bE*pQ3@`uJlq`JnzADllb=Ecj&ihV7Yw@hWlBeCs1ja%FzE|u+W<-&&5{>XEV zF8f2OrG$qqJN>-jtq8N>(5iYItPgU=FI8!DvVP0OG0{3vda7_j#t;CGLTufUGNB}P z%p^A12Ix8;ub1UTjlaT+84^#O@WAjWsN z&1XD#1ToL(VvOlxLg`|1=wjf{PkvJj3}k9b`Sn;4V*inA*C)5BGyE>t`(SeC5*?*FhVRnry5|Fn==c@$4T}jU6{#s)AS$ zaXt9J(MOWRQXnkHGH|?}wI*oM7O06wxIyJ-vIeAqKpeaQnh~HsMB*EWkM$W&t7*Gb z7J)&b981ukOE~yn&y{KLaT;iz&9LC-1_mToMDR5_sr|K?MS?Qe?1kL-j=d!CfU!$F z+8q~>m<(n)py8;*H`$gYvP%AZWoP&d_s`&)OyXC?9fW%=$VPTeD}oMd)N}Bpz%Khx zvPM9eGdX5tp|}PWv8SRnaH^=ID;ceWR42JR?sF3fyCg|V;Ke8BN2Sw9Q zSKHBx3Ny%eV{h{r-Jw|y0*2)t&nOg}i!%etE)o!Ri^F}~7ZV0iMQ;yk6n5fhUg#{H zCii{NJZxc7Ab-ZK}eip zy$g4py2Wt9^6M@0f^e&UT|wz$IMhs`Qli7<6-Z1NSv5x8wP<}x2xyP? zL?6!A{HnVkBNisWQKItV*?zOC+}669n5l%V^~QTY9qp>Hbrgx;-f{btg0cXUOGP-) zzL5`~m|OV{@1Z$%O@43wToRJavQ zl)Dj4)aBZ-G*MfwPZj~^b=^5o)Z3Pg_Kivbc2yCUkVO@1J6 zj0zCpP|8D&s=;4EiD5)IFnAs#$nj*xH};~7mt8ijjxYB<{LtF&>D@I`dD92v@eW@|Dr1cwK1q1dJWBczFkE}nT1yi7>MskcgpIjI78>GKff;w1QcDX% z&+7A@t$G`=9J!@GdF3YKSBc;P$}#-p&A*fAa_tQoyl^X;PAMTYL%_0!z!1McR5w(F zPZPOZhEMXT{xY9JJ#H1WGD^zdLV%7-m6bZJz+CZnB1qcKDNPlwNF1r`c+_oDp;94w zG!OjXg#DmCV-5JO&73Ukj}w7415OJb2uB{25lT9>6?dDvSEZqmyqiaM{h?Oac2Baa zT&^z691?+J17UT|97kG%rNiM+`b@Hok?ID0a~J8GTP{J@oRda&=l?w-)EP7_!mR{a zz-a}(7SNpqTA1Ysw2+CT8H%+~V5pQ3fua6M5oB1ob?I;nms;YInVY6ilQ+F-pSF?b z`=dAx43Jpu%o|kR-5@I`Y&?bx=NDbQJ26)$mAK`hOuwZ2n~CR9rA1eX=l4xt3kTIb zi08G}!lL;-;(2e4&7ym!6VHFqafdVOa>VoZ-Qm)W2J!rFia>#lR|#*+Qk?Ks3{M<{ zLJS;X`Wb>g+8~-DXsfv4M1~~$rl&Y_SY$+E`4dj8g#u1yIbZ@xG@OaxbAn9{(3BGW zFCsw86UZ7E5?TwNI=iZu;e(P{6)xy}$c`(pV8~G+Q{v{EO!!-)@9yOIP_aw| ze|x+by#9I}j_;qCKq4tmBE%p~aPBiR93f^cffgVj{=Z59FFo@OAR8x88m<@#ln%E7 zrSZ3R4lS=iEEje~$k{4@vxQ?WjGYE_{LEOo;{z+7GfcE`_R zeWp2Vf_9=wOvXA7L4YUw$08uk_`Jm?`|pc@s|tKA-oO$3I>Q9P5Aq%WYa6q5|lM_x5<2Lccp+^W==Qq0-G=4Y5 zlfX9ijICwtr)kLTUC!lYaWh)|v=0>yhf6NSJ5h(d6SPSVPKLYU-X5-YPbjIs67J!t zJKf=K1Fw>{oQ)f=lIFcH)s8bqqa}f9H9FM|)RmV_*$?3=#q&2fJZ=rx42Kk?aG*8! z)evD0am3-#!*)7ct7x2yBJ;n9fVEHn$t*{pgS(MHhqVlv4*wQ{j9FfI`wAQZt&+JD zuDTkig41)JDtvr9wOdCf(Zs1MwDIO4;q>K}aHGtcc%g0vcp-*(;c2MH#3krmQsfep z$t`=0eQ39Svw&jOOd3U)pc3l^IQohti6J9B;nqt&enn!_Q>qeL$qPRT?P|(m5-NC{ zU_a^3-tEx%QZABEF=!nT2g`-iw&_FTJGc`^*MCk#xRpQz93bFp0sUB@g;@^RgVI7K zj-~}`Ay|;oA|*ti#aae3Go{7fD8hO;d4bY=(7LsZi#y&$qoeO0U{2P;b93Q-TkvE~ zm%rv2$p!GA+i(gN{S%P8@w#o*b<{5RCeNqfH(^SdNN|bT9O9CDv%tAbqRh;F;1aP5 z*d^t2*TNZCA>xLuh48N~Jc{yJ|AGP(zGm)+|DBN@O#+Qw8l2@#!f$F!OWOulazI%$ zSmQxQE0w8Do^Z?+ltsEtYgr$2)7bw0WTX+ z7OY4kB4FURi9u1LF&$h0{*?m1xG{LsoRE~9A+ZpVjJ-r6Ddq(Q_^dl-hDwyn*bm++ zp@WXiK^!f(^mMgI7`;6Hc=9eds;)``(2O16uZ`rdNy2}npon|03&+~6Vi9moeliIQ z5_7>{({|tjyYOZ&6Tn-~E{aJxZPg$dgD!o6MX32ClyV5Ns(xo)RKJ z{<{j`KEf(7@_~DFZCm)ZR!Qtt-FLHC!JYU5c=+^hbWT4Zu%b-3RRaDrCeRswGJ?** zUq{^^N9?RS7cN|Qyd)nP#OlUDo}Gb}_R#tG`Ehe3aAElz66vW!jyh#U^7NH%CvEjO#4lmC$$Zy_=)fm?*|}Ey|dalr6HyMpIwe==02%Lfd3_ zzgl{U+iT9D!Qy)_-W*|JuA+SB-|Jt5DZC1@L+iO+@p17gXBU&UCmUV04 zSN+w42F8sywd#9vW8jD>-dnGk&gkp(!Lc&KLCJVnnC-D;cRgeMl~l)@2KL!EM|t9~ z`2iqRD0Sl3{pR=X_uZ>{b5Mo$(IVqH{_u0(M+atmxQO(Uh1$J0EYbUvcz(fn;N4qw ziR2dJNtv2-y7sSac-G$Ca`K!t zypG6O)4T1+T`QNnC$d~>dIoXaU1s-i9CB=349YCO_2L|Kna$-$UZ^ijFwHh)Iz3eO z;&QpQ;i2iOg&D(gy*du16csJ@FVMQZaOa$)gk=AyB(4$j31_>_w?R{Kz1YodF^M&^ z7|I#1_9h8&J~_{B=4>-8h(B0xynJe|SL>m(MMWB^^}!EL2|?|aLv}?)+cOK!rwtZf zA0}T>@hKs3r%c?D^P`7eGc`%gFn4m$T3ALHj> z>a-@UEt*rUtnB<;T-&zN>`;E4Z@c8PjK*tb4!44BqP(9KeQ-Ke5zQTcv$?8)5uR{1 zZEz`PZ|D-O>PJc$*7eT!cAxt0)TNd``$UOFTf1k)fC~+$YL{?A(mbQ{Y}+NnGv*|$ zn^`KR?GxBjcdCA|ssDCI_WD;fb*1_*>zv9ZLo((R9-5%(zGGE>om%~3eJIYmam&GS zd4AoL`o%i_+nonVJe;t7e*XIx33~Zsz8(2Ccf*`71CPYnapE^;%t_oSV)^#DT6CVS zxqr_wk#FpDmDpjXlKHa&IHxM-ziT+nsdcTc$jskxFR^zgJme^wacJM{ZN=7$trAN* z1~+re{R;M*_XW{)in(yrt4SrFubmg;ngbX4%m)t)=o>iALYHtxyW$W zwW13PhU~~|V#LLDI?cGT-C4Qsy{&SRh1Pm+_s>y!*_BXpKkxd}xPtme&a1wU`L_7Z z`m=Z5TSqN_RJ6kJRE0K_6-xF?nm0L%7KdQf)k$du)e6@K@Ufumi z4(0Rl8;e`(8Bv#_S6s;L7cXBgDB9F8$PtRPRoST)wJ!=sb?jMdtDP0!GzPt}m@xB5 zT!D^lsN?I|jZTl{(+aGm!V6~jKR)kh(wKHIDsMwp!Kh0jaUa;Ki3$fB+e(rUT`v1% z;!HapUAxnF`E`ZXi*=p0_&q-FJZQz%CdPTAd|)!jWgW`IJ*+nFxM0+^O(@kpD(}r& zz_GrUL4TClpo=nn41{qet3WwhMEsa1GrX*BWO7~iW6f)WBS(A4?gy3QXK``m7# zQe3FKI9g;5hku`4Gb-X*ga5fQ_Kc#k_m%n4VdC}99O~SHhwlNfptU`Ie{9ezt57-#^@NJ3dgfE}>+V-O z!(XT15!s6Z_q7ze&vuns3f7M_J`?5z2V4aV<4Pv559hb|5u%rh){kPV@GEF{YEL5y|S- z?q_%_e;NRNSncG5j|*U$EKV%Wd}MEts;YJh#xyNXtTiv}O}^uMP@sWZc%dFONjT*o z6U>G)J!rWHm|501!I2&cS#oPaJwNlgH9-KNtTmy~AFVzkG%c;h{{DCwlFQYYZSTMJ zT}^WUT+cP{aY5tbtNGHKW4MNDSd-~7r#teUXX7&%P}0n%?&f>w9&~MNYdbUs0|_jf z(7V2_0v`z2WF4xwGCwcF98YS3+#Q5sq8@tVV;kWb^rRp>BoIxaXHx2ECBHjEld8_3Nrhw3>_Lin#Rv3rFNia#6hRGaUUaKEL$wmm z2(wnfLoZ^TWCAV6#=oO;!>JlEYrphlJO`pD*bx7u?bNT0fT5RPRdTch=H zP@0H0Tm!q09{e)2SXJMk=Tx8+aV@7cV6ttuR_M)j*-M2g#5<&g6WIIFTDixN!|)d= zhn2`u%S{KNq}$D8lGL|AT6m-{2_2G^esSpEvT!$J!2hP5PbWYSb$h+uUJQh_f-TH! zaDFv~&-iy2saBA%1dT%_tkRKm;nl#7S1=`Zjp)o}#4L+GDl$z!b`Z0itrrt2;-1@p zmxR14;aXuqXzmGYv7Z##*EjKzBG!DQ8|Wsu?I07!Gl6)4G)saq0kBR95g-GHQIG){ z_*`5x1XP^nT?vVo0@qpM;JP;Bx zy+KTzIwiat(OR{(k%X{ALfnjqE}+$2RgAAqU$Aul(|~|=oJGb}>Q*j40S?5WrcCBx!@yC z4GTzW2z-c!tc4Xx4MY%)UGrPd%ft<9%avsrUF5@Wp^+JQ*zY6;R&_;z%6df%jD)QT z!^X*T_10&|q;4b@aVn^;UL_S4?Bv=xTnZ~(ArN)~l~CfK@6PDZgVcxSLbH<|cFTHI z2nn)V%(?Tly($w#M2Gsw%uKjVH&Ou98(Lf8BU^M*U1tl=%lIW?jNzWL6)B9Z&CD57 zlO04vk35rr0NAmGAfTa4yv+rX-14PVkD{so#Gq7 z*t5-Xj>2sb;x{1FOSr95WEp(@V3dq+F>g)9#>^vHYIsk{EjR)cM}Yyp+tjn)W%^C(Xw-JX$v(UF)EAAVndMGg30uw= zY@InM5G9Qw5(PvNC+FsB_)eOnai|3j5piP+YV0ytg@b@yg#%BFU|mYLu5*P@46pi& zMtgdr?FU-h)6pzuT`je7B{chL3UmA?YO6?Sb`+hgp4~vB3(d|(jTWBuxR4KiN0$4o2X0|F}Ms6Ssk9IcNtSR884>kCC@Tunz?4tKhi9kP28L*vxTARME+)T?IRd zM6eBHX3of^4L#c+TE$n&z35jqUtC2{}RFCbMQg$xWqR;T#2 zFQ5_S&1jRhY#BnMdHR#&Vz3QE-0PFalNs-{ZDev11Znv}{WbNQ5B1VM-49(NMBL*W zrFfpt_&q%OEhuYIUIjatW87i*s}tyQMzM#M=m<_Q;r4AE@X^Qn-g!Lbc|YNgvJDkv zG{E=F()r{(P4z!}t!&h$4qr-Z5#kR(gl4bs%w5T=trG0Uce&t`!jIfKblyBR-PbVR zck7`x-VJgKj=X(1H~bkOLp34z@gwZcC=bCi;rgY|XGFt`_aGJ}a`2EVZ0q2K;~B3y zn51E!9^!*W4KhN2!3ThZ3P?Dkx)t_(uzc}+*vWZv4UKDL)+-yS47Sb>rb!`w8v3Mb zyJAh;l@Tsi2>`YZ>e{rF$S6L2sc@fOsp~jYKHg%EnXk#>cP6$Gbk_5JbbD3P=2%N1 zFn{)0C9<|En^Nr2Pj%Pia?*n-@b1IkYQ3Vj?zYRP)804xAm;r3n_jnNx(-odo4b$X zNFT`o8FaVA-B2|t^dFiJKUL#L!ty}LJidRE!F;~uyK5*;dn={xGCZU&% z)i;&zA{LC?@Je~&EC&^0-GZ4l7l&L_3nU)28TGd6NBN9KTz>|udb@_LsP?fU4jlLV zVeYlol?$=wt$ltpuUpkfYkT=cTlIy5G$;@hG$`O{DU^sSBWO?z*PW6=X`2=PYJ6jX-mN?3;!9OQN;Pr8BRCVNTyO9SK1Wl&WF<-V;g<>6Bo<3|3YHY7c$^WFc0^i zLB;hg=DPXOM8z)&l{L|~4st*d!U(??AY#g;!5;Q-MXunbWhy%VwA$9;e+=e6%hjSxRS)_W@xoJ?2LjD!I1d(--RzW+${2 z2&cD_F>P+a=UhZ|ChlKc!EPX$0KO1km1%jxuE^o3+1QN9A@Utvu>BM*g48c{om2?l z%)DHWYkqapvHSab?Yx6m6Y6cZznWHj@iw7i9-kku!}z8;(R*~-)^lbwqSem-3DHu) zw-Vk@&yUP`dl9d;2p&(@pS9FyXwfTz!E??$n3@bH1fKl)i)V2=R3KN1|~^FSu` zULGm0*NjINxs9jLPX3E(wulc*%`Zj;6O?0>;f=NRip1N(2_p-<%0&!!OJ<@z?k9nV78czX6+ zsG@jnc1ARuDt?Vp)65UTv4#qq0)@H){gW&;Y7 znN*k*T7rw#AHcO(u$UdLBE=kVZY}1bKpPc|SDmf@aiT+=Vff^O4Mfz1{bGD|8K3;5 zSD^gHY`kdUgwd{9Le1V=m%-2z_Y3v|?@9V;f&2BSe#M>03K z^HGev`>=~R*speVZf!{`$#d*OD3|S{a#Pgh<|GP?_lrTxV-8Rzmpl7S2%{wg?;^j&{CXlfhJ`Yzxmm z(g6*VS))dLW-|Qp%lMDFtB;>N^%_>J?c9OK+nry3LE?%Qb7!E85l{6+C> zFjLbdd|n4k95V(j-(3rm7^9Gf`OmKpFRMxj5LVO4ZyLoeLf6e|T|EnZ`hJ(f0Akpp2+eM{>tGk@2T4 za2YiC{5R*!9#oM5Iet1gZeKbX42yoS(si!(r7E3EuYP8~oJa;k@wed8iyG8W-M(N2 z#)F=ZSU*KE+O(MD4KbcC1SxCcGq}WU=qX=zQbEeQE3O5wQVXvHblz{w`gClL_2ivt zWfk|R0`R++FzO#Vl00m0$q3rV-4eH$uEr`w+~tZ@d~NlR2Imz`AGv zt5KMLMv>$|rI*P&Ar8tZ%zuv{^K3quA7FI7p3%_t`H6;Z;4m7x(Ua)tmeJ82rlad2 zHN!cxo*#(oK+x1=njl?gu^=d54elw6+0Ea1bBD2*-H$JS$cPfNdw$`vl-+41*y=7} zXJDl#VK@8cs|)M_V%$GmRw|YgQ{;)h|D*nz_=)eBnJL3pWZ#(^V4)D_GkF(oM_t^%+N>^9nM1_!6uIq)1(U zqhwr0;4^(Tv~RvSDe?Sc@=`(if@#UYGI)jHf~LPxapTmzV$m7)QW1L2(~gj;>*~^< zm5MLQ;G5G051{ySzw4OsVuhHmQl_dW5+y=*N+j(36TeYC`BE$M0$Z<_^&y!Xh98%Z zb6MeaW!R!Jx(?-l0t@hWFXHd7`)$R|Y#EQA7z!8kNgeT+JY)PDe&ffr0`OOrki6B4 zcq)=_T$u@@{jv+(b^5aveusb?pd<^L;3sJf^9+W~&c)|%Z@{|Tz@Lu^jbuTf z=#tN4nRr6zo+Y1@y7#33J!h$a3v6$xfMPkRfP2bBK3~a(QO$(+a5(-J6A6TR#*@UbffcW9i) zr{NU&+xbsQTu9Cc`nwx;?jt6;mj#acNKCXdXqxOgYy9e#rD?p0*S5*{^E7Gkw&242QjCxol;Kz z{xs2BXrgx)8E&kp9fnH%dh~@LInhu*ijR3maUTQ4rLzZ&m|E0len-cymjf5IK zfG^pTGe_3{92t2LnhBFO>ydE*oV+TpU&b{F?i8gpc%+14v^$N0jZe#tMHJg&@lpLm z#B*~p(2NP^G(T<-y6&bnP!vxk`3Z$vX2GwPjri~B!q)v4A z!ATjQ??|vD2Uyz0fhP(?RSo9%rmXUx_NLutl!NS$etCJe!jbNENf*_|-(DQN#qm3D z*Up|t8oxVn>YdG*pfR^%Cp11#Nj7u$act|Q>L02ZV3lAKJ>TB^m$ZHNYjfGojjCx` z1M@cfwr>qAi+Yrn=z3&a=9{Z)m?d$AW7X!Zw_NgW|8D2x_Hk7;efG>=Ya@* z;>(twBl$g{1!U}rUV_;^1GaY_)nHD;L)I`O+5-vkAt~{15saM&0H{oV47G7-sy{i$Ep43BIg>}Pn*?cuI<(}@x8!KV1j1VaeEFxdi&EXPVPFerh!_C}URn7GFKCmaNq zU`;{vV=-_+{)B$WiHe_c+4a#ii<`lCpq-Vmr)v5Ua1UToNd_gvB8u~+BC?_YI3;4Y zGff0DLMkHA?B9vN5g_LD%>gN=j9ZFW35-vhKqBCi~v_XqBQ;)dE_q9_~`fGPY0s$gsI>*H%jA4Z@{Rg#HjsF zfl_)ONNYCs}m#X zq#~Cp<+Mpg`MMaa!QV!pnkJVW%8CL=I0sA(3^dcpBcZOVf{F21{dw0O zXV3?alSywdBRp=GU%y@4IOYWzK&YX8zb(loG)~2udQu59X%g1cB>Vyrl7AxUqo4Op ztAx|H=BJ&$nYK^d&`a0gW4G|*w5~f9){i*a-XA&ofs3QjEuVa&?i zBspjYdT;Z|CALR6#)Xm0BHT60OI4599;s(@fn=G^(A%;FGqZ5MLRe`6tc;}svZAB{ z0?niXRFkCw_BcxgunR-AdWwz7PCudlSZsmcqsU|LkwPlYmqKDjP&y~Cx-I#CzpjDg z|Jt8#N}*0(i=nnCLP|Rckpb}L!r)#f&^OkF z+v~*mT9eU8b;8+?;)FBa?r_uLkyV#*rSg{u_PQ)3qYH^{^0g+V1QJ))at06Px9buV z6E&`q;tR=kNnePIFJy$urh{o>Ak319Ib?7)9YzZQ6Ny#YS*l0^u=aHAF#KHp!7wos_-yKf=86|2wn9|7#2C4*KEy**P%l z%RrJxb?c2}lx;}voO~O+7)iW%@&>s5o)x(PekFlwh?Kyzs#6}g?0=jujdV= zef1$FwhsGx>KZ_9|8615?N{!C&-5s0w)uBu%Z1uL7@KtjII3VLQQs82A2*k%Uwj9= z=|t4eHi8hjn@QA!BP2G^3^bG4;0=3^L<>JFV~G}SD#=nU zhzKn0hyTY(Dbg1(kFt?My?uO%FQ6T@f>%iSF#q#jjQg->+CI@@qa0#{ya%X z2z-P-Nk<58q!vj>2x3gv4w8;Cz(-PoH|#r70%nAiAS>#Bjo_;NoNhlT;9e00Opn7L6Qh14(HI- zQQ(7qB#HbVi?A{VRVgi0l4)8L=Yu^cEwZAdTI_NLqlvX(Mo6^?G?NoaUrr@)lWzkbYsmD6=dIP;#Tr<>3Z-GjQpMFV`WiwsxvY1ts7 ztb!eBG_l9{5PjCs92=xk#E`>2;QVXzu|?{86m`t>k{gG${l95KdC{qd?I8>v)rWU_ zZ>tKGHQI$k6@gcPY3DecV+{K}PJ>i*JPoI!{GKtOrOUPXIAakWX1j1=`*&n-*v>RE zSg50sW!clEF-wTFst{Im=CVJ3WrmY zw!%7rmW|-`&6yjWP6Zu9>pD*6$lPT=5K{$@K^88qoQ90A?P+1`qnK#hJOUC3(m7(~ z@U4puo`UkPC8wg0&;1;3`3Tv&qn6Vk*eDY)*!%-5QFgcSxC|w)%)awbDQ0w#H7a%I z(EwCfD?haGuDqAJ2Hoc5%I8T04d4Wb#aJHatq}`}eZmiuojd;FGZYr@r2-PZkjk6jsWmhRe6kLkTdl`sppjj=UAZ zX{drl+2gkKGVah~Lzxh_7p!L}hx!i<_pUS;+8KbB@(Nntv&GAL@SDbdi`JD{Uiz9J zEk2+kI`bscY*Qf@FEBt$3pQDiNd~qwuQZ}7?eIq`4O~2}T&re1$i^v-5c6HdTpcfdQctJgPB18()}ic)ei)M&nd!yH!EL@t-5Cp7qAb7duMb zeo<8B7xDulzAs!tGGNl~t#D=iExD34p{@?TfedS;OI@KmNP*+jOi|dKl~?(GihSOT zc{zejcV7B;jd|>7Hg}d;D#@hy;^zgXt)Q4pD@Vqpx(}ubM zxZ;dhciX3-Vb&WtDno4?Usz~(U3n~;kVmSAEsBbc_@3hLq-VF)0$e~Lx$rL0{{Q$Y z!yBg#tb^mlNG>kL@TLt zvPEm4U&PdC%+98B_R^?x-6^zA0?c_%$nkW;b2&CB!NwgLEpNO!P5k?b;W?7JfYJL| z8Haq(B;G&gyF|TxEQ-(Mt4@-}!kmzY)z{w< z?YC&TX6nR=;kPCY&C`tBib9oL&+T=8OkWk>#8L=BO^kw z`*3TJl*=};$>BG|$ z?IvNc5go8L{L2dm-P$I;sG4U|h0;QJtqAHxWsfMiRP#p^?xz*Q{ycpq9d}O`TViCCS#5zu848Z zM2km$B*P+}l?<*H$)Z@Epx%QdI*f&%&nGz%6gL7>G!hMwe$0~S@^n;2 zU@%q*NCYa65YQ}pmYV{}XCN@Jj4n_$nJ#dTGhJXlyZx&L@-|NKr3;+!g}^0J4ME_( zLlO-^U^RJwgFFEOGh6VpBkZN(#(*lztv!~XtytUDG{!%m!rE+RYmUz|%W|JjyfU+_ zD;C4l1-%Z*2Fd-jp{6P1J@+(cvhBu79S=39tb%zDPsS`cGTJG%dv($2rpdN?+jPt} zc#dgs8yGZPcf&||i?z#HMe&Dsj<%RmkWcG<4>Me%s6SJ%{J4DLU}@C-sQ> zroxq-uKj}s%f8XKpTD0SFKWqI@z7J!rKB?)Y{#kn{H$R6z&32Z``1Hin_y zX2#%lA9P%LT<{_~UDOr#Ai`7Q)xatxcDjdVS0TsgUA;o3+XiU96`d~ZDm!WH5@|k6 zf4g=~!&!?JaSfcEuU!Z7hgnFk`$xni zhhscLLG*5N*=0cw+@%)gD}ENbkyV_khLZ`b+KdTWECrXP4C_g$r)PTRoL_Q?p_3L` zpx@lOqNJj2$B+<(J@U~HM?PFSnKXvH3Rg(Dn#tJAM*!ORQ69FFryu0Hbo1sMV)S0+ z_u%@0kUCBm$F!q+k*xgbUj5A(%Scy^=^c)r9K6OT2(Hf9-_gCU)%{9lKxOrey9C5j zXZcmNQx86<5aDK_W_OiELU{O@kQgEPBja6_!Y|VfcGlGs#S&gBu%=wC)JZ4w7Ts>$ zOM_8#=wT3Vzs`Votmk? z*3<9!l1PJPT|fBA%!@vQuRL#+h}esuaSgis?6A8#^ODTG+-RqY`Q7txWvfSr8;L&i z8eHbLakjHOJ#){N@+x|JObhS4R$rL;YJU49&dDx4qocvm3-+ARe8o>q8Nuvc&pn-E z$v#p(ly~t}&B;3!JM+f6-{SRVOiOUR++n!VC$^uv_DAD;K?-*m7dKe4-Vy4dZH z*1Ti;9nxkOS}oSzB!E}%(&SqOk1bTYMq0r2tkATgqbUkq5$l+K(H|-!&Wy7h%4al3 z-@VtoA|Fd{=D%mvtMEJAmVZV;+jm^w z2=k)!!l8z&rRr(RUN7EUa(W1$TTnN4#q!?U^LMwma98Bd3-FykR%L`yu$6*ESVq9w z^sz(64X}x@>ArB^CUJh>V`)z?|L2tf8`8&)7&pkq{hRvm8y4#(TCU%vLXhZn?aZI= z+tGfWIrnH+-BV+q_G-BP_Mxr*UghTQ3!gJ1EhlV0SbTLG$VhOj%)Cpx3^~Urb~-a< z&^&jOP0W6y?wxU*X}tYMz~}jVkG4tL;!(_Hv0$uvvxcmzg^Qmw-_uM53)mmu zfEw}T-Fu%2;j#BS-Mzqer3}4y`u+q&40ypbzZ@=y#2h|j7+##-7=A;rzv2H?oQ zwnuvdnduB+`O!K;NF{{meFovERIeY_ohVozCuVuFGX1VyqnOR)jxX4x(%Cr4GD;ci z^2In;G=G89OCdq{h+-Pn$)ZWnR{e0ek`-3y z+i5D|rT>T_snH7c1woo*o`tAxim8w_1uSDpQE7D&e6ADX1~(#Uf$(S$5pHh9+}H6Y^ySQ z=ce+ClwFq<5*>x5PfqjM4$-Vt!2E*DB!`tdMXW@k8q& z`Nf@%%I?4d&3cT2q3KD2!eCq>XGY7F>QyjQ&fo&M>*BFQxtoGrW62T-us1LK9J-wh z7hu9`tnDNVH1%vy`7ymG)VUNFbq#I%EPL&7X%cZ(VsQ}&KeNQ|1X+Nwu1&vN+_>r~ zehuLcC{VyI&moID2(yhd-&`BdLXbGsWRGYC42-+*9qr1=Sy&N$jQfZohRGdo$+aSj zO_V%d7hRsafF`e9O81-cNN$mcN4aHa8(-l`88`V-OK0edPJt3$qaQLv*^4hv(0=(l zgwZdAOi@#}>+G$lBI{NEz;C0w9naulpnEq_Zwjw!gA7lTGRs+h%S;Kt`WJ$Oqf$Nm zh&i1;GM0K*rleDoqNS&zVBaQVl?rAf}d3ar-jVPd`tb{VJEMH zBw9fEhTRS*anb->D#=J3UJU{ySxtk3NY-7|lpb2#7}QQOEvU20nSWE0%;Z3Uz_OIx zWC|wewV8G`@qviPukm;*PqAb%CO#@>yW*t|WCjo?X#;Wg75B-sj-XU)q@!F*-e#4M zSw7qaYgPy)ChOs)$PMxm%wvbBo2o=B9z@WRo0}9sSRDDd@xmamiaIw?!LdwC|=V;TMDuFUA%h1N>`oOaA{Ke1F zBZzhN9M4xZO&a7;DH7k5LKFX04IaFSI3r<@=mMvU;5-ooXOl)6EXdyWJn?!JZ>fH7 zc!h)Exvx6;8^huc+eF|?mol7`s=xliEKf=kZdeeS8@+`nq@8ds%k3$W3azs+)%u!lhiN7_@ED?^ zDY*&dt(EGP;MR6C7nIGXOl(G$B#NFL(g8jiD#Wk2AOJAxR!RU^B{+m)t?Pg@vn1gS zHZI~^+*tC7#@X%wjq@UPWJ2J~@l>k#Z5nOJ5aY!bI7t`tn%yp8rU3cJM{JrESUwca zTl2tbga)mvbgB7zOs|BeyW@BYI@wTVG%;qyHQZ5Ro`gXeg3<3DIteV!$Il>i-FsY< zZ7Qk7;NSI@1%qo5edU+I2yb74vA6g5Zg^=z4p#Smzt^J8Nx%vXulxOmfg?QdGEuIW z0s>#c79ImmY3z9n%l>KtJJ}Obf`K#%b16(n!m1@SuD{nQnbHo!==B8w7?Z+1ciArI zqgA+`-aTd#xI%jZN>?|`4ukatdr{gv>)i7@xSu>l33cVWKC%!NLvgD8N`g<82fG-H z(TzkGAQd5F>(4sDR5o1CA~0SBrn2*e3mb1vy-6F%H7)Qv)D6`;q9RH`K^L zbn;ShbgIli;WCtrk|jsh%kVt*;<1?3|Cp89xE%&)$#(ZTQp|{8zLP%)yr}E`8|T&_qQo|@v~KMP7Cd` z25OC)I6ID;gIuu?@7l=SmAX-e7rYy%(3J!Ip=|g8-#1jg2Gg%Zu(R<-4c!@A=jp^~ zyv2EH?bz9p-&ydxxeLGZt837A&G3gQ98|dFUI7%*9Cvj8QP~}%lH9;YuLw`c8aF$u ziR%8g?;2(@)%{^=E<1|q?g-uO$=kvz`)R+OXun+$O9pzy`Rw$e{#Gt!L@IlE^vFoQ zCQh1K5Nu8?oZH*_futrLPQ<;o?{+Q}5HOPfOi~55xzaHRN7F3qq^!xaAtmie!#RKI zlU#QDU8^%_@M{=%HI+Swr)_P1u=y%ncxmyixn6FX_rTYu@jA+lX~)5(rmrxYyGqE{ zKax~%{Rwzwjup-{cW2QW?$H~RBlAPL@#_&Qw`@i}eU2yaH!f0aQ4-&>h1L*9Z`ev} z$fq}$(;B$P!#1%2A!fC0vz;hDn+(qFn+0>;6n*;Lv6)g7;4f67;67?gL~JlzgY$v=kJF70D-U&-rR&6KCioJ zc`f*!)Obxh7_$s_p3X?!B*T03BX;ZBAva;L$q^Im`&KU1BN{Kb=xW&ChUxora=V)V zd$lT*Nl<*;Hp`1|P7FA`A8fYbd6V1Sl1t!wW8(YY6Jc^5z9S^=wPViE?+GucWnOHN z|B1jt<0Ecqvq7lZY5a)ZB(t~n%7aY&gnx>SYb9@Mi&ZCj^p7rFLR+lx6aJO&YVINrf(cxTG35%joR73GGPs#@85WE z3U+5VBRkIq4e(^+7UZkD}gn;#_t9&SoSFiU=0 zM7bgRKcN0KKs@$Kzu)8R(U#+g(mdydhwG9Hj1X@32DA&$2c`Mgb!R2j-j;A(oxQ>c zKM{HlPPbvyZP{#3Zc7NxIl+o@sh!bU!jZ_*cMWbRE*9mdd*WKq$$OJbEvu_TA6M$@ zz@y#93L^CK-q`}Bjl-{q>Z`P|9n^JZd9}d@hG(GU_P;5tQ9g{O*~Kq3+Xw+6(adPp zMrM#iGd-O>&R8>{K(i>%IL^FJn3Wnf5GqtW3>ysB|9%JfOcb30Q_Pcd2O!Qr>g65Yc6L}-(k7PvyA7~cS4siv$=!F(^IJ>Hx%^1&3!`*$MW4UZ97O~;x-#yvq+1^!zN$(rAyWj0+R+?XcZ z18+M16AfZk$*WA6$tAt<;^F;M;8<}((AfXDA%&bsuzRGXjk5=A>_@ff^t1wYQ~Tpl zC>z`TXq(k!KlFz`*I@5yL5gj}s-2e)8+>4m;u(szlyT@m<)Ma?qL-ECXODd1o zMKIzRd;@!7rZ*3Sg$n=o-L@QVe4%vUkqMNBZX$>cvyd~7)xB_S_PAMiI53&A+Rdz zAQs{{>i30k7~kpR>3y{ikSKdlfPt4q9ZiTHsq@60Q0;>8Mt{cT9EO;ZOKLuh>bD83 z5~KvMPCyaxKEaX@MbO6=R($~mk}!I)uauy2v6SFQ)&B(n^1c`nexJYaJI=rZ`mmK( z+iwwU0P6Lrx+1|2ZSNf9d?gue-ACDHurspddy)f+z!e_HN!7b89b7DjU-#2JI&szT zLtPs*aN7N=7wiEcc%GZ;3lDvc<5E5s2}yoZi%ZlPh?Y6wWXTi%zeD=JzV@DQNvAI^ z_~#}{xHheE#*XQ$0iimtm@G`NAv#lb5Z5CSze8Y^ASD1#N(jJ{l!UTSa6KjAga)`? zOwfc}PZ1;{*HZ-VQLF#~s^tc|OvtjgxJN=(+zFL+Pbb1Ng#b1wRVYrlYTTO+4=bkO z2Qg>G;&A3Eb%ce%3{vQbMc}$m+zUIuBB(T=Z)1l?!7lG^;m(X|g=_`ndiEjY?mGlW zEi%VOQsHSR%-~NvgkNmd)lh&z98ixjz3W8w+e9jxY!nk=Jg1oBUzxsoNOFuoZM-^-;tGE47RYG z2DY8#C=51E4X1t#Hu|?k6gNsmfR7|1z>!iB%o0jOLF?l#NefJKH^ajsiU#JX4d8K# zn~m!>4{#Jw1t!Ol@SvJP5LtbM3(lpm#Vw7|f&e0@VRBml0rA&`;e9>8lCgiSh~rY{ zVUB8nZsFtxfreRV`Nv*pE8zM3%u`F_r>&iyzdp6=u10>)AqzByb_|w_tVl9=RE*cm zBCmOIOm(8thf`VX%gY&=d>56*RXW_+2WIGxxu$>eZQB({IZ08Uqfd!7r zQq2z{!oX3i2RFsAz)@<2pWT^cxevJ`$VRN`@3Tbv+yYV?XLaJWMzoi0L895T3alwS zC^hSw5b+VOG2(51mChFrRbaCs{97ev{S9F(wdAkt`PVd+H~`FA6G)jA?Y;{eV4NY4 zhsqJDW^rfl#ibm)(lBF3Da$gse(hXTJerIxZ0+y3@Xozyd%W6_H_3Jmw6o86(bi3K z$srktLGj)V56HlsB9^?agT^Mp4uIfc0S+nT5;wHn3s#e8ln-#2aqu&9Bvh?%lLHOW{*>N)!s9 z=p9LVTgj_b5L_P9-Wui_KgCmBl!8!X2jh2tP{weGs^eJ+M&ZY85)2JrXv4>ESHV&o z$_!j9@=#w4upRHnkTkZSy)i4rV(v=BguBZa<2R~s+vlp3=o4QUK_l96w&htJA7YfQ zM<&|-H*p;rn$Q#>ng`FU%0_igyyrBh@D|!pN_l>I1rZ=lDtKex6p}3J(d(S>s8F17 zW)m}ulMLSJvr-&0)x_vj&WX1`(+o+l;r%{TS3!BC!YaJrA&yh$M>uB0u}C38mPKif zLPRAc3K7*vArd>DLPU9pLPUiDg-G0$LWH{tSQTr+rICt*hCmWKObQ8>_vba>+Z}ia z4vrJ-#1#;VX*dedq5zjY|F+4~q5wa&B^|%K`fD8j8r7GQ(G^<7kiy3^Sx?1Ru%@T4PPKduG;T$9LS39d5<4~vR6Tq8Gp z6geq*iBh!i`aooFx56;lb}l|DVn=Xj0-RVEor51sH6#W>M-Pu0ylgF+EFXVUO1%ZvRu2RXLyQ((Ih&(*- zBlfyQj_~ZG0iQ~Q#ymVDWoh9u9)=&Fpf|yURN4d&Mrc%j)WqX7EJP(gW^eUJSAUKF zuc^@T0Yv;whF!?<0~ zK0Y@Khd)e;Ps!sHMx3kt2G_nQWkYn&aKlwG+_?aicbCawBNK5KnD@6=Vac!GQ= z*k3{GTJIK5Cp?1}22n&A4=)Xg72gj)9Dm^= z^r#EPf`v|Vg|)3WDx(M)E2juAN1}NP(wu?`wYMT6 zniu&|iV}7N(olluXeePs)06{WEnFl{I~G|@beMrd&5`jitRG>UGqx82f}X+iTg!bqICx>zr7rB*{W-fA z+y=iRA6*VakJM1^h*s?2EL6p6P!V!74c`^8Z<})RXfa`tz{XCxsecYUOO~uqQL|FK zyo%;x$nKxM2$rw7qWnem#8zcCW&kbN3?E>k`W5j*WtKG!x7ib zyCz8i$OtR&+O0U`PHKr$02;loCAkl_y()BxiyH6>e+7PnoLJr-P)fu>j-iPIAJN1? z=+MN0$G#B98tOq(G>%kHg)T`o{fF`zhmuuCG%z5*uSxPE$|}DS_eGBRWPmrl#xYzp zI__3jXC*7OR*B-e20mGyEL_NaqYUH!BQ3#*JYGnuQe@VjiCIZ(IdSkp4Jv3+z8OR; zLZZnJ&l*t8?2&w>-fz43PUKPYvtT~Cb3#Zuc;4n)Ucxs6%%r&@{afq}xPw97V2SBS z0#J}nHc$ePR{D@{(!Uko!R)0_AQoV$pWY-90K?86@(m^KKe+;*(zw9ghq40*hn04k z@PBC%dJH0C2ku}t&PW~f6b+S`kVHUL@&dxPGDt9B1}ZDs6KPb&OaOO-`Ox@=9Bc}a z2c|`}SZc2l2z&K1Stlz!A zki)EbJF1iG9bl1skIFHEMm5+bg8+dC6JT_CgoqQ4>F`7R-S5O%1rDiXxmaOEz`Nij z)@Su3090daO$R_Jamxd$1^h#oBzryL*?m0uR$yWsRaPtGfe z*`(4a=W0j_M}(3b0D=uLoE=OGXJo@KFC;*aL8U-&TuFd{MQK35e}4o7{6_-<{-Xh5 zmT<^RQZTN;?F?&@o^c=v#cGpi5vxt2g{C${3uR=a_8&^)i>-{KMIg2^iCYax6`x?0 zP;ps&$40UFD`{{xFIt5_kqWZW{m7=aN$7F2gu`5E@R8R$Gn2Ew#9!s|CP)p)fg>d; z#Ym>2>4YS0mctrsc}Q2fvoq~cW!lo*x< z6kI?93aNtz6f%w{S?8u4^3`-gx`J>=qbv#vCR^C>XkY}o?5}1@1EUGiA*F)@43QGP zJ7?$i-3T&PLGA)$poL)u+l4nzPaDpGgz}fw->LKDkJQ3291Q1ILf$BbS_G~{%INU} zDn({`iH!067(#4=j3`>XLeo~KpYHx!4WY6^3vtM-8s5zk2b!N^ho?BqFRMkS=6VXif6)9YURr{WU`heP`4J?JyjYaDN$i# zRTFtJfH+)%7f!Mg4h26xd6yUp4o&aMbOCwQ7j87*tSTXXxd7dua^9j>N%5`qk2^vf zIC|n&mC-E;A|w$W|5LYC8ZO8UG+a=L&h(PtYJH3Xmcr%dFii>s#ygEa3je>(e>^_e z3gurIVd;ad#gp*=->)nS!G0>qexP6ag3%^mdPAtUlkO{80mWl53TlkSs!SWMK z3+qM76Al!5-b`r*_xs>?iY*ICXpGN7Wqeu`&Jzl1fq3D-3}*^$dlh{9Nrp-Txpfy_ z;&G;2{synRupw@cyF&5X7)4Y}tz3u-&R8nmzD6L46|q3L>CyyJF+d5V;)4=MGES9P zAUN7=dy=%LJ}Y-Gt*6>C+7)btk;*fg>Gd=izh8lD3wu}+_Y?g<+_mDtF22MrnZ1=& zlHX_Jm84h*tK(K`rAvre0Of1;35|4Y&P6681IzZ-;+HInrrUhS9N#nn+p=WG+Fj0K zNkNhQv+OBBw&zu)a_sI+Ct{#_W~%w0(-NrH4d63V{dHn`zQEf*;}4AV-q!o){TN5x^iipOC)J`Ua!KymnO=jJ z;Wq)`dsXXY#vjI;qHNcwU6WnZV+nep9==`m-Ei9;`|vLLIc2bGsmDjWMf0l#%u$yL zFg+j@5dR79#v%gVI7$UvuaXMTNtbGH+E=Q<=!sGden&uYoKyhQMk>InP%0oRN-7}G zOe#PnSt?+cvsA!q_72R{GND-3D}&p<`iTdTPzTTTSM zF&MMF|Flu5?@jSL*|Awuk1H-d)PUb9i9d2>Gp;%zwZrfAGAA7b=&q8s=x2z8HIyAE z%@~#HKcN;C6}Xe>zAI=Mw5abs@OXwJK6haJ3kaiW>G)JIyFVldq!H{+lM*0&uwHA4 zIPL8yz^e^d#Do+sE_NjVQPqQGd`V)Cm;VT=-xG548?hR%*@0FPHJCP1f~+VhDwX8_ zQ37Sx{)pawy)-K3K zb)W6R)oYGeo+GX($v3&OQ~KL8#Fre{7azeKl{%fWm|1X`?4pdt_|Uks+s2i%uw1+xvD}~>@PQH03*0~4)|6N-tA$38 zP9vC*=}a}kp8-z3OokCQ@T+DIW~ zMM)v4BugRvngFGxpemCD4aw9s`3HiR^mrhrj-FwIZZznj5@F zm=dJOI?9`ud@K{5z>aRvgl}rW`S&O{7r6T?UfNfKb2j%XJidhW4avo#b7YWZO`W3? zbM_g@!OvkF`%EP`l(oRyQ%QC(Z87oQHic5$8$4{PNyf3!AsEN?@5wm+0A4j3O2)BV z2#jMlBI0fb1Xuo3sffGsG!fjr*dSO$#7SbQzf}a&Mk*rEOd>*mkFylV?cz8I*c(=b z5{=HA`)!e^nrrz~+VH12eLVrp%`8n@R%b(3*OsoPLgV=dxl(U!4NW#JM?FHWsM=_SWCzznV@-OP*;I~MHWOr8WNB~2@rvR zLzDm!22BYtDd|n&<3q>>Us^V)KT=eVj|C9^T_ zc!hywTL18v{zpbS?Q)JjvU%KwJtxoS2=3YnAg{YK02bR4G~@jMVlU<=u&+l z0RrVq1v23=r(SRUHo74qq+yz^yoy}+y9d!JqVi#j1_$=%4$d=MK@R8~JvOMfD;(vS z+EjMk;zm;3gvH0Rda4vL9)65qMF+$v9q!|l*W5Jzmx$f6K|OWXhxfE^JRkR1$+lPJ zvWZ3e$Nj{2?ay!V>&11b_ghe*S2>ED&M9Ksd34=OD1_551&WV3dwnZJRS_KX1;@zo zoPyS(u1{0u^j^1JyQ$#~i=ka%X3W~r{NS4>jJ!fi*2>1h>U53KJ;P%Z+PE*G%Zl?w zCsM}&?dk64a%>BByICKVuF?%gOF4z^FerRHhFkymaPiTuZ_v=va z&E@QMY49{C^84)euyFoP&)VoM!k{OND}|wt){W@YP|T{Y0KgCB8@PTRqIL6QJJgN~ z#zwDl6S!YtdG4}pbQqxdL^Hd=*h(av^K%$WDYD-o&3aE>!qwA)#`^9yRrh+eg^U@o zqBftsB8Gm4FJqO*_kNs7bN$o*K6xt-pD!GEQF(HEN(X4U?lQ`o}j}y1Crhx?@Po)6$Ay4-kFI zi062I-wf{2(u$GW;riOhgeg8#fK+yKU5eo*q|r?otNHF?pn zr`Z-s6{4H=sE2cPmCH1{?l6T?p%wn4*R!g^Z`k}Wg?GZ~_>VIm>OvMLp3iM@D7P9C zV&T(#K&f(F{mD4i?jShC)BIpcN^IF`%|=h=A~-51PAr+~Ia;h!{YTORF52up?JL}q|ekDm7N)3YP zsK21CJzd)~<6K9Taf)4gSV*MM3jZNrSe0;( z%?*PCI;Z15ZgE?V8kl;l?qWR%Tyn_hk(pDFpzDdgfv15gAU1!w)ci`(r#1UJv-04e z(PWV(SABm;?HX+z!CLf(`v@(rZApA*uKs$@HWeUPx&3P3!D8pm+=ho0Dp_!>>Hd-s z_2V8TAJ=Fv5oF~8iN+T0?V}qLG*dnnbZLKkB8T&t8J@kMB)%h8{|8S_HjwnzlTY_4 zdcQ_{j$rMZSKISgliTNc*)@lSTqqcnHCD*zsyzHAoT2*GI+OEb6r)IFe!`5Az4hYh zeqDN5MQD50yQ}pzq0=s0ZMc1`E!yhhbU&cAfhmJk0QNKKX zPgam`xb{R2KDsmELCWV9h7r#D@zI@jQS%;sj@zS_F5fJOshHjmj&`vJP_fKj);)_!n zS6LY~))XCO4Ud6-^I9X{WyPNKT(J#U2-c3|%Arg z7TC3G8DKG0-37f;uMLmAc&FcBQv9@QJwi`<>8i{^y=KQl zuW#SPNPGRVYb)a0-wOC%yM81VsfDEv9{57qD{HSMznrZAO(se71n#Iyr_DVQcNJ(EbB2n&QkXJnpaN;23fMGIRy0tm$utqgG!a>1y&DT} z`_d@js6#15D2)QXlP3Yyyvtb%Y84ICQaY$NG*Es8Pry?6%cMRsSJV0g`(odB3vc9W zGRB~J2`kvSbB4=vn1C+olT(4_C1^6bsE?mw(Kh1YcqKSzu5T3{>m@fUH^_`XLxv=4 z!~QQD_*vwe=)X%5=4SO7A55W5G2{?Nc{w7ZUPBi*zo!yG&O-%Q1 z03iDAG>?C^V&fC;ZKh5RdcKg)%Vbq+!&$oVmnJMVl(F!yAU^(B311<)*S!cQ;pzSK z@#iM+Q;&Z7a;X8;3D{@t4N34tqD;<7ybUovBh^5sd1t2`PW)?!T%F}LFVlf!+kMUO zfg%$I37Ydq5mjpmzP|)bSo;2YQWV~MQZnj&f8z`;`Ob-*?A7X751L5BiAodrSP?lD zlr((6hyH>i;AkKODzf5z;`NFD~LEo((L-kGQ~#w#KK%M2V3WM~#@b zRg9ErHqAWI7bpJlUe?Ka5BK7i+=>>-E0g~U{b zXVRh3u)8@YA8rH5Ntu(Er=x|b^GB_dZ(ZeKV`QYlN2IRcLmFbiu~pYUJR_*~HBT5L zH-m^4jsA2+cz}HQ1!7_U)-Nbpz3@98mf-Jnojwer$H&Sgb7wW<9f(j6OIDr8!ZdH^%+`GBPf1x zAI^vP{SKKZMp0YAxPJ%UAj#g+vRdTZw&49Dd{4D`KI4nFjGT1CUIcHl(V^Bh$BTyv z$SApx?yX;lV`TM}c6^&)1V~^#8u(}AR3pgfA&r#k-!yd@*K|JEI;~O-y{J~iotM|P z{{hkzUXP1K7z2=QsQALDoDeFs4uy=6f>DY27b5uR>7W_1RuY|u1-1c{Q`oEx2qRj* zLKqL3A<=z)zNssC`!1!+r8gX%Bibd}*Y!)VRohY3uJa+$rw4Qp0Pu!wo70A#6o5|v zVD79+qI=hvl+Ficn;sJ_5Lt;%pF;#rs5WXcclAXDowJYdV{MbZkbzJBwfQ_lJK?l< zrG)?f4}@bEC~_MU`Hr2847?B!+lqA2Ej&3)LVzY^n{zz4fm0wIFMOf zw@#aZ*UYiAs%9-A6>F4d+~pAHn2nET@D!$?Ppd_5S>`JKDBnrQc!mRK&O;gqJNaFE z@5rX?=~*rQo}U72?j5}zf2I#HhP|tQ&(*s5ZU_O6gTONNo^@DY)D+v+(Bl8c-Jb_? z*?j-wxFWPj+7w06zK}|^(T228(JE3xrEF#2qTP~cQBsmhmZ($|k`^UdOHxGkkX^F> z&dglb^}L?<>)z^h->=X6`}^;Cp68l#&di*7%$d37%yp~J89(e6ClmjsLX+7@ca-I;SVdq8MYHn#1;%^@$nwwKrbXExTg! z@FBW1VI6e)TE1<1OE7BGh;^mFL50S_miRqlE;!H7BtO4X7$4$J3jc;V?^eyD_`{=c zfCA1W3Hc-AOUX%ztiaAmZnCmtF(_L9@MRIUpJ6JZIln-BZ;Xezk+!(ZE?n?2ZA5C* z1`$WQzBmQ@j$g$ssUJ)3U}#EMU^XmC)SVyLfQ)0EOT(S%GK_Wsn_80tp%%n3M~%hT3Y=G)rK6#_S3l` z=x_r*^O6-9KQu|yjWiwj$4U{$v7}idqf;8!K~MCjeMem_NKaIY{iIwD?G8xDAF;Hz zBNhcaIXeu)2sVS}_NO~20xC!(Q22OV@bURQH2lh{)W6WCQ5BNQWN+YuS7?-jxnKl^ z#d_{V9-#!q(l5T|V$J*9_~;h|`WMgwVK&OH(OZRY>p_qPt<16=I)|zv49e?y2`p7< zwJh6rThq4Bb5xM!umoDm|5ho|^>%v*iep{3R{IhN!WO=N^=c(G{n+icHrZK9zzX}1 z{LIF|=$qOwYw7tHh>f&6f!>hbe6-W~LK$(!z(xg$ZXJUv4ZV z7v82Uqz^<`k9PEj9KK`~0=i;d>J<^&H8jaeyOOE!Z+VOUAp9y zLsu5-OVoQuycadMV7L8Rd_M!44!|#SJsy$Z$ap^VU>D7-7Q6uicAIP!iK8x^IR*Yw zy&j)UO^$TQJkLeiaB;T@zk!6omMQpxU4vZBhNkQq=Y$mmw_bl|@f=n=?zT?UyH19r z^8pr7_B9f$IZNSKNE}DI-sM{Vf~bwVF(%GmSRfy_Eh?J{_n;0>v+$tS(6mdd6+M}( zn2kP7(|jhk#`()GxX=?kX4}Mu&CMMV;gcK1SH!lztwR}$OI)RX^j9H5gBFQ&I(^3T zM&CZ}MRiRQ2x>GYt>JSC#4)b*lB8Pd-0l3o@i2%MuR{@c&EeiE^$HxxX7M7c2Cl%-~3#H+g=ddl4njq++7b{;h>A z*zU+%ft^#_605NwT?gg1^?WY5SXA5`m+Y(GTXczSAG_3_`Q_RqkifQM;x{c_T0&Rg zf#w$GIi3|0we@J$=qm?Ky<=FtS5z!y^e((o<8rPojhMQxw_#892{U|;!-omS+Wkf) zwxKI3407kJ`CcdG*n}>&NRD*6QX@H%CcLh6Iv57lVd(wFS60ZYi0^Eu`PlC@Bm!Ne z7=6khZ7i)7hcR;wHHPPPl{=tMEbGQCZp*20ZgoI!R+n|{7ng*O;H5!yp=Eo&8XcVp z4GlsKqh~~hN19L>^ejb`#XY8myMJ5m3THb4AJsv`rT--59OIE|_M@E+`+zE|^pE{+9~w_NWPy ze!UGP+3a;V3LjwnQxz9V*tQv;$7dgUt&@qV+B=7Hp z?=wRHa#Fg%C8aJJ#iX+=Cwtb+7GDU5v!OA~qWp+69PJ1F^Eg3|%;;iMP?vnS$EUO5 z>@4bqPu156#4hc#+xhz=^eEaglh;Pw{H-OMgdmJmi~>T#N;ir)IwZ`d&fxw=4)k=P zo-7r~Fe=ghE%6X|HA-S)>^;~zq>^|RqY`@sst8tzI+vvqJJ7}Xgx8)73iHW{Sp~OA zZf3RQRIK>op-Boh^P2i{{oKqwA%lH_!qFc#bze(!1aEx9~RU4arK*T_*Mk9 zTdA5?AEVoVA=kaM>#G9wDJAG~GnM*;+FZIDZwWrmB_Fa3aVoiy|M)rb^9Yvnnd^JtI`9cs<&mAjc-1T!Rt^9S^xj zcKBWv#&=kyJ!VA2nJIVRd(MzALMeyBD2#aEU$^oSTJiM`nB`yK@Df`D z0_{w!>k=3dI?)bwCvZq%wo?x;ac z0bio3p!N!|KqqRQPgoPV1dFw=sN*uoX1GTYV5=Ubfv}$jqfe^foQHXtkQHZ*WqY$PV z9T7$$_6<&zkauyaggc#42;MO)iCdwhtU7^CtWa6cm&}M*p>zB=W^RLYPg`{||00D( ztqs0A$%+d1VafOuvTnjX@N%Uu0a@%zNCgdQxAL5jPzwJjF%(on7ymyf80_RJ?M1Fd zh?kG^R_hp1=zQYZq`S^8jlN%O&e*_iNU=-%0Q;ReDr=M=Z7+kwp9BfK)o{*sveJTU zg3b%F@dn2C2Ggl-lHSd@1)LOjw}u$tn{4g~Pn^v9UtOfr_L?__m}lycL?VrotPLbJ z*6}GzkgFX#%zdSPG%P1avyYvI^d4GW088DMaggfcqlD+C|FH_dfVN%MbY1_yKv4mh zBc%G|4rf9&s6$329h@PaaWh;e3v1iPMM~h5v+VIorKRJvOry;N z*vcx&TYxt%VerG2Si@ck42m#yK&qAP9B&M{02+{jv*6-OjP(F0Umv}Swj*Qc=9s_@ zmyDap5L&ZX$%V=rgPfwpO5hxv=l-TL7{4rKFt#CY>~b1YVaOZHC}%1Rjz#N+3bWMN zvFirIo>e!%AT^OuTq2**R-$6&bhWW118r_H+GfXDNidKH?o+*>mX3rQVMEd`p9vvh zN3ty5va1eCBLJMaUA;-C-W(%Te@<35|GPho7CEA*$;lkYUfB83OPu@(0E z#8$}rfUQtq@6RYi@9fARz$ze5U~{6f-Gi=yxhQ;vImq$TBeadWv`-sk1~|UqxW$|X z{8>&kJ;AHn=P&X5HQe|5LnQHgI0!HPn?h71121rk4e-$dMmRbjfM(^jd>4P5r-7Lm zfw%Oa0U;|viL8flXCh;9G8*dV+b6v7`#4l@QYoYgdk3QmITfnMPpit4C#o#=pe~N2 zRB2(l%F>G@=aSZOz8`h}y8y4KyvB}*1~rsP zl7V(dPhPkN>3s!6_AGTs?|VdK8~GO3qI^G1?_Mwtke_p+xN_`bvi>7@Ht zS)HW9)W9g$JsFP?S||b~>_kWq01ED5R2U$R^y=R&uolt-iBEt!v;bM3s8JkUDY_|F z5`q5$-2%_6GHy}^liY3@6IH0gA6zD?a3|Xn+i?F?kHjeUa@D$>=&Mu^GAkPSLT@Z2 z10FfT?G{fw#Bm?LpM^0Rdz4NFhH~x#nnIicsGH~lsPE|lxW6e4xQ}TK|5kytNREct zapf~e9ngsLe@5znN7+D9Y3vnqsY>~(w>lj!jdX+QkLHQ%7zppl-`@Vz%Q$!G@gaqa@uRn&WS0ENF%AUvF-p+C~Vx-5_3}^3q`1apj+JaL&R{t3LwXILF*rx z6tn`vn2#Qia7mN z#owiZfxa~upUP5)ws4?Ko3MMb+qcccv6itsqA_+x>*nhrHqX#QdM*tI?Y@r81C8R<~ zn>9eMFe?0Yd56&|AOY|uqrxb6(F+QnVN~%?VN~SFuVD>PS9e;)ZtMS%ilOlNQS70} z5I9})s=X_8+d#O}w+T(>6U|ED#g)f}YgX;6ALH%8Q8?-IJgGA7+-E~6L~}m?Yo*S zAPBY;VSquV;B0ybuZuPTp(N6}Zj_t-oErcCq5{|ffYCq{paooG>%@iCk%h(yN-jfB z6b5#efswP+L)YDzK@VnM$7!qRLEh;A-=@c*>#B8A+@>@CYxC)xr{N#c2br?aYTHQ# z-;BF1_2DV0;CXfEqa&mRG;*EoR0VR|a)H~C`7YBcO=)u_X1b$`3SCuhzmj@R+h zqMB%mn@zX{y2%U;2$kF4j#20f9r8euhUj-SA33F?O**zy^9hWgpDj>pDz8BWAt(13RM-i+I)Qg1q)*fUFAMj#iz7H zbkSh4+_Jb~NpWoo=o(e%^#@Y63OzT-dN_;dCP=9xvbSkFg^v4FZl@ii11)UF?-zK^ zDj>ot5W-UTV>U}&V0j^io(~J5C8Y;a0~(s!OOYPLxANqRNmaqvjmK3-(b1o^v;v1= zlzaRc1>e7sq}gPK7q&GL`_gK6cdw?R!drO@sRn_-Lq3ip_I-_*1q~X|)toA&MRKb2 z9|h1oE~quJ9q1mHwhpar-f#tSZkL+RkFLZTb@?7=>;`#Z4*^{7(X zW70vWtCPh^HIYAvo6+D7eG*Ta7?r-=a1{3m_KiO(;P}ykAYGz0=$>y%w}ndm?w3qk z2r7Mx#k!#_IJ#@WA86h11usT7w4};yd7>K^ct3*flMQ@22J~ouAob&3$qn?D1`P+S zf(*G`#1Jy{Kl&HEJ&8ZEK$=gC_&e?tkV_ZOyPwP&n4p{zWnz6xjx{j7Xn^>Q*jAP$ zc?+SkOmWmCv?aPG12|)O3#TGRxqoIAwMK`oho?~2Z|-?JY#khQU5MxOO)t{>fxZW`Ft zT~GJ%NvRJJPpR1Y04)E8(H#~ns05#|C#_sL$xZXnUaFPnxfi`9A9jcSK55iSeYYN5 zBsgy&r^qhrv?+AILK4je#u9&BjwM+&{$L4#EAkKt=0?LnhkB6Z9}$a??~cQP*>R}0 z1o?<^3dpi*E<>A;mFPUIgMkuGA_aK`7->v+@Q5`L8PxqBDLL_UNYq&ITKG9 zb>!dxG`9r1_{;U#ckxx;5bjl2oV~|rgyZ%cjel0;6h24`@xr_>Q^tl<8wv-Wu3xf& zTGCe@4nG``Om%5rwsLcpzF%SV-Rwm<0b~``uA%ioz7Txu9)0WwYI`pH`RG0PwO#~u z0I}Lzs-fd_#|`vl79-zu%eD7!l4f3&y;&x#0w35jnDBL)XbyP;4E}J=qsq=30n&N( zdEt;wjR){7b>oLr_6@j6^j7T*e7x`Fs%&*u(QK7r^y3qCwHxr+K)JgP+3N?BzvI*< z>W(LWgSEf>H>4C56U$pG_ijwF$JRohd|H2(M6uT1>DFf>@Tou;){u@wP9}nL{1=bE zWJ$L;TT1F*n>9Dm*O4~h<$7Pbq7|_#8fhCxZB&0u#dMcSrlinz?cX}S4L1?A#mVq- zg?Kj*S1J}fCQqQiD;R={JnBag9R+pJA;?QTiYSUA?wyZ zc(*30+i|P*>R^m|@EW9}$zrX%7e;y57_Z5Asggs!!wxS@ZYxWQuGcZfm`D}ecZpr_ zz7?ln2uhhoP)Z4XNIoAQAU5SgV5&;laD0!W1$MTSf0)<|FY3OpL(?;4+U|2x!R z_?$e#*3dH7E=UqIxucIm#yxiWE@6V*dQd4A*8ysU1}AD-`1m24iss_|GR4*p7yI=u zXVm?&$Uia6+niN}mnGeMs#hV9(3mb<1Mia4`#PV1yJF!*qrMBgFV?7EiC)<39IaN| z<6CH4fP;hfo_PXr2xQ1Tcn6=8d;uMaMBR$0UH>-KXF5hP=I6G&PhF`sYl&i#Z$Di8wA!#T&uMRVTScsircH`)3r~f&)*Y z1vqlRtQx%@WnJSl3F*p>jt zC;iuyOtvc;7*LRxSzOAicTh|-h1aI2CjIE}iIVlb-`TE^h~+i5nR8FE?V#wDWUa<0 zqZQ+#gI=Tv#Pi5s_7$jol6NV-?G~036*=of^n7tj>aSA2WKG53;p+Upj5*VIb`Q;R zne(*X>3yrPibfazdviJ8ysKB-=9~7M{&7aww%48oeTL<`iY(|+lkD;NKS_@l=CY;Uj_#jb)TULIk#ZB zrzu`&ysb&PG$JW$#1~@K%_0rYqFtWmmL+{|HVoA^pQvg+TUGI41B}ytQ=o$s#iRqU zz2Mv@L`HduXqYm(2Yyc2z@ZpRV6?L=fqJo&H$Gu2w___uHRdSC-oYqGjm1$8gOXKo ztWLm8Z7SXBJ2F)1W&q_6J>2Ogf+xSfh@{&AOi_$u+5t=nD4^ScG(O!9*zpwTcEJ56 zPPYRxCC`hcpty#A#P%{yhyNoY+4ZroW_psY!Or?(0i;++ zOnBd6skG{lyf^26LgkFM(EFYA%gON&&UbsM~TPSJz*vU=xkaCaSKMre^;=` z$*_!`pLXyG)J>gA&rjg@Y#rbkEaRXD*v92~v5hlU_~nAO+cwiPB6wy}$LrVhj0i6F z`#N@?YC}#8y@>14q*}*%RII->K*(%iGS9wkJ_!KBSUxB3^NDEjgeUXcwmy|gS(L4J z9&tr&C-z??refOlevpee{J85}QhUh5=gn}ZXD!f0MO`~_gL%tdUB#j@JSM1`H$Sb# zMhNRnoZ%KMYE671bE7_=nrw}RQW3z5;&NA!Q3u1V(5O9cB zTG4*H4edMPBa)IjQdo}))JaZE*zSILM8=s>y6MB7&3hYOp9tF^*&spCxa(>y3jNj zc#)yeaZr5>$^b?XF10}OQmDe8UR%X7JD}i&`199zOhYC9gc{$dw1J~uCgt88mWsZo zJXkecnZ7cDW82o`J1?uwexw`9aL=9yz0gYo^k$=3Z0pgBFA%f$DODex#4iJ7HcQ{> z4qE=+tXWD_`oeSog@t!_HYDGsCm09ghGH)YA#WCa=f9GpnM_Yi-|D_b>IIP|f%&F; zURu>KO6{7YZ<+}kqB3dVF}|Z0YxnhO+MYISEThQ-XR|k@!tPw`lZw zBB&RUNoFnR0)0N&4ZG-x1AIkv>OEGsG77LCZKRdsa#6IMFdu+SS|9eYc>5#POxH=< zGM3pD@vGKfeM@X1GRNtVTu{sWPN4KM4m!53n~VlLRF9Q6qY*h6uKcm9e4`e zfY>*3rrtY^0hovZ?Y~5UdK#&~;eI1Dp>!UbxiXTi5iv2~tRwaS7fn}UxgW!YBs2G} zDXn|hU=uqi$K-vkYr8|b$LBf4y{0Z2;It!mo645v`y#^2d+EK>uGZ`?x^UlfUX6pp zi$Bk49^SS0Iq!;t!}g@PyeaUga(Th4dT?k}fs2_(=U`#MUK*8;cX=trw=P{!#5*Zy z>gPRsD~~iM7WW$cM9?dL>!$c{(X1YKfxSFqXAd)J)g3W0?YO{B9?99UJ6ex4wvLxD z?{y&abM~Q?_bWF_ORVX&H}kvq+c7CucRx?&JGHnlbHVv;k3MgYdkGe~JznPHwC%G; znahi0-ZhH@_wSUwlqh>Ai)YoTVLl%M!ULZIqxT?J#fry6zV>NM+##J*{qDJM`;IJ+ z65zP1^41QY+cC{kb??w!(=z8}&ag^+o_tWXx9%#r$8o*9J_y!#mksSoe0!*ms7H{9 zLz_UK4^oAx0{!9lS5f|*-*%*azMN<;(i!z3_3@xF)gI+}^DEzX4R%P$Z47MDyw zFiNkpd+K+~sO!qrB_C_*f^O;k0D4`Np>pclwCEmvE&-SM-V-X@ zmGS2w;deuK+!y<8J7nv&R7K~1AD}c!XW9YPn(Ml$j_(&9i2NS4$Z5Z%B68$5 zN>4DGApPApvTUKr0uz}|C!wSFcgR+3`4~OnW?8LHz2+T1%jwmdmugrxS%mUG-Ezmz zV*1z39jBU#cI_DvF>LeG&FRq(`jvgTVX%L){MF&M(_5^z*NBIT@pRavKL|LsrK#tm zNly1oE3qTCD#rv~9*eD-`o=?cTu*!ExSpL($HN~R-uscB86}+N?Q&Q7`Fcsd$nH%* zl?4U}Tb$h(WB%Dx(*LD$im=5n4cVeiUzWyn*i>g}Y;94}S>~wwS>ExsPSciz*eNjv zK2L)(gTx(g>O=#*=ic`nYaaAIW_tT$ZomfFNPp*t=MC+)4^Vn@Yve7xt@2m)$eFHK zyi_69KF1NU$KE+FXz|dfaja>YQA=^;zRMR^UtBTZQIbHcykCw-ob`^q-`7u?UdbP^ zan|O9*y>c@i&08?f~SQ|O(eoaZJYwPH+|!~&R3xSEo^gyUVe+uvvS_UdU9<~9+cm< zxA2>K`{7ID>q1Hqw?+c@2+u{8F3Ubehd%lzR=r3|JZ%`JeMQ`HxlZ)PgxJ)*ANiyw zi&XNLt{YSNLihH=6q(ri!IJ627uj2EJZ+ZTe`?=K{*A@{F;y>gXYncw;gQXCQ8K)> zIb1Ja{=M<6YifNLDf~EmzdXX;A~(GwP09XxPkx`6_nzxzYd?;P$*a0i8W{Iu=l$|< z;J4-~6sm5l%FvB?Ca(jve7xg9+tc%dU22PmN; z>E4awyYe5KgxUdVWph8pfBowWT}SsV(b~`~jqxWAX+6!*U9%}|EwrMi-|8J6*-o{^ zZ{PX{fjEN?3QKd&*6bGz40tc~?S<~?bqf16&sOahZH>4e>tK;PBRXx@%<=8{FDBlQ zR{(p;z4qQXHYu$_W<&D`$v1o-KvqXZGlY4Xb|ZdbizACUak3v&SBG-P6Bs zPJEH55--{uk{KAc=#-c8F2muCdhY_4Kz)|xV6sW?10wyq_*z5WxPA8M(5lSP&5z&L zxp->y&DP#M@5b9S1Xc0BzxC$nXOB)`?weHb<^keodI-c0?>Q<#zrGd0z{ zHDJ{2Neiz3$bT{YW3v3cnFlj(V`iYQX~5E{ynTfRXiiqLX_)*qxjA~~mCQ`cEI)Vj zvh%AaOAbBLatBXX5f&68IrB+oJ!UF=6SHq0%PS-_h?ERP&mLU5^!eMam-Mss<~%3B z+E3OYh{^N3*927Qr!ns{-wKaBuE_HuZd8-rV3!Up{&54>G|0RR&{Ti8uXW}O3my-f zx#g6?MHUAUHKGXX8z%6?*3aOxLTh5jWQ9#UBkL^R$bFyP+`N=uX5bYfLLMlzP~Yk# ze>(V;ja-wY`_3-@iI#HN0-}Ce@4Az{G;wU_r}g|;n3#3@SQHc1S-SsNv;OT$WgNNa zYKWxYzTxNm%1boL?yS~ykLYkO^@YUXM!Qu>3zLP4C%%#Ot?l zD>4_YHiVU(8-l`+HndEU(CaQ7=MRE+c2YiFoqVJzy11F{oG{x);hE8b+YJh)h)49i>V$VGW}BM?~OT&!?* zsW>iH1e=xW{;&?OcIqs`%(pPDB@xmu26q{11H{_OX616R^f1e>$gq)5GNfNC;_d9U zJor`4`}KOFg)ch0mij~#&IpPf@zvn$%L^}V8#+HC?FGa=!!aBpmQBR7i6?C0Ig4;| zs;>*di=u_;(~M+zvl7S(sky>*fG+=42NI)IW)z%%G+bThKJ(8ey){z*q;Cm6pUnPg$>(#lIxjrPHT%y zS8aPNQ(U&cqp9!1iGU;GC0r%TnUa%VfT{XmDp?f4lS9sf4!nFq*5o0nco7EJWP$C* zDe>=iZ(M=RJlT^hQ1){du#D_)YoUx zEDGkA?>1KFDIQR!zaWyk7^)w~64XH)OQ3@|mZ17^v~d-aC>)o+>AYj;I}ChpV+PgL z&i5+pz}uLuyF4F{$#0m9fir8wh@^^i0;%4~PXv_|lyEHlay#FwtNDNj zgZ6Y_|%W17kyuzw|XnPKetSY)4sn!8Nz`#L7i!+$UboE{ z+9;_%^ywbn09|O~kq{(>MJgZUXlxNMw`N+Un)rKKqfo3Diw6*N!R&BKtWeXJd_()>;YF({_$Kwky# z4Wx{k)uY1~)uv(-TC^|8d@0X*t%mTSD`cMT)3o5T-Uy!B*RweQ!RAf7u;lKlJ?#Md z?J<7%Ie;-^KgI$y#&5VdkjjP&!MN`JMm576h&!MV0|oFHfr6i9zySU_1nZ>m4r`$? zm76iL;v0uy@tHS5 zU?lky2jwY-i*k#Ex~G1!Emb2lGk8)}MKjBP!I<-eBWe#X1Q0vy=~kl|C3PX6r6DpH zVMYTugcc>uG_s4lS+2oilmP?57MhAimO$%B!9<$7mQsVkL#>zec{$Wp>%d1x_o3`Z z@L)BRyHK7XswNcb?0V-g9>N5cK!&HStJcfdk0mfb7dHqI*zVl?SaT!>AFHAEdA225 zv|g^qpvV4Fc0=pw)_&H(%X4jQ=~rdpo}Im6TRyQ}Xi52wanVO!CB5mM*f5!bheJn2-VD{G!2(g^ zxTx6_)$QE)9>T|~AuwccbDwxAXcWd!NzY(`z(qacqMmY5ueqpfF6tu}Rm??IQIyMo zBpsL?QUd9@LO>WGgp2BXh0UAHMX7U9ySba(ruK{vwpo{PafLaSdmT_A{RAEu#YvCW8>(yf(%j-}90 zd!zXA8w!L&IZt(0*{gNKh~ua2N5C?It|y92x1)AM69IymqplP-P>)ei%VHojf%1Qw z(d}F{x(&SZXUc>{{!J~=-n7AJ3gGBq7@+=A8+7gOu#lGjmT|*@!O}cK7;>Dci7;sO zzr!Nxf5SlA6phVRgHK8o8mGBTY78%oJ+mJU$1N!>f*}@qnL<>wywF-m!42xS8}?ua zj=t`}=0Md~3X>;)bW(gw{|5K~z@VU3yzQ9C8*NPrzEB{-$eXu*MAE7j8uPRvG|izg zPYXg*PN893h4wWim{A}c=AT>`L&EQQ>$`5)6;fd?OBUdnDr{;{25IYt^kY@;(iB#W ztioWy!_+90QwydL6|jc%GxmcP`bny@t5nD1X}#PU7%%ZI_zPT%%$OU0&N$HY-d5#VT)P~1+$k> z1hk*PX;}5D9elGczon4d7=qM>0E|>6QRy9$3>92uH9?joekp{e^T$)6>2-)^4Gjof zK3)$H+;WG&y)rEO^V>HO2o8bJHb#jGZIuC!O`WKqH;T>C1j#y*SaQS0T&p73#bC_a z2f+YSjr+aQWti&XMe-*ml!{J`UrmQnurU2q1_Vpk05cewsO6B#ra5@^y7s1o!Zz=^ z=+6W`d@T@stjc~NXq0|~;1dFj^1Upe|3?@Ab$2ZQe4+t-P^Y80W$r~fT!t}BGtj2R zKhH=Ee6)8ft6pdZq3eaBUZ%p_i~wECKm!K%R2~!C!laKZM#0ubaR~g3X%K{C)Tsfe z6H(xoJ}zBm{~V0O5JbyJiW>Xjx}muDk~(ZX8&kk+H34GV02-Jt!1Bi&x&sHx#)FOh zk}got{%eI&tfznOI76_#v~g_grUB_B{>(A6w8|~&h^Rw*S_+Y4w|ee;FzEDwo-R0O zO|*NT5s4pho;FO{kWZH1h@MQAk4*A#r7c^yPPKlA{tY?+rJjT#gzEbDnJ&r?KaN{1 zUlBqr(Iwh~R~k7&#P76ta+ zomu0XTDcxnWsZgFh!NocX6q}m$D24a(!FIi zGphqNrAIq&(d&L6;J{`hj@9f-gIB(9BeCBjiMC4Lvq&5QUTI0Z?a3iv6P)ZQyi)Uv zKy8HZVqs$z-u4`{=9;Jfu+@Frm8vCr)|9?C>yQK~E%4CiPk2rO%7kt;vrO&$ z!xUZ~t3og7iB!L;*~1jZQrM|u-n zNN8+d0?{s3y4OBmSxJ*H23NtJ10~$*e$uu7WKnyMr)9o?;RF`RW7Il!1|a*A2(k2@@ypkSKICLuj*E!!qBFVvvU%d?NQ*+OZS%eIjdWep*RYB?Da0* zuy3N)@e89?`^6Kuf_d-$w|$RFZ&B<0miU3Xjo+C<$7Jj(m_kea;yWpf%c#yAU)M_S z!{!F9{M^OnIK3tt!WHACZRMV3)BC1>NI}PZ{0>plb{aLCp5_@IzD~h;hKIu()lD>n z#>d{9$q@;$rQk|x>OgywvnJEKf4@fk=tz+tXzX|43?24n^#9kW;Rg>&wdD8?E9lBX zFH@@(HmsFVovCwN-5%Z#T&2T6`;i<n2LDDOvPdgW>&#s`#Fi$l&i> zj!f{4U!nkL$BX=lKH3(v66R>2HdT#=U#CJ@v`HI1iM2_4K?Mcec#{_PeW$IULRqvg zYqXXQWns&9mPa-YWjk{oj)TY%D3TRr>HQg2p&&nF{50PI>M+>wNeOHx-0FebD*_Z;)-zt{F)md z9#-*ny_O#gr=&;9d@bAG*JB*7`a?A{2xGQ#D~`R!rPy5k=M>W$iFt+~h*|uCMO=(N zW3If)R`gBY;}mEW<$_%2^8?2z(pB?j~((b3tZ z&G+p|Ue1~nVWv%U&b<2j#H+>pzSzk~ssD@QW}e>e?`qEt`(YIX-?``#hNKBq8=Piy z{+faY$_Y&J7`1G|pb;8AR}flibl&k85DkFsq?D}pXus5v%mDt_mVHs zQu5xbKJ(N-QGH@khP00FfNRhCjF8^+cC2z~)2nmic)yzWN)~*7;FWOO0+bjsZ|gxh zH~GNZ%j`ge zoEvX36yCXV@P#v5W4Nhp%1K?51Jxdk^HEQ+5|>ugp91Z}Q0>>}w=K9k{=}*kk)K8+ z^|H_*)VfvK7k`cP&OiOm$^o*Zp6@FIKUrX@3AhevKa27=fK#PNw=M&y26jw0H!TQ{ z3wkh*AItiOM`5HapR*AGsNC zu~Ku9VlC`@qB9#-4+BRe`RD!^ONGgQP0T&MYK3m?MAh5n^3Jb{R0iVNe!~A%l79xv z$n?nnLnKBdG~+$b%i&3;pm$wu*2Vlh6P}V|1Qo~oIStnr((gP)AhYzYcXW6!Pe~eF zzFSz!A8ep-+Ba2+RFJ~Dyq8!onzXcEdW5uSP9WiMq&M1J85ho{T3>9G{~Avg>+Y_A zyeQM;TaFTWzRM2AHpQDSZ_N-KfrSN8ufY1m6}(z;30gEh#@;uz;( zwKnY)MjktS^}v7hq53HF@MTCkUas$LM1eA#D?rcv5(6S^kCneEUmVE*u4=uT1`Yl2 zROLGwiT@!6t^OwkgI{n;q}Ot6{7Ht3^8Hx8^hi}HKs0JE{ig^Ds(Tx6lonCmSuZ7k zmu;@m;XcPD;lyr_c+e))3<+DZ7WS5&iST=B61dZlB~x(qy1esIH5ep$;?Xw@dF z7$3DwpPuz& zKm2OZR<>m6uwA={602vb%c*-WbG=R%z83iYnnY(fMdBJ?&Inzk@ub7^WY1`?%H%ZHY!g}nFbgC zcYcA#HEA@Nu$`|C_H`+YTKzPy;11`>!_jdijx^H9_cgXrb7oU7VFMQjT+R{digEK{ zW0gX))8^JT@f;OjYHH<`DD`(IAc|5!y1Lb!dh}7mYQ;DQ*x$vg144b{qAqb!Wt2kQ z_Y(pN65wnriT*cVG`DVj#6{V2Q4)bDFy4H3W&5RDbLc43s)8vvQNw2}&p{jLv?wmsyBXN|v z$5wX1XCCZ=wWj7|raG|s^$a(K_+5A!!}}H6`OIvyF!td!>{G$d^;cm=ft428C^;e$ z|3!tGHNXk_OWR_>R7gBrwf?9mH5Y)(Ooy7uQj-cq13Dv;#P#km4i`fyMr$OrQ9>z3 z(;NyVXvNeH&2JSO+i)pPuLZ?SsB8)~pmF8b830merUw*26_}8?0NR4ya`}fDctQTj ztSini6BbgP$D}lSQbcy9tQ)ec&(;x19XJdI)Sg-d4P#DO0dEzHgeFqv!SN9e!$0Sk zv@)|@WBcp`wLpM~T0tR#MHCrxp5k@>9R_UC*iwwdz%9K*Rc{|1!l3pa5esEK^@Sz^ zBI2z*ICm?ifzk5SBH{=BbN(GtF^)^}|KE@d>h?F@_?92GI_N?3rDo5^qGQu|dZ|=h zy8qE*0oo>RtWua4NX=Ssc;w7tS+cT*xd%>=O+KWD;!Zp>4TsYt{0SsZhMk`2a0Fz4 zJ+su-`Jl3DWHXHuib3-j=A&r=Jp-A@IQ1zUC}6bs9T~z>BGZ2&ONZ`o4Ms)EB9H>7 zUWf)?*XB)%@Fsg^B|)OEcg*1^f?;MVUI1hpe1WqKudn!#rNc|4@WUdg7TQqpMhfq^ zLah)ANg#y=yih3=^)5sTllh@eXfwzjDfASADxobLtZ<|_D8#!oSm7L&!aT#hEQQgj zY=y>tY=v-mk);q0K(Z9VVG@=?cpuGD2z%1Mpb$1L=CCvZ&hBHWgz@!>r4uIh7?x6m zvn3p@2xlP=4eANo#mmQbR0+@Zew<jVx`T&^43Vr{@TO9q;S3Wh(!38Jm2 zU0_WF;Y)&-$eUQy6KLxO91K#ZEKpZa4mJl)iS*_;*goitJ{$*wtsT$))UGbd(Evfr z(*5@t{HzivErKb*VZg40J!ET*6s@FpOQg@Yxv zD1+vsGorEWpR__DfPoESy)IP~bg%{XYhrBJ8^qA7<=vp;)nc?-LJm?3>Z#r1|6r#3 zpf{0+DCY?%L9Yl&6b38N9fVwvgt^$60y_c)U@}KB9Dkt|+fRF&-!+q#oNaKS zR>l3|d@6YJHWXtCl1QDMF2l%Kcy2c%=B(>%0T%Q1B7ZI$49BD;Suz%0n|Z2S{~=@l zx{=HG-`)y%12({W?wymgV=adxhpGIRI94K~np zKcMOEjvsbmwm^8tw~4V3%D+0Ny)%1MMD3qG3yB`Qs4en*-Bmyc1RoU0%#qq_JkwuAk;WW?J_0Qeb6{J0B_+euoUiHXdSJGYIX23 z&IfmX=zwdX`N1}DYU>sD4bZGzn>8P%$WrV&Q+RhzX{{U$si#QyQz_7W)}a~RjdGMj z*9aKxE2QomanO6Ht2ApcUQUrdng_$>0 zX9Ty<6UtvPa0(Qy9v^l?Cna|+q>ezK#GfpC`sCXbNFPO(;nS;O@ap;&%#Lt+%0;

+En4-Fq; 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�nkU&e*C?Je43JW_ZLXB&Hos;v3 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 A^Z)<= literal 0 HcmV?d00001 diff --git a/Tests/Laminar/Heat_Exchanger/2_Domains/upper_dom.msh.gz b/Tests/Laminar/Heat_Exchanger/2_Domains/upper_dom.msh.gz new file mode 100644 index 0000000000000000000000000000000000000000..76c9324aa6d259f8b73178ce40c119e71d6c072e GIT binary patch literal 745089 zcmZ^}2Ut_x(l)H2h9*UNlMd2Bnlwe}AcE3ElO`?n&_S9g1Wcg^oDO^yWW5 z$&9#yU+rExpYMxbokm>3uTHm*aR+NQm)NUI+#%=5P|JBT9=Oddj z9}Q4^o*j{P!O+6m_T;Jv8_;+)etBNBc)fY;JiIjG^6l060Zyg4wD%$bw9ONy8hfVk z@X}qiqHr-x6u4oCLu=tgza7fVMPFkT%-QjsEVu|_xH-7QyitgJiIAJ7>>>C*d~Ydy z_=Qh#Q?E@wV$D0^iW=ncVsGwJPH>Jsk@X_3r?Ifg_jD)-S@fPa{Ih`dY=Rim0r=Dlg6>`KZ!6QhhBN&vX80@951g5CnHXu zL+_v7!f7rhLpPQ=nf=E&nSWl=RTN5q#m{4o=|&8CimbZqFJg}9P7NBv7ZFoCbV~+$ zs*+b7dvqHH?y5yweit9SH!uR7g=yhNm)a`=iRjZcdZUP|-gh5QcCH%hM$2(Hzl%XQ zn^EW>j#5mUqtShAf@MXaY0SFvd*P@hmhS*}U=lRAqQG9)@FZb-y?l#zA|$v}vFj*r z_6rqXWwm$dgW$kHFnz+on)#y1Zu+;7V9%EA-ceKkjfum8xt!YAQ;<}cKRjm??}j|s zd71)maQm{o-UJTX=JoW4pQ=2X+g4N-HL7E%Z`Ke+=YtL%Kf3F43;kF-n42^Wk^f{l z8(mD&G&XGC@Xa?^QFTy7&J5o0gmP%TZYX~W2vLfQzO zQ=yZRv_hi@oim|}5^GiegFBd#uELyf*UQfIk)Pn8z&L4MW;ROMSI7xN|m6@N_mpYgZOuHJ^cl5D;-iLf|xv8V95@H<(@lynysga==)uary_ z&V}FYB4O+bVCt|-duhl-Y|ivBu|@I`qU#=p1rc&f(u+yQRwS~OP=k)?k*!kX^-dG>HR5Vjf^+H<%~(4y325GWSGJMj z8#=h<0lnduZ+&Is)?5(rp*eGM(3*y`?Jj%sz5-}S<`+q`PO`zQV`*`s+^Is7)vnHj zZ|~lia?Ty)Oc9$gTC}D1<*y7-MM+q7aL&Pu?c6Vp!l}__^n;hexDt;M6WmYVLPc%M z*>V-*l5*G3mW@rw#EQp3kLO)5eF>;wHNkQ~G7jI{{#w|e4A_{cP*X{eeH=D4d7JWO zis zaU%5+e=t7q>4rXA=pud4Mg5?Q>4B6JGlASoW~nY_DPk5W4Hl`FEK*%8OA6ids6vM34G|^@bA!`{`0??@tMs*$T#qreHU6D6S_Hhy^G}T%TuYY zQz_yzDUCC!muFI4XG`f!5las^9$elZKW0Tp{>qfx%#_^9l-$Xb+{=_a$do+FlssmH zUb2di6UcS3FI_N4;ETc`)x{x2%qgY8DfNxP z{yB+=TMTh01YZ^UIU!ORW0=dxDRw-~9$sG;chU|?>^}9nLT%pICwUf$XJqX-w?lT> z$08zZA+PXm5Alqmi?Zq&Q!CI*kMosX(=HqK2#@o`eE{q7@p*R#H}rMqj-Ct z@PK49P$&<|fWuZlT03bCxH}|niL7|!e6gsQzeX~#uB3{<>+O&|n||Xrnn#1ez48b5 zqp^Mk`)IzcN6z^H`GdZ5{&$CNRN%2cHJbmIPwQ_jTE?lQI(+B1&xT(CC#Yoq9Hy#y zYVi#p=#R^9y7ot1v+HG?p?GlN?!ThCPh{l}p8n3~f6O3>Q~zx?qxxfPg}2NVIuxO2 z*_KroBk93R(7G!Z&N`YQ@ln+7ZzXgkIr6_0k{&?&Y1*zDKB$W>(`d#nAG9TswWvfw z!@v$&(8i=3D;dlpzWlobgIRb6cH@ZB{|8p9W?!|x;cc~PPvf1xXHVxndu&hd&3

  • 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%0DjokqW!^6~_PLeZ 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Π&f`X&nokglBCor)l*W8+O}g!RpcfI-q^_)L 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Ν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 z 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 z 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 Date: Mon, 27 Mar 2023 10:41:35 +0200 Subject: [PATCH 152/223] Removed very old solvers. On branch bojan_more_robust_communicator deleted: Dimensional_Solvers/Bicg.f90 deleted: Dimensional_Solvers/Cg.f90 deleted: Dimensional_Solvers/Cgs.f90 deleted: Normalized_Solvers/Bicg.f90 deleted: Normalized_Solvers/Cg.f90 deleted: Normalized_Solvers/Cgs.f90 --- .../Utilities/Dimensional_Solvers/Bicg.f90 | 202 --------------- Sources/Utilities/Dimensional_Solvers/Cg.f90 | 181 -------------- Sources/Utilities/Dimensional_Solvers/Cgs.f90 | 203 --------------- Sources/Utilities/Normalized_Solvers/Bicg.f90 | 234 ----------------- Sources/Utilities/Normalized_Solvers/Cg.f90 | 213 ---------------- Sources/Utilities/Normalized_Solvers/Cgs.f90 | 235 ------------------ 6 files changed, 1268 deletions(-) delete mode 100644 Sources/Utilities/Dimensional_Solvers/Bicg.f90 delete mode 100644 Sources/Utilities/Dimensional_Solvers/Cg.f90 delete mode 100644 Sources/Utilities/Dimensional_Solvers/Cgs.f90 delete mode 100644 Sources/Utilities/Normalized_Solvers/Bicg.f90 delete mode 100644 Sources/Utilities/Normalized_Solvers/Cg.f90 delete mode 100644 Sources/Utilities/Normalized_Solvers/Cgs.f90 diff --git a/Sources/Utilities/Dimensional_Solvers/Bicg.f90 b/Sources/Utilities/Dimensional_Solvers/Bicg.f90 deleted file mode 100644 index 4cde16ead..000000000 --- a/Sources/Utilities/Dimensional_Solvers/Bicg.f90 +++ /dev/null @@ -1,202 +0,0 @@ -!==============================================================================! - subroutine Bicg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) -!------------------------------------------------------------------------------! -! Solves the linear systems of equations by a preconditioned BiCG method ! -!------------------------------------------------------------------------------! -!----------------------------------[Modules]-----------------------------------! - use Work_Mod, only: p1 => r_cell_11, & - p2 => r_cell_12, & - q1 => r_cell_13, & - q2 => r_cell_14, & - r1 => r_cell_15, & - r2 => r_cell_16 -!------------------------------------------------------------------------------! -! When using Work_Mod, calling sequence should be outlined ! -! ! -! Main_Pro (allocates Work_Mod) ! -! | ! -! +----> Compute_Energy (uses r_cell_01..03) ! -! | | ! -! +----> Compute_Momentum (does not use Work_Mod) ! -! | | ! -! +----> Compute_Scalar (uses r_cell_04) ! -! | ! -! +----> Bicg (safe to use r_cell_11..16) ! -! ! -! Main_Pro (allocates Work_Mod) ! -! | ! -! +----> Turb_Mod_Main (does not use Work_Mod) ! -! | ! -! +---> Turb_Mod_Compute_Variable (does not use Work_Mod) ! -! | | ! -! +---> Turb_Mod_Compute_Stress (uses r_cell_01..09) ! -! | ! -! +----> Bicg (safe to use r_cell_11..16) ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Native_Type), target :: Nat - type(Matrix_Type) :: A - real :: x(-Nat % pnt_grid % n_bnd_cells : & - Nat % pnt_grid % n_cells) - real :: b( Nat % pnt_grid % n_cells) - character(SL) :: prec ! preconditioner - integer :: miter ! maximum and actual ... - integer :: niter ! ... number of iterations - real :: tol ! tolerance - real :: fin_res ! final residual - real, optional :: norm ! normalization -!-----------------------------------[Locals]-----------------------------------! - type(Matrix_Type), pointer :: D - integer :: nt, ni, nb - real :: alfa, beta, rho, rho_old, bnrm2, res - integer :: i, j, k, iter -!==============================================================================! - - ! Take some aliases - D => Nat % D - nt = A % pnt_grid % n_cells - ni = A % pnt_grid % n_cells - A % pnt_grid % Comm % n_buff_cells - nb = A % pnt_grid % n_bnd_cells - - res = 0.0 - - !---------------------! - ! Preconditioning ! - !---------------------! - call Nat % Prec_Form(ni, A, D, prec) - - !-----------------------------------! - ! This is quite tricky point. ! - ! What if bnrm2 is very small ? ! - !-----------------------------------! - if(.not. present(norm)) then - bnrm2 = Nat % Normalized_Root_Mean_Square(ni, b(1:nt), A, x(1:nt)) - else - bnrm2 = Nat % Normalized_Root_Mean_Square(ni, b(1:nt), A, x(1:nt), norm) - end if - - if(bnrm2 < tol) then - iter = 0 - goto 1 - end if - - !----------------! - ! r = b - Ax ! - !----------------! - call Nat % Residual_Vector(ni, r1(1:nt), b(1:nt), A, x(1:nt)) - - !--------------------------------! - ! Calculate initial residual ! - !--------------------------------! - res = Nat % Normalized_Root_Mean_Square(ni, r1(1:nt), A, x(1:nt)) - - if(res < tol) then - iter = 0 - goto 1 - end if - - !-----------------------! - ! Choose initial r~ ! - !-----------------------! - do i = 1, ni - r2(i) = r1(i) - end do - - !---------------! - ! ! - ! Main loop ! - ! ! - !---------------! - do iter = 1, miter - - !------------------------! - ! solve M z = r ! - ! solve M^T z~ = r~ ! don't have M^T!!! - ! (q instead of z) ! - !------------------------! - call Nat % Prec_Solve(ni, A, D, q1(1:nt), r1(1:nt), prec) - call Nat % Prec_Solve(ni, A, D, q2(1:nt), r2(1:nt), prec) - - !------------------! - ! rho = (z,r~) ! - !------------------! - rho = dot_product(q1(1:ni), r2(1:ni)) - call Comm_Mod_Global_Sum_Real(rho) - - if(iter .eq. 1) then - p1(1:ni) = q1(1:ni) - p2(1:ni) = q2(1:ni) - else - beta = rho / rho_old - p1(1:ni) = q1(1:ni) + beta * p1(1:ni) - p2(1:ni) = q2(1:ni) + beta * p2(1:ni) - end if - - !---------------! - ! q = A p ! - ! q~= A^T p~ ! don't have A^T - !---------------! - call A % pnt_grid % Exchange_Cells_Real(p1(-nb:ni)) - call A % pnt_grid % Exchange_Cells_Real(p2(-nb:ni)) - do i = 1, ni - q1(i) = 0.0 - q2(i) = 0.0 - do j = A % row(i), A % row(i+1)-1 - k = A % col(j) - q1(i) = q1(i) + A % val(j) * p1(k) - q2(i) = q2(i) + A % val(j) * p2(k) - end do - end do - - !----------------------! - ! alfa = rho/(p,q) ! - !----------------------! - alfa = 0.0 - alfa = alfa + dot_product(p2(1:ni), q1(1:ni)) - call Comm_Mod_Global_Sum_Real(alfa) - alfa = rho / alfa - - !--------------------! - ! x = x + alfa p ! - ! r = r - alfa q ! - !--------------------! - x (1:ni) = x (1:ni) + alfa*p1(1:ni) - r1(1:ni) = r1(1:ni) - alfa*q1(1:ni) - r2(1:ni) = r2(1:ni) - alfa*q2(1:ni) - - !-----------------------! - ! Check convergence ! - !-----------------------! - if(.not. present(norm)) then - res = Nat % Normalized_Root_Mean_Square(ni, r1(1:nt), A, x(1:nt)) - else - res = Nat % Normalized_Root_Mean_Square(ni, r1(1:nt), A, x(1:nt), norm) - end if - - if(res < tol) goto 1 - - rho_old = rho - - end do ! iter - - ! Correct the number of executed iterations, because - ! Fortran goes one number up do loop's upper limit - iter = iter - 1 - - !----------------------------------! - ! ! - ! Convergence has been reached ! - ! ! - !----------------------------------! -1 continue - - !-------------------------------------------! - ! Refresh the solution vector's buffers ! - !-------------------------------------------! - call A % pnt_grid % Exchange_Cells_Real(x(-nb:ni)) - - fin_res = res - niter = iter - - end subroutine diff --git a/Sources/Utilities/Dimensional_Solvers/Cg.f90 b/Sources/Utilities/Dimensional_Solvers/Cg.f90 deleted file mode 100644 index 3d93bed2c..000000000 --- a/Sources/Utilities/Dimensional_Solvers/Cg.f90 +++ /dev/null @@ -1,181 +0,0 @@ -!==============================================================================! - subroutine Cg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) -!------------------------------------------------------------------------------! -! Solves the linear systems of equations by a preconditioned CG method ! -!------------------------------------------------------------------------------! -!----------------------------------[Modules]-----------------------------------! - use Work_Mod, only: p1 => r_cell_01, & - q1 => r_cell_02, & - r1 => r_cell_03 -!------------------------------------------------------------------------------! -! When using Work_Mod, calling sequence should be outlined ! -! ! -! Main_Pro (allocates Work_Mod) ! -! | ! -! +----> Compute_Pressure (does not use Work_Mod) ! -! | ! -! +----> Cg (safe to use r_cell_01..03) ! -! ! -! Main_Pro (allocates Work_Mod) ! -! | ! -! +----> Turb_Mod_Main (does not use Work_Mod) ! -! | ! -! +---> Turb_Mod_Compute_F22 (does not use Work_Mod) ! -! | ! -! +----> Cg (safe to use r_cell_01..03) ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Native_Type), target :: Nat - type(Matrix_Type) :: A - real :: x(-Nat % pnt_grid % n_bnd_cells : & - Nat % pnt_grid % n_cells) - real :: b( Nat % pnt_grid % n_cells) - character(SL) :: prec ! preconditioner - integer :: miter ! maximum and actual ... - integer :: niter ! ... number of iterations - real :: tol ! tolerance - real :: fin_res ! final residual - real, optional :: norm ! normalization -!-----------------------------------[Locals]-----------------------------------! - type(Matrix_Type), pointer :: D - integer :: nt, ni, nb - real :: alfa, beta, rho, rho_old, bnrm2, res - integer :: i, j, k, iter -!==============================================================================! - - ! Take some aliases - D => Nat % D - nt = A % pnt_grid % n_cells - ni = A % pnt_grid % n_cells - A % pnt_grid % Comm % n_buff_cells - nb = A % pnt_grid % n_bnd_cells - - res = 0.0 - - !---------------------! - ! Preconditioning ! - !---------------------! - call Nat % Prec_Form(ni, A, D, prec) - - !-----------------------------------! - ! This is quite tricky point. ! - ! What if bnrm2 is very small ? ! - !-----------------------------------! - if(.not. present(norm)) then - bnrm2 = Nat % Normalized_Root_Mean_Square(ni, b(1:nt), A, x(1:nt)) - else - bnrm2 = Nat % Normalized_Root_Mean_Square(ni, b(1:nt), A, x(1:nt), norm) - end if - - if(bnrm2 < tol) then - iter = 0 - goto 1 - end if - - !----------------! - ! r = b - Ax ! - !----------------! - call Nat % Residual_Vector(ni, r1(1:nt), b(1:nt), A, x(1:nt)) - - !--------------------------------! - ! Calculate initial residual ! - !--------------------------------! - res = Nat % Normalized_Root_Mean_Square(ni, r1(1:nt), A, x(1:nt)) - - if(res < tol) then - iter = 0 - goto 1 - end if - - !-----------! - ! p = r ! - !-----------! - p1(1:ni) = r1(1:ni) - - !---------------! - ! ! - ! Main loop ! - ! ! - !---------------! - do iter = 1, miter - - !----------------------! - ! solve Mz = r ! - ! (q instead of z) ! - !----------------------! - call Nat % Prec_Solve(ni, A, D, q1(1:nt), r1(1:nt), prec) - - !-----------------! - ! rho = (r,z) ! - !-----------------! - rho = dot_product(r1(1:ni), q1(1:ni)) - call Comm_Mod_Global_Sum_Real(rho) - - if(iter .eq. 1) then - p1(1:ni) = q1(1:ni) - else - beta = rho / rho_old - p1(1:ni) = q1(1:ni) + beta * p1(1:ni) - end if - - !------------! - ! q = Ap ! - !------------! - call A % pnt_grid % Exchange_Cells_Real(p1(-nb:ni)) - do i = 1, ni - q1(i) = 0.0 - do j = A % row(i), A % row(i+1)-1 - k = A % col(j) - q1(i) = q1(i) + A % val(j) * p1(k) - end do - end do - - !------------------------! - ! alfa = (r,z)/(p,q) ! - !------------------------! - alfa = dot_product(p1(1:ni), q1(1:ni)) - call Comm_Mod_Global_Sum_Real(alfa) - alfa = rho/alfa - - !---------------------! - ! x = x + alfa p ! - ! r = r - alfa Ap ! - !---------------------! - x (1:ni) = x (1:ni) + alfa * p1(1:ni) - r1(1:ni) = r1(1:ni) - alfa * q1(1:ni) - - !-----------------------! - ! Check convergence ! - !-----------------------! - if(.not. present(norm)) then - res = Nat % Normalized_Root_Mean_Square(ni, r1(1:nt), A, x(1:nt)) - else - res = Nat % Normalized_Root_Mean_Square(ni, r1(1:nt), A, x(1:nt), norm) - end if - - if(res < tol) goto 1 - - rho_old = rho - - end do ! iter - - ! Correct the number of executed iterations, because - ! Fortran goes one number up do loop's upper limit - iter = iter - 1 - - !----------------------------------! - ! ! - ! Convergence has been reached ! - ! ! - !----------------------------------! -1 continue - - !-------------------------------------------! - ! Refresh the solution vector's buffers ! - !-------------------------------------------! - call A % pnt_grid % Exchange_Cells_Real(x(-nb:ni)) - - fin_res = res - niter = iter - - end subroutine diff --git a/Sources/Utilities/Dimensional_Solvers/Cgs.f90 b/Sources/Utilities/Dimensional_Solvers/Cgs.f90 deleted file mode 100644 index 3012685d9..000000000 --- a/Sources/Utilities/Dimensional_Solvers/Cgs.f90 +++ /dev/null @@ -1,203 +0,0 @@ -!==============================================================================! - subroutine Cgs(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) -!------------------------------------------------------------------------------! -! Solves the linear systems of equations by a preconditioned CGS method ! -!------------------------------------------------------------------------------! -!----------------------------------[Modules]-----------------------------------! - use Work_Mod, only: p1 => r_cell_01, & - p2 => r_cell_02, & - q1 => r_cell_03, & - q2 => r_cell_04, & - r1 => r_cell_06, & - r2 => r_cell_07, & - u1 => r_cell_08, & - u2 => r_cell_09, & - v2 => r_cell_10, & - u1_plus_q1 => r_cell_11 -!------------------------------------------------------------------------------! -! When using Work_Mod, calling sequence should be outlined, but this ! -! procedure is never called, so it doesn't make much sense to do it. ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Native_Type), target :: Nat - type(Matrix_Type) :: A - real :: x(-Nat % pnt_grid % n_bnd_cells : & - Nat % pnt_grid % n_cells) - real :: b( Nat % pnt_grid % n_cells) - character(SL) :: prec ! preconditioner - integer :: miter ! maximum and actual ... - integer :: niter ! ... number of iterations - real :: tol ! tolerance - real :: fin_res ! final residual - real, optional :: norm ! normalization -!-----------------------------------[Locals]-----------------------------------! - type(Matrix_Type), pointer :: D - integer :: nt, ni, nb - real :: alfa, beta, rho, rho_old, bnrm2, res - integer :: i, j, k, iter -!==============================================================================! - - ! Take some aliases - D => Nat % D - nt = A % pnt_grid % n_cells - ni = A % pnt_grid % n_cells - A % pnt_grid % Comm % n_buff_cells - nb = A % pnt_grid % n_bnd_cells - - res = 0.0 - - !---------------------! - ! Preconditioning ! - !---------------------! - call Nat % Prec_Form(ni, A, D, prec) - - !-----------------------------------! - ! This is quite tricky point. ! - ! What if bnrm2 is very small ? ! - !-----------------------------------! - if(.not. present(norm)) then - bnrm2 = Nat % Normalized_Root_Mean_Square(ni, b(1:nt), A, x(1:nt)) - else - bnrm2 = Nat % Normalized_Root_Mean_Square(ni, b(1:nt), A, x(1:nt), norm) - end if - - if(bnrm2 < tol) then - iter=0 - goto 1 - end if - - !-----------------! - ! r1 = b - Ax ! - !-----------------! - call Nat % Residual_Vector(ni, r1(1:nt), b(1:nt), A, x(1:nt)) - - !--------------------------------! - ! Calculate initial residual ! - !--------------------------------! - res = Nat % Normalized_Root_Mean_Square(ni, r1(1:nt), A, x(1:nt)) - - if(res < tol) then - iter=0 - goto 1 - end if - - !-------------! - ! r2 = r1 ! - !-------------! - r2(1:ni) = r1(1:ni) - - !---------------! - ! ! - ! Main loop ! - ! ! - !---------------! - do iter = 1, miter - - !-------------------! - ! rho = (r2,z1) ! - !-------------------! - rho = dot_product(r1(1:ni), r2(1:ni)) - call Comm_Mod_Global_Sum_Real(rho) - - if(iter .eq. 1) then - u1(1:ni) = r1(1:ni) - u2(1:ni) = u1(1:ni) - else - beta = rho / rho_old - u1(1:ni) = r1(1:ni) + beta * q1(1:ni) - u2(1:ni) = u1(1:ni) + beta * (q1(1:ni) + beta*u2(1:ni)) - end if - - !---------------------! - ! Solve M p2 = u2 ! - !---------------------! - call Nat % Prec_Solve(ni, A, D, p2(1:nt), u2(1:nt), prec) - - !--------------! - ! v2 = Ap2 ! - !--------------! - call A % pnt_grid % Exchange_Cells_Real(p2(-nb:ni)) - do i = 1, ni - v2(i) = 0.0 - do j = A % row(i), A % row(i+1)-1 - k = A % col(j) - v2(i) = v2(i) + A % val(j) * p2(k) - end do - alfa = alfa + r2(i) * v2(i) - end do - - !------------------------! - ! alfa = rho/(r2,v2) ! - !------------------------! - alfa = dot_product(r2(1:ni), v2(1:ni)) - call Comm_Mod_Global_Sum_Real(alfa) - alfa=rho / alfa - - !-------------------------! - ! q1 = u1 - alfa * v2 ! - !-------------------------! - q1(1:ni) = u1(1:ni) - alfa * v2(1:ni) - - !-------------------------! - ! solve Mp1 = u1 + q1 ! - !-------------------------! - u1_plus_q1(1:ni) = u1(1:ni) + q1(1:ni) - call Nat % Prec_Solve(ni, A, D, p1(1:nt), u1_plus_q1(1:nt), prec) - - !---------------------! - ! x = x + alfa p1 ! - !---------------------! - x(1:ni) = x(1:ni) + alfa * p1(1:ni) - - !---------------! - ! q2 = A p1 ! - !---------------! - call A % pnt_grid % Exchange_Cells_Real(p1(-nb:ni)) - do i = 1, ni - q2(i) = 0.0 - do j = A % row(i), A % row(i+1)-1 - k = A % col(j) - q2(i) = q2(i) + A % val(j) * p1(k) - end do - end do - - !---------------------! - ! r = r - alfa q2 ! - !---------------------! - r1(1:ni) = r1(1:ni) - alfa * q2(1:ni) - - !-----------------------! - ! Check convergence ! - !-----------------------! - if(.not. present(norm)) then - res = Nat % Normalized_Root_Mean_Square(ni, r1(1:nt), A, x(1:nt)) - else - res = Nat % Normalized_Root_Mean_Square(ni, r1(1:nt), A, x(1:nt), norm) - end if - - if(res < tol) goto 1 - - rho_old=rho - - end do ! iter - - ! Correct the number of executed iterations, because - ! Fortran goes one number up do loop's upper limit - iter = iter - 1 - - !----------------------------------! - ! ! - ! Convergence has been reached ! - ! ! - !----------------------------------! -1 continue - - !-------------------------------------------! - ! Refresh the solution vector's buffers ! - !-------------------------------------------! - call A % pnt_grid % Exchange_Cells_Real(x(-nb:ni)) - - fin_res = res - niter = iter - - end subroutine diff --git a/Sources/Utilities/Normalized_Solvers/Bicg.f90 b/Sources/Utilities/Normalized_Solvers/Bicg.f90 deleted file mode 100644 index 8fe36b315..000000000 --- a/Sources/Utilities/Normalized_Solvers/Bicg.f90 +++ /dev/null @@ -1,234 +0,0 @@ -!==============================================================================! - subroutine Bicg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) -!------------------------------------------------------------------------------! -! Solves the linear systems of equations by a preconditioned BiCG method ! -!------------------------------------------------------------------------------! -!----------------------------------[Modules]-----------------------------------! - use Work_Mod, only: p1 => r_cell_11, & - p2 => r_cell_12, & - q1 => r_cell_13, & - q2 => r_cell_14, & - r1 => r_cell_15, & - r2 => r_cell_16 -!------------------------------------------------------------------------------! -! When using Work_Mod, calling sequence should be outlined ! -! ! -! Main_Pro (allocates Work_Mod) ! -! | ! -! +----> Compute_Energy (uses r_cell_01..03) ! -! | | ! -! +----> Compute_Momentum (does not use Work_Mod) ! -! | | ! -! +----> Compute_Scalar (uses r_cell_04) ! -! | ! -! +----> Bicg (safe to use r_cell_11..17) ! -! ! -! Main_Pro (allocates Work_Mod) ! -! | ! -! +----> Turb_Mod_Main (does not use Work_Mod) ! -! | ! -! +---> Turb_Mod_Compute_Variable (does not use Work_Mod) ! -! | | ! -! +---> Turb_Mod_Compute_Stress (uses r_cell_01..09) ! -! | ! -! +----> Bicg (safe to use r_cell_11..16) ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Native_Type), target :: Nat - type(Matrix_Type) :: A - real :: x(-Nat % pnt_grid % n_bnd_cells : & - Nat % pnt_grid % n_cells) - real :: b( Nat % pnt_grid % n_cells) - character(SL) :: prec ! preconditioner - integer :: miter ! maximum and actual ... - integer :: niter ! ... number of iterations - real :: tol ! tolerance - real :: fin_res ! final residual - real, optional :: norm ! normalization -!-----------------------------------[Locals]-----------------------------------! - type(Matrix_Type), pointer :: D - integer :: nt, ni, nb - real :: alfa, beta, rho, rho_old, bnrm2, res - integer :: i, j, k, iter - real :: sum_a, fn - integer :: sum_n -!==============================================================================! - - ! Take some aliases - D => Nat % D - nt = A % pnt_grid % n_cells - ni = A % pnt_grid % n_cells - A % pnt_grid % Comm % n_buff_cells - nb = A % pnt_grid % n_bnd_cells - - res = 0.0 - - !--------------------------! - ! Normalize the system ! - !--------------------------! - sum_a = 0.0 - sum_n = 0 - do i = 1, ni - sum_a = sum_a + A % val(A % dia(i)) - sum_n = sum_n + 1 - end do - call Comm_Mod_Global_Sum_Real(sum_a) - call Comm_Mod_Global_Sum_Int (sum_n) ! this is stored somewhere, check - sum_a = sum_a / sum_n - fn = 1.0 / sum_a - do i = 1, nt - do j = A % row(i), A % row(i+1)-1 - A % val(j) = A % val(j) * fn - end do - b(i) = b(i) * fn - end do - - !---------------------! - ! Preconditioning ! - !---------------------! - call Nat % Prec_Form(ni, A, D, prec) - - !-----------------------------------! - ! This is quite tricky point. ! - ! What if bnrm2 is very small ? ! - !-----------------------------------! - if(.not. present(norm)) then - bnrm2 = Nat % Normalized_Root_Mean_Square(ni, b(1:nt), A, x(1:nt)) - else - bnrm2 = Nat % Normalized_Root_Mean_Square(ni, b(1:nt), A, x(1:nt), norm) - end if - - if(bnrm2 < tol) then - iter = 0 - goto 1 - end if - - !----------------! - ! r = b - Ax ! - !----------------! - call Nat % Residual_Vector(ni, r1(1:nt), b(1:nt), A, x(1:nt)) - - !--------------------------------! - ! Calculate initial residual ! - !--------------------------------! - res = Nat % Normalized_Root_Mean_Square(ni, r1(1:nt), A, x(1:nt)) - - if(res < tol) then - iter = 0 - goto 1 - end if - - !-----------------------! - ! Choose initial r~ ! - !-----------------------! - do i = 1, ni - r2(i) = r1(i) - end do - - !---------------! - ! ! - ! Main loop ! - ! ! - !---------------! - do iter = 1, miter - - !------------------------! - ! solve M z = r ! - ! solve M^T z~ = r~ ! don't have M^T!!! - ! (q instead of z) ! - !------------------------! - call Nat % Prec_Solve(ni, A, D, q1(1:nt), r1(1:nt), prec) - call Nat % Prec_Solve(ni, A, D, q2(1:nt), r2(1:nt), prec) - - !------------------! - ! rho = (z,r~) ! - !------------------! - rho = dot_product(q1(1:ni), r2(1:ni)) - call Comm_Mod_Global_Sum_Real(rho) - - if(iter .eq. 1) then - p1(1:ni) = q1(1:ni) - p2(1:ni) = q2(1:ni) - else - beta = rho / rho_old - p1(1:ni) = q1(1:ni) + beta * p1(1:ni) - p2(1:ni) = q2(1:ni) + beta * p2(1:ni) - end if - - !---------------! - ! q = A p ! - ! q~= A^T p~ ! don't have A^T - !---------------! - call A % pnt_grid % Exchange_Cells_Real(p1(-nb:ni)) - call A % pnt_grid % Exchange_Cells_Real(p2(-nb:ni)) - do i = 1, ni - q1(i) = 0.0 - q2(i) = 0.0 - do j = A % row(i), A % row(i+1)-1 - k = A % col(j) - q1(i) = q1(i) + A % val(j) * p1(k) - q2(i) = q2(i) + A % val(j) * p2(k) - end do - end do - - !----------------------! - ! alfa = rho/(p,q) ! - !----------------------! - alfa = 0.0 - alfa = alfa + dot_product(p2(1:ni), q1(1:ni)) - call Comm_Mod_Global_Sum_Real(alfa) - alfa = rho / alfa - - !--------------------! - ! x = x + alfa p ! - ! r = r - alfa q ! - !--------------------! - x (1:ni) = x (1:ni) + alfa*p1(1:ni) - r1(1:ni) = r1(1:ni) - alfa*q1(1:ni) - r2(1:ni) = r2(1:ni) - alfa*q2(1:ni) - - !-----------------------! - ! Check convergence ! - !-----------------------! - if(.not. present(norm)) then - res = Nat % Normalized_Root_Mean_Square(ni, r1(1:nt), A, x(1:nt)) - else - res = Nat % Normalized_Root_Mean_Square(ni, r1(1:nt), A, x(1:nt), norm) - end if - - if(res < tol) goto 1 - - rho_old = rho - - end do ! iter - - ! Correct the number of executed iterations, because - ! Fortran goes one number up do loop's upper limit - iter = iter - 1 - - !----------------------------------! - ! ! - ! Convergence has been reached ! - ! ! - !----------------------------------! -1 continue - - !-------------------------------------------! - ! Refresh the solution vector's buffers ! - !-------------------------------------------! - call A % pnt_grid % Exchange_Cells_Real(x(-nb:ni)) - - !-----------------------------! - ! De-normalize the system ! - !-----------------------------! - do i = 1, nt - do j = A % row(i), A % row(i+1)-1 - A % val(j) = A % val(j) / fn - end do - b(i) = b(i) / fn - end do - - fin_res = res - niter = iter - - end subroutine diff --git a/Sources/Utilities/Normalized_Solvers/Cg.f90 b/Sources/Utilities/Normalized_Solvers/Cg.f90 deleted file mode 100644 index 48427f5f3..000000000 --- a/Sources/Utilities/Normalized_Solvers/Cg.f90 +++ /dev/null @@ -1,213 +0,0 @@ -!==============================================================================! - subroutine Cg(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) -!------------------------------------------------------------------------------! -! Solves the linear systems of equations by a preconditioned CG method ! -!------------------------------------------------------------------------------! -!----------------------------------[Modules]-----------------------------------! - use Work_Mod, only: p1 => r_cell_01, & - q1 => r_cell_02, & - r1 => r_cell_03 -!------------------------------------------------------------------------------! -! When using Work_Mod, calling sequence should be outlined ! -! ! -! Main_Pro (allocates Work_Mod) ! -! | ! -! +----> Compute_Pressure (does not use Work_Mod) ! -! | ! -! +----> Cg (safe to use r_cell_01..03) ! -! ! -! Main_Pro (allocates Work_Mod) ! -! | ! -! +----> Turb_Mod_Main (does not use Work_Mod) ! -! | ! -! +---> Turb_Mod_Compute_F22 (does not use Work_Mod) ! -! | ! -! +----> Cg (safe to use r_cell_01..04) ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Native_Type), target :: Nat - type(Matrix_Type) :: A - real :: x(-Nat % pnt_grid % n_bnd_cells : & - Nat % pnt_grid % n_cells) - real :: b( Nat % pnt_grid % n_cells) - character(SL) :: prec ! preconditioner - integer :: miter ! maximum and actual ... - integer :: niter ! ... number of iterations - real :: tol ! tolerance - real :: fin_res ! final residual - real, optional :: norm ! normalization -!-----------------------------------[Locals]-----------------------------------! - type(Matrix_Type), pointer :: D - integer :: nt, ni, nb - real :: alfa, beta, rho, rho_old, bnrm2, res - integer :: i, j, k, iter - real :: sum_a, fn - integer :: sum_n -!==============================================================================! - - ! Take some aliases - D => Nat % D - nt = A % pnt_grid % n_cells - ni = A % pnt_grid % n_cells - A % pnt_grid % Comm % n_buff_cells - nb = A % pnt_grid % n_bnd_cells - - res = 0.0 - - !--------------------------! - ! Normalize the system ! - !--------------------------! - sum_a = 0.0 - sum_n = 0 - do i = 1, ni - sum_a = sum_a + A % val(A % dia(i)) - sum_n = sum_n + 1 - end do - call Comm_Mod_Global_Sum_Real(sum_a) - call Comm_Mod_Global_Sum_Int (sum_n) ! this is stored somewhere, check - sum_a = sum_a / sum_n - fn = 1.0 / sum_a - do i = 1, nt - do j = A % row(i), A % row(i+1)-1 - A % val(j) = A % val(j) * fn - end do - b(i) = b(i) * fn - end do - - !---------------------! - ! Preconditioning ! - !---------------------! - call Nat % Prec_Form(ni, A, D, prec) - - !-----------------------------------! - ! This is quite tricky point. ! - ! What if bnrm2 is very small ? ! - !-----------------------------------! - if(.not. present(norm)) then - bnrm2 = Nat % Normalized_Root_Mean_Square(ni, b(1:nt), A, x(1:nt)) - else - bnrm2 = Nat % Normalized_Root_Mean_Square(ni, b(1:nt), A, x(1:nt), norm) - end if - - if(bnrm2 < tol) then - iter = 0 - goto 1 - end if - - !----------------! - ! r = b - Ax ! - !----------------! - call Nat % Residual_Vector(ni, r1(1:nt), b(1:nt), A, x(1:nt)) - - !--------------------------------! - ! Calculate initial residual ! - !--------------------------------! - res = Nat % Normalized_Root_Mean_Square(ni, r1(1:nt), A, x(1:nt)) - - if(res < tol) then - iter = 0 - goto 1 - end if - - !-----------! - ! p = r ! - !-----------! - p1(1:ni) = r1(1:ni) - - !---------------! - ! ! - ! Main loop ! - ! ! - !---------------! - do iter = 1, miter - - !----------------------! - ! solve Mz = r ! - ! (q instead of z) ! - !----------------------! - call Nat % Prec_Solve(ni, A, D, q1(1:nt), r1(1:nt), prec) - - !-----------------! - ! rho = (r,z) ! - !-----------------! - rho = dot_product(r1(1:ni), q1(1:ni)) - call Comm_Mod_Global_Sum_Real(rho) - - if(iter .eq. 1) then - p1(1:ni) = q1(1:ni) - else - beta = rho / rho_old - p1(1:ni) = q1(1:ni) + beta * p1(1:ni) - end if - - !------------! - ! q = Ap ! - !------------! - call A % pnt_grid % Exchange_Cells_Real(p1(-nb:ni)) - do i = 1, ni - q1(i) = 0.0 - do j = A % row(i), A % row(i+1)-1 - k = A % col(j) - q1(i) = q1(i) + A % val(j) * p1(k) - end do - end do - - !------------------------! - ! alfa = (r,z)/(p,q) ! - !------------------------! - alfa = dot_product(p1(1:ni), q1(1:ni)) - call Comm_Mod_Global_Sum_Real(alfa) - alfa = rho/alfa - - !---------------------! - ! x = x + alfa p ! - ! r = r - alfa Ap ! - !---------------------! - x (1:ni) = x (1:ni) + alfa * p1(1:ni) - r1(1:ni) = r1(1:ni) - alfa * q1(1:ni) - - !-----------------------! - ! Check convergence ! - !-----------------------! - if(.not. present(norm)) then - res = Nat % Normalized_Root_Mean_Square(ni, r1(1:nt), A, x(1:nt)) - else - res = Nat % Normalized_Root_Mean_Square(ni, r1(1:nt), A, x(1:nt), norm) - end if - - if(res < tol) goto 1 - - rho_old = rho - - end do ! iter - - ! Correct the number of executed iterations, because - ! Fortran goes one number up do loop's upper limit - iter = iter - 1 - - !----------------------------------! - ! ! - ! Convergence has been reached ! - ! ! - !----------------------------------! -1 continue - - !-------------------------------------------! - ! Refresh the solution vector's buffers ! - !-------------------------------------------! - call A % pnt_grid % Exchange_Cells_Real(x(-nb:ni)) - - !-----------------------------! - ! De-normalize the system ! - !-----------------------------! - do i = 1, nt - do j = A % row(i), A % row(i+1)-1 - A % val(j) = A % val(j) / fn - end do - b(i) = b(i) / fn - end do - - fin_res = res - niter = iter - - end subroutine diff --git a/Sources/Utilities/Normalized_Solvers/Cgs.f90 b/Sources/Utilities/Normalized_Solvers/Cgs.f90 deleted file mode 100644 index 84d12ac58..000000000 --- a/Sources/Utilities/Normalized_Solvers/Cgs.f90 +++ /dev/null @@ -1,235 +0,0 @@ -!==============================================================================! - subroutine Cgs(Nat, A, x, b, prec, miter, niter, tol, fin_res, norm) -!------------------------------------------------------------------------------! -! Solves the linear systems of equations by a preconditioned CGS method ! -!------------------------------------------------------------------------------! -!----------------------------------[Modules]-----------------------------------! - use Work_Mod, only: p1 => r_cell_01, & - p2 => r_cell_02, & - q1 => r_cell_03, & - q2 => r_cell_04, & - r1 => r_cell_06, & - r2 => r_cell_07, & - u1 => r_cell_08, & - u2 => r_cell_09, & - v2 => r_cell_10, & - u1_plus_q1 => r_cell_11 -!------------------------------------------------------------------------------! -! When using Work_Mod, calling sequence should be outlined, but this ! -! procedure is never called, so it doesn't make much sense to do it. ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - class(Native_Type), target :: Nat - type(Matrix_Type) :: A - real :: x(-Nat % pnt_grid % n_bnd_cells : & - Nat % pnt_grid % n_cells) - real :: b( Nat % pnt_grid % n_cells) - character(SL) :: prec ! preconditioner - integer :: miter ! maximum and actual ... - integer :: niter ! ... number of iterations - real :: tol ! tolerance - real :: fin_res ! final residual - real, optional :: norm ! normalization -!-----------------------------------[Locals]-----------------------------------! - type(Matrix_Type), pointer :: D - integer :: nt, ni, nb - real :: alfa, beta, rho, rho_old, bnrm2, res - integer :: i, j, k, iter - real :: sum_a, fn - integer :: sum_n -!==============================================================================! - - ! Take some aliases - D => Nat % D - nt = A % pnt_grid % n_cells - ni = A % pnt_grid % n_cells - A % pnt_grid % Comm % n_buff_cells - nb = A % pnt_grid % n_bnd_cells - - res = 0.0 - - !--------------------------! - ! Normalize the system ! - !--------------------------! - sum_a = 0.0 - sum_n = 0 - do i = 1, ni - sum_a = sum_a + A % val(A % dia(i)) - sum_n = sum_n + 1 - end do - call Comm_Mod_Global_Sum_Real(sum_a) - call Comm_Mod_Global_Sum_Int (sum_n) ! this is stored somewhere, check - sum_a = sum_a / sum_n - fn = 1.0 / sum_a - do i = 1, nt - do j = A % row(i), A % row(i+1)-1 - A % val(j) = A % val(j) * fn - end do - b(i) = b(i) * fn - end do - - !---------------------! - ! Preconditioning ! - !---------------------! - call Nat % Prec_Form(ni, A, D, prec) - - !-----------------------------------! - ! This is quite tricky point. ! - ! What if bnrm2 is very small ? ! - !-----------------------------------! - if(.not. present(norm)) then - bnrm2 = Nat % Normalized_Root_Mean_Square(ni, b(1:nt), A, x(1:nt)) - else - bnrm2 = Nat % Normalized_Root_Mean_Square(ni, b(1:nt), A, x(1:nt), norm) - end if - - if(bnrm2 < tol) then - iter=0 - goto 1 - end if - - !-----------------! - ! r1 = b - Ax ! - !-----------------! - call Nat % Residual_Vector(ni, r1(1:nt), b(1:nt), A, x(1:nt)) - - !--------------------------------! - ! Calculate initial residual ! - !--------------------------------! - res = Nat % Normalized_Root_Mean_Square(ni, r1(1:nt), A, x(1:nt)) - - if(res < tol) then - iter = 0 - goto 1 - end if - - !-------------! - ! r2 = r1 ! - !-------------! - r2(1:ni) = r1(1:ni) - - !---------------! - ! ! - ! Main loop ! - ! ! - !---------------! - do iter = 1, miter - - !-------------------! - ! rho = (r2,z1) ! - !-------------------! - rho = dot_product(r1(1:ni), r2(1:ni)) - call Comm_Mod_Global_Sum_Real(rho) - - if(iter .eq. 1) then - u1(1:ni) = r1(1:ni) - u2(1:ni) = u1(1:ni) - else - beta = rho / rho_old - u1(1:ni) = r1(1:ni) + beta * q1(1:ni) - u2(1:ni) = u1(1:ni) + beta * (q1(1:ni) + beta*u2(1:ni)) - end if - - !---------------------! - ! Solve M p2 = u2 ! - !---------------------! - call Nat % Prec_Solve(ni, A, D, p2(1:nt), u2(1:nt), prec) - - !--------------! - ! v2 = Ap2 ! - !--------------! - call A % pnt_grid % Exchange_Cells_Real(p2(-nb:ni)) - do i = 1, ni - v2(i) = 0.0 - do j = A % row(i), A % row(i+1)-1 - k = A % col(j) - v2(i) = v2(i) + A % val(j) * p2(k) - end do - alfa = alfa + r2(i) * v2(i) - end do - - !------------------------! - ! alfa = rho/(r2,v2) ! - !------------------------! - alfa = dot_product(r2(1:ni), v2(1:ni)) - call Comm_Mod_Global_Sum_Real(alfa) - alfa=rho / alfa - - !-------------------------! - ! q1 = u1 - alfa * v2 ! - !-------------------------! - q1(1:ni) = u1(1:ni) - alfa * v2(1:ni) - - !-------------------------! - ! solve Mp1 = u1 + q1 ! - !-------------------------! - u1_plus_q1(1:ni) = u1(1:ni) + q1(1:ni) - call Nat % Prec_Solve(ni, A, D, p1(1:nt), u1_plus_q1(1:nt), prec) - - !---------------------! - ! x = x + alfa p1 ! - !---------------------! - x(1:ni) = x(1:ni) + alfa * p1(1:ni) - - !---------------! - ! q2 = A p1 ! - !---------------! - call A % pnt_grid % Exchange_Cells_Real(p1(-nb:ni)) - do i = 1, ni - q2(i) = 0.0 - do j = A % row(i), A % row(i+1)-1 - k = A % col(j) - q2(i) = q2(i) + A % val(j) * p1(k) - end do - end do - - !---------------------! - ! r = r - alfa q2 ! - !---------------------! - r1(1:ni) = r1(1:ni) - alfa * q2(1:ni) - - !-----------------------! - ! Check convergence ! - !-----------------------! - if(.not. present(norm)) then - res = Nat % Normalized_Root_Mean_Square(ni, r1(1:nt), A, x(1:nt)) - else - res = Nat % Normalized_Root_Mean_Square(ni, r1(1:nt), A, x(1:nt), norm) - end if - - if(res < tol) goto 1 - - rho_old = rho - - end do ! iter - - ! Correct the number of executed iterations, because - ! Fortran goes one number up do loop's upper limit - iter = iter - 1 - - !----------------------------------! - ! ! - ! Convergence has been reached ! - ! ! - !----------------------------------! -1 continue - - !-------------------------------------------! - ! Refresh the solution vector's buffers ! - !-------------------------------------------! - call A % pnt_grid % Exchange_Cells_Real(x(-nb:ni)) - - !-----------------------------! - ! De-normalize the system ! - !-----------------------------! - do i = 1, nt - do j = A % row(i), A % row(i+1)-1 - A % val(j) = A % val(j) / fn - end do - b(i) = b(i) / fn - end do - - fin_res = res - niter = iter - - end subroutine From 9578edeff3081a207fb03ff9b3f96ee99d975f5b Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 27 Mar 2023 12:19:01 +0200 Subject: [PATCH 153/223] One more little update to syntax highlighting file On branch bojan_more_robust_communicator modified: Documentation/fortran.vim --- Documentation/fortran.vim | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Documentation/fortran.vim b/Documentation/fortran.vim index 82d2932e7..e3c33df73 100644 --- a/Documentation/fortran.vim +++ b/Documentation/fortran.vim @@ -451,7 +451,6 @@ if b:fortran_dialect == "f08" syn keyword fortranObjectTflows Comm Global Backup Bac Flow Fld Turb Tur Vof Swarm Swr syn keyword fortranTypeTflows Bulk_Type Face_Type syn keyword fortranObjectTflows bulk v_flux - syn keyword fortranObjectTflows This_Proc N_Procs First_Proc Sequential_Run Parallel_Run syn keyword fortranTypeTflows Front_Type Surf_Type Elem_Type Side_Type Vert_Type Particle_Type syn keyword fortranObjectTflows Front Surf Elem side Vert Part syn keyword fortranTypeTflows Monitor_Type Results_Type Porosity_Type Profiler_Type Message_Type @@ -460,6 +459,12 @@ if b:fortran_dialect == "f08" syn keyword fortranObjectTflows A M vector Sol Nat Pet Process syn keyword fortranTypeTflows Var_Type syn keyword fortranObjectTflows u v w ui uj uk p t kin eps zeta f22 uu vv ww uv vw uw ut vt wt t2 vis +" Items which follow are not really objects, but I don't know where else to put them + syn keyword fortranObjectTflows This_Proc N_Procs First_Proc Sequential_Run Parallel_Run +" Macros might need a special group of their own. + syn keyword fortranMacroTflows Boundary_Regions Boundary_And_Inside_Regions Boundary_Inside_And_Buffer_Regions + syn keyword fortranMacroTflows All_Regions Faces_In_Region Faces_In_Domain + syn keyword fortranMacroTflows Cells_In_Region Cells_In_Domain Cells_In_Domain_And_Buffers Cells_In_Buffers " Finally, a few global functions which I don't really like in the code syn keyword fortranGlobalTflows Adjust_Dim Adjust_First_Dim Swap_Int Swap_Real "---------------------------------------------------------------------[T-Flows]- @@ -689,6 +694,7 @@ hi def link fortranConstantTflows fortranConstant hi def link fortranTypeTflows fortranType hi def link fortranObjectTflows fortranIntrinsic hi def link fortranMpiTflows fortranIntrinsic +hi def link fortranMacroTflows fortranIntrinsic hi def link fortranGlobalTflows Todo "---------------------------------------------------------------------[T-Flows]- From 19a23fdf786d8121d39879c565c296f9af170550 Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 27 Mar 2023 12:54:13 +0200 Subject: [PATCH 154/223] Fixed PETSc compilation - again. On branch bojan_more_robust_communicator modified: Process/Petsc_Mod/True/Create_Petsc.f90 --- Sources/Process/Petsc_Mod/True/Create_Petsc.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Process/Petsc_Mod/True/Create_Petsc.f90 b/Sources/Process/Petsc_Mod/True/Create_Petsc.f90 index e83187de3..138a997e9 100644 --- a/Sources/Process/Petsc_Mod/True/Create_Petsc.f90 +++ b/Sources/Process/Petsc_Mod/True/Create_Petsc.f90 @@ -40,7 +40,7 @@ subroutine Create_Petsc(Pet, Nat, Grid) ! Distribute m_lowers among all processors all_lower_ms(This_Proc()) = Pet % m_lower - call Comm_Mod_Global_Sum_Int_Array(N_Procs(), all_lower_ms) + call Global % Sum_Int_Array(N_Procs(), all_lower_ms) start = sum(all_lower_ms(1:This_Proc())) - Pet % m_lower From 4a9894bef3cec76ad7a02eab986106c45a981b65 Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 27 Mar 2023 19:31:45 +0200 Subject: [PATCH 155/223] Added a missing keyword. How did it go missing? On branch bojan_more_robust_communicator modified: Documentation/all_control_keywords --- Documentation/all_control_keywords | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/all_control_keywords b/Documentation/all_control_keywords index d329ac2a6..ed5c1f93a 100644 --- a/Documentation/all_control_keywords +++ b/Documentation/all_control_keywords @@ -68,6 +68,7 @@ NORMALIZATION_FOR_TURBULENCE_SOLVER | 1.0 | any real number, but mostly it is 1.0 NUMBER_OF_PISO_CORRECTIONS | 3 | any integer up to 10 is reasonable NUMBER_OF_TIME_STEPS | 1200 | any integer, multiples of 30 make sense + NUMBER_OF_SWARM_SUB_STEPS | 12 | any integer, but I would say up to 20 PRECONDITIONER_FOR_SYSTEM_MATRIX | incomplete_cholesky | diagonal, none PRESSURE_MOMENTUM_COUPLING | simple | piso REPORT_VOLUME_BALANCE | no | yes From b5a8402c440426b948ed9e991ed92e4de50c76c1 Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 27 Mar 2023 19:33:19 +0200 Subject: [PATCH 156/223] Added a couple of STL files. They are rather small On branch bojan_more_robust_communicator new file: Tests/Swarm/Three_Phase_Flow/sphere.stl new file: Tests/Vof/Rising_Bubble/sphere.stl --- Tests/Swarm/Three_Phase_Flow/sphere.stl | Bin 0 -> 16084 bytes Tests/Vof/Rising_Bubble/sphere.stl | Bin 0 -> 16084 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Tests/Swarm/Three_Phase_Flow/sphere.stl create mode 100644 Tests/Vof/Rising_Bubble/sphere.stl diff --git a/Tests/Swarm/Three_Phase_Flow/sphere.stl b/Tests/Swarm/Three_Phase_Flow/sphere.stl new file mode 100644 index 0000000000000000000000000000000000000000..7b1341e7933a4d5bdecf189ed42d88f8dbe21d78 GIT binary patch literal 16084 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 pbVP$-HS05UoqxrxM`wEqI*>Zz{{VIgIzs>e literal 0 HcmV?d00001 diff --git a/Tests/Vof/Rising_Bubble/sphere.stl b/Tests/Vof/Rising_Bubble/sphere.stl new file mode 100644 index 0000000000000000000000000000000000000000..ed9683262d746bfa850fb764d4614ffefe45fc6d GIT binary patch literal 16084 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 Date: Mon, 27 Mar 2023 19:35:31 +0200 Subject: [PATCH 157/223] Correction to a number of control files. They include: line alignment, removing the features which do not exist in the code any more, fixing the syntax of features which do exist. On branch bojan_more_robust_communicator modified: Tests/Laminar/Convective_Outflow/control modified: Tests/Laminar/Flat_Plate/control modified: Tests/Laminar/Module/control modified: Tests/Les/Barc/control modified: Tests/Les/Forrest/control modified: Tests/Les/Pipe_Re_Tau_180/control modified: Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/control modified: Tests/Manual/Rising_Bubble/control modified: Tests/Rans/Channel_Re_Tau_590/Long_Domain/control modified: Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/control modified: Tests/Swarm/Three_Phase_Flow/control modified: Tests/Vof/Fuel_Bundle/control modified: Tests/Vof/Rising_Bubble/control modified: Tests/Vof/Stefan/control modified: Tests/Vof/Sucking/control --- Tests/Laminar/Convective_Outflow/control | 6 ++-- Tests/Laminar/Flat_Plate/control | 6 ++-- Tests/Laminar/Module/control | 2 +- Tests/Les/Barc/control | 10 +++---- Tests/Les/Forrest/control | 2 +- Tests/Les/Pipe_Re_Tau_180/control | 7 ++--- .../control | 1 - Tests/Manual/Rising_Bubble/control | 28 +++++++++---------- .../Channel_Re_Tau_590/Long_Domain/control | 1 - .../control | 9 +++--- Tests/Swarm/Three_Phase_Flow/control | 9 +++--- Tests/Vof/Fuel_Bundle/control | 24 ++++++++-------- Tests/Vof/Rising_Bubble/control | 28 +++++++++---------- Tests/Vof/Stefan/control | 15 +++++----- Tests/Vof/Sucking/control | 15 +++++----- 15 files changed, 78 insertions(+), 85 deletions(-) diff --git a/Tests/Laminar/Convective_Outflow/control b/Tests/Laminar/Convective_Outflow/control index 5c772cdca..ea14ab5ab 100644 --- a/Tests/Laminar/Convective_Outflow/control +++ b/Tests/Laminar/Convective_Outflow/control @@ -37,15 +37,15 @@ #----------------------------------------------------------- # Numerical parameters #----------------------------------------------------------- - PRESSURE_MOMENTUM_COUPLING piso + PRESSURE_MOMENTUM_COUPLING piso SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.999 - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem MAX_GAUSS_GRADIENTS_ITERATIONS 200 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-5 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-5 #----------------------------------------------------------- # Linear solver settings diff --git a/Tests/Laminar/Flat_Plate/control b/Tests/Laminar/Flat_Plate/control index bd88bfc97..5ebaf498c 100644 --- a/Tests/Laminar/Flat_Plate/control +++ b/Tests/Laminar/Flat_Plate/control @@ -37,10 +37,10 @@ # Fluid properties # Dry air at 27oC in SI units #---------------------------------------- - MASS_DENSITY 1.177 - DYNAMIC_VISCOSITY 1.846e-5 + MASS_DENSITY 1.177 + DYNAMIC_VISCOSITY 1.846e-5 - THERMAL_CONDUCTIVITY 2.6240e-2 + THERMAL_CONDUCTIVITY 2.6240e-2 HEAT_CAPACITY 1000.0 #---------------------------------------- diff --git a/Tests/Laminar/Module/control b/Tests/Laminar/Module/control index 9b86beedf..975581e9c 100644 --- a/Tests/Laminar/Module/control +++ b/Tests/Laminar/Module/control @@ -7,7 +7,7 @@ NUMBER_OF_TIME_STEPS 1200 RESULTS_SAVE_INTERVAL 120 BACKUP_SAVE_INTERVAL 600 - TIME_STEP 0.01 + TIME_STEP 0.01 # LOAD_BACKUP_NAME backstep_orthogonal-ts000001.backup diff --git a/Tests/Les/Barc/control b/Tests/Les/Barc/control index b70390412..9c70f0b06 100644 --- a/Tests/Les/Barc/control +++ b/Tests/Les/Barc/control @@ -35,10 +35,10 @@ SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.95 TOLERANCE_FOR_SIMPLE_ALGORITHM 1.0e-3 MIN_SIMPLE_ITERATIONS 2 - MAX_SIMPLE_ITERATIONS 25 + MAX_SIMPLE_ITERATIONS 25 TIME_INTEGRATION_SCHEME parabolic - + ADVECTION_SCHEME_FOR_MOMENTUM smart ### BLENDING_COEFFICIENT_FOR_MOMENTUM 0.8 @@ -47,10 +47,10 @@ ADVECTION_SCHEME_FOR_MOMENTUM smart #-------------------------- TOLERANCE_FOR_POTENTIAL_SOLVER 1.0e-4 TOLERANCE_FOR_WALL_DISTANCE_SOLVER 1.0e-4 - + TOLERANCE_FOR_PRESSURE_SOLVER 1.0e-6 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_MOMENTUM_SOLVER 25 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_MOMENTUM_SOLVER 25 #------------------- # Initial conditions diff --git a/Tests/Les/Forrest/control b/Tests/Les/Forrest/control index 7d630c051..7a24469e1 100644 --- a/Tests/Les/Forrest/control +++ b/Tests/Les/Forrest/control @@ -4,7 +4,7 @@ PROBLEM_NAME domain HEAT_TRANSFER no - TIME_STEP 0.5 + TIME_STEP 0.5 NUMBER_OF_TIME_STEPS 14400 (this is two hours) STARTING_TIME_STEP_FOR_TURB_STATISTICS 7200 (this is one hour) RESULTS_SAVE_INTERVAL 600 (five minutes) diff --git a/Tests/Les/Pipe_Re_Tau_180/control b/Tests/Les/Pipe_Re_Tau_180/control index 13aa565b3..aaad0c1d4 100644 --- a/Tests/Les/Pipe_Re_Tau_180/control +++ b/Tests/Les/Pipe_Re_Tau_180/control @@ -29,8 +29,7 @@ DYNAMIC_VISCOSITY 3.33333e-4 HEAT_CAPACITY 1.0 -TURBULENCE_MODEL les_dynamic - PERTURB_MOMENTUM yes + TURBULENCE_MODEL les_dynamic PRESSURE_DROPS 0.0 0.0 -0.0072 MASS_FLOW_RATES 0.0 0.0 -2.8 @@ -62,7 +61,7 @@ TURBULENCE_MODEL les_dynamic # Initial conditions #-------------------- INITIAL_CONDITION - VARIABLES u v w t + VARIABLES u v w t VALUES 0.0 0.0 -2.8 20.0 #--------------------- @@ -73,5 +72,3 @@ TURBULENCE_MODEL les_dynamic TYPE wall VARIABLES u v w q VALUES 0.0 0.0 0.0 0.1 -INTERFACE_TRACKING no -PARTICLE_TRACKING no diff --git a/Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/control b/Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/control index 51be84aa5..8a53f1962 100644 --- a/Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/control +++ b/Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/control @@ -64,7 +64,6 @@ VARIABLES u v w t VALUES 0.0 0.0 0.0 10.0 - #--------------------- # Boundary conditions #--------------------- diff --git a/Tests/Manual/Rising_Bubble/control b/Tests/Manual/Rising_Bubble/control index a9327d1ba..2bf14f679 100644 --- a/Tests/Manual/Rising_Bubble/control +++ b/Tests/Manual/Rising_Bubble/control @@ -47,24 +47,24 @@ GRADIENT_METHOD_FOR_PRESSURE gauss_theorem GRADIENT_METHOD_FOR_VOF gauss_theorem - MAX_ITERATIONS_FOR_GAUSS_GRADIENTS 200 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-4 + MAX_GAUSS_GRADIENTS_ITERATIONS 200 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-4 #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-12 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-03 - TOLERANCE_FOR_VOF_SOLVER 1.e-12 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 100 - MAX_SIMPLE_ITERATIONS 20 - MAX_SMOOTHING_CYCLES_CURVATURE_VOF 12 - MAX_SMOOTHING_CYCLES_NORMAL_VOF 0 - COMPRESION_VOF no - COMPRESION_FACTOR_VOF 1.0 - MIN_SIMPLE_ITERATIONS 3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-12 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-03 + TOLERANCE_FOR_VOF_SOLVER 1.e-12 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 100 + MAX_SIMPLE_ITERATIONS 20 + MAX_SMOOTHING_CYCLES_CURVATURE_VOF 12 + MAX_SMOOTHING_CYCLES_NORMAL_VOF 0 + COMPRESION_VOF no + COMPRESION_FACTOR_VOF 1.0 + MIN_SIMPLE_ITERATIONS 3 #--------------------- diff --git a/Tests/Rans/Channel_Re_Tau_590/Long_Domain/control b/Tests/Rans/Channel_Re_Tau_590/Long_Domain/control index 0a0bc0262..3c3f8a5e0 100644 --- a/Tests/Rans/Channel_Re_Tau_590/Long_Domain/control +++ b/Tests/Rans/Channel_Re_Tau_590/Long_Domain/control @@ -7,7 +7,6 @@ #--------------- # Time stepping #--------------- - TIME_STEP 0.6 NUMBER_OF_TIME_STEPS 1200 RESULTS_SAVE_INTERVAL 600 diff --git a/Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/control b/Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/control index 93342c82a..e5cf73298 100644 --- a/Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/control +++ b/Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/control @@ -8,11 +8,11 @@ TIME_STEP 0.05 NUMBER_OF_TIME_STEPS 3600 - STARTING_TIME_STEP_FOR_TURB_STATISTICS 50 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 60 # LOAD_BACKUP_NAME rb_conv-ts000060.backup - RESULTS_SAVE_INTERVAL 50 - BACKUP_SAVE_INTERVAL 2000 + RESULTS_SAVE_INTERVAL 60 + BACKUP_SAVE_INTERVAL 3600 #------------------- # Monitoring points @@ -48,6 +48,7 @@ HEAT_CAPACITY 1.0 TURBULENCE_MODEL k_eps_zeta_f +#TURBULENCE_MODEL k_eps TURBULENT_HEAT_FLUX_MODEL GGDH @@ -74,7 +75,7 @@ TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 TOLERANCE_FOR_ENERGY_SOLVER 1.e-4 - TOLERANCE_FOR_TURBULENCE 1.e-4 + TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-4 TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 diff --git a/Tests/Swarm/Three_Phase_Flow/control b/Tests/Swarm/Three_Phase_Flow/control index e71816a4f..8e886ead6 100644 --- a/Tests/Swarm/Three_Phase_Flow/control +++ b/Tests/Swarm/Three_Phase_Flow/control @@ -3,7 +3,7 @@ #---------- PROBLEM_NAME cavity HEAT_TRANSFER no - INTERFACE_TRACKING yes +INTERFACE_TRACKING yes TRACK_FRONT yes NUMBER_OF_TIME_STEPS 1200 @@ -43,10 +43,10 @@ PHASE_DENSITIES 1.0 1.0e3 PHASE_VISCOSITIES 0.005 0.005 # 0.01 0.01 SURFACE_TENSION 0.05 # 0.36 - TURBULENCE_MODEL none +TURBULENCE_MODEL none GRAVITATIONAL_VECTOR 0.0 0.0 -9.81 - PARTICLE_TRACKING yes +PARTICLE_TRACKING yes SWARM_DIAMETER 5.0e-04 SWARM_DENSITY 1.0e+04 NUMBER_OF_SWARM_SUB_STEPS 12 @@ -72,8 +72,7 @@ GRADIENT_METHOD_FOR_PRESSURE gauss_theorem GRADIENT_METHOD_FOR_VOF gauss_theorem - MAX_ITERATIONS_FOR_GAUSS_GRADIENTS 200 - MAX_ITERATIONS_FOR_VOF_GRADIENTS 200 + MAX_GAUSS_GRADIENTS_ITERATIONS 200 TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-4 # NODAL_CURVATURE yes diff --git a/Tests/Vof/Fuel_Bundle/control b/Tests/Vof/Fuel_Bundle/control index 94ea464e9..6883aecc4 100644 --- a/Tests/Vof/Fuel_Bundle/control +++ b/Tests/Vof/Fuel_Bundle/control @@ -47,24 +47,24 @@ CHOI_CORRECTION yes GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_ITERATIONS_FOR_GAUSS_GRADIENTS 200 + MAX_GAUSS_GRADIENTS_ITERATIONS 200 TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-4 #------------------------ # Linear solver settings #------------------------ PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-12 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-03 - TOLERANCE_FOR_VOF_SOLVER 1.e-12 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 100 - MAX_SIMPLE_ITERATIONS 20 - MAX_SMOOTHING_CYCLES_CURVATURE_VOF 12 - MAX_SMOOTHING_CYCLES_NORMAL_VOF 0 - COMPRESION_VOF no - COMPRESION_FACTOR_VOF 1.0 - MIN_SIMPLE_ITERATIONS 3 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-12 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-03 + TOLERANCE_FOR_VOF_SOLVER 1.e-12 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 100 + MAX_SIMPLE_ITERATIONS 20 + MAX_SMOOTHING_CYCLES_CURVATURE_VOF 12 + MAX_SMOOTHING_CYCLES_NORMAL_VOF 0 + COMPRESION_VOF no + COMPRESION_FACTOR_VOF 1.0 + MIN_SIMPLE_ITERATIONS 3 #DUAL_TIME_STEP_VOF yes #-------------------- diff --git a/Tests/Vof/Rising_Bubble/control b/Tests/Vof/Rising_Bubble/control index b75bbd272..37ad0125f 100644 --- a/Tests/Vof/Rising_Bubble/control +++ b/Tests/Vof/Rising_Bubble/control @@ -47,25 +47,25 @@ CHOI_CORRECTION yes GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_ITERATIONS_FOR_GAUSS_GRADIENTS 200 + MAX_GAUSS_GRADIENTS_ITERATIONS 200 TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-4 #------------------------ # Linear solver settings #------------------------ - LINEAR_SOLVERS native - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-12 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-03 - TOLERANCE_FOR_VOF_SOLVER 1.e-12 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 100 - MAX_SIMPLE_ITERATIONS 20 - MAX_SMOOTHING_CYCLES_CURVATURE_VOF 12 - MAX_SMOOTHING_CYCLES_NORMAL_VOF 0 - COMPRESION_VOF no - COMPRESION_FACTOR_VOF 1.0 - MIN_SIMPLE_ITERATIONS 3 + LINEAR_SOLVERS native + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-12 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-03 + TOLERANCE_FOR_VOF_SOLVER 1.e-12 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 100 + MAX_SIMPLE_ITERATIONS 20 + MAX_SMOOTHING_CYCLES_CURVATURE_VOF 12 + MAX_SMOOTHING_CYCLES_NORMAL_VOF 0 + COMPRESION_VOF no + COMPRESION_FACTOR_VOF 1.0 + MIN_SIMPLE_ITERATIONS 3 #DUAL_TIME_STEP_VOF yes PETSC_OPTIONS_FOR_PRESSURE diff --git a/Tests/Vof/Stefan/control b/Tests/Vof/Stefan/control index 8d17c9927..02f3fc3fa 100644 --- a/Tests/Vof/Stefan/control +++ b/Tests/Vof/Stefan/control @@ -69,9 +69,8 @@ GRADIENT_METHOD_FOR_PRESSURE gauss_theorem GRADIENT_METHOD_FOR_VOF gauss_theorem - TOLERANCE_FOR_VOF GRADIENTS 1.0e-4 TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-4 - MAX_ITERATIONS_FOR_GAUSS_GRADIENTS 200 + MAX_GAUSS_GRADIENTS_ITERATIONS 200 #------------------------ # Linear solver settings @@ -96,16 +95,16 @@ #--------------------- BOUNDARY_CONDITION wall TYPE inflow - VARIABLES u v w vof vof_c_ang t - VALUES 0.00 0.0 0.0 0.0 90.0 10.1 + VARIABLES u v w vof vof_c_ang t + VALUES 0.0 0.0 0.0 0.0 90.0 10.1 BOUNDARY_CONDITION outlet TYPE outflow - VARIABLES u v w vof vof_c_ang q - VALUES 0.00 0.0 0.0 0.0 90.0 0.0 + VARIABLES u v w vof vof_c_ang q + VALUES 0.0 0.0 0.0 0.0 90.0 0.0 BOUNDARY_CONDITION symmetry TYPE symmetry - VARIABLES u v w vof vof_c_ang q - VALUES 0.00 0.0 0.0 0.0 90.0 0.0 + VARIABLES u v w vof vof_c_ang q + VALUES 0.0 0.0 0.0 0.0 90.0 0.0 diff --git a/Tests/Vof/Sucking/control b/Tests/Vof/Sucking/control index 045d8917b..678172d89 100644 --- a/Tests/Vof/Sucking/control +++ b/Tests/Vof/Sucking/control @@ -69,9 +69,8 @@ GRADIENT_METHOD_FOR_PRESSURE gauss_theorem GRADIENT_METHOD_FOR_VOF gauss_theorem - TOLERANCE_FOR_VOF GRADIENTS 1.0e-4 TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-4 - MAX_ITERATIONS_FOR_GAUSS_GRADIENTS 200 + MAX_GAUSS_GRADIENTS_ITERATIONS 200 #------------------------ # Linear solver settings @@ -96,16 +95,16 @@ #--------------------- BOUNDARY_CONDITION wall TYPE inflow - VARIABLES u v w vof vof_c_ang t - VALUES 0.00 0.0 0.0 0.0 90.0 10.0 + VARIABLES u v w vof vof_c_ang t + VALUES 0.0 0.0 0.0 0.0 90.0 10.0 BOUNDARY_CONDITION outlet TYPE outflow - VARIABLES u v w vof vof_c_ang q - VALUES 0.00 0.0 0.0 0.0 90.0 0.0 + VARIABLES u v w vof vof_c_ang q + VALUES 0.0 0.0 0.0 0.0 90.0 0.0 BOUNDARY_CONDITION symmetry TYPE symmetry - VARIABLES u v w vof vof_c_ang q - VALUES 0.00 0.0 0.0 0.0 90.0 0.0 + VARIABLES u v w vof vof_c_ang q + VALUES 0.0 0.0 0.0 0.0 90.0 0.0 From c136c1b502db322ef265a38277e0a18041ee3580 Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 28 Mar 2023 10:13:55 +0200 Subject: [PATCH 158/223] Inserted a few comments On branch bojan_more_robust_communicator modified: test_build.sh --- Tests/test_build.sh | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Tests/test_build.sh b/Tests/test_build.sh index daa1a01ad..bbc4440eb 100755 --- a/Tests/test_build.sh +++ b/Tests/test_build.sh @@ -1019,6 +1019,7 @@ function process_backup_tests { replace_line_with_first_occurence_in_file \ "TURBULENCE_MODEL" \ "TURBULENCE_MODEL rsm_manceau_hanjalic" \ + $TEST_DIR/$RANS_CHANNEL_LR_RSM_DIR/control process_backup_test \ @@ -1622,38 +1623,54 @@ function chose_test { option=$1 if [ $option -eq 0 ]; then exit 1; fi + + # 1. Generate tests" if [ $option -eq 1 ]; then generate_tests fi + + # 2. Convert tests" if [ $option -eq 2 ]; then convert_tests fi + + # 3. Divide tests" if [ $option -eq 3 ]; then if [ $DONE_GENERATE_TESTS -eq 0 ]; then generate_tests; fi if [ $DONE_CONVERT_TESTS -eq 0 ]; then convert_tests; fi divide_tests fi + + # 4. Processor backup tests" if [ $option -eq 4 ]; then if [ $DONE_GENERATE_TESTS -eq 0 ]; then generate_tests; fi if [ $DONE_CONVERT_TESTS -eq 0 ]; then convert_tests; fi if [ $DONE_DIVIDE_TESTS -eq 0 ]; then divide_tests; fi process_backup_tests fi + + # 5. Processor save_now/exit_now tests" if [ $option -eq 5 ]; then if [ $DONE_GENERATE_TESTS -eq 0 ]; then generate_tests; fi if [ $DONE_CONVERT_TESTS -eq 0 ]; then convert_tests; fi if [ $DONE_DIVIDE_TESTS -eq 0 ]; then divide_tests; fi process_save_exit_now_tests fi + + # 6. Processor full lenght tests" if [ $option -eq 6 ]; then if [ $DONE_GENERATE_TESTS -eq 0 ]; then generate_tests; fi if [ $DONE_CONVERT_TESTS -eq 0 ]; then convert_tests; fi if [ $DONE_DIVIDE_TESTS -eq 0 ]; then divide_tests; fi process_full_length_tests fi + + # 7. Process accuracy test" if [ $option -eq 7 ]; then process_accuracy_tests fi + + # 8. Perform all tests" if [ $option -eq 8 ]; then generate_tests convert_tests @@ -1663,6 +1680,8 @@ function chose_test { process_full_length_tests process_accuracy_tests fi + + # 9. Clean all test directories" if [ $option -eq 9 ]; then git clean -dfx $TEST_DIR/.. make_clean $GENE_DIR @@ -1670,6 +1689,8 @@ function chose_test { make_clean $DIVI_DIR make_clean $PROC_DIR fi + + # 10. Change the compiler" if [ $option -eq 10 ]; then if [ $FORTRAN == "gnu" ]; then FORTRAN="intel" From af38539725def1b48a9ffeeda9b5f70dc4a8f0b9 Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 28 Mar 2023 10:24:39 +0200 Subject: [PATCH 159/223] IMPORTANT: Fixed the keyword for phase capacities! On branch bojan_more_robust_communicator modified: all_control_keywords --- Documentation/all_control_keywords | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/all_control_keywords b/Documentation/all_control_keywords index ed5c1f93a..eb1d51dad 100644 --- a/Documentation/all_control_keywords +++ b/Documentation/all_control_keywords @@ -125,7 +125,7 @@ PARTICLE_TRACKING | no | yes PHASE_DENSITIES | 1.0, 1.0 | two physical properties - densities PHASE_VISCOSITIES | 1.0, 1.0 | two viscosities for two phases - PHASE_CAPACITY | 1.0, 1.0 | thermal capacities for two phases + PHASE_CAPACITIES | 1.0, 1.0 | thermal capacities for two phases PHASE_CONDUCTIVITIES | 1.0, 1.0 | thermal conductivities for two phases POINT_FOR_MONITORING_PLANES | 0.0, 0.0, 0.0 | see MONITORING_POINT above POTENTIAL_INITIALIZATION | no | yes From a0fb09268ebdfe31537da3482b37ab79b56ad1a4 Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 28 Mar 2023 10:54:17 +0200 Subject: [PATCH 160/223] Changed alignement and removed obsolete entries On branch bojan_more_robust_communicator modified: Functionality/Eddies/control modified: Functionality/Gradients/control modified: Functionality/Omp/control modified: Hybrid_Les_Rans/Channel_Re_Tau_2000/Stretched_Mesh/control modified: Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/control modified: Hybrid_Les_Rans/Cylinder/control-ra-1e09 modified: Hybrid_Les_Rans/Cylinder/control-ra-1e10 modified: Hybrid_Les_Rans/Cylinder/control-ra-1e11 modified: Hybrid_Les_Rans/Cylinder/control-ra-1e12 modified: Laminar/Accuracy_Test/Channel_Re_2000/control modified: Laminar/Backstep/Nonorthogonal/control modified: Laminar/Backstep/Orthogonal/Solvers_Scaling/control modified: Laminar/Backstep/Orthogonal/control modified: Laminar/Backstep/Orthogonal_With_Eddies/control modified: Laminar/Backstep/Polyhedral/control modified: Laminar/Cavity/Hydrostatic/control modified: Laminar/Cavity/Lid_Driven/Hexahedral/Re_0100/control modified: Laminar/Cavity/Lid_Driven/Hexahedral/Re_0100/control_piso modified: Laminar/Cavity/Lid_Driven/Hexahedral/Re_0100/control_simple modified: Laminar/Cavity/Lid_Driven/Hexahedral/Re_0400/control modified: Laminar/Cavity/Lid_Driven/Hexahedral/Re_0400/control_piso modified: Laminar/Cavity/Lid_Driven/Hexahedral/Re_0400/control_simple modified: Laminar/Cavity/Lid_Driven/Hexahedral/Re_1000/control modified: Laminar/Cavity/Lid_Driven/Hexahedral/Re_1000/control_piso modified: Laminar/Cavity/Lid_Driven/Hexahedral/Re_1000/control_simple modified: Laminar/Cavity/Lid_Driven/Skewed/control modified: Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e3/control.1 modified: Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e3/control.2 modified: Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e3/control.3 modified: Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e5/control.1 modified: Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e5/control.2 modified: Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e5/control.3 modified: Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e3/control.1 modified: Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e3/control.2 modified: Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e3/control.3 modified: Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e5/control.1 modified: Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e5/control.2 modified: Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e5/control.3 modified: Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e3/control.1 modified: Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e3/control.2 modified: Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e3/control.3 modified: Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e5/control.1 modified: Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e5/control.2 modified: Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e5/control.3 modified: Laminar/Cavity/Thermally_Driven/Conjugate/control.0 modified: Laminar/Cavity/Thermally_Driven/Direct/Ra_10e3/control modified: Laminar/Cavity/Thermally_Driven/Direct/Ra_10e4/control modified: Laminar/Cavity/Thermally_Driven/Direct/Ra_10e5/control modified: Laminar/Cavity/Thermally_Driven/Direct/Ra_10e6/control modified: Laminar/Cavity/Thermally_Driven/Direct/Ra_10e7/control modified: Laminar/Cavity/Thermally_Driven/Direct/Ra_10e8/control modified: Laminar/Cavity/Thermally_Driven/Direct/Variable_Properties_Air/control modified: Laminar/Cavity/Thermally_Driven/Skewed/control modified: Laminar/Channel/control modified: Laminar/Convective_Outflow/control modified: Laminar/Copy_Inlet/control.0 modified: Laminar/Copy_Inlet/control.1 modified: Laminar/Copy_Inlet/control.2 modified: Laminar/Cylinder/Horizontal/Re_100_A/control-m1-p2-s1 modified: Laminar/Cylinder/Horizontal/Re_100_A/control-m2-p3-s2 modified: Laminar/Cylinder/Horizontal/Re_100_A/control-m3-p4-s3 modified: Laminar/Cylinder/Horizontal/Re_100_A/control-m4-p5-s4 modified: Laminar/Cylinder/Horizontal/Re_100_A/control-m5-p6-s5 modified: Laminar/Cylinder/Horizontal/Re_100_A/control-m6-p7-s6 modified: Laminar/Cylinder/Horizontal/Re_100_B/control-m1-p2-s1-g2 modified: Laminar/Cylinder/Horizontal/Re_100_B/control-m2-p3-s2-g3 modified: Laminar/Cylinder/Horizontal/Re_100_B/control-m3-p4-s3-g4 modified: Laminar/Cylinder/Horizontal/Re_100_B/control-m4-p5-s4-g5 modified: Laminar/Cylinder/Horizontal/Re_100_B/control-m5-p6-s5-g6 modified: Laminar/Cylinder/Horizontal/Re_100_B/control-m6-p7-s6-g7 modified: Laminar/Cylinder/Horizontal/Re_100_C/control-m1-p2-s1-g2 modified: Laminar/Cylinder/Horizontal/Re_100_C/control-m2-p3-s2-g3 modified: Laminar/Cylinder/Horizontal/Re_100_C/control-m3-p4-s3-g4 modified: Laminar/Cylinder/Horizontal/Re_100_C/control-m4-p5-s4-g5 modified: Laminar/Cylinder/Horizontal/Re_100_C/control-m5-p6-s5-g6 modified: Laminar/Cylinder/Horizontal/Re_100_C/control-m6-p7-s6-g7 modified: Laminar/Cylinder/Horizontal/Re_100_D/control-m1-p2-s1-g2 modified: Laminar/Cylinder/Horizontal/Re_100_D/control-m2-p3-s2-g3 modified: Laminar/Cylinder/Horizontal/Re_100_D/control-m3-p4-s3-g4 modified: Laminar/Cylinder/Horizontal/Re_100_D/control-m4-p5-s4-g5 modified: Laminar/Cylinder/Horizontal/Re_100_D/control-m5-p6-s5-g6 modified: Laminar/Cylinder/Horizontal/Re_100_D/control-m6-p7-s6-g7 modified: Laminar/Cylinder/Vertical/control-ra-1e05 modified: Laminar/Cylinder/Vertical/control-ra-1e06 modified: Laminar/Cylinder/Vertical/control-ra-1e07 modified: Laminar/Cylinder/Vertical/control-ra-1e08 modified: Laminar/Cylinder/Vertical/control-ra-1e5 modified: Laminar/Cylinder/Vertical/control-ra-1e6 modified: Laminar/Cylinder/Vertical/control-ra-1e7 modified: Laminar/Flat_Plate/control modified: Laminar/Heat_Exchanger/2_Domains/control.0 modified: Laminar/Heat_Exchanger/2_Domains/control.1 modified: Laminar/Heat_Exchanger/2_Domains/control.2 modified: Laminar/Heat_Exchanger/3_Domains/control.0 modified: Laminar/Heat_Exchanger/3_Domains/control.1 modified: Laminar/Heat_Exchanger/3_Domains/control.2 modified: Laminar/Heat_Exchanger/3_Domains/control.3 modified: Laminar/Membrane/2_Domains/control.0 modified: Laminar/Membrane/2_Domains/control.1 modified: Laminar/Membrane/2_Domains/control.2 modified: Laminar/Membrane/Spacers/Concave/control modified: Laminar/Membrane/Spacers/Parallelogram/control modified: Laminar/Membrane/Spacers/Teardrop/control modified: Laminar/Membrane/Spiral/control.0 modified: Laminar/Membrane/Spiral/control.1 modified: Laminar/Membrane/Spiral/control.2 modified: Laminar/Membrane/Spiral_Poly/control.0 modified: Laminar/Membrane/Spiral_Poly/control.1 modified: Laminar/Membrane/Spiral_Poly/control.2 modified: Laminar/Module/control modified: Les/Barc/control modified: Les/Channel_Re_Tau_180/Long_Domain/control modified: Les/Channel_Re_Tau_180/Periodic_Domain/control modified: Les/Forrest/control modified: Les/Matrix_Of_Cubes/control modified: Les/Pipe_Re_Tau_180/control modified: Les/Rayleigh_Benard_Convection_Ra_10e09/control modified: Manual/Channel_Re_Tau_590/Stretched_Mesh/control modified: Manual/Conjugate/control modified: Manual/Conjugate/control.1 modified: Manual/Conjugate/control.2 modified: Manual/Conjugate/control.3 modified: Manual/Impinging_Jet_2d_Distant_Re_23000/control modified: Manual/Inflows/Option_1/control modified: Manual/Inflows/Option_2/control modified: Manual/Inflows/Option_3/control modified: Manual/Inflows/Option_4/control modified: Manual/Inflows/Option_4/control.1 modified: Manual/Inflows/Option_4/control.2 modified: Manual/Matrix_Of_Cubes/control modified: Manual/Parallel/control modified: Manual/Rising_Bubble/control modified: Manual/Thermally_Driven/Varible/control modified: Rans/Backstep_Re_05100/control modified: Rans/Backstep_Re_28000/control modified: Rans/Channel_Re_Tau_590/Long_Domain/control modified: Rans/Channel_Re_Tau_590/Rsm/control_air modified: Rans/Channel_Re_Tau_590/Rsm/control_water modified: Rans/Channel_Re_Tau_590/Stretched_Mesh/control modified: Rans/Fuel_Bundle/control modified: Rans/Impinging_Jet_2d_Distant_Re_23000/control modified: Rans/Membrane/control.0 modified: Rans/Membrane/control.1 modified: Rans/Membrane/control.2 modified: Rans/Membrane/control.3 modified: Rans/Negative_Buoyant_Fountain/control-1 modified: Rans/Negative_Buoyant_Fountain/control-2 modified: Rans/Negative_Buoyant_Fountain/control-3 modified: Rans/Negative_Buoyant_Fountain/control-4 modified: Rans/Pipe_Re_Tau_550/control modified: Rans/Rayleigh_Benard_Convection_Ra_10e09/control modified: Rans/Single_Rod/control.0 modified: Rans/Single_Rod/control.1 modified: Rans/Single_Rod/control.2 modified: Rans/Single_Rod/control.3 modified: Swarm/Bend_90_Degrees/Control_Flow_Development/control modified: Swarm/Bend_90_Degrees/Control_Flow_Development/control.1 modified: Swarm/Bend_90_Degrees/Control_Flow_Development/control.2 modified: Swarm/Bend_90_Degrees/Control_Particle_Tracking/control modified: Swarm/Bend_90_Degrees/Control_Particle_Tracking/control.1 modified: Swarm/Bend_90_Degrees/Control_Particle_Tracking/control.2 modified: Swarm/Channel_Re_Tau_150/control_a_flow_development modified: Swarm/Channel_Re_Tau_150/control_b_particles modified: Swarm/Channel_Re_Tau_590/control_a_flow_development modified: Swarm/Channel_Re_Tau_590/control_b_particles modified: Swarm/Cylinders_Periodic/control modified: Swarm/Rod_Bundle_Hexagonal/control modified: Swarm/Rod_Bundle_Polyhedral/control modified: Swarm/T_Junction_Circular/control modified: Swarm/T_Junction_Square/control-1 modified: Swarm/T_Junction_Square/control-2 modified: Swarm/Three_Phase_Flow/control modified: Vof/Dam_Break_2d/control modified: Vof/Dam_Break_3d/control modified: Vof/Fuel_Bundle/control modified: Vof/Mencinger_And_Zun/control modified: Vof/Rising_Bubble/control modified: Vof/Stefan/control modified: Vof/Sucking/control --- Tests/Functionality/Eddies/control | 51 ++++---- Tests/Functionality/Gradients/control | 28 ++-- Tests/Functionality/Omp/control | 56 ++++---- .../Stretched_Mesh/control | 63 +++++---- .../Channel_Re_Tau_2000/Uniform_Mesh/control | 63 +++++---- .../Hybrid_Les_Rans/Cylinder/control-ra-1e09 | 70 +++++----- .../Hybrid_Les_Rans/Cylinder/control-ra-1e10 | 72 +++++------ .../Hybrid_Les_Rans/Cylinder/control-ra-1e11 | 72 +++++------ .../Hybrid_Les_Rans/Cylinder/control-ra-1e12 | 72 +++++------ .../Accuracy_Test/Channel_Re_2000/control | 80 ++++++------ Tests/Laminar/Backstep/Nonorthogonal/control | 51 ++++---- .../Orthogonal/Solvers_Scaling/control | 98 +++++++------- Tests/Laminar/Backstep/Orthogonal/control | 55 ++++---- .../Backstep/Orthogonal_With_Eddies/control | 54 ++++---- Tests/Laminar/Backstep/Polyhedral/control | 54 ++++---- Tests/Laminar/Cavity/Hydrostatic/control | 57 ++++---- .../Lid_Driven/Hexahedral/Re_0100/control | 52 ++++---- .../Hexahedral/Re_0100/control_piso | 52 ++++---- .../Hexahedral/Re_0100/control_simple | 50 ++++--- .../Lid_Driven/Hexahedral/Re_0400/control | 50 ++++--- .../Hexahedral/Re_0400/control_piso | 52 ++++---- .../Hexahedral/Re_0400/control_simple | 50 ++++--- .../Lid_Driven/Hexahedral/Re_1000/control | 52 ++++---- .../Hexahedral/Re_1000/control_piso | 53 ++++---- .../Hexahedral/Re_1000/control_simple | 47 ++++--- .../Laminar/Cavity/Lid_Driven/Skewed/control | 38 +++--- .../Conjugate/K_0.1/Ra_10e3/control.1 | 112 ++++++++-------- .../Conjugate/K_0.1/Ra_10e3/control.2 | 120 ++++++++--------- .../Conjugate/K_0.1/Ra_10e3/control.3 | 98 +++++++------- .../Conjugate/K_0.1/Ra_10e5/control.1 | 98 +++++++------- .../Conjugate/K_0.1/Ra_10e5/control.2 | 116 ++++++++--------- .../Conjugate/K_0.1/Ra_10e5/control.3 | 108 ++++++++-------- .../Conjugate/K_1.0/Ra_10e3/control.1 | 108 ++++++++-------- .../Conjugate/K_1.0/Ra_10e3/control.2 | 116 ++++++++--------- .../Conjugate/K_1.0/Ra_10e3/control.3 | 108 ++++++++-------- .../Conjugate/K_1.0/Ra_10e5/control.1 | 108 ++++++++-------- .../Conjugate/K_1.0/Ra_10e5/control.2 | 116 ++++++++--------- .../Conjugate/K_1.0/Ra_10e5/control.3 | 108 ++++++++-------- .../Conjugate/K_10.0/Ra_10e3/control.1 | 108 ++++++++-------- .../Conjugate/K_10.0/Ra_10e3/control.2 | 116 ++++++++--------- .../Conjugate/K_10.0/Ra_10e3/control.3 | 108 ++++++++-------- .../Conjugate/K_10.0/Ra_10e5/control.1 | 108 ++++++++-------- .../Conjugate/K_10.0/Ra_10e5/control.2 | 116 ++++++++--------- .../Conjugate/K_10.0/Ra_10e5/control.3 | 108 ++++++++-------- .../Thermally_Driven/Conjugate/control.0 | 24 ++-- .../Thermally_Driven/Direct/Ra_10e3/control | 78 ++++++----- .../Thermally_Driven/Direct/Ra_10e4/control | 78 ++++++----- .../Thermally_Driven/Direct/Ra_10e5/control | 78 ++++++----- .../Thermally_Driven/Direct/Ra_10e6/control | 78 ++++++----- .../Thermally_Driven/Direct/Ra_10e7/control | 78 ++++++----- .../Thermally_Driven/Direct/Ra_10e8/control | 78 ++++++----- .../Direct/Variable_Properties_Air/control | 78 +++++------ .../Cavity/Thermally_Driven/Skewed/control | 82 ++++++------ Tests/Laminar/Channel/control | 14 +- Tests/Laminar/Convective_Outflow/control | 26 ++-- Tests/Laminar/Copy_Inlet/control.0 | 16 +-- Tests/Laminar/Copy_Inlet/control.1 | 48 +++---- Tests/Laminar/Copy_Inlet/control.2 | 50 ++++--- .../Horizontal/Re_100_A/control-m1-p2-s1 | 78 +++++------ .../Horizontal/Re_100_A/control-m2-p3-s2 | 78 +++++------ .../Horizontal/Re_100_A/control-m3-p4-s3 | 78 +++++------ .../Horizontal/Re_100_A/control-m4-p5-s4 | 78 +++++------ .../Horizontal/Re_100_A/control-m5-p6-s5 | 78 +++++------ .../Horizontal/Re_100_A/control-m6-p7-s6 | 80 ++++++------ .../Horizontal/Re_100_B/control-m1-p2-s1-g2 | 82 ++++++------ .../Horizontal/Re_100_B/control-m2-p3-s2-g3 | 82 ++++++------ .../Horizontal/Re_100_B/control-m3-p4-s3-g4 | 82 ++++++------ .../Horizontal/Re_100_B/control-m4-p5-s4-g5 | 82 ++++++------ .../Horizontal/Re_100_B/control-m5-p6-s5-g6 | 82 ++++++------ .../Horizontal/Re_100_B/control-m6-p7-s6-g7 | 82 ++++++------ .../Horizontal/Re_100_C/control-m1-p2-s1-g2 | 84 ++++++------ .../Horizontal/Re_100_C/control-m2-p3-s2-g3 | 84 ++++++------ .../Horizontal/Re_100_C/control-m3-p4-s3-g4 | 84 ++++++------ .../Horizontal/Re_100_C/control-m4-p5-s4-g5 | 84 ++++++------ .../Horizontal/Re_100_C/control-m5-p6-s5-g6 | 84 ++++++------ .../Horizontal/Re_100_C/control-m6-p7-s6-g7 | 84 ++++++------ .../Horizontal/Re_100_D/control-m1-p2-s1-g2 | 84 ++++++------ .../Horizontal/Re_100_D/control-m2-p3-s2-g3 | 84 ++++++------ .../Horizontal/Re_100_D/control-m3-p4-s3-g4 | 84 ++++++------ .../Horizontal/Re_100_D/control-m4-p5-s4-g5 | 84 ++++++------ .../Horizontal/Re_100_D/control-m5-p6-s5-g6 | 84 ++++++------ .../Horizontal/Re_100_D/control-m6-p7-s6-g7 | 84 ++++++------ .../Laminar/Cylinder/Vertical/control-ra-1e05 | 68 +++++----- .../Laminar/Cylinder/Vertical/control-ra-1e06 | 72 +++++------ .../Laminar/Cylinder/Vertical/control-ra-1e07 | 72 +++++------ .../Laminar/Cylinder/Vertical/control-ra-1e08 | 72 +++++------ .../Laminar/Cylinder/Vertical/control-ra-1e5 | 70 +++++----- .../Laminar/Cylinder/Vertical/control-ra-1e6 | 70 +++++----- .../Laminar/Cylinder/Vertical/control-ra-1e7 | 69 +++++----- Tests/Laminar/Flat_Plate/control | 100 +++++++------- .../Heat_Exchanger/2_Domains/control.0 | 16 +-- .../Heat_Exchanger/2_Domains/control.1 | 48 ++++--- .../Heat_Exchanger/2_Domains/control.2 | 40 +++--- .../Heat_Exchanger/3_Domains/control.0 | 20 +-- .../Heat_Exchanger/3_Domains/control.1 | 48 ++++--- .../Heat_Exchanger/3_Domains/control.2 | 48 ++++--- .../Heat_Exchanger/3_Domains/control.3 | 48 ++++--- Tests/Laminar/Membrane/2_Domains/control.0 | 16 +-- Tests/Laminar/Membrane/2_Domains/control.1 | 50 +++---- Tests/Laminar/Membrane/2_Domains/control.2 | 55 ++++---- .../Laminar/Membrane/Spacers/Concave/control | 46 +++---- .../Membrane/Spacers/Parallelogram/control | 46 +++---- .../Laminar/Membrane/Spacers/Teardrop/control | 48 +++---- Tests/Laminar/Membrane/Spiral/control.0 | 16 +-- Tests/Laminar/Membrane/Spiral/control.1 | 50 +++---- Tests/Laminar/Membrane/Spiral/control.2 | 52 ++++---- Tests/Laminar/Membrane/Spiral_Poly/control.0 | 16 +-- Tests/Laminar/Membrane/Spiral_Poly/control.1 | 52 ++++---- Tests/Laminar/Membrane/Spiral_Poly/control.2 | 52 ++++---- Tests/Laminar/Module/control | 47 ++++--- Tests/Les/Barc/control | 109 ++++++++-------- .../Channel_Re_Tau_180/Long_Domain/control | 63 +++++---- .../Periodic_Domain/control | 68 +++++----- Tests/Les/Forrest/control | 54 ++++---- Tests/Les/Matrix_Of_Cubes/control | 68 +++++----- Tests/Les/Pipe_Re_Tau_180/control | 64 ++++----- .../control | 66 +++++----- .../Channel_Re_Tau_590/Stretched_Mesh/control | 24 ++-- Tests/Manual/Conjugate/control | 22 ++-- Tests/Manual/Conjugate/control.1 | 114 ++++++++-------- Tests/Manual/Conjugate/control.2 | 122 +++++++++--------- Tests/Manual/Conjugate/control.3 | 108 ++++++++-------- .../Impinging_Jet_2d_Distant_Re_23000/control | 66 +++++----- Tests/Manual/Inflows/Option_1/control | 64 ++++----- Tests/Manual/Inflows/Option_2/control | 64 ++++----- Tests/Manual/Inflows/Option_3/control | 72 +++++------ Tests/Manual/Inflows/Option_4/control | 14 +- Tests/Manual/Inflows/Option_4/control.1 | 48 +++---- Tests/Manual/Inflows/Option_4/control.2 | 64 ++++----- Tests/Manual/Matrix_Of_Cubes/control | 70 +++++----- Tests/Manual/Parallel/control | 55 ++++---- Tests/Manual/Rising_Bubble/control | 75 ++++++----- Tests/Manual/Thermally_Driven/Varible/control | 90 ++++++------- Tests/Rans/Backstep_Re_05100/control | 58 ++++----- Tests/Rans/Backstep_Re_28000/control | 88 ++++++------- .../Channel_Re_Tau_590/Long_Domain/control | 77 ++++++----- Tests/Rans/Channel_Re_Tau_590/Rsm/control_air | 98 +++++++------- .../Rans/Channel_Re_Tau_590/Rsm/control_water | 95 +++++++------- .../Channel_Re_Tau_590/Stretched_Mesh/control | 77 +++++------ Tests/Rans/Fuel_Bundle/control | 86 ++++++------ .../Impinging_Jet_2d_Distant_Re_23000/control | 99 +++++++------- Tests/Rans/Membrane/control.0 | 20 +-- Tests/Rans/Membrane/control.1 | 48 +++---- Tests/Rans/Membrane/control.2 | 48 +++---- Tests/Rans/Membrane/control.3 | 45 +++---- .../Rans/Negative_Buoyant_Fountain/control-1 | 101 +++++++-------- .../Rans/Negative_Buoyant_Fountain/control-2 | 103 +++++++-------- .../Rans/Negative_Buoyant_Fountain/control-3 | 103 ++++++++------- .../Rans/Negative_Buoyant_Fountain/control-4 | 102 +++++++-------- Tests/Rans/Pipe_Re_Tau_550/control | 89 ++++++------- .../control | 104 ++++++++------- Tests/Rans/Single_Rod/control.0 | 26 ++-- Tests/Rans/Single_Rod/control.1 | 52 ++++---- Tests/Rans/Single_Rod/control.2 | 52 ++++---- Tests/Rans/Single_Rod/control.3 | 68 +++++----- .../Control_Flow_Development/control | 22 ++-- .../Control_Flow_Development/control.1 | 42 +++--- .../Control_Flow_Development/control.2 | 50 +++---- .../Control_Particle_Tracking/control | 22 ++-- .../Control_Particle_Tracking/control.1 | 44 +++---- .../Control_Particle_Tracking/control.2 | 52 ++++---- .../control_a_flow_development | 62 ++++----- .../Channel_Re_Tau_150/control_b_particles | 64 ++++----- .../control_a_flow_development | 62 ++++----- .../Channel_Re_Tau_590/control_b_particles | 64 ++++----- Tests/Swarm/Cylinders_Periodic/control | 69 +++++----- Tests/Swarm/Rod_Bundle_Hexagonal/control | 68 +++++----- Tests/Swarm/Rod_Bundle_Polyhedral/control | 68 +++++----- Tests/Swarm/T_Junction_Circular/control | 48 ++++--- Tests/Swarm/T_Junction_Square/control-1 | 52 ++++---- Tests/Swarm/T_Junction_Square/control-2 | 66 +++++----- Tests/Swarm/Three_Phase_Flow/control | 109 ++++++++-------- Tests/Vof/Dam_Break_2d/control | 72 +++++------ Tests/Vof/Dam_Break_3d/control | 78 ++++++----- Tests/Vof/Fuel_Bundle/control | 78 ++++++----- Tests/Vof/Mencinger_And_Zun/control | 90 ++++++------- Tests/Vof/Rising_Bubble/control | 91 ++++++------- Tests/Vof/Stefan/control | 71 +++++----- Tests/Vof/Sucking/control | 100 +++++++------- 179 files changed, 6085 insertions(+), 6317 deletions(-) diff --git a/Tests/Functionality/Eddies/control b/Tests/Functionality/Eddies/control index f0b0e84af..18f3c4d49 100644 --- a/Tests/Functionality/Eddies/control +++ b/Tests/Functionality/Eddies/control @@ -1,56 +1,53 @@ #---------- # Prologue #--------- -#PROBLEM_NAME cube-x -#PROBLEM_NAME cube-y - PROBLEM_NAME cube-z - HEAT_TRANSFER no +# PROBLEM_NAME cube-x +# PROBLEM_NAME cube-y + PROBLEM_NAME cube-z + HEAT_TRANSFER no -NUMBER_OF_TIME_STEPS 240 -RESULTS_SAVE_INTERVAL 1 -BACKUP_SAVE_INTERVAL 30 + NUMBER_OF_TIME_STEPS 240 + RESULTS_SAVE_INTERVAL 1 + BACKUP_SAVE_INTERVAL 30 -TIME_STEP 0.02 - -#LOAD_BACKUP_NAME backstep_orthogonal-ts.backup + TIME_STEP 0.02 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 0.2 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - DYNAMIC_VISCOSITY 1.0e-2 - HEAT_CAPACITY 1.0 + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 1.0e-2 + HEAT_CAPACITY 1.0 - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 #-------------------- # Initial conditions diff --git a/Tests/Functionality/Gradients/control b/Tests/Functionality/Gradients/control index 144d593a0..166a6452f 100644 --- a/Tests/Functionality/Gradients/control +++ b/Tests/Functionality/Gradients/control @@ -7,26 +7,26 @@ # This is just to give it temperature # as dependendent variable to work on -HEAT_TRANSFER yes + HEAT_TRANSFER yes # Do not compute anything except what # is in User_Mod_Initialize_Variables -NUMBER_OF_TIME_STEPS 0 + NUMBER_OF_TIME_STEPS 0 # Boundary conditions are mandatory -BOUNDARY_CONDITION top - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 20.0 + BOUNDARY_CONDITION top + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 20.0 -BOUNDARY_CONDITION bottom - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 10.0 + BOUNDARY_CONDITION bottom + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 10.0 -BOUNDARY_CONDITION side - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 15.0 + BOUNDARY_CONDITION side + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 15.0 diff --git a/Tests/Functionality/Omp/control b/Tests/Functionality/Omp/control index f15630ee0..1e825d8e6 100644 --- a/Tests/Functionality/Omp/control +++ b/Tests/Functionality/Omp/control @@ -1,61 +1,57 @@ #------------------------------------------ # A couple of things specific to this case #------------------------------------------ - MAX_THREADS 4 - PROFILER_INFO seconds + MAX_THREADS 4 + PROFILER_INFO seconds #---------- # Prologue #--------- - PROBLEM_NAME backstep_orthogonal - HEAT_TRANSFER no + PROBLEM_NAME backstep_orthogonal + HEAT_TRANSFER no - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 120 0 - RESULTS_SAVE_INTERVAL 30 - BACKUP_SAVE_INTERVAL 300 - SAVE_RESULTS_AT_BOUNDARIES no - -#LOAD_BACKUP_NAME backstep_orthogonal-ts000001.backup + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 120 0 + RESULTS_SAVE_INTERVAL 30 + BACKUP_SAVE_INTERVAL 300 + SAVE_RESULTS_AT_BOUNDARIES no #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 0.2 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - DYNAMIC_VISCOSITY 1.0e-3 - HEAT_CAPACITY 1.0 + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 1.0e-3 + HEAT_CAPACITY 1.0 #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING piso - PRESSURE_MOMENTUM_COUPLING piso - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 - - TIME_INTEGRATION_SCHEME linear + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 - ADVECTION_SCHEME_FOR_MOMENTUM minmod + TIME_INTEGRATION_SCHEME linear - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + ADVECTION_SCHEME_FOR_MOMENTUM minmod + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MIN_SIMPLE_ITERATIONS 1 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + MIN_SIMPLE_ITERATIONS 1 #--------------------- # Boundary conditions diff --git a/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Stretched_Mesh/control b/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Stretched_Mesh/control index 14d25e4db..c5a9749cb 100644 --- a/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Stretched_Mesh/control +++ b/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Stretched_Mesh/control @@ -1,60 +1,56 @@ #---------- # Prologue #---------- + PROBLEM_NAME chan - PROBLEM_NAME chan + HEAT_TRANSFER yes - HEAT_TRANSFER yes - - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 18000 - STARTING_TIME_STEP_FOR_TURB_STATISTICS 6000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 600 - -# LOAD_BACKUP_NAME chan-ts012000.backup + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 18000 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 6000 + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 600 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 1.0 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 1.0 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 0.0000422 - DYNAMIC_VISCOSITY 3.e-5 - HEAT_CAPACITY 1.0 + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 0.0000422 + DYNAMIC_VISCOSITY 3.e-5 + HEAT_CAPACITY 1.0 - TURBULENCE_MODEL hybrid_les_rans + TURBULENCE_MODEL hybrid_les_rans - PRESSURE_DROPS 0.0036 0.0 0.0 - MASS_FLOW_RATES 8.28 0.0 0.0 + PRESSURE_DROPS 0.0036 0.0 0.0 + MASS_FLOW_RATES 8.28 0.0 0.0 #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.8 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.8 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.8 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.8 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM central - ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_MOMENTUM central + ADVECTION_SCHEME_FOR_ENERGY smart - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 #-------------------- # Initial conditions @@ -63,7 +59,6 @@ VARIABLES u v w t kin eps zeta f22 VALUES 1.0 0.0 0.0 20.0 0.01 0.001 0.1 0.1 - #--------------------- # Boundary conditions #--------------------- diff --git a/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/control b/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/control index 2b4d93214..cd3a4a6f3 100644 --- a/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/control +++ b/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/control @@ -1,60 +1,56 @@ #---------- # Prologue #---------- + PROBLEM_NAME chan - PROBLEM_NAME chan + HEAT_TRANSFER yes - HEAT_TRANSFER yes - - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 18000 - STARTING_TIME_STEP_FOR_TURB_STATISTICS 6000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 600 - -# LOAD_BACKUP_NAME chan-ts012000.backup + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 18000 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 6000 + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 600 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 1.0 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 1.0 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 0.0000422 - DYNAMIC_VISCOSITY 3.e-5 - HEAT_CAPACITY 1.0 + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 0.0000422 + DYNAMIC_VISCOSITY 3.e-5 + HEAT_CAPACITY 1.0 - TURBULENCE_MODEL hybrid_les_rans + TURBULENCE_MODEL hybrid_les_rans - PRESSURE_DROPS 0.0036 0.0 0.0 - MASS_FLOW_RATES 8.28 0.0 0.0 + PRESSURE_DROPS 0.0036 0.0 0.0 + MASS_FLOW_RATES 8.28 0.0 0.0 #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.8 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.8 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.8 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.8 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM central - ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_MOMENTUM central + ADVECTION_SCHEME_FOR_ENERGY smart - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-4 - TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-4 + TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 #-------------------- # Initial conditions @@ -63,7 +59,6 @@ VARIABLES u v w t kin eps zeta f22 VALUES 1.0 0.0 0.0 20.0 0.01 0.001 0.1 0.1 - #--------------------- # Boundary conditions #--------------------- diff --git a/Tests/Hybrid_Les_Rans/Cylinder/control-ra-1e09 b/Tests/Hybrid_Les_Rans/Cylinder/control-ra-1e09 index 94a98fac7..0850c61d0 100644 --- a/Tests/Hybrid_Les_Rans/Cylinder/control-ra-1e09 +++ b/Tests/Hybrid_Les_Rans/Cylinder/control-ra-1e09 @@ -1,62 +1,62 @@ #---------- # Prologue #---------- - PROBLEM_NAME cylinder - HEAT_TRANSFER yes - BUOYANCY thermal + PROBLEM_NAME cylinder + HEAT_TRANSFER yes + BUOYANCY thermal - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 1200 - STARTING_TIME_STEP_FOR_TURB_STATISTICS 1200000 - RESULTS_SAVE_INTERVAL 150 - BACKUP_SAVE_INTERVAL 600 + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 1200 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 1200000 + RESULTS_SAVE_INTERVAL 150 + BACKUP_SAVE_INTERVAL 600 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 1.0 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 1.0 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models for Ra = 10^9 #----------------- - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 0.000206 - DYNAMIC_VISCOSITY 0.000146 - HEAT_CAPACITY 1.0 - REFERENCE_TEMPERATURE 20.0 + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 0.000206 + DYNAMIC_VISCOSITY 0.000146 + HEAT_CAPACITY 1.0 + REFERENCE_TEMPERATURE 20.0 - GRAVITATIONAL_VECTOR 0.0, -1.0, 0.0 + GRAVITATIONAL_VECTOR 0.0, -1.0, 0.0 - TURBULENCE_MODEL hybrid_les_rans - HYBRID_LES_RANS_SWITCH switch_velocity + TURBULENCE_MODEL hybrid_les_rans + HYBRID_LES_RANS_SWITCH switch_velocity #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM smart - ADVECTION_SCHEME_FOR_ENERGY smart - ADVECTION_SCHEME_FOR_TURBULENCE smart + ADVECTION_SCHEME_FOR_MOMENTUM smart + ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_TURBULENCE smart - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 - MIN_SIMPLE_ITERATIONS 6 - MAX_SIMPLE_ITERATIONS 12 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 + MIN_SIMPLE_ITERATIONS 6 + MAX_SIMPLE_ITERATIONS 12 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 #-------------------- # Initial conditions diff --git a/Tests/Hybrid_Les_Rans/Cylinder/control-ra-1e10 b/Tests/Hybrid_Les_Rans/Cylinder/control-ra-1e10 index 9bce24af3..86baa6a46 100644 --- a/Tests/Hybrid_Les_Rans/Cylinder/control-ra-1e10 +++ b/Tests/Hybrid_Les_Rans/Cylinder/control-ra-1e10 @@ -1,65 +1,65 @@ #---------- # Prologue #---------- - PROBLEM_NAME cylinder - HEAT_TRANSFER yes - BUOYANCY thermal + PROBLEM_NAME cylinder + HEAT_TRANSFER yes + BUOYANCY thermal - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 2400 - STARTING_TIME_STEP_FOR_TURB_STATISTICS 1200000 - RESULTS_SAVE_INTERVAL 150 - BACKUP_SAVE_INTERVAL 600 + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 2400 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 1200000 + RESULTS_SAVE_INTERVAL 150 + BACKUP_SAVE_INTERVAL 600 - LOAD_BACKUP_NAME cylinder-ts001200.backup + LOAD_BACKUP_NAME cylinder-ts001200.backup #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 1.0 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 1.0 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models for Ra = 10^6 #----------------- - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 0.000065 - DYNAMIC_VISCOSITY 0.0000462 - HEAT_CAPACITY 1.0 - REFERENCE_TEMPERATURE 20.0 + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 0.000065 + DYNAMIC_VISCOSITY 0.0000462 + HEAT_CAPACITY 1.0 + REFERENCE_TEMPERATURE 20.0 - GRAVITATIONAL_VECTOR 0.0, -1.0, 0.0 + GRAVITATIONAL_VECTOR 0.0, -1.0, 0.0 - TURBULENCE_MODEL hybrid_les_rans - HYBRID_LES_RANS_SWITCH switch_velocity + TURBULENCE_MODEL hybrid_les_rans + HYBRID_LES_RANS_SWITCH switch_velocity #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM smart - ADVECTION_SCHEME_FOR_ENERGY smart - ADVECTION_SCHEME_FOR_TURBULENCE smart + ADVECTION_SCHEME_FOR_MOMENTUM smart + ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_TURBULENCE smart - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 - MIN_SIMPLE_ITERATIONS 6 - MAX_SIMPLE_ITERATIONS 12 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 + MIN_SIMPLE_ITERATIONS 6 + MAX_SIMPLE_ITERATIONS 12 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 #-------------------- # Initial conditions diff --git a/Tests/Hybrid_Les_Rans/Cylinder/control-ra-1e11 b/Tests/Hybrid_Les_Rans/Cylinder/control-ra-1e11 index dde720dff..b70c60ac0 100644 --- a/Tests/Hybrid_Les_Rans/Cylinder/control-ra-1e11 +++ b/Tests/Hybrid_Les_Rans/Cylinder/control-ra-1e11 @@ -1,65 +1,65 @@ #---------- # Prologue #---------- - PROBLEM_NAME cylinder - HEAT_TRANSFER yes - BUOYANCY thermal + PROBLEM_NAME cylinder + HEAT_TRANSFER yes + BUOYANCY thermal - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 3600 - STARTING_TIME_STEP_FOR_TURB_STATISTICS 1200000 - RESULTS_SAVE_INTERVAL 150 - BACKUP_SAVE_INTERVAL 600 + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 3600 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 1200000 + RESULTS_SAVE_INTERVAL 150 + BACKUP_SAVE_INTERVAL 600 - LOAD_BACKUP_NAME cylinder-ts002400.backup + LOAD_BACKUP_NAME cylinder-ts002400.backup #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 1.0 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 1.0 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models for Ra = 10^11 #----------------- - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 0.0000206 - DYNAMIC_VISCOSITY 0.0000146 - HEAT_CAPACITY 1.0 - REFERENCE_TEMPERATURE 20.0 + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 0.0000206 + DYNAMIC_VISCOSITY 0.0000146 + HEAT_CAPACITY 1.0 + REFERENCE_TEMPERATURE 20.0 - GRAVITATIONAL_VECTOR 0.0, -1.0, 0.0 + GRAVITATIONAL_VECTOR 0.0, -1.0, 0.0 - TURBULENCE_MODEL hybrid_les_rans - HYBRID_LES_RANS_SWITCH switch_velocity + TURBULENCE_MODEL hybrid_les_rans + HYBRID_LES_RANS_SWITCH switch_velocity #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM smart - ADVECTION_SCHEME_FOR_ENERGY smart - ADVECTION_SCHEME_FOR_TURBULENCE smart + ADVECTION_SCHEME_FOR_MOMENTUM smart + ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_TURBULENCE smart - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 - MIN_SIMPLE_ITERATIONS 6 - MAX_SIMPLE_ITERATIONS 12 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 + MIN_SIMPLE_ITERATIONS 6 + MAX_SIMPLE_ITERATIONS 12 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 #-------------------- # Initial conditions diff --git a/Tests/Hybrid_Les_Rans/Cylinder/control-ra-1e12 b/Tests/Hybrid_Les_Rans/Cylinder/control-ra-1e12 index 9f9ce3bf5..41976bfd4 100644 --- a/Tests/Hybrid_Les_Rans/Cylinder/control-ra-1e12 +++ b/Tests/Hybrid_Les_Rans/Cylinder/control-ra-1e12 @@ -1,65 +1,65 @@ #---------- # Prologue #---------- - PROBLEM_NAME cylinder - HEAT_TRANSFER yes - BUOYANCY thermal + PROBLEM_NAME cylinder + HEAT_TRANSFER yes + BUOYANCY thermal - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 4800 - STARTING_TIME_STEP_FOR_TURB_STATISTICS 1200000 - RESULTS_SAVE_INTERVAL 150 - BACKUP_SAVE_INTERVAL 600 + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 4800 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 1200000 + RESULTS_SAVE_INTERVAL 150 + BACKUP_SAVE_INTERVAL 600 - LOAD_BACKUP_NAME cylinder-ts003600.backup + LOAD_BACKUP_NAME cylinder-ts003600.backup #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 1.0 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 1.0 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models for Ra = 10^8 #----------------- - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 0.0000065 - DYNAMIC_VISCOSITY 0.00000462 - HEAT_CAPACITY 1.0 - REFERENCE_TEMPERATURE 20.0 + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 0.0000065 + DYNAMIC_VISCOSITY 0.00000462 + HEAT_CAPACITY 1.0 + REFERENCE_TEMPERATURE 20.0 - GRAVITATIONAL_VECTOR 0.0, -1.0, 0.0 + GRAVITATIONAL_VECTOR 0.0, -1.0, 0.0 - TURBULENCE_MODEL hybrid_les_rans - HYBRID_LES_RANS_SWITCH switch_velocity + TURBULENCE_MODEL hybrid_les_rans + HYBRID_LES_RANS_SWITCH switch_velocity #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM smart - ADVECTION_SCHEME_FOR_ENERGY smart - ADVECTION_SCHEME_FOR_TURBULENCE smart + ADVECTION_SCHEME_FOR_MOMENTUM smart + ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_TURBULENCE smart - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 - MIN_SIMPLE_ITERATIONS 6 - MAX_SIMPLE_ITERATIONS 12 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 + MIN_SIMPLE_ITERATIONS 6 + MAX_SIMPLE_ITERATIONS 12 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Accuracy_Test/Channel_Re_2000/control b/Tests/Laminar/Accuracy_Test/Channel_Re_2000/control index f5f6677cf..afca7035e 100644 --- a/Tests/Laminar/Accuracy_Test/Channel_Re_2000/control +++ b/Tests/Laminar/Accuracy_Test/Channel_Re_2000/control @@ -1,55 +1,49 @@ - PROBLEM_NAME chan - - TIME_STEP 5.e-2 - NUMBER_OF_TIME_STEPS 14000 - RESULTS_SAVE_INTERVAL 9999999 # no saves during this test - BACKUP_SAVE_INTERVAL 9999999 # no backups during this test - - POINT_FOR_MONITORING_PLANES 6.0 0.5 3.0 - MASS_FLOW_RATES 3.1415926 0.0 0.0 - - MASS_DENSITY 1.0 - DYNAMIC_VISCOSITY 5.e-4 - TURBULENCE_MODEL none - - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - - TIME_INTEGRATION_SCHEME parabolic - TIME_INTEGRATION_FOR_ADVECTION fully_implicit - TIME_INTEGRATION_FOR_DIFFUSION fully_implicit - TIME_INTEGRATION_FOR_CROSS_DIFFUSION fully_implicit - - PRESSURE_MOMENTUM_COUPLING simple - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-8 - MAX_SIMPLE_ITERATIONS 999 - MIN_SIMPLE_ITERATIONS 2 - - ADVECTION_SCHEME_FOR_MOMENTUM central - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-8 - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - MAX_ITERATIONS_FOR_MOMENTUM_SOLVER 999 - #NORMALIZATION_FOR_PRESSURE_SOLVER 1e-6 # IS NOT USED ANYWHERE - - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-8 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 999 - #NORMALIZATION_FOR_PRESSURE_SOLVER 1e-6 + PROBLEM_NAME chan + + TIME_STEP 5.e-2 + NUMBER_OF_TIME_STEPS 14000 + RESULTS_SAVE_INTERVAL 9999999 # no saves during this test + BACKUP_SAVE_INTERVAL 9999999 # no backups during this test + + POINT_FOR_MONITORING_PLANES 6.0 0.5 3.0 + MASS_FLOW_RATES 3.1415926 0.0 0.0 + + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 5.e-4 + TURBULENCE_MODEL none + + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + + TIME_INTEGRATION_SCHEME parabolic + + PRESSURE_MOMENTUM_COUPLING simple + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-8 + MAX_SIMPLE_ITERATIONS 999 + MIN_SIMPLE_ITERATIONS 2 + + ADVECTION_SCHEME_FOR_MOMENTUM central + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-8 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + MAX_ITERATIONS_FOR_MOMENTUM_SOLVER 999 + + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-8 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 999 #-------------------- # Initial conditions #-------------------- INITIAL_CONDITION - VARIABLES u v w - VALUES 1.16 0. 0. + VARIABLES u v w + VALUES 1.16 0.0 0.0 #--------------------- # Boundary conditions #--------------------- BOUNDARY_CONDITION wall - TYPE wall - VARIABLES u v w - VALUES 0. 0. 0. + VARIABLES u v w + VALUES 0.0 0.0 0.0 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 1.0 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 1.0 diff --git a/Tests/Laminar/Backstep/Nonorthogonal/control b/Tests/Laminar/Backstep/Nonorthogonal/control index 1c19b7935..d866071d1 100644 --- a/Tests/Laminar/Backstep/Nonorthogonal/control +++ b/Tests/Laminar/Backstep/Nonorthogonal/control @@ -1,57 +1,56 @@ #---------- # Prologue #--------- - PROBLEM_NAME backstep_nonorthogonal - HEAT_TRANSFER no + PROBLEM_NAME backstep_nonorthogonal + HEAT_TRANSFER no - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 30 - BACKUP_SAVE_INTERVAL 300 - SAVE_RESULTS_AT_BOUNDARIES no + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 30 + BACKUP_SAVE_INTERVAL 300 + SAVE_RESULTS_AT_BOUNDARIES no # LOAD_BACKUP_NAME backstep_orthogonal-ts000001.backup #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 0.2 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - DYNAMIC_VISCOSITY 1.0e-3 - HEAT_CAPACITY 1.0 + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 1.0e-3 + HEAT_CAPACITY 1.0 - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING piso - PRESSURE_MOMENTUM_COUPLING piso + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 + TIME_INTEGRATION_SCHEME linear - TIME_INTEGRATION_SCHEME linear + ADVECTION_SCHEME_FOR_MOMENTUM minmod - ADVECTION_SCHEME_FOR_MOMENTUM minmod - - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MIN_SIMPLE_ITERATIONS 1 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + MIN_SIMPLE_ITERATIONS 1 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Backstep/Orthogonal/Solvers_Scaling/control b/Tests/Laminar/Backstep/Orthogonal/Solvers_Scaling/control index 9f6196d80..bbfdb8082 100644 --- a/Tests/Laminar/Backstep/Orthogonal/Solvers_Scaling/control +++ b/Tests/Laminar/Backstep/Orthogonal/Solvers_Scaling/control @@ -1,78 +1,78 @@ #---------- # Prologue #--------- - PROBLEM_NAME backstep_orthogonal - HEAT_TRANSFER no + PROBLEM_NAME backstep_orthogonal + HEAT_TRANSFER no - TIME_STEP 0.00375 # 0.02 0.01 0.005 0.00375 0.0025 - NUMBER_OF_TIME_STEPS 12 - RESULTS_SAVE_INTERVAL 99999 - BACKUP_SAVE_INTERVAL 99999 - SAVE_RESULTS_AT_BOUNDARIES no + TIME_STEP 0.00375 # 0.02 0.01 0.005 0.00375 0.0025 + NUMBER_OF_TIME_STEPS 12 + RESULTS_SAVE_INTERVAL 99999 + BACKUP_SAVE_INTERVAL 99999 + SAVE_RESULTS_AT_BOUNDARIES no - SAVE_INITIAL_CONDITION no + SAVE_INITIAL_CONDITION no #------------------- -# Monitoring points +# Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 0.2 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - DYNAMIC_VISCOSITY 1.0e-3 - HEAT_CAPACITY 1.0 + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 1.0e-3 + HEAT_CAPACITY 1.0 - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 3 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 3 #------------------------ # Linear solver settings #------------------------ - LINEAR_SOLVERS petsc - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 99 - MAX_ITERATIONS_FOR_POTENTIAL_SOLVER 99 - - PETSC_OPTIONS_FOR_PRESSURE - SOLVER cg - PREC hypre # asm or hypre - PREC_OPTS - TOLERANCE 1.0e-6 # 1.0e-3 was also working - - PETSC_OPTIONS_FOR_WALL_DISTANCE - SOLVER cg - PREC hypre # asm or hypre - PREC_OPTS - TOLERANCE 1.0e-6 # 1.0e-3 was also working - - PETSC_OPTIONS_FOR_MOMENTUM - SOLVER bicg - PREC asm - PREC_OPTS - TOLERANCE 1.0e-6 # 1.0e-5 was also working + LINEAR_SOLVERS petsc + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 99 + MAX_ITERATIONS_FOR_POTENTIAL_SOLVER 99 + + PETSC_OPTIONS_FOR_PRESSURE + SOLVER cg + PREC hypre # asm or hypre + PREC_OPTS + TOLERANCE 1.0e-6 # 1.0e-3 was also working + + PETSC_OPTIONS_FOR_WALL_DISTANCE + SOLVER cg + PREC hypre # asm or hypre + PREC_OPTS + TOLERANCE 1.0e-6 # 1.0e-3 was also working + + PETSC_OPTIONS_FOR_MOMENTUM + SOLVER bicg + PREC asm + PREC_OPTS + TOLERANCE 1.0e-6 # 1.0e-5 was also working #-------------------- # Initial conditions diff --git a/Tests/Laminar/Backstep/Orthogonal/control b/Tests/Laminar/Backstep/Orthogonal/control index 2da30fe4f..4c23ae738 100644 --- a/Tests/Laminar/Backstep/Orthogonal/control +++ b/Tests/Laminar/Backstep/Orthogonal/control @@ -1,57 +1,50 @@ #---------- # Prologue #--------- - PROBLEM_NAME backstep_orthogonal - HEAT_TRANSFER no + PROBLEM_NAME backstep_orthogonal + HEAT_TRANSFER no - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 30 - BACKUP_SAVE_INTERVAL 300 - SAVE_RESULTS_AT_BOUNDARIES no - -#LOAD_BACKUP_NAME backstep_orthogonal-ts000001.backup + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 30 + BACKUP_SAVE_INTERVAL 300 + SAVE_RESULTS_AT_BOUNDARIES no #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 0.2 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - DYNAMIC_VISCOSITY 1.0e-3 - HEAT_CAPACITY 1.0 - -TURBULENCE_MODEL none + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 1.0e-3 + HEAT_CAPACITY 1.0 #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING piso - PRESSURE_MOMENTUM_COUPLING piso - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 - - TIME_INTEGRATION_SCHEME linear - - ADVECTION_SCHEME_FOR_MOMENTUM minmod + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + TIME_INTEGRATION_SCHEME linear + ADVECTION_SCHEME_FOR_MOMENTUM minmod + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MIN_SIMPLE_ITERATIONS 1 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + MIN_SIMPLE_ITERATIONS 1 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Backstep/Orthogonal_With_Eddies/control b/Tests/Laminar/Backstep/Orthogonal_With_Eddies/control index 7356a26f7..3c9525f45 100644 --- a/Tests/Laminar/Backstep/Orthogonal_With_Eddies/control +++ b/Tests/Laminar/Backstep/Orthogonal_With_Eddies/control @@ -1,58 +1,54 @@ #---------- # Prologue #--------- - PROBLEM_NAME backstep_orthogonal - HEAT_TRANSFER no + PROBLEM_NAME backstep_orthogonal + HEAT_TRANSFER no - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 300 - RESULTS_SAVE_INTERVAL 15 - BACKUP_SAVE_INTERVAL 60 - SAVE_RESULTS_AT_BOUNDARIES no - -#LOAD_BACKUP_NAME backstep_orthogonal-ts.backup + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 300 + RESULTS_SAVE_INTERVAL 15 + BACKUP_SAVE_INTERVAL 60 + SAVE_RESULTS_AT_BOUNDARIES no #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 0.2 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - DYNAMIC_VISCOSITY 2.5e-3 - HEAT_CAPACITY 1.0 + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 2.5e-3 + HEAT_CAPACITY 1.0 - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - - TIME_INTEGRATION_SCHEME linear + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - ADVECTION_SCHEME_FOR_MOMENTUM minmod + TIME_INTEGRATION_SCHEME linear - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + ADVECTION_SCHEME_FOR_MOMENTUM minmod + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Backstep/Polyhedral/control b/Tests/Laminar/Backstep/Polyhedral/control index 27b3ca1e3..a72063e33 100644 --- a/Tests/Laminar/Backstep/Polyhedral/control +++ b/Tests/Laminar/Backstep/Polyhedral/control @@ -1,57 +1,53 @@ #---------- # Prologue #--------- - PROBLEM_NAME backstep_polyhedral_dual - HEAT_TRANSFER no + PROBLEM_NAME backstep_polyhedral_dual + HEAT_TRANSFER no - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 30 - BACKUP_SAVE_INTERVAL 300 - SAVE_RESULTS_AT_BOUNDARIES no - -# LOAD_BACKUP_NAME backstep_orthogonal-ts000001.backup + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 30 + BACKUP_SAVE_INTERVAL 300 + SAVE_RESULTS_AT_BOUNDARIES no #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 0.2 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - DYNAMIC_VISCOSITY 1.0e-3 - HEAT_CAPACITY 1.0 + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 1.0e-3 + HEAT_CAPACITY 1.0 - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING piso - PRESSURE_MOMENTUM_COUPLING piso - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 - - TIME_INTEGRATION_SCHEME linear + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 - ADVECTION_SCHEME_FOR_MOMENTUM minmod + TIME_INTEGRATION_SCHEME linear - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + ADVECTION_SCHEME_FOR_MOMENTUM minmod + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MIN_SIMPLE_ITERATIONS 1 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + MIN_SIMPLE_ITERATIONS 1 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Cavity/Hydrostatic/control b/Tests/Laminar/Cavity/Hydrostatic/control index 949162976..48769810b 100644 --- a/Tests/Laminar/Cavity/Hydrostatic/control +++ b/Tests/Laminar/Cavity/Hydrostatic/control @@ -1,62 +1,57 @@ #---------- # Prologue #---------- - PROBLEM_NAME cavity - HEAT_TRANSFER no + PROBLEM_NAME cavity + HEAT_TRANSFER no - NUMBER_OF_TIME_STEPS 18 + NUMBER_OF_TIME_STEPS 18 - RESULTS_SAVE_INTERVAL 6 - BACKUP_SAVE_INTERVAL 180 + RESULTS_SAVE_INTERVAL 6 + BACKUP_SAVE_INTERVAL 180 - TIME_STEP 5.0 + TIME_STEP 5.0 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.1 0.75 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.1 0.75 - POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 + POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 #----------------- # Physical models #----------------- + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 1.4080e-4 + DYNAMIC_VISCOSITY 0.01 + HEAT_CAPACITY 1.0 - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 1.4080e-4 - DYNAMIC_VISCOSITY 0.01 - HEAT_CAPACITY 1.0 - - TURBULENCE_MODEL none - - GRAVITATIONAL_VECTOR 0 0 -1 + GRAVITATIONAL_VECTOR 0 0 -1 #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - - TIME_INTEGRATION_SCHEME linear + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - ADVECTION_SCHEME_FOR_MOMENTUM central + TIME_INTEGRATION_SCHEME linear + ADVECTION_SCHEME_FOR_MOMENTUM central #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-9 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-15 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-9 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-15 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 720 - MAX_ITERATIONS_FOR_MOMENTUM_SOLVER 36 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 720 + MAX_ITERATIONS_FOR_MOMENTUM_SOLVER 36 - MAX_SIMPLE_ITERATIONS 24 + MAX_SIMPLE_ITERATIONS 24 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_0100/control b/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_0100/control index a44b36893..0d44e6056 100644 --- a/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_0100/control +++ b/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_0100/control @@ -1,57 +1,55 @@ #---------- # Prologue #---------- - PROBLEM_NAME cavity - HEAT_TRANSFER no + PROBLEM_NAME cavity + HEAT_TRANSFER no - NUMBER_OF_TIME_STEPS 180 + NUMBER_OF_TIME_STEPS 180 - RESULTS_SAVE_INTERVAL 60 - BACKUP_SAVE_INTERVAL 180 + RESULTS_SAVE_INTERVAL 60 + BACKUP_SAVE_INTERVAL 180 - TIME_STEP 1.0 + TIME_STEP 1.0 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.1 0.75 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.1 0.75 - POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 + POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 #----------------- # Physical models #----------------- + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 1.4080e-4 + DYNAMIC_VISCOSITY 0.01 + HEAT_CAPACITY 1.0 - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 1.4080e-4 - DYNAMIC_VISCOSITY 0.01 - HEAT_CAPACITY 1.0 - - TURBULENCE_MODEL none - PRESSURE_MOMENTUM_COUPLING simple + TURBULENCE_MODEL none + PRESSURE_MOMENTUM_COUPLING simple #---------------------- # Numerical parameters #---------------------- + LINEAR_SOLVERS petsc + PRESSURE_MOMENTUM_COUPLING simple - LINEAR_SOLVERS petsc - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_0100/control_piso b/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_0100/control_piso index 04df9d68c..230cfaa2e 100644 --- a/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_0100/control_piso +++ b/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_0100/control_piso @@ -1,57 +1,55 @@ #---------- # Prologue #---------- - PROBLEM_NAME cavity - HEAT_TRANSFER no + PROBLEM_NAME cavity + HEAT_TRANSFER no - NUMBER_OF_TIME_STEPS 1 + NUMBER_OF_TIME_STEPS 1 - RESULTS_SAVE_INTERVAL 60 - BACKUP_SAVE_INTERVAL 180 + RESULTS_SAVE_INTERVAL 60 + BACKUP_SAVE_INTERVAL 180 - TIME_STEP 1.0e+12 + TIME_STEP 1.0e+12 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.1 0.75 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.1 0.75 - POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 + POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 #----------------- # Physical models #----------------- + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 1.4080e-4 + DYNAMIC_VISCOSITY 0.01 + HEAT_CAPACITY 1.0 - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 1.4080e-4 - DYNAMIC_VISCOSITY 0.01 - HEAT_CAPACITY 1.0 - - TURBULENCE_MODEL none - PRESSURE_MOMENTUM_COUPLING piso + TURBULENCE_MODEL none + PRESSURE_MOMENTUM_COUPLING piso #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.9 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.9 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-12 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_SIMPLE_ITERATIONS 60 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-12 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + MAX_SIMPLE_ITERATIONS 60 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_0100/control_simple b/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_0100/control_simple index d587d61f5..26ca1bcf3 100644 --- a/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_0100/control_simple +++ b/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_0100/control_simple @@ -1,56 +1,54 @@ #---------- # Prologue #---------- - PROBLEM_NAME cavity - HEAT_TRANSFER no + PROBLEM_NAME cavity + HEAT_TRANSFER no - NUMBER_OF_TIME_STEPS 180 + NUMBER_OF_TIME_STEPS 180 - RESULTS_SAVE_INTERVAL 60 - BACKUP_SAVE_INTERVAL 180 + RESULTS_SAVE_INTERVAL 60 + BACKUP_SAVE_INTERVAL 180 - TIME_STEP 1.0 + TIME_STEP 1.0 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.1 0.75 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.1 0.75 - POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 + POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 #----------------- # Physical models #----------------- + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 1.4080e-4 + DYNAMIC_VISCOSITY 0.01 + HEAT_CAPACITY 1.0 - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 1.4080e-4 - DYNAMIC_VISCOSITY 0.01 - HEAT_CAPACITY 1.0 - - TURBULENCE_MODEL none - PRESSURE_MOMENTUM_COUPLING simple + TURBULENCE_MODEL none + PRESSURE_MOMENTUM_COUPLING simple #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_0400/control b/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_0400/control index 144ef9064..1e316fe18 100644 --- a/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_0400/control +++ b/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_0400/control @@ -1,56 +1,54 @@ #---------- # Prologue #---------- - PROBLEM_NAME cavity - HEAT_TRANSFER no + PROBLEM_NAME cavity + HEAT_TRANSFER no - NUMBER_OF_TIME_STEPS 180 + NUMBER_OF_TIME_STEPS 180 - RESULTS_SAVE_INTERVAL 60 - BACKUP_SAVE_INTERVAL 180 + RESULTS_SAVE_INTERVAL 60 + BACKUP_SAVE_INTERVAL 180 - TIME_STEP 1.0 + TIME_STEP 1.0 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.1 0.75 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.1 0.75 - POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 + POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 #----------------- # Physical models #----------------- + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 1.4080e-4 + DYNAMIC_VISCOSITY 0.0025 + HEAT_CAPACITY 1.0 - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 1.4080e-4 - DYNAMIC_VISCOSITY 0.0025 - HEAT_CAPACITY 1.0 - - TURBULENCE_MODEL none - PRESSURE_MOMENTUM_COUPLING simple + TURBULENCE_MODEL none + PRESSURE_MOMENTUM_COUPLING simple #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_0400/control_piso b/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_0400/control_piso index eea9c413b..911af1c96 100644 --- a/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_0400/control_piso +++ b/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_0400/control_piso @@ -1,57 +1,55 @@ #---------- # Prologue #---------- - PROBLEM_NAME cavity - HEAT_TRANSFER no + PROBLEM_NAME cavity + HEAT_TRANSFER no - NUMBER_OF_TIME_STEPS 1 + NUMBER_OF_TIME_STEPS 1 - RESULTS_SAVE_INTERVAL 60 - BACKUP_SAVE_INTERVAL 180 + RESULTS_SAVE_INTERVAL 60 + BACKUP_SAVE_INTERVAL 180 - TIME_STEP 1.0e+12 + TIME_STEP 1.0e+12 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.1 0.75 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.1 0.75 - POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 + POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 #----------------- # Physical models #----------------- + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 1.4080e-4 + DYNAMIC_VISCOSITY 0.0025 + HEAT_CAPACITY 1.0 - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 1.4080e-4 - DYNAMIC_VISCOSITY 0.0025 - HEAT_CAPACITY 1.0 - - TURBULENCE_MODEL none - PRESSURE_MOMENTUM_COUPLING piso + TURBULENCE_MODEL none + PRESSURE_MOMENTUM_COUPLING piso #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.9 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.9 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-12 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_SIMPLE_ITERATIONS 120 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-12 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + MAX_SIMPLE_ITERATIONS 120 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_0400/control_simple b/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_0400/control_simple index 144ef9064..1e316fe18 100644 --- a/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_0400/control_simple +++ b/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_0400/control_simple @@ -1,56 +1,54 @@ #---------- # Prologue #---------- - PROBLEM_NAME cavity - HEAT_TRANSFER no + PROBLEM_NAME cavity + HEAT_TRANSFER no - NUMBER_OF_TIME_STEPS 180 + NUMBER_OF_TIME_STEPS 180 - RESULTS_SAVE_INTERVAL 60 - BACKUP_SAVE_INTERVAL 180 + RESULTS_SAVE_INTERVAL 60 + BACKUP_SAVE_INTERVAL 180 - TIME_STEP 1.0 + TIME_STEP 1.0 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.1 0.75 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.1 0.75 - POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 + POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 #----------------- # Physical models #----------------- + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 1.4080e-4 + DYNAMIC_VISCOSITY 0.0025 + HEAT_CAPACITY 1.0 - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 1.4080e-4 - DYNAMIC_VISCOSITY 0.0025 - HEAT_CAPACITY 1.0 - - TURBULENCE_MODEL none - PRESSURE_MOMENTUM_COUPLING simple + TURBULENCE_MODEL none + PRESSURE_MOMENTUM_COUPLING simple #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_1000/control b/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_1000/control index b11af422e..c91d6600b 100644 --- a/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_1000/control +++ b/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_1000/control @@ -1,56 +1,55 @@ #---------- # Prologue #---------- - PROBLEM_NAME cavity - HEAT_TRANSFER no + PROBLEM_NAME cavity + HEAT_TRANSFER no - NUMBER_OF_TIME_STEPS 180 + NUMBER_OF_TIME_STEPS 180 + TIME_STEP 1.0 - RESULTS_SAVE_INTERVAL 60 - BACKUP_SAVE_INTERVAL 180 + RESULTS_SAVE_INTERVAL 60 + BACKUP_SAVE_INTERVAL 180 - TIME_STEP 1.0 +# Keep the line below, it is needed by test_build.sh script for backup tests +# LOAD_BACKUP_NAME cavity-ts000180.backup #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.1 0.75 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.1 0.75 - POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 + POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 #----------------- # Physical models #----------------- + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 1.4080e-4 + DYNAMIC_VISCOSITY 0.001 + HEAT_CAPACITY 1.0 - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 1.4080e-4 - DYNAMIC_VISCOSITY 0.001 - HEAT_CAPACITY 1.0 - -TURBULENCE_MODEL none - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 #-------------------- # Initial conditions @@ -71,3 +70,4 @@ TURBULENCE_MODEL none TYPE inflow VARIABLES u v w VALUES 1.0 0.0 0.0 +:q1 :q! diff --git a/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_1000/control_piso b/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_1000/control_piso index 0c6673d54..7a901851c 100644 --- a/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_1000/control_piso +++ b/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_1000/control_piso @@ -1,58 +1,55 @@ #---------- # Prologue #---------- - PROBLEM_NAME cavity - HEAT_TRANSFER no + PROBLEM_NAME cavity + HEAT_TRANSFER no - NUMBER_OF_TIME_STEPS 1 + NUMBER_OF_TIME_STEPS 1 - RESULTS_SAVE_INTERVAL 60 - BACKUP_SAVE_INTERVAL 180 + RESULTS_SAVE_INTERVAL 60 + BACKUP_SAVE_INTERVAL 180 - TIME_STEP 1.0e+12 + TIME_STEP 1.0e+12 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.1 0.75 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.1 0.75 - POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 + POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 #----------------- # Physical models #----------------- + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 1.4080e-4 + DYNAMIC_VISCOSITY 0.001 + HEAT_CAPACITY 1.0 - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 1.4080e-4 - DYNAMIC_VISCOSITY 0.001 - HEAT_CAPACITY 1.0 - - TURBULENCE_MODEL none - PRESSURE_MOMENTUM_COUPLING piso + PRESSURE_MOMENTUM_COUPLING piso #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-12 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_SIMPLE_ITERATIONS 240 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-12 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + MAX_SIMPLE_ITERATIONS 240 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_1000/control_simple b/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_1000/control_simple index b11af422e..4b391f635 100644 --- a/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_1000/control_simple +++ b/Tests/Laminar/Cavity/Lid_Driven/Hexahedral/Re_1000/control_simple @@ -1,56 +1,55 @@ #---------- # Prologue #---------- - PROBLEM_NAME cavity - HEAT_TRANSFER no + PROBLEM_NAME cavity + HEAT_TRANSFER no - NUMBER_OF_TIME_STEPS 180 + NUMBER_OF_TIME_STEPS 180 - RESULTS_SAVE_INTERVAL 60 - BACKUP_SAVE_INTERVAL 180 + RESULTS_SAVE_INTERVAL 60 + BACKUP_SAVE_INTERVAL 180 - TIME_STEP 1.0 + TIME_STEP 1.0 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.1 0.75 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.1 0.75 - POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 + POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 1.4080e-4 - DYNAMIC_VISCOSITY 0.001 - HEAT_CAPACITY 1.0 + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 1.4080e-4 + DYNAMIC_VISCOSITY 0.001 + HEAT_CAPACITY 1.0 -TURBULENCE_MODEL none - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Cavity/Lid_Driven/Skewed/control b/Tests/Laminar/Cavity/Lid_Driven/Skewed/control index 433d948b3..bbb731aef 100644 --- a/Tests/Laminar/Cavity/Lid_Driven/Skewed/control +++ b/Tests/Laminar/Cavity/Lid_Driven/Skewed/control @@ -24,23 +24,23 @@ #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION top_wall - TYPE inflow - VARIABLES u v w - VALUES 1.0 0.0 0.0 - - BOUNDARY_CONDITION bottom_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 - - BOUNDARY_CONDITION west_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 - - BOUNDARY_CONDITION east_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION top_wall + TYPE inflow + VARIABLES u v w + VALUES 1.0 0.0 0.0 + + BOUNDARY_CONDITION bottom_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 + + BOUNDARY_CONDITION west_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 + + BOUNDARY_CONDITION east_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e3/control.1 b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e3/control.1 index cca28824d..d2045007e 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e3/control.1 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e3/control.1 @@ -1,87 +1,87 @@ #------- # Intro #------- - PROBLEM_NAME left + PROBLEM_NAME left - HEAT_TRANSFER yes - POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 + HEAT_TRANSFER yes + POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 - TIME_STEP 1.0e-2 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 999999 + TIME_STEP 1.0e-2 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 999999 #----------------------------------------------- # Physical models # (Properties are read from file for this case) #----------------------------------------------- - TURBULENCE_MODEL none - - # Properties based on Pr and Ra numbers: - # Pr = 0.7 - # Ra = 10e3 - # mu = 1.0 / sqrt(Pr * Ra) = 0.0377964473 - # lambda = sqrt(Pr / Ra) * 0.1 = 0.00264575131 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.0377964473 - THERMAL_CONDUCTIVITY 0.00264575131 + TURBULENCE_MODEL none + + # Properties based on Pr and Ra numbers: + # Pr = 0.7 + # Ra = 10e3 + # mu = 1.0 / sqrt(Pr * Ra) = 0.0377964473 + # lambda = sqrt(Pr / Ra) * 0.1 = 0.00264575131 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.0377964473 + THERMAL_CONDUCTIVITY 0.00264575131 #-------------------- # Initial conditions #-------------------- INITIAL_CONDITION - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.25 + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.25 #---------------------- # Numerical parameters #---------------------- - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 - MIN_SIMPLE_ITERATIONS 3 + MIN_SIMPLE_ITERATIONS 3 #-------------------------- # Boundary conditions #-------------------------- -BOUNDARY_CONDITION TOP - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION BOTTOM - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION SIDE - TYPE symmetry - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.25 - -BOUNDARY_CONDITION LEFT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION RIGHT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 + BOUNDARY_CONDITION TOP + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION BOTTOM + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION SIDE + TYPE symmetry + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.25 + + BOUNDARY_CONDITION LEFT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION RIGHT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e3/control.2 b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e3/control.2 index 204b05c75..aa99bc7f9 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e3/control.2 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e3/control.2 @@ -1,95 +1,95 @@ #------- # Intro #------- - PROBLEM_NAME middle + PROBLEM_NAME middle - HEAT_TRANSFER yes - BUOYANCY thermal - REFERENCE_TEMPERATURE 0.5 + HEAT_TRANSFER yes + BUOYANCY thermal + REFERENCE_TEMPERATURE 0.5 - POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 + POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 - TIME_STEP 1.0e-2 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 999999 + TIME_STEP 1.0e-2 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 999999 #----------------------------------------------- # Physical models # (Properties are read from file for this case) #----------------------------------------------- - TURBULENCE_MODEL none + TURBULENCE_MODEL none - GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 + GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 - # Properties based on Pr and Ra numbers: - # Pr = 0.7 - # Ra = 10e3 - # mu = 1.0 / sqrt(Pr * Ra) = 0.0377964473 - # lambda = sqrt(Pr / Ra) = 0.0264575131 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.0377964473 - THERMAL_CONDUCTIVITY 0.0264575131 + # Properties based on Pr and Ra numbers: + # Pr = 0.7 + # Ra = 10e3 + # mu = 1.0 / sqrt(Pr * Ra) = 0.0377964473 + # lambda = sqrt(Pr / Ra) = 0.0264575131 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.0377964473 + THERMAL_CONDUCTIVITY 0.0264575131 #-------------------- # Initial conditions #-------------------- INITIAL_CONDITION - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 #---------------------- # Numerical parameters #---------------------- - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 - ADVECTION_SCHEME_FOR_ENERGY superbee - ADVECTION_SCHEME_FOR_MOMENTUM superbee + ADVECTION_SCHEME_FOR_ENERGY superbee + ADVECTION_SCHEME_FOR_MOMENTUM superbee - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 - MIN_SIMPLE_ITERATIONS 3 + MIN_SIMPLE_ITERATIONS 3 #-------------------------- # Boundary conditions #-------------------------- -BOUNDARY_CONDITION TOP - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION BOTTOM - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION SIDE - TYPE symmetry - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 - -BOUNDARY_CONDITION LEFT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 - -BOUNDARY_CONDITION RIGHT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 + BOUNDARY_CONDITION TOP + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION BOTTOM + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION SIDE + TYPE symmetry + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 + + BOUNDARY_CONDITION LEFT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 + + BOUNDARY_CONDITION RIGHT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e3/control.3 b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e3/control.3 index f6c63e472..4d6608f3f 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e3/control.3 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e3/control.3 @@ -1,31 +1,31 @@ #------- # Intro #------- - PROBLEM_NAME right + PROBLEM_NAME right - HEAT_TRANSFER yes - POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 + HEAT_TRANSFER yes + POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 - TIME_STEP 1.0e-2 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 999999 + TIME_STEP 1.0e-2 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 999999 #----------------------------------------------- # Physical models # (Properties are read from file for this case) #----------------------------------------------- - TURBULENCE_MODEL none - - # Properties based on Pr and Ra numbers: - # Pr = 0.7 - # Ra = 10e3 - # mu = 1.0 / sqrt(Pr * Ra) = 0.0377964473 - # lambda = sqrt(Pr / Ra) * 0.1 = 0.00264575131 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.0377964473 - THERMAL_CONDUCTIVITY 0.00264575131 + TURBULENCE_MODEL none + + # Properties based on Pr and Ra numbers: + # Pr = 0.7 + # Ra = 10e3 + # mu = 1.0 / sqrt(Pr * Ra) = 0.0377964473 + # lambda = sqrt(Pr / Ra) * 0.1 = 0.00264575131 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.0377964473 + THERMAL_CONDUCTIVITY 0.00264575131 #-------------------- # Initial conditions @@ -37,48 +37,48 @@ #---------------------- # Numerical parameters #---------------------- - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 - MIN_SIMPLE_ITERATIONS 3 + MIN_SIMPLE_ITERATIONS 3 #-------------------------- # Boundary conditions #-------------------------- -BOUNDARY_CONDITION TOP - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION BOTTOM - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION SIDE - TYPE symmetry - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.75 - -BOUNDARY_CONDITION LEFT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 + BOUNDARY_CONDITION TOP + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION BOTTOM + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION SIDE + TYPE symmetry + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.75 + + BOUNDARY_CONDITION LEFT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 BOUNDARY_CONDITION RIGHT TYPE wall diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e5/control.1 b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e5/control.1 index dabab14e3..185df8cee 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e5/control.1 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e5/control.1 @@ -1,31 +1,31 @@ #------- # Intro #------- - PROBLEM_NAME left + PROBLEM_NAME left - HEAT_TRANSFER yes - POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 + HEAT_TRANSFER yes + POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 - TIME_STEP 1.0e-2 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 999999 + TIME_STEP 1.0e-2 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 999999 #----------------------------------------------- # Physical models # (Properties are read from file for this case) #----------------------------------------------- - TURBULENCE_MODEL none - - # Properties based on Pr and Ra numbers: - # Pr = 0.7 - # Ra = 10e5 - # mu = 1.0 / sqrt(Pr * Ra) = 0.00377964473 - # lambda = sqrt(Pr / Ra) * 0.1 = 0.000264575131 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.00377964473 - THERMAL_CONDUCTIVITY 0.000264575131 + TURBULENCE_MODEL none + + # Properties based on Pr and Ra numbers: + # Pr = 0.7 + # Ra = 10e5 + # mu = 1.0 / sqrt(Pr * Ra) = 0.00377964473 + # lambda = sqrt(Pr / Ra) * 0.1 = 0.000264575131 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.00377964473 + THERMAL_CONDUCTIVITY 0.000264575131 #-------------------- # Initial conditions @@ -37,48 +37,48 @@ #---------------------- # Numerical parameters #---------------------- - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 - MIN_SIMPLE_ITERATIONS 3 + MIN_SIMPLE_ITERATIONS 3 #-------------------------- # Boundary conditions #-------------------------- -BOUNDARY_CONDITION TOP - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION BOTTOM - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION SIDE - TYPE symmetry - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.25 - -BOUNDARY_CONDITION LEFT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0 + BOUNDARY_CONDITION TOP + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION BOTTOM + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION SIDE + TYPE symmetry + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.25 + + BOUNDARY_CONDITION LEFT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0 BOUNDARY_CONDITION RIGHT TYPE wall diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e5/control.2 b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e5/control.2 index ad76fde62..5ab923bd4 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e5/control.2 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e5/control.2 @@ -1,36 +1,36 @@ #------- # Intro #------- - PROBLEM_NAME middle + PROBLEM_NAME middle - HEAT_TRANSFER yes - BUOYANCY thermal - REFERENCE_TEMPERATURE 0.5 + HEAT_TRANSFER yes + BUOYANCY thermal + REFERENCE_TEMPERATURE 0.5 - POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 + POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 - TIME_STEP 1.0e-2 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 999999 + TIME_STEP 1.0e-2 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 999999 #----------------------------------------------- # Physical models # (Properties are read from file for this case) #----------------------------------------------- - TURBULENCE_MODEL none + TURBULENCE_MODEL none - GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 + GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 - # Properties based on Pr and Ra numbers: - # Pr = 0.7 - # Ra = 10e5 - # mu = 1.0 / sqrt(Pr * Ra) = 0.00377964473 - # lambda = sqrt(Pr / Ra) = 0.00264575131 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.00377964473 - THERMAL_CONDUCTIVITY 0.00264575131 + # Properties based on Pr and Ra numbers: + # Pr = 0.7 + # Ra = 10e5 + # mu = 1.0 / sqrt(Pr * Ra) = 0.00377964473 + # lambda = sqrt(Pr / Ra) = 0.00264575131 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.00377964473 + THERMAL_CONDUCTIVITY 0.00264575131 #-------------------- # Initial conditions @@ -42,54 +42,54 @@ #---------------------- # Numerical parameters #---------------------- - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 - ADVECTION_SCHEME_FOR_ENERGY superbee - ADVECTION_SCHEME_FOR_MOMENTUM superbee + ADVECTION_SCHEME_FOR_ENERGY superbee + ADVECTION_SCHEME_FOR_MOMENTUM superbee - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 - MIN_SIMPLE_ITERATIONS 3 + MIN_SIMPLE_ITERATIONS 3 #-------------------------- # Boundary conditions #-------------------------- -BOUNDARY_CONDITION TOP - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION BOTTOM - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION SIDE - TYPE symmetry - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 - -BOUNDARY_CONDITION LEFT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 - -BOUNDARY_CONDITION RIGHT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 + BOUNDARY_CONDITION TOP + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION BOTTOM + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION SIDE + TYPE symmetry + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 + + BOUNDARY_CONDITION LEFT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 + + BOUNDARY_CONDITION RIGHT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e5/control.3 b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e5/control.3 index 30bb64e92..c15509517 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e5/control.3 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_0.1/Ra_10e5/control.3 @@ -1,31 +1,31 @@ #------- # Intro #------- - PROBLEM_NAME right + PROBLEM_NAME right - HEAT_TRANSFER yes - POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 + HEAT_TRANSFER yes + POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 - TIME_STEP 1.0e-2 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 999999 + TIME_STEP 1.0e-2 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 999999 #----------------------------------------------- # Physical models # (Properties are read from file for this case) #----------------------------------------------- - TURBULENCE_MODEL none - - # Properties based on Pr and Ra numbers: - # Pr = 0.7 - # Ra = 10e5 - # mu = 1.0 / sqrt(Pr * Ra) = 0.00377964473 - # lambda = sqrt(Pr / Ra) * 0.1 = 0.000264575131 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.00377964473 - THERMAL_CONDUCTIVITY 0.000264575131 + TURBULENCE_MODEL none + + # Properties based on Pr and Ra numbers: + # Pr = 0.7 + # Ra = 10e5 + # mu = 1.0 / sqrt(Pr * Ra) = 0.00377964473 + # lambda = sqrt(Pr / Ra) * 0.1 = 0.000264575131 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.00377964473 + THERMAL_CONDUCTIVITY 0.000264575131 #-------------------- # Initial conditions @@ -37,51 +37,51 @@ #---------------------- # Numerical parameters #---------------------- - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 - MIN_SIMPLE_ITERATIONS 3 + MIN_SIMPLE_ITERATIONS 3 #-------------------------- # Boundary conditions #-------------------------- -BOUNDARY_CONDITION TOP - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION BOTTOM - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION SIDE - TYPE symmetry - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.75 - -BOUNDARY_CONDITION LEFT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 - -BOUNDARY_CONDITION RIGHT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 1.0 + BOUNDARY_CONDITION TOP + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION BOTTOM + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION SIDE + TYPE symmetry + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.75 + + BOUNDARY_CONDITION LEFT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 + + BOUNDARY_CONDITION RIGHT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 1.0 diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e3/control.1 b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e3/control.1 index 64902cfaf..877d8ed56 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e3/control.1 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e3/control.1 @@ -1,31 +1,31 @@ #------- # Intro #------- - PROBLEM_NAME left + PROBLEM_NAME left - HEAT_TRANSFER yes - POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 + HEAT_TRANSFER yes + POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 - TIME_STEP 1.0e-2 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 999999 + TIME_STEP 1.0e-2 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 999999 #----------------------------------------------- # Physical models # (Properties are read from file for this case) #----------------------------------------------- - TURBULENCE_MODEL none - - # Properties based on Pr and Ra numbers: - # Pr = 0.7 - # Ra = 10e3 - # mu = 1.0 / sqrt(Pr * Ra) = 0.0377964473 - # lambda = sqrt(Pr / Ra) = 0.0264575131 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.0377964473 - THERMAL_CONDUCTIVITY 0.0264575131 + TURBULENCE_MODEL none + + # Properties based on Pr and Ra numbers: + # Pr = 0.7 + # Ra = 10e3 + # mu = 1.0 / sqrt(Pr * Ra) = 0.0377964473 + # lambda = sqrt(Pr / Ra) = 0.0264575131 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.0377964473 + THERMAL_CONDUCTIVITY 0.0264575131 #-------------------- # Initial conditions @@ -37,51 +37,51 @@ #---------------------- # Numerical parameters #---------------------- - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 - MIN_SIMPLE_ITERATIONS 3 + MIN_SIMPLE_ITERATIONS 3 #-------------------------- # Boundary conditions #-------------------------- -BOUNDARY_CONDITION TOP - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION BOTTOM - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION SIDE - TYPE symmetry - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.25 - -BOUNDARY_CONDITION LEFT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION RIGHT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 + BOUNDARY_CONDITION TOP + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION BOTTOM + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION SIDE + TYPE symmetry + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.25 + + BOUNDARY_CONDITION LEFT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION RIGHT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e3/control.2 b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e3/control.2 index 204b05c75..400fae6ec 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e3/control.2 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e3/control.2 @@ -1,36 +1,36 @@ #------- # Intro #------- - PROBLEM_NAME middle + PROBLEM_NAME middle - HEAT_TRANSFER yes - BUOYANCY thermal - REFERENCE_TEMPERATURE 0.5 + HEAT_TRANSFER yes + BUOYANCY thermal + REFERENCE_TEMPERATURE 0.5 - POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 + POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 - TIME_STEP 1.0e-2 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 999999 + TIME_STEP 1.0e-2 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 999999 #----------------------------------------------- # Physical models # (Properties are read from file for this case) #----------------------------------------------- - TURBULENCE_MODEL none + TURBULENCE_MODEL none - GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 + GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 - # Properties based on Pr and Ra numbers: - # Pr = 0.7 - # Ra = 10e3 - # mu = 1.0 / sqrt(Pr * Ra) = 0.0377964473 - # lambda = sqrt(Pr / Ra) = 0.0264575131 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.0377964473 - THERMAL_CONDUCTIVITY 0.0264575131 + # Properties based on Pr and Ra numbers: + # Pr = 0.7 + # Ra = 10e3 + # mu = 1.0 / sqrt(Pr * Ra) = 0.0377964473 + # lambda = sqrt(Pr / Ra) = 0.0264575131 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.0377964473 + THERMAL_CONDUCTIVITY 0.0264575131 #-------------------- # Initial conditions @@ -42,54 +42,54 @@ #---------------------- # Numerical parameters #---------------------- - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 - ADVECTION_SCHEME_FOR_ENERGY superbee - ADVECTION_SCHEME_FOR_MOMENTUM superbee + ADVECTION_SCHEME_FOR_ENERGY superbee + ADVECTION_SCHEME_FOR_MOMENTUM superbee - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 - MIN_SIMPLE_ITERATIONS 3 + MIN_SIMPLE_ITERATIONS 3 #-------------------------- # Boundary conditions #-------------------------- -BOUNDARY_CONDITION TOP - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION BOTTOM - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION SIDE - TYPE symmetry - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 - -BOUNDARY_CONDITION LEFT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 - -BOUNDARY_CONDITION RIGHT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 + BOUNDARY_CONDITION TOP + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION BOTTOM + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION SIDE + TYPE symmetry + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 + + BOUNDARY_CONDITION LEFT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 + + BOUNDARY_CONDITION RIGHT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e3/control.3 b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e3/control.3 index 6711b26e8..af45d75f5 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e3/control.3 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e3/control.3 @@ -1,31 +1,31 @@ #------- # Intro #------- - PROBLEM_NAME right + PROBLEM_NAME right - HEAT_TRANSFER yes - POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 + HEAT_TRANSFER yes + POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 - TIME_STEP 1.0e-2 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 999999 + TIME_STEP 1.0e-2 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 999999 #----------------------------------------------- # Physical models # (Properties are read from file for this case) #----------------------------------------------- - TURBULENCE_MODEL none - - # Properties based on Pr and Ra numbers: - # Pr = 0.7 - # Ra = 10e3 - # mu = 1.0 / sqrt(Pr * Ra) = 0.0377964473 - # lambda = sqrt(Pr / Ra) = 0.0264575131 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.0377964473 - THERMAL_CONDUCTIVITY 0.0264575131 + TURBULENCE_MODEL none + + # Properties based on Pr and Ra numbers: + # Pr = 0.7 + # Ra = 10e3 + # mu = 1.0 / sqrt(Pr * Ra) = 0.0377964473 + # lambda = sqrt(Pr / Ra) = 0.0264575131 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.0377964473 + THERMAL_CONDUCTIVITY 0.0264575131 #-------------------- # Initial conditions @@ -37,51 +37,51 @@ #---------------------- # Numerical parameters #---------------------- - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 - MIN_SIMPLE_ITERATIONS 3 + MIN_SIMPLE_ITERATIONS 3 #-------------------------- # Boundary conditions #-------------------------- -BOUNDARY_CONDITION TOP - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION BOTTOM - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION SIDE - TYPE symmetry - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.75 - -BOUNDARY_CONDITION LEFT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 - -BOUNDARY_CONDITION RIGHT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 1.0 + BOUNDARY_CONDITION TOP + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION BOTTOM + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION SIDE + TYPE symmetry + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.75 + + BOUNDARY_CONDITION LEFT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 + + BOUNDARY_CONDITION RIGHT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 1.0 diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e5/control.1 b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e5/control.1 index 761a365f2..338590eb5 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e5/control.1 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e5/control.1 @@ -1,31 +1,31 @@ #------- # Intro #------- - PROBLEM_NAME left + PROBLEM_NAME left - HEAT_TRANSFER yes - POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 + HEAT_TRANSFER yes + POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 - TIME_STEP 1.0e-2 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 999999 + TIME_STEP 1.0e-2 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 999999 #----------------------------------------------- # Physical models # (Properties are read from file for this case) #----------------------------------------------- - TURBULENCE_MODEL none - - # Properties based on Pr and Ra numbers: - # Pr = 0.7 - # Ra = 10e5 - # mu = sqrt(Pr / Ra) = 0.00264575131 - # lambda = 1.0 / sqrt(Pr * Ra) = 0.00377964473 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.00264575131 - THERMAL_CONDUCTIVITY 0.00377964473 + TURBULENCE_MODEL none + + # Properties based on Pr and Ra numbers: + # Pr = 0.7 + # Ra = 10e5 + # mu = sqrt(Pr / Ra) = 0.00264575131 + # lambda = 1.0 / sqrt(Pr * Ra) = 0.00377964473 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.00264575131 + THERMAL_CONDUCTIVITY 0.00377964473 #-------------------- # Initial conditions @@ -37,51 +37,51 @@ #---------------------- # Numerical parameters #---------------------- - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 - MIN_SIMPLE_ITERATIONS 3 + MIN_SIMPLE_ITERATIONS 3 #-------------------------- # Boundary conditions #-------------------------- -BOUNDARY_CONDITION TOP - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION BOTTOM - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION SIDE - TYPE symmetry - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.25 - -BOUNDARY_CONDITION LEFT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION RIGHT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 + BOUNDARY_CONDITION TOP + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION BOTTOM + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION SIDE + TYPE symmetry + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.25 + + BOUNDARY_CONDITION LEFT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION RIGHT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e5/control.2 b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e5/control.2 index 2c20c3d07..78cae1eee 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e5/control.2 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e5/control.2 @@ -1,36 +1,36 @@ #------- # Intro #------- - PROBLEM_NAME middle + PROBLEM_NAME middle - HEAT_TRANSFER yes - BUOYANCY thermal - REFERENCE_TEMPERATURE 0.5 + HEAT_TRANSFER yes + BUOYANCY thermal + REFERENCE_TEMPERATURE 0.5 - POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 + POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 - TIME_STEP 1.0e-2 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 999999 + TIME_STEP 1.0e-2 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 999999 #----------------------------------------------- # Physical models # (Properties are read from file for this case) #----------------------------------------------- - TURBULENCE_MODEL none + TURBULENCE_MODEL none - GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 + GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 - # Properties based on Pr and Ra numbers: - # Pr = 0.7 - # Ra = 10e5 - # mu = sqrt(Pr / Ra) = 0.00264575131 - # lambda = 1.0 / sqrt(Pr * Ra) = 0.00377964473 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.00264575131 - THERMAL_CONDUCTIVITY 0.00377964473 + # Properties based on Pr and Ra numbers: + # Pr = 0.7 + # Ra = 10e5 + # mu = sqrt(Pr / Ra) = 0.00264575131 + # lambda = 1.0 / sqrt(Pr * Ra) = 0.00377964473 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.00264575131 + THERMAL_CONDUCTIVITY 0.00377964473 #-------------------- # Initial conditions @@ -42,54 +42,54 @@ #---------------------- # Numerical parameters #---------------------- - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 - ADVECTION_SCHEME_FOR_ENERGY superbee - ADVECTION_SCHEME_FOR_MOMENTUM superbee + ADVECTION_SCHEME_FOR_ENERGY superbee + ADVECTION_SCHEME_FOR_MOMENTUM superbee - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 - MIN_SIMPLE_ITERATIONS 3 + MIN_SIMPLE_ITERATIONS 3 #-------------------------- # Boundary conditions #-------------------------- -BOUNDARY_CONDITION TOP - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION BOTTOM - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION SIDE - TYPE symmetry - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 - -BOUNDARY_CONDITION LEFT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 - -BOUNDARY_CONDITION RIGHT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 + BOUNDARY_CONDITION TOP + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION BOTTOM + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION SIDE + TYPE symmetry + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 + + BOUNDARY_CONDITION LEFT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 + + BOUNDARY_CONDITION RIGHT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e5/control.3 b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e5/control.3 index b0730636e..2a1d5b8f2 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e5/control.3 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_1.0/Ra_10e5/control.3 @@ -1,31 +1,31 @@ #------- # Intro #------- - PROBLEM_NAME right + PROBLEM_NAME right - HEAT_TRANSFER yes - POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 + HEAT_TRANSFER yes + POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 - TIME_STEP 1.0e-2 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 999999 + TIME_STEP 1.0e-2 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 999999 #----------------------------------------------- # Physical models # (Properties are read from file for this case) #----------------------------------------------- - TURBULENCE_MODEL none - - # Properties based on Pr and Ra numbers: - # Pr = 0.7 - # Ra = 10e5 - # mu = sqrt(Pr / Ra) = 0.00264575131 - # lambda = 1.0 / sqrt(Pr * Ra) = 0.00377964473 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.00264575131 - THERMAL_CONDUCTIVITY 0.00377964473 + TURBULENCE_MODEL none + + # Properties based on Pr and Ra numbers: + # Pr = 0.7 + # Ra = 10e5 + # mu = sqrt(Pr / Ra) = 0.00264575131 + # lambda = 1.0 / sqrt(Pr * Ra) = 0.00377964473 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.00264575131 + THERMAL_CONDUCTIVITY 0.00377964473 #-------------------- # Initial conditions @@ -37,51 +37,51 @@ #---------------------- # Numerical parameters #---------------------- - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 - MIN_SIMPLE_ITERATIONS 3 + MIN_SIMPLE_ITERATIONS 3 #-------------------------- # Boundary conditions #-------------------------- -BOUNDARY_CONDITION TOP - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION BOTTOM - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION SIDE - TYPE symmetry - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.75 - -BOUNDARY_CONDITION LEFT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 - -BOUNDARY_CONDITION RIGHT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 1.0 + BOUNDARY_CONDITION TOP + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION BOTTOM + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION SIDE + TYPE symmetry + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.75 + + BOUNDARY_CONDITION LEFT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 + + BOUNDARY_CONDITION RIGHT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 1.0 diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e3/control.1 b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e3/control.1 index a474823b5..1550ab259 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e3/control.1 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e3/control.1 @@ -1,31 +1,31 @@ #------- # Intro #------- - PROBLEM_NAME left + PROBLEM_NAME left - HEAT_TRANSFER yes - POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 + HEAT_TRANSFER yes + POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 - TIME_STEP 1.0e-2 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 999999 + TIME_STEP 1.0e-2 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 999999 #----------------------------------------------- # Physical models # (Properties are read from file for this case) #----------------------------------------------- - TURBULENCE_MODEL none - - # Properties based on Pr and Ra numbers: - # Pr = 0.7 - # Ra = 10e3 - # mu = 1.0 / sqrt(Pr * Ra) = 0.0377964473 - # lambda = sqrt(Pr / Ra) * 10 = 0.264575131 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.0377964473 - THERMAL_CONDUCTIVITY 0.264575131 + TURBULENCE_MODEL none + + # Properties based on Pr and Ra numbers: + # Pr = 0.7 + # Ra = 10e3 + # mu = 1.0 / sqrt(Pr * Ra) = 0.0377964473 + # lambda = sqrt(Pr / Ra) * 10 = 0.264575131 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.0377964473 + THERMAL_CONDUCTIVITY 0.264575131 #-------------------- # Initial conditions @@ -37,51 +37,51 @@ #---------------------- # Numerical parameters #---------------------- - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 - MIN_SIMPLE_ITERATIONS 3 + MIN_SIMPLE_ITERATIONS 3 #-------------------------- # Boundary conditions #-------------------------- -BOUNDARY_CONDITION TOP - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION BOTTOM - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION SIDE - TYPE symmetry - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.25 - -BOUNDARY_CONDITION LEFT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION RIGHT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 + BOUNDARY_CONDITION TOP + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION BOTTOM + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION SIDE + TYPE symmetry + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.25 + + BOUNDARY_CONDITION LEFT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION RIGHT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e3/control.2 b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e3/control.2 index 204b05c75..365209832 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e3/control.2 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e3/control.2 @@ -1,36 +1,36 @@ #------- # Intro #------- - PROBLEM_NAME middle + PROBLEM_NAME middle - HEAT_TRANSFER yes - BUOYANCY thermal - REFERENCE_TEMPERATURE 0.5 + HEAT_TRANSFER yes + BUOYANCY thermal + REFERENCE_TEMPERATURE 0.5 - POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 + POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 - TIME_STEP 1.0e-2 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 999999 + TIME_STEP 1.0e-2 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 999999 #----------------------------------------------- # Physical models # (Properties are read from file for this case) #----------------------------------------------- - TURBULENCE_MODEL none + TURBULENCE_MODEL none - GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 + GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 - # Properties based on Pr and Ra numbers: - # Pr = 0.7 - # Ra = 10e3 - # mu = 1.0 / sqrt(Pr * Ra) = 0.0377964473 - # lambda = sqrt(Pr / Ra) = 0.0264575131 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.0377964473 - THERMAL_CONDUCTIVITY 0.0264575131 + # Properties based on Pr and Ra numbers: + # Pr = 0.7 + # Ra = 10e3 + # mu = 1.0 / sqrt(Pr * Ra) = 0.0377964473 + # lambda = sqrt(Pr / Ra) = 0.0264575131 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.0377964473 + THERMAL_CONDUCTIVITY 0.0264575131 #-------------------- # Initial conditions @@ -42,54 +42,54 @@ #---------------------- # Numerical parameters #---------------------- - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 - ADVECTION_SCHEME_FOR_ENERGY superbee - ADVECTION_SCHEME_FOR_MOMENTUM superbee + ADVECTION_SCHEME_FOR_ENERGY superbee + ADVECTION_SCHEME_FOR_MOMENTUM superbee - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 - MIN_SIMPLE_ITERATIONS 3 + MIN_SIMPLE_ITERATIONS 3 #-------------------------- # Boundary conditions #-------------------------- -BOUNDARY_CONDITION TOP - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION BOTTOM - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION SIDE - TYPE symmetry - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 - -BOUNDARY_CONDITION LEFT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 - -BOUNDARY_CONDITION RIGHT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 + BOUNDARY_CONDITION TOP + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION BOTTOM + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION SIDE + TYPE symmetry + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 + + BOUNDARY_CONDITION LEFT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 + + BOUNDARY_CONDITION RIGHT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e3/control.3 b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e3/control.3 index 9e7e6aa0c..82e201baa 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e3/control.3 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e3/control.3 @@ -1,31 +1,31 @@ #------- # Intro #------- - PROBLEM_NAME right + PROBLEM_NAME right - HEAT_TRANSFER yes - POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 + HEAT_TRANSFER yes + POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 - TIME_STEP 1.0e-2 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 999999 + TIME_STEP 1.0e-2 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 999999 #----------------------------------------------- # Physical models # (Properties are read from file for this case) #----------------------------------------------- - TURBULENCE_MODEL none - - # Properties based on Pr and Ra numbers: - # Pr = 0.7 - # Ra = 10e3 - # mu = 1.0 / sqrt(Pr * Ra) = 0.0377964473 - # lambda = sqrt(Pr / Ra) * 10 = 0.264575131 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.0377964473 - THERMAL_CONDUCTIVITY 0.264575131 + TURBULENCE_MODEL none + + # Properties based on Pr and Ra numbers: + # Pr = 0.7 + # Ra = 10e3 + # mu = 1.0 / sqrt(Pr * Ra) = 0.0377964473 + # lambda = sqrt(Pr / Ra) * 10 = 0.264575131 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.0377964473 + THERMAL_CONDUCTIVITY 0.264575131 #-------------------- # Initial conditions @@ -37,51 +37,51 @@ #---------------------- # Numerical parameters #---------------------- - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 - MIN_SIMPLE_ITERATIONS 3 + MIN_SIMPLE_ITERATIONS 3 #-------------------------- # Boundary conditions #-------------------------- -BOUNDARY_CONDITION TOP - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION BOTTOM - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION SIDE - TYPE symmetry - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.75 - -BOUNDARY_CONDITION LEFT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 - -BOUNDARY_CONDITION RIGHT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 1.0 + BOUNDARY_CONDITION TOP + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION BOTTOM + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION SIDE + TYPE symmetry + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.75 + + BOUNDARY_CONDITION LEFT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 + + BOUNDARY_CONDITION RIGHT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 1.0 diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e5/control.1 b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e5/control.1 index 695d7ea03..505f1270d 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e5/control.1 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e5/control.1 @@ -1,31 +1,31 @@ #------- # Intro #------- - PROBLEM_NAME left + PROBLEM_NAME left - HEAT_TRANSFER yes - POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 + HEAT_TRANSFER yes + POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 - TIME_STEP 1.0e-2 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 999999 + TIME_STEP 1.0e-2 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 999999 #----------------------------------------------- # Physical models # (Properties are read from file for this case) #----------------------------------------------- - TURBULENCE_MODEL none - - # Properties based on Pr and Ra numbers: - # Pr = 0.7 - # Ra = 10e5 - # mu = 1.0 / sqrt(Pr * Ra) = 0.00377964473 - # lambda = sqrt(Pr / Ra) * 10 = 0.0264575131 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.00377964473 - THERMAL_CONDUCTIVITY 0.0264575131 + TURBULENCE_MODEL none + + # Properties based on Pr and Ra numbers: + # Pr = 0.7 + # Ra = 10e5 + # mu = 1.0 / sqrt(Pr * Ra) = 0.00377964473 + # lambda = sqrt(Pr / Ra) * 10 = 0.0264575131 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.00377964473 + THERMAL_CONDUCTIVITY 0.0264575131 #-------------------- # Initial conditions @@ -37,51 +37,51 @@ #---------------------- # Numerical parameters #---------------------- - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 - MIN_SIMPLE_ITERATIONS 3 + MIN_SIMPLE_ITERATIONS 3 #-------------------------- # Boundary conditions #-------------------------- -BOUNDARY_CONDITION TOP - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION BOTTOM - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION SIDE - TYPE symmetry - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.25 - -BOUNDARY_CONDITION LEFT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION RIGHT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 + BOUNDARY_CONDITION TOP + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION BOTTOM + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION SIDE + TYPE symmetry + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.25 + + BOUNDARY_CONDITION LEFT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION RIGHT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e5/control.2 b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e5/control.2 index ad76fde62..5ab923bd4 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e5/control.2 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e5/control.2 @@ -1,36 +1,36 @@ #------- # Intro #------- - PROBLEM_NAME middle + PROBLEM_NAME middle - HEAT_TRANSFER yes - BUOYANCY thermal - REFERENCE_TEMPERATURE 0.5 + HEAT_TRANSFER yes + BUOYANCY thermal + REFERENCE_TEMPERATURE 0.5 - POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 + POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 - TIME_STEP 1.0e-2 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 999999 + TIME_STEP 1.0e-2 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 999999 #----------------------------------------------- # Physical models # (Properties are read from file for this case) #----------------------------------------------- - TURBULENCE_MODEL none + TURBULENCE_MODEL none - GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 + GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 - # Properties based on Pr and Ra numbers: - # Pr = 0.7 - # Ra = 10e5 - # mu = 1.0 / sqrt(Pr * Ra) = 0.00377964473 - # lambda = sqrt(Pr / Ra) = 0.00264575131 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.00377964473 - THERMAL_CONDUCTIVITY 0.00264575131 + # Properties based on Pr and Ra numbers: + # Pr = 0.7 + # Ra = 10e5 + # mu = 1.0 / sqrt(Pr * Ra) = 0.00377964473 + # lambda = sqrt(Pr / Ra) = 0.00264575131 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.00377964473 + THERMAL_CONDUCTIVITY 0.00264575131 #-------------------- # Initial conditions @@ -42,54 +42,54 @@ #---------------------- # Numerical parameters #---------------------- - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 - ADVECTION_SCHEME_FOR_ENERGY superbee - ADVECTION_SCHEME_FOR_MOMENTUM superbee + ADVECTION_SCHEME_FOR_ENERGY superbee + ADVECTION_SCHEME_FOR_MOMENTUM superbee - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 - MIN_SIMPLE_ITERATIONS 3 + MIN_SIMPLE_ITERATIONS 3 #-------------------------- # Boundary conditions #-------------------------- -BOUNDARY_CONDITION TOP - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION BOTTOM - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION SIDE - TYPE symmetry - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 - -BOUNDARY_CONDITION LEFT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 - -BOUNDARY_CONDITION RIGHT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 + BOUNDARY_CONDITION TOP + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION BOTTOM + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION SIDE + TYPE symmetry + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 + + BOUNDARY_CONDITION LEFT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 + + BOUNDARY_CONDITION RIGHT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e5/control.3 b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e5/control.3 index 9f9d4e61e..edbd295a0 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e5/control.3 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/K_10.0/Ra_10e5/control.3 @@ -1,31 +1,31 @@ #------- # Intro #------- - PROBLEM_NAME right + PROBLEM_NAME right - HEAT_TRANSFER yes - POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 + HEAT_TRANSFER yes + POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 - TIME_STEP 1.0e-2 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 999999 + TIME_STEP 1.0e-2 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 999999 #----------------------------------------------- # Physical models # (Properties are read from file for this case) #----------------------------------------------- - TURBULENCE_MODEL none - - # Properties based on Pr and Ra numbers: - # Pr = 0.7 - # Ra = 10e5 - # mu = 1.0 / sqrt(Pr * Ra) = 0.00377964473 - # lambda = sqrt(Pr / Ra) * 10 = 0.0264575131 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.00377964473 - THERMAL_CONDUCTIVITY 0.0264575131 + TURBULENCE_MODEL none + + # Properties based on Pr and Ra numbers: + # Pr = 0.7 + # Ra = 10e5 + # mu = 1.0 / sqrt(Pr * Ra) = 0.00377964473 + # lambda = sqrt(Pr / Ra) * 10 = 0.0264575131 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.00377964473 + THERMAL_CONDUCTIVITY 0.0264575131 #-------------------- # Initial conditions @@ -37,51 +37,51 @@ #---------------------- # Numerical parameters #---------------------- - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 - MIN_SIMPLE_ITERATIONS 3 + MIN_SIMPLE_ITERATIONS 3 #-------------------------- # Boundary conditions #-------------------------- -BOUNDARY_CONDITION TOP - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION BOTTOM - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION SIDE - TYPE symmetry - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.75 - -BOUNDARY_CONDITION LEFT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 - -BOUNDARY_CONDITION RIGHT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 1.0 + BOUNDARY_CONDITION TOP + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION BOTTOM + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION SIDE + TYPE symmetry + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.75 + + BOUNDARY_CONDITION LEFT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 + + BOUNDARY_CONDITION RIGHT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 1.0 diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/control.0 b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/control.0 index 76ade5c0e..f7ad64259 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/control.0 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/control.0 @@ -1,17 +1,17 @@ - NUMBER_OF_DOMAINS 3 + NUMBER_OF_DOMAINS 3 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 30 - BACKUP_SAVE_INTERVAL 999999 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 30 + BACKUP_SAVE_INTERVAL 999999 - TIME_STEP 0.1 + TIME_STEP 0.1 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - # Connection between left and the middle: - INTERFACE_CONDITION left middle - BOUNDARY_CONDITIONS right left + # Connection between left and the middle: + INTERFACE_CONDITION left middle + BOUNDARY_CONDITIONS right left - # Connection between middle and the right - INTERFACE_CONDITION middle right - BOUNDARY_CONDITIONS right left + # Connection between middle and the right + INTERFACE_CONDITION middle right + BOUNDARY_CONDITIONS right left diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Direct/Ra_10e3/control b/Tests/Laminar/Cavity/Thermally_Driven/Direct/Ra_10e3/control index f14997616..fe22d337c 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Direct/Ra_10e3/control +++ b/Tests/Laminar/Cavity/Thermally_Driven/Direct/Ra_10e3/control @@ -1,73 +1,71 @@ #---------- # Prologue #---------- - PROBLEM_NAME cavity - HEAT_TRANSFER yes - BUOYANCY thermal + PROBLEM_NAME cavity + HEAT_TRANSFER yes + BUOYANCY thermal - NUMBER_OF_TIME_STEPS 600 + NUMBER_OF_TIME_STEPS 600 - RESULTS_SAVE_INTERVAL 300 - BACKUP_SAVE_INTERVAL 300 + RESULTS_SAVE_INTERVAL 300 + BACKUP_SAVE_INTERVAL 300 - TIME_STEP 1.0 + TIME_STEP 1.0 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 4 - MONITORING_POINT_001 0.5 0.1 0.95 - MONITORING_POINT_002 0.5 0.1 0.85 - MONITORING_POINT_003 0.5 0.1 0.75 - MONITORING_POINT_004 0.5 0.1 0.65 + NUMBER_OF_MONITORING_POINTS 4 + MONITORING_POINT_001 0.5 0.1 0.95 + MONITORING_POINT_002 0.5 0.1 0.85 + MONITORING_POINT_003 0.5 0.1 0.75 + MONITORING_POINT_004 0.5 0.1 0.65 - POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 + POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 #----------------- # Physical models #----------------- + GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 - GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 + # Properties based on Pr and Ra numbers: + # Pr = 0.71 + # Ra = 10e3 + # mu = sqrt(Pr / Ra) = 0.02664582518 + # lambda = 1.0 / sqrt(Pr * Ra) = 0.03752933125 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.02664582518 + THERMAL_CONDUCTIVITY 0.03752933125 - # Properties based on Pr and Ra numbers: - # Pr = 0.71 - # Ra = 10e3 - # mu = sqrt(Pr / Ra) = 0.02664582518 - # lambda = 1.0 / sqrt(Pr * Ra) = 0.03752933125 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.02664582518 - THERMAL_CONDUCTIVITY 0.03752933125 - - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod - ADVECTION_SCHEME_FOR_ENERGY minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_ENERGY minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-7 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-7 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - REFERENCE_TEMPERATURE 0.5 + REFERENCE_TEMPERATURE 0.5 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Direct/Ra_10e4/control b/Tests/Laminar/Cavity/Thermally_Driven/Direct/Ra_10e4/control index 05a4dad92..909ff61cc 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Direct/Ra_10e4/control +++ b/Tests/Laminar/Cavity/Thermally_Driven/Direct/Ra_10e4/control @@ -1,73 +1,71 @@ #---------- # Prologue #---------- - PROBLEM_NAME cavity - HEAT_TRANSFER yes - BUOYANCY thermal + PROBLEM_NAME cavity + HEAT_TRANSFER yes + BUOYANCY thermal - NUMBER_OF_TIME_STEPS 600 + NUMBER_OF_TIME_STEPS 600 - RESULTS_SAVE_INTERVAL 300 - BACKUP_SAVE_INTERVAL 300 + RESULTS_SAVE_INTERVAL 300 + BACKUP_SAVE_INTERVAL 300 - TIME_STEP 1.0 + TIME_STEP 1.0 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 4 - MONITORING_POINT_001 0.5 0.1 0.95 - MONITORING_POINT_002 0.5 0.1 0.85 - MONITORING_POINT_003 0.5 0.1 0.75 - MONITORING_POINT_004 0.5 0.1 0.65 + NUMBER_OF_MONITORING_POINTS 4 + MONITORING_POINT_001 0.5 0.1 0.95 + MONITORING_POINT_002 0.5 0.1 0.85 + MONITORING_POINT_003 0.5 0.1 0.75 + MONITORING_POINT_004 0.5 0.1 0.65 - POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 + POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 #----------------- # Physical models #----------------- + GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 - GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 + # Properties based on Pr and Ra numbers: + # Pr = 0.71 + # Ra = 10e4 + # mu = sqrt(Pr / Ra) = 0.00842614977 + # lambda = 1.0 / sqrt(Pr * Ra) = 0.01186781658 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.00842614977 + THERMAL_CONDUCTIVITY 0.01186781658 - # Properties based on Pr and Ra numbers: - # Pr = 0.71 - # Ra = 10e4 - # mu = sqrt(Pr / Ra) = 0.00842614977 - # lambda = 1.0 / sqrt(Pr * Ra) = 0.01186781658 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.00842614977 - THERMAL_CONDUCTIVITY 0.01186781658 - - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod - ADVECTION_SCHEME_FOR_ENERGY minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_ENERGY minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-7 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-7 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - REFERENCE_TEMPERATURE 0.5 + REFERENCE_TEMPERATURE 0.5 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Direct/Ra_10e5/control b/Tests/Laminar/Cavity/Thermally_Driven/Direct/Ra_10e5/control index 4d3f4e97b..fe27021e3 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Direct/Ra_10e5/control +++ b/Tests/Laminar/Cavity/Thermally_Driven/Direct/Ra_10e5/control @@ -1,73 +1,71 @@ #---------- # Prologue #---------- - PROBLEM_NAME cavity - HEAT_TRANSFER yes - BUOYANCY thermal + PROBLEM_NAME cavity + HEAT_TRANSFER yes + BUOYANCY thermal - NUMBER_OF_TIME_STEPS 600 + NUMBER_OF_TIME_STEPS 600 - RESULTS_SAVE_INTERVAL 300 - BACKUP_SAVE_INTERVAL 300 + RESULTS_SAVE_INTERVAL 300 + BACKUP_SAVE_INTERVAL 300 - TIME_STEP 1.0 + TIME_STEP 1.0 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 4 - MONITORING_POINT_001 0.5 0.1 0.95 - MONITORING_POINT_002 0.5 0.1 0.85 - MONITORING_POINT_003 0.5 0.1 0.75 - MONITORING_POINT_004 0.5 0.1 0.65 + NUMBER_OF_MONITORING_POINTS 4 + MONITORING_POINT_001 0.5 0.1 0.95 + MONITORING_POINT_002 0.5 0.1 0.85 + MONITORING_POINT_003 0.5 0.1 0.75 + MONITORING_POINT_004 0.5 0.1 0.65 - POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 + POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 #----------------- # Physical models #----------------- + GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 - GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 + # Properties based on Pr and Ra numbers: + # Pr = 0.71 + # Ra = 10e5 + # mu = sqrt(Pr / Ra) = 0.00266458251 + # lambda = 1.0 / sqrt(Pr * Ra) = 0.00375293312 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.00266458251 + THERMAL_CONDUCTIVITY 0.00375293312 - # Properties based on Pr and Ra numbers: - # Pr = 0.71 - # Ra = 10e5 - # mu = sqrt(Pr / Ra) = 0.00266458251 - # lambda = 1.0 / sqrt(Pr * Ra) = 0.00375293312 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.00266458251 - THERMAL_CONDUCTIVITY 0.00375293312 - - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod - ADVECTION_SCHEME_FOR_ENERGY minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_ENERGY minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-7 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-7 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - REFERENCE_TEMPERATURE 0.5 + REFERENCE_TEMPERATURE 0.5 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Direct/Ra_10e6/control b/Tests/Laminar/Cavity/Thermally_Driven/Direct/Ra_10e6/control index 00e7e62a9..da8dcbc05 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Direct/Ra_10e6/control +++ b/Tests/Laminar/Cavity/Thermally_Driven/Direct/Ra_10e6/control @@ -1,73 +1,71 @@ #---------- # Prologue #---------- - PROBLEM_NAME cavity - HEAT_TRANSFER yes - BUOYANCY thermal + PROBLEM_NAME cavity + HEAT_TRANSFER yes + BUOYANCY thermal - NUMBER_OF_TIME_STEPS 600 + NUMBER_OF_TIME_STEPS 600 - RESULTS_SAVE_INTERVAL 300 - BACKUP_SAVE_INTERVAL 300 + RESULTS_SAVE_INTERVAL 300 + BACKUP_SAVE_INTERVAL 300 - TIME_STEP 1.0 + TIME_STEP 1.0 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 4 - MONITORING_POINT_001 0.5 0.1 0.95 - MONITORING_POINT_002 0.5 0.1 0.85 - MONITORING_POINT_003 0.5 0.1 0.75 - MONITORING_POINT_004 0.5 0.1 0.65 + NUMBER_OF_MONITORING_POINTS 4 + MONITORING_POINT_001 0.5 0.1 0.95 + MONITORING_POINT_002 0.5 0.1 0.85 + MONITORING_POINT_003 0.5 0.1 0.75 + MONITORING_POINT_004 0.5 0.1 0.65 - POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 + POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 #----------------- # Physical models #----------------- + GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 - GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 + # Properties based on Pr and Ra numbers: + # Pr = 0.71 + # Ra = 10e6 + # mu = sqrt(Pr / Ra) = 0.000842614977 + # lambda = 1.0 / sqrt(Pr * Ra) = 0.001186781658 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.000842614977 + THERMAL_CONDUCTIVITY 0.001186781658 - # Properties based on Pr and Ra numbers: - # Pr = 0.71 - # Ra = 10e6 - # mu = sqrt(Pr / Ra) = 0.000842614977 - # lambda = 1.0 / sqrt(Pr * Ra) = 0.001186781658 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.000842614977 - THERMAL_CONDUCTIVITY 0.001186781658 - - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod - ADVECTION_SCHEME_FOR_ENERGY minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_ENERGY minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-7 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-7 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - REFERENCE_TEMPERATURE 0.5 + REFERENCE_TEMPERATURE 0.5 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Direct/Ra_10e7/control b/Tests/Laminar/Cavity/Thermally_Driven/Direct/Ra_10e7/control index 549f019c5..bceec1798 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Direct/Ra_10e7/control +++ b/Tests/Laminar/Cavity/Thermally_Driven/Direct/Ra_10e7/control @@ -1,73 +1,71 @@ #---------- # Prologue #---------- - PROBLEM_NAME cavity - HEAT_TRANSFER yes - BUOYANCY thermal + PROBLEM_NAME cavity + HEAT_TRANSFER yes + BUOYANCY thermal - NUMBER_OF_TIME_STEPS 600 + NUMBER_OF_TIME_STEPS 600 - RESULTS_SAVE_INTERVAL 300 - BACKUP_SAVE_INTERVAL 300 + RESULTS_SAVE_INTERVAL 300 + BACKUP_SAVE_INTERVAL 300 - TIME_STEP 1.0 + TIME_STEP 1.0 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 4 - MONITORING_POINT_001 0.5 0.1 0.95 - MONITORING_POINT_002 0.5 0.1 0.85 - MONITORING_POINT_003 0.5 0.1 0.75 - MONITORING_POINT_004 0.5 0.1 0.65 + NUMBER_OF_MONITORING_POINTS 4 + MONITORING_POINT_001 0.5 0.1 0.95 + MONITORING_POINT_002 0.5 0.1 0.85 + MONITORING_POINT_003 0.5 0.1 0.75 + MONITORING_POINT_004 0.5 0.1 0.65 - POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 + POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 #----------------- # Physical models #----------------- + GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 - GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 + # Properties based on Pr and Ra numbers: + # Pr = 0.71 + # Ra = 10e7 + # mu = sqrt(Pr / Ra) = 0.000266458251 + # lambda = 1.0 / sqrt(Pr * Ra) = 0.000375293312 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.000266458251 + THERMAL_CONDUCTIVITY 0.000375293312 - # Properties based on Pr and Ra numbers: - # Pr = 0.71 - # Ra = 10e7 - # mu = sqrt(Pr / Ra) = 0.000266458251 - # lambda = 1.0 / sqrt(Pr * Ra) = 0.000375293312 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.000266458251 - THERMAL_CONDUCTIVITY 0.000375293312 - - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod - ADVECTION_SCHEME_FOR_ENERGY minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_ENERGY minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-7 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-7 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - REFERENCE_TEMPERATURE 0.5 + REFERENCE_TEMPERATURE 0.5 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Direct/Ra_10e8/control b/Tests/Laminar/Cavity/Thermally_Driven/Direct/Ra_10e8/control index 8a3f48b18..50ce9e10b 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Direct/Ra_10e8/control +++ b/Tests/Laminar/Cavity/Thermally_Driven/Direct/Ra_10e8/control @@ -1,73 +1,71 @@ #---------- # Prologue #---------- - PROBLEM_NAME cavity - HEAT_TRANSFER yes - BUOYANCY thermal + PROBLEM_NAME cavity + HEAT_TRANSFER yes + BUOYANCY thermal - NUMBER_OF_TIME_STEPS 600 + NUMBER_OF_TIME_STEPS 600 - RESULTS_SAVE_INTERVAL 300 - BACKUP_SAVE_INTERVAL 300 + RESULTS_SAVE_INTERVAL 300 + BACKUP_SAVE_INTERVAL 300 - TIME_STEP 1.0 + TIME_STEP 1.0 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 4 - MONITORING_POINT_001 0.5 0.1 0.95 - MONITORING_POINT_002 0.5 0.1 0.85 - MONITORING_POINT_003 0.5 0.1 0.75 - MONITORING_POINT_004 0.5 0.1 0.65 + NUMBER_OF_MONITORING_POINTS 4 + MONITORING_POINT_001 0.5 0.1 0.95 + MONITORING_POINT_002 0.5 0.1 0.85 + MONITORING_POINT_003 0.5 0.1 0.75 + MONITORING_POINT_004 0.5 0.1 0.65 - POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 + POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 #----------------- # Physical models #----------------- + GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 - GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 + # Properties based on Pr and Ra numbers: + # Pr = 0.71 + # Ra = 10e8 + # mu = sqrt(Pr / Ra) = 0.0000842614977 + # lambda = 1.0 / sqrt(Pr * Ra) = 0.0001186781658 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.0000842614977 + THERMAL_CONDUCTIVITY 0.0001186781658 - # Properties based on Pr and Ra numbers: - # Pr = 0.71 - # Ra = 10e8 - # mu = sqrt(Pr / Ra) = 0.0000842614977 - # lambda = 1.0 / sqrt(Pr * Ra) = 0.0001186781658 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.0000842614977 - THERMAL_CONDUCTIVITY 0.0001186781658 - - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod - ADVECTION_SCHEME_FOR_ENERGY minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_ENERGY minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-7 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-7 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - REFERENCE_TEMPERATURE 0.5 + REFERENCE_TEMPERATURE 0.5 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Direct/Variable_Properties_Air/control b/Tests/Laminar/Cavity/Thermally_Driven/Direct/Variable_Properties_Air/control index 04082c07f..ca335eb70 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Direct/Variable_Properties_Air/control +++ b/Tests/Laminar/Cavity/Thermally_Driven/Direct/Variable_Properties_Air/control @@ -1,72 +1,72 @@ #------- # Intro #------- - PROBLEM_NAME air + PROBLEM_NAME air - HEAT_TRANSFER yes + HEAT_TRANSFER yes - TIME_STEP 1.0e-2 - NUMBER_OF_TIME_STEPS 6000 - RESULTS_SAVE_INTERVAL 120 + TIME_STEP 1.0e-2 + NUMBER_OF_TIME_STEPS 6000 + RESULTS_SAVE_INTERVAL 120 #----------------------------------------------- # Physical models # (Properties are read from file for this case) #----------------------------------------------- - GRAVITATIONAL_VECTOR 0.0, 0.0, -9.81 + GRAVITATIONAL_VECTOR 0.0, 0.0, -9.81 - TURBULENCE_MODEL none + TURBULENCE_MODEL none #-------------------- # Initial conditions #-------------------- - INITIAL_CONDITION - VARIABLES u v w t - VALUES 0.0 0.0 0.0 20 + INITIAL_CONDITION + VARIABLES u v w t + VALUES 0.0 0.0 0.0 20 #---------------------- # Numerical parameters #---------------------- - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 #-------------------------- # Boundary conditions #-------------------------- -BOUNDARY_CONDITION TOP - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 + BOUNDARY_CONDITION TOP + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 -BOUNDARY_CONDITION BOTTOM - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 + BOUNDARY_CONDITION BOTTOM + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 -BOUNDARY_CONDITION SIDE - TYPE symmetry - VARIABLES u v w t - VALUES 0.0 0.0 0.0 10 + BOUNDARY_CONDITION SIDE + TYPE symmetry + VARIABLES u v w t + VALUES 0.0 0.0 0.0 10 -BOUNDARY_CONDITION LEFT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 10 + BOUNDARY_CONDITION LEFT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 10 -BOUNDARY_CONDITION RIGHT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 30 + BOUNDARY_CONDITION RIGHT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 30 diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Skewed/control b/Tests/Laminar/Cavity/Thermally_Driven/Skewed/control index 8c2e63dc9..28a65f079 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Skewed/control +++ b/Tests/Laminar/Cavity/Thermally_Driven/Skewed/control @@ -1,75 +1,73 @@ #---------- # Prologue #---------- - PROBLEM_NAME skewed - HEAT_TRANSFER yes - BUOYANCY thermal + PROBLEM_NAME skewed + HEAT_TRANSFER yes + BUOYANCY thermal - NUMBER_OF_TIME_STEPS 1 + NUMBER_OF_TIME_STEPS 1 - RESULTS_SAVE_INTERVAL 3 - BACKUP_SAVE_INTERVAL 3 + RESULTS_SAVE_INTERVAL 3 + BACKUP_SAVE_INTERVAL 3 - TIME_STEP 1.0e+12 + TIME_STEP 1.0e+12 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 4 - MONITORING_POINT_001 0.5 0.1 0.95 - MONITORING_POINT_002 0.5 0.1 0.85 - MONITORING_POINT_003 0.5 0.1 0.75 - MONITORING_POINT_004 0.5 0.1 0.65 + NUMBER_OF_MONITORING_POINTS 4 + MONITORING_POINT_001 0.5 0.1 0.95 + MONITORING_POINT_002 0.5 0.1 0.85 + MONITORING_POINT_003 0.5 0.1 0.75 + MONITORING_POINT_004 0.5 0.1 0.65 - POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 + POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 #----------------- # Physical models #----------------- + GRAVITATIONAL_VECTOR 0.0 0.0 0.0 - GRAVITATIONAL_VECTOR 0.0 0.0 0.0 + # Properties based on Pr and Ra numbers: + # Pr = 0.71 + # Ra = 10e3 + # mu = 1.0 / sqrt(Pr * Ra) = 0.03752933125 + # lambda = sqrt(Pr / Ra) = 0.02664582518 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.03752933125 + THERMAL_CONDUCTIVITY 0.02664582518 - # Properties based on Pr and Ra numbers: - # Pr = 0.71 - # Ra = 10e3 - # mu = 1.0 / sqrt(Pr * Ra) = 0.03752933125 - # lambda = sqrt(Pr / Ra) = 0.02664582518 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.03752933125 - THERMAL_CONDUCTIVITY 0.02664582518 - - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 1.0 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 1.0 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod - ADVECTION_SCHEME_FOR_ENERGY minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_ENERGY minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-12 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-7 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-12 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-7 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 120 - MIN_SIMPLE_ITERATIONS 24 - MAX_SIMPLE_ITERATIONS 120 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 120 + MIN_SIMPLE_ITERATIONS 24 + MAX_SIMPLE_ITERATIONS 120 - REFERENCE_TEMPERATURE 0.5 + REFERENCE_TEMPERATURE 0.5 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Channel/control b/Tests/Laminar/Channel/control index 09a87d2bd..465cf2440 100644 --- a/Tests/Laminar/Channel/control +++ b/Tests/Laminar/Channel/control @@ -1,12 +1,12 @@ -PROBLEM_NAME channel_dual + PROBLEM_NAME channel_dual -NUMBER_OF_TIME_STEPS 120 + NUMBER_OF_TIME_STEPS 120 -MASS_FLOW_RATES 1.0 0.0 0.0 + MASS_FLOW_RATES 1.0 0.0 0.0 -BOUNDARY_CONDITION walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Convective_Outflow/control b/Tests/Laminar/Convective_Outflow/control index ea14ab5ab..773ae7838 100644 --- a/Tests/Laminar/Convective_Outflow/control +++ b/Tests/Laminar/Convective_Outflow/control @@ -37,26 +37,26 @@ #----------------------------------------------------------- # Numerical parameters #----------------------------------------------------------- - PRESSURE_MOMENTUM_COUPLING piso + PRESSURE_MOMENTUM_COUPLING piso - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.999 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.999 - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 200 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-5 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 200 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-5 #----------------------------------------------------------- # Linear solver settings #----------------------------------------------------------- - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 #----------------------------------------------------------- # Boundary conditions diff --git a/Tests/Laminar/Copy_Inlet/control.0 b/Tests/Laminar/Copy_Inlet/control.0 index dacdf024c..79d8bc0a2 100644 --- a/Tests/Laminar/Copy_Inlet/control.0 +++ b/Tests/Laminar/Copy_Inlet/control.0 @@ -1,13 +1,13 @@ - NUMBER_OF_DOMAINS 2 + NUMBER_OF_DOMAINS 2 - NUMBER_OF_TIME_STEPS 300 - RESULTS_SAVE_INTERVAL 30 - BACKUP_SAVE_INTERVAL 300 + NUMBER_OF_TIME_STEPS 300 + RESULTS_SAVE_INTERVAL 30 + BACKUP_SAVE_INTERVAL 300 - TIME_STEP 0.04 + TIME_STEP 0.04 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - INTERFACE_CONDITION channel backstep - BOUNDARY_CONDITIONS periodic_x in + INTERFACE_CONDITION channel backstep + BOUNDARY_CONDITIONS periodic_x in diff --git a/Tests/Laminar/Copy_Inlet/control.1 b/Tests/Laminar/Copy_Inlet/control.1 index 064a3b1fa..9992b16ed 100644 --- a/Tests/Laminar/Copy_Inlet/control.1 +++ b/Tests/Laminar/Copy_Inlet/control.1 @@ -1,52 +1,52 @@ #---------- # Prologue #--------- - PROBLEM_NAME channel - HEAT_TRANSFER no + PROBLEM_NAME channel + HEAT_TRANSFER no - NUMBER_OF_TIME_STEPS 300 - RESULTS_SAVE_INTERVAL 30 - BACKUP_SAVE_INTERVAL 300 - TIME_STEP 0.04 + NUMBER_OF_TIME_STEPS 300 + RESULTS_SAVE_INTERVAL 30 + BACKUP_SAVE_INTERVAL 300 + + TIME_STEP 0.04 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 -1.5 0.5 0.5 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 -1.5 0.5 0.5 - POINT_FOR_MONITORING_PLANES -1.5 0.5 0.5 + POINT_FOR_MONITORING_PLANES -1.5 0.5 0.5 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - DYNAMIC_VISCOSITY 1.0e-3 - HEAT_CAPACITY 1.0 + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 1.0e-3 + HEAT_CAPACITY 1.0 - TURBULENCE_MODEL none - MASS_FLOW_RATES 2.0 0.0 0.0 + TURBULENCE_MODEL none + MASS_FLOW_RATES 2.0 0.0 0.0 #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Copy_Inlet/control.2 b/Tests/Laminar/Copy_Inlet/control.2 index ad7fd7bd7..41f649b99 100644 --- a/Tests/Laminar/Copy_Inlet/control.2 +++ b/Tests/Laminar/Copy_Inlet/control.2 @@ -1,57 +1,55 @@ #---------- # Prologue #--------- - PROBLEM_NAME backstep - HEAT_TRANSFER no + PROBLEM_NAME backstep + HEAT_TRANSFER no - NUMBER_OF_TIME_STEPS 300 - RESULTS_SAVE_INTERVAL 30 - BACKUP_SAVE_INTERVAL 300 - TIME_STEP 0.04 + NUMBER_OF_TIME_STEPS 300 + RESULTS_SAVE_INTERVAL 30 + BACKUP_SAVE_INTERVAL 300 -#LOAD_BACKUP_NAME backstep_orthogonal-ts.backup + TIME_STEP 0.04 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 0.2 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - DYNAMIC_VISCOSITY 1.0e-3 - HEAT_CAPACITY 1.0 + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 1.0e-3 + HEAT_CAPACITY 1.0 - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + TIME_INTEGRATION_SCHEME linear - TIME_INTEGRATION_SCHEME linear + ADVECTION_SCHEME_FOR_MOMENTUM minmod - ADVECTION_SCHEME_FOR_MOMENTUM minmod - - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 400 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 400 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Cylinder/Horizontal/Re_100_A/control-m1-p2-s1 b/Tests/Laminar/Cylinder/Horizontal/Re_100_A/control-m1-p2-s1 index 9b8328448..006b9321e 100644 --- a/Tests/Laminar/Cylinder/Horizontal/Re_100_A/control-m1-p2-s1 +++ b/Tests/Laminar/Cylinder/Horizontal/Re_100_A/control-m1-p2-s1 @@ -1,7 +1,7 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #----------------------- # Physical properties @@ -11,7 +11,7 @@ # nu = 2.0e-3 # Re = U * D / nu = 100 #----------------------- - DYNAMIC_VISCOSITY 2.0e-3 + DYNAMIC_VISCOSITY 2.0e-3 #--------------------------------------- # Time stepping @@ -24,63 +24,63 @@ # dt = 0.0005 # N = 12000 give 6 flow through times #--------------------------------------- - TIME_STEP 0.0005 - NUMBER_OF_TIME_STEPS 12000 + TIME_STEP 0.0005 + NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 + SAVE_RESULTS_AT_BOUNDARIES no #----------------------------- # Monitoring points and plane #----------------------------- - POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.1 0.2 0.2 + POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.1 0.2 0.2 #---------------------- # Numerical parameters #---------------------- - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-1 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-2 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-1 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-1 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-2 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-1 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - MIN_SIMPLE_ITERATIONS 3 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + MIN_SIMPLE_ITERATIONS 3 - TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + TIME_INTEGRATION_SCHEME parabolic + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cylinder/Horizontal/Re_100_A/control-m2-p3-s2 b/Tests/Laminar/Cylinder/Horizontal/Re_100_A/control-m2-p3-s2 index c3dc2de02..6a5855fa1 100644 --- a/Tests/Laminar/Cylinder/Horizontal/Re_100_A/control-m2-p3-s2 +++ b/Tests/Laminar/Cylinder/Horizontal/Re_100_A/control-m2-p3-s2 @@ -1,7 +1,7 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #----------------------- # Physical properties @@ -11,7 +11,7 @@ # nu = 2.0e-3 # Re = U * D / nu = 100 #----------------------- - DYNAMIC_VISCOSITY 2.0e-3 + DYNAMIC_VISCOSITY 2.0e-3 #--------------------------------------- # Time stepping @@ -24,63 +24,63 @@ # dt = 0.0005 # N = 12000 give 6 flow through times #--------------------------------------- - TIME_STEP 0.0005 - NUMBER_OF_TIME_STEPS 12000 + TIME_STEP 0.0005 + NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 + SAVE_RESULTS_AT_BOUNDARIES no #----------------------------- # Monitoring points and plane #----------------------------- - POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.1 0.2 0.2 + POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.1 0.2 0.2 #---------------------- # Numerical parameters #---------------------- - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-2 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-2 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-2 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-2 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - MIN_SIMPLE_ITERATIONS 3 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + MIN_SIMPLE_ITERATIONS 3 - TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + TIME_INTEGRATION_SCHEME parabolic + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cylinder/Horizontal/Re_100_A/control-m3-p4-s3 b/Tests/Laminar/Cylinder/Horizontal/Re_100_A/control-m3-p4-s3 index e3c46f16f..a04b9db89 100644 --- a/Tests/Laminar/Cylinder/Horizontal/Re_100_A/control-m3-p4-s3 +++ b/Tests/Laminar/Cylinder/Horizontal/Re_100_A/control-m3-p4-s3 @@ -1,7 +1,7 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #----------------------- # Physical properties @@ -11,7 +11,7 @@ # nu = 2.0e-3 # Re = U * D / nu = 100 #----------------------- - DYNAMIC_VISCOSITY 2.0e-3 + DYNAMIC_VISCOSITY 2.0e-3 #--------------------------------------- # Time stepping @@ -24,63 +24,63 @@ # dt = 0.0005 # N = 12000 give 6 flow through times #--------------------------------------- - TIME_STEP 0.0005 - NUMBER_OF_TIME_STEPS 12000 + TIME_STEP 0.0005 + NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 + SAVE_RESULTS_AT_BOUNDARIES no #----------------------------- # Monitoring points and plane #----------------------------- - POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.1 0.2 0.2 + POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.1 0.2 0.2 #---------------------- # Numerical parameters #---------------------- - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - MIN_SIMPLE_ITERATIONS 3 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + MIN_SIMPLE_ITERATIONS 3 - TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + TIME_INTEGRATION_SCHEME parabolic + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cylinder/Horizontal/Re_100_A/control-m4-p5-s4 b/Tests/Laminar/Cylinder/Horizontal/Re_100_A/control-m4-p5-s4 index 3a8e9e6a0..41ed14900 100644 --- a/Tests/Laminar/Cylinder/Horizontal/Re_100_A/control-m4-p5-s4 +++ b/Tests/Laminar/Cylinder/Horizontal/Re_100_A/control-m4-p5-s4 @@ -1,7 +1,7 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #----------------------- # Physical properties @@ -11,7 +11,7 @@ # nu = 2.0e-3 # Re = U * D / nu = 100 #----------------------- - DYNAMIC_VISCOSITY 2.0e-3 + DYNAMIC_VISCOSITY 2.0e-3 #--------------------------------------- # Time stepping @@ -24,63 +24,63 @@ # dt = 0.0005 # N = 12000 give 6 flow through times #--------------------------------------- - TIME_STEP 0.0005 - NUMBER_OF_TIME_STEPS 12000 + TIME_STEP 0.0005 + NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 + SAVE_RESULTS_AT_BOUNDARIES no #----------------------------- # Monitoring points and plane #----------------------------- - POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.1 0.2 0.2 + POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.1 0.2 0.2 #---------------------- # Numerical parameters #---------------------- - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - MIN_SIMPLE_ITERATIONS 3 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + MIN_SIMPLE_ITERATIONS 3 - TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + TIME_INTEGRATION_SCHEME parabolic + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cylinder/Horizontal/Re_100_A/control-m5-p6-s5 b/Tests/Laminar/Cylinder/Horizontal/Re_100_A/control-m5-p6-s5 index edb815049..1b494352b 100644 --- a/Tests/Laminar/Cylinder/Horizontal/Re_100_A/control-m5-p6-s5 +++ b/Tests/Laminar/Cylinder/Horizontal/Re_100_A/control-m5-p6-s5 @@ -1,7 +1,7 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #----------------------- # Physical properties @@ -11,7 +11,7 @@ # nu = 2.0e-3 # Re = U * D / nu = 100 #----------------------- - DYNAMIC_VISCOSITY 2.0e-3 + DYNAMIC_VISCOSITY 2.0e-3 #--------------------------------------- # Time stepping @@ -24,63 +24,63 @@ # dt = 0.0005 # N = 12000 give 6 flow through times #--------------------------------------- - TIME_STEP 0.0005 - NUMBER_OF_TIME_STEPS 12000 + TIME_STEP 0.0005 + NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 + SAVE_RESULTS_AT_BOUNDARIES no #----------------------------- # Monitoring points and plane #----------------------------- - POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.1 0.2 0.2 + POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.1 0.2 0.2 #---------------------- # Numerical parameters #---------------------- - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-5 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-5 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - MIN_SIMPLE_ITERATIONS 3 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + MIN_SIMPLE_ITERATIONS 3 - TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + TIME_INTEGRATION_SCHEME parabolic + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cylinder/Horizontal/Re_100_A/control-m6-p7-s6 b/Tests/Laminar/Cylinder/Horizontal/Re_100_A/control-m6-p7-s6 index bff83b4fa..c3bd756ed 100644 --- a/Tests/Laminar/Cylinder/Horizontal/Re_100_A/control-m6-p7-s6 +++ b/Tests/Laminar/Cylinder/Horizontal/Re_100_A/control-m6-p7-s6 @@ -1,7 +1,7 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #----------------------- # Physical properties @@ -11,7 +11,7 @@ # nu = 2.0e-3 # Re = U * D / nu = 100 #----------------------- - DYNAMIC_VISCOSITY 2.0e-3 + DYNAMIC_VISCOSITY 2.0e-3 #--------------------------------------- # Time stepping @@ -24,64 +24,64 @@ # dt = 0.0005 # N = 12000 give 6 flow through times #--------------------------------------- - TIME_STEP 0.0005 - NUMBER_OF_TIME_STEPS 12000 + TIME_STEP 0.0005 + NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 + SAVE_RESULTS_AT_BOUNDARIES no #----------------------------- # Monitoring points and plane #----------------------------- - POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.1 0.2 0.2 + POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.1 0.2 0.2 #---------------------- # Numerical parameters #---------------------- - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-6 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-7 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-6 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-6 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-7 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-6 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - MIN_SIMPLE_ITERATIONS 3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + MIN_SIMPLE_ITERATIONS 3 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 - TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + TIME_INTEGRATION_SCHEME parabolic + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cylinder/Horizontal/Re_100_B/control-m1-p2-s1-g2 b/Tests/Laminar/Cylinder/Horizontal/Re_100_B/control-m1-p2-s1-g2 index b194ad434..81d13cea5 100644 --- a/Tests/Laminar/Cylinder/Horizontal/Re_100_B/control-m1-p2-s1-g2 +++ b/Tests/Laminar/Cylinder/Horizontal/Re_100_B/control-m1-p2-s1-g2 @@ -1,7 +1,7 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #----------------------- # Physical properties @@ -11,7 +11,7 @@ # nu = 2.0e-3 # Re = U * D / nu = 100 #----------------------- - DYNAMIC_VISCOSITY 2.0e-3 + DYNAMIC_VISCOSITY 2.0e-3 #--------------------------------------- # Time stepping @@ -24,66 +24,66 @@ # dt = 0.0005 # N = 12000 give 6 flow through times #--------------------------------------- - TIME_STEP 0.0005 - NUMBER_OF_TIME_STEPS 12000 + TIME_STEP 0.0005 + NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 + SAVE_RESULTS_AT_BOUNDARIES no #----------------------------- # Monitoring points and plane #----------------------------- - POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.1 0.2 0.2 + POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.1 0.2 0.2 #---------------------- # Numerical parameters #---------------------- - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-1 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-2 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-1 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-2 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-1 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-2 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-1 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-2 - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - MIN_SIMPLE_ITERATIONS 3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + MIN_SIMPLE_ITERATIONS 3 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 240 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 240 #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cylinder/Horizontal/Re_100_B/control-m2-p3-s2-g3 b/Tests/Laminar/Cylinder/Horizontal/Re_100_B/control-m2-p3-s2-g3 index e4f016ae1..ec496b6ce 100644 --- a/Tests/Laminar/Cylinder/Horizontal/Re_100_B/control-m2-p3-s2-g3 +++ b/Tests/Laminar/Cylinder/Horizontal/Re_100_B/control-m2-p3-s2-g3 @@ -1,7 +1,7 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #----------------------- # Physical properties @@ -11,7 +11,7 @@ # nu = 2.0e-3 # Re = U * D / nu = 100 #----------------------- - DYNAMIC_VISCOSITY 2.0e-3 + DYNAMIC_VISCOSITY 2.0e-3 #--------------------------------------- # Time stepping @@ -24,66 +24,66 @@ # dt = 0.0005 # N = 12000 give 6 flow through times #--------------------------------------- - TIME_STEP 0.0005 - NUMBER_OF_TIME_STEPS 12000 + TIME_STEP 0.0005 + NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 + SAVE_RESULTS_AT_BOUNDARIES no #----------------------------- # Monitoring points and plane #----------------------------- - POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.1 0.2 0.2 + POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.1 0.2 0.2 #---------------------- # Numerical parameters #---------------------- - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-2 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-2 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-2 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-2 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - MIN_SIMPLE_ITERATIONS 3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + MIN_SIMPLE_ITERATIONS 3 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 240 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 240 #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cylinder/Horizontal/Re_100_B/control-m3-p4-s3-g4 b/Tests/Laminar/Cylinder/Horizontal/Re_100_B/control-m3-p4-s3-g4 index 7a69b8282..c7c020e7e 100644 --- a/Tests/Laminar/Cylinder/Horizontal/Re_100_B/control-m3-p4-s3-g4 +++ b/Tests/Laminar/Cylinder/Horizontal/Re_100_B/control-m3-p4-s3-g4 @@ -1,7 +1,7 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #----------------------- # Physical properties @@ -11,7 +11,7 @@ # nu = 2.0e-3 # Re = U * D / nu = 100 #----------------------- - DYNAMIC_VISCOSITY 2.0e-3 + DYNAMIC_VISCOSITY 2.0e-3 #--------------------------------------- # Time stepping @@ -24,66 +24,66 @@ # dt = 0.0005 # N = 12000 give 6 flow through times #--------------------------------------- - TIME_STEP 0.0005 - NUMBER_OF_TIME_STEPS 12000 + TIME_STEP 0.0005 + NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 + SAVE_RESULTS_AT_BOUNDARIES no #----------------------------- # Monitoring points and plane #----------------------------- - POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.1 0.2 0.2 + POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.1 0.2 0.2 #---------------------- # Numerical parameters #---------------------- - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-4 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-4 - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - MIN_SIMPLE_ITERATIONS 3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + MIN_SIMPLE_ITERATIONS 3 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 240 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 240 #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cylinder/Horizontal/Re_100_B/control-m4-p5-s4-g5 b/Tests/Laminar/Cylinder/Horizontal/Re_100_B/control-m4-p5-s4-g5 index 6dff896c6..c39b95af3 100644 --- a/Tests/Laminar/Cylinder/Horizontal/Re_100_B/control-m4-p5-s4-g5 +++ b/Tests/Laminar/Cylinder/Horizontal/Re_100_B/control-m4-p5-s4-g5 @@ -1,7 +1,7 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #----------------------- # Physical properties @@ -11,7 +11,7 @@ # nu = 2.0e-3 # Re = U * D / nu = 100 #----------------------- - DYNAMIC_VISCOSITY 2.0e-3 + DYNAMIC_VISCOSITY 2.0e-3 #--------------------------------------- # Time stepping @@ -24,66 +24,66 @@ # dt = 0.0005 # N = 12000 give 6 flow through times #--------------------------------------- - TIME_STEP 0.0005 - NUMBER_OF_TIME_STEPS 12000 + TIME_STEP 0.0005 + NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 + SAVE_RESULTS_AT_BOUNDARIES no #----------------------------- # Monitoring points and plane #----------------------------- - POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.1 0.2 0.2 + POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.1 0.2 0.2 #---------------------- # Numerical parameters #---------------------- - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-5 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-5 - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - MIN_SIMPLE_ITERATIONS 3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + MIN_SIMPLE_ITERATIONS 3 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 240 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 240 #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cylinder/Horizontal/Re_100_B/control-m5-p6-s5-g6 b/Tests/Laminar/Cylinder/Horizontal/Re_100_B/control-m5-p6-s5-g6 index 899961fd7..8f6b666bd 100644 --- a/Tests/Laminar/Cylinder/Horizontal/Re_100_B/control-m5-p6-s5-g6 +++ b/Tests/Laminar/Cylinder/Horizontal/Re_100_B/control-m5-p6-s5-g6 @@ -1,7 +1,7 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #----------------------- # Physical properties @@ -11,7 +11,7 @@ # nu = 2.0e-3 # Re = U * D / nu = 100 #----------------------- - DYNAMIC_VISCOSITY 2.0e-3 + DYNAMIC_VISCOSITY 2.0e-3 #--------------------------------------- # Time stepping @@ -24,66 +24,66 @@ # dt = 0.0005 # N = 12000 give 6 flow through times #--------------------------------------- - TIME_STEP 0.0005 - NUMBER_OF_TIME_STEPS 12000 + TIME_STEP 0.0005 + NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 + SAVE_RESULTS_AT_BOUNDARIES no #----------------------------- # Monitoring points and plane #----------------------------- - POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.1 0.2 0.2 + POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.1 0.2 0.2 #---------------------- # Numerical parameters #---------------------- - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-5 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-6 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-5 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-6 - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - MIN_SIMPLE_ITERATIONS 3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + MIN_SIMPLE_ITERATIONS 3 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 240 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 240 #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cylinder/Horizontal/Re_100_B/control-m6-p7-s6-g7 b/Tests/Laminar/Cylinder/Horizontal/Re_100_B/control-m6-p7-s6-g7 index bc6df3816..7777c23a6 100644 --- a/Tests/Laminar/Cylinder/Horizontal/Re_100_B/control-m6-p7-s6-g7 +++ b/Tests/Laminar/Cylinder/Horizontal/Re_100_B/control-m6-p7-s6-g7 @@ -1,7 +1,7 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #----------------------- # Physical properties @@ -11,7 +11,7 @@ # nu = 2.0e-3 # Re = U * D / nu = 100 #----------------------- - DYNAMIC_VISCOSITY 2.0e-3 + DYNAMIC_VISCOSITY 2.0e-3 #--------------------------------------- # Time stepping @@ -24,66 +24,66 @@ # dt = 0.0005 # N = 12000 give 6 flow through times #--------------------------------------- - TIME_STEP 0.0005 - NUMBER_OF_TIME_STEPS 12000 + TIME_STEP 0.0005 + NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 + SAVE_RESULTS_AT_BOUNDARIES no #----------------------------- # Monitoring points and plane #----------------------------- - POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.1 0.2 0.2 + POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.1 0.2 0.2 #---------------------- # Numerical parameters #---------------------- - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-6 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-7 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-6 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-7 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-6 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-7 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-6 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-7 - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - MIN_SIMPLE_ITERATIONS 3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + MIN_SIMPLE_ITERATIONS 3 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 240 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 240 #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cylinder/Horizontal/Re_100_C/control-m1-p2-s1-g2 b/Tests/Laminar/Cylinder/Horizontal/Re_100_C/control-m1-p2-s1-g2 index 8d28099ab..91f42f42d 100644 --- a/Tests/Laminar/Cylinder/Horizontal/Re_100_C/control-m1-p2-s1-g2 +++ b/Tests/Laminar/Cylinder/Horizontal/Re_100_C/control-m1-p2-s1-g2 @@ -1,7 +1,7 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #----------------------- # Physical properties @@ -11,7 +11,7 @@ # nu = 2.0e-3 # Re = U * D / nu = 100 #----------------------- - DYNAMIC_VISCOSITY 2.0e-3 + DYNAMIC_VISCOSITY 2.0e-3 #--------------------------------------- # Time stepping @@ -24,67 +24,67 @@ # dt = 0.0005 # N = 12000 give 6 flow through times #--------------------------------------- - TIME_STEP 0.0005 - NUMBER_OF_TIME_STEPS 12000 + TIME_STEP 0.0005 + NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 + SAVE_RESULTS_AT_BOUNDARIES no #----------------------------- # Monitoring points and plane #----------------------------- - POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.1 0.2 0.2 + POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.1 0.2 0.2 #---------------------- # Numerical parameters #---------------------- - CHOI_CORRECTION yes - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-1 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-2 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-1 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-2 + CHOI_CORRECTION yes + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-1 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-2 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-1 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-2 - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - MIN_SIMPLE_ITERATIONS 3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + MIN_SIMPLE_ITERATIONS 3 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 240 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 240 #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cylinder/Horizontal/Re_100_C/control-m2-p3-s2-g3 b/Tests/Laminar/Cylinder/Horizontal/Re_100_C/control-m2-p3-s2-g3 index f6de771c7..f601b48e7 100644 --- a/Tests/Laminar/Cylinder/Horizontal/Re_100_C/control-m2-p3-s2-g3 +++ b/Tests/Laminar/Cylinder/Horizontal/Re_100_C/control-m2-p3-s2-g3 @@ -1,7 +1,7 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #----------------------- # Physical properties @@ -11,7 +11,7 @@ # nu = 2.0e-3 # Re = U * D / nu = 100 #----------------------- - DYNAMIC_VISCOSITY 2.0e-3 + DYNAMIC_VISCOSITY 2.0e-3 #--------------------------------------- # Time stepping @@ -24,67 +24,67 @@ # dt = 0.0005 # N = 12000 give 6 flow through times #--------------------------------------- - TIME_STEP 0.0005 - NUMBER_OF_TIME_STEPS 12000 + TIME_STEP 0.0005 + NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 + SAVE_RESULTS_AT_BOUNDARIES no #----------------------------- # Monitoring points and plane #----------------------------- - POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.1 0.2 0.2 + POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.1 0.2 0.2 #---------------------- # Numerical parameters #---------------------- - CHOI_CORRECTION yes - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-2 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-2 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 + CHOI_CORRECTION yes + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-2 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-2 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - MIN_SIMPLE_ITERATIONS 3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + MIN_SIMPLE_ITERATIONS 3 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 240 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 240 #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cylinder/Horizontal/Re_100_C/control-m3-p4-s3-g4 b/Tests/Laminar/Cylinder/Horizontal/Re_100_C/control-m3-p4-s3-g4 index 8f678ce7e..1cfecab93 100644 --- a/Tests/Laminar/Cylinder/Horizontal/Re_100_C/control-m3-p4-s3-g4 +++ b/Tests/Laminar/Cylinder/Horizontal/Re_100_C/control-m3-p4-s3-g4 @@ -1,7 +1,7 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #----------------------- # Physical properties @@ -11,7 +11,7 @@ # nu = 2.0e-3 # Re = U * D / nu = 100 #----------------------- - DYNAMIC_VISCOSITY 2.0e-3 + DYNAMIC_VISCOSITY 2.0e-3 #--------------------------------------- # Time stepping @@ -24,67 +24,67 @@ # dt = 0.0005 # N = 12000 give 6 flow through times #--------------------------------------- - TIME_STEP 0.0005 - NUMBER_OF_TIME_STEPS 12000 + TIME_STEP 0.0005 + NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 + SAVE_RESULTS_AT_BOUNDARIES no #----------------------------- # Monitoring points and plane #----------------------------- - POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.1 0.2 0.2 + POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.1 0.2 0.2 #---------------------- # Numerical parameters #---------------------- - CHOI_CORRECTION yes - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-4 + CHOI_CORRECTION yes + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-4 - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - MIN_SIMPLE_ITERATIONS 3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + MIN_SIMPLE_ITERATIONS 3 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 240 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 240 #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cylinder/Horizontal/Re_100_C/control-m4-p5-s4-g5 b/Tests/Laminar/Cylinder/Horizontal/Re_100_C/control-m4-p5-s4-g5 index 3a6de347f..d73eeb774 100644 --- a/Tests/Laminar/Cylinder/Horizontal/Re_100_C/control-m4-p5-s4-g5 +++ b/Tests/Laminar/Cylinder/Horizontal/Re_100_C/control-m4-p5-s4-g5 @@ -1,7 +1,7 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #----------------------- # Physical properties @@ -11,7 +11,7 @@ # nu = 2.0e-3 # Re = U * D / nu = 100 #----------------------- - DYNAMIC_VISCOSITY 2.0e-3 + DYNAMIC_VISCOSITY 2.0e-3 #--------------------------------------- # Time stepping @@ -24,67 +24,67 @@ # dt = 0.0005 # N = 12000 give 6 flow through times #--------------------------------------- - TIME_STEP 0.0005 - NUMBER_OF_TIME_STEPS 12000 + TIME_STEP 0.0005 + NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 + SAVE_RESULTS_AT_BOUNDARIES no #----------------------------- # Monitoring points and plane #----------------------------- - POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.1 0.2 0.2 + POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.1 0.2 0.2 #---------------------- # Numerical parameters #---------------------- - CHOI_CORRECTION yes - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-5 + CHOI_CORRECTION yes + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-5 - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - MIN_SIMPLE_ITERATIONS 3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + MIN_SIMPLE_ITERATIONS 3 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 240 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 240 #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cylinder/Horizontal/Re_100_C/control-m5-p6-s5-g6 b/Tests/Laminar/Cylinder/Horizontal/Re_100_C/control-m5-p6-s5-g6 index 946b98914..89c7c1aa3 100644 --- a/Tests/Laminar/Cylinder/Horizontal/Re_100_C/control-m5-p6-s5-g6 +++ b/Tests/Laminar/Cylinder/Horizontal/Re_100_C/control-m5-p6-s5-g6 @@ -1,7 +1,7 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #----------------------- # Physical properties @@ -11,7 +11,7 @@ # nu = 2.0e-3 # Re = U * D / nu = 100 #----------------------- - DYNAMIC_VISCOSITY 2.0e-3 + DYNAMIC_VISCOSITY 2.0e-3 #--------------------------------------- # Time stepping @@ -24,67 +24,67 @@ # dt = 0.0005 # N = 12000 give 6 flow through times #--------------------------------------- - TIME_STEP 0.0005 - NUMBER_OF_TIME_STEPS 12000 + TIME_STEP 0.0005 + NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 + SAVE_RESULTS_AT_BOUNDARIES no #----------------------------- # Monitoring points and plane #----------------------------- - POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.1 0.2 0.2 + POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.1 0.2 0.2 #---------------------- # Numerical parameters #---------------------- - CHOI_CORRECTION yes - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-5 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-6 + CHOI_CORRECTION yes + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-5 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-6 - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - MIN_SIMPLE_ITERATIONS 3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + MIN_SIMPLE_ITERATIONS 3 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 240 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 240 #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cylinder/Horizontal/Re_100_C/control-m6-p7-s6-g7 b/Tests/Laminar/Cylinder/Horizontal/Re_100_C/control-m6-p7-s6-g7 index 8b501589a..5136ee096 100644 --- a/Tests/Laminar/Cylinder/Horizontal/Re_100_C/control-m6-p7-s6-g7 +++ b/Tests/Laminar/Cylinder/Horizontal/Re_100_C/control-m6-p7-s6-g7 @@ -1,7 +1,7 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #----------------------- # Physical properties @@ -11,7 +11,7 @@ # nu = 2.0e-3 # Re = U * D / nu = 100 #----------------------- - DYNAMIC_VISCOSITY 2.0e-3 + DYNAMIC_VISCOSITY 2.0e-3 #--------------------------------------- # Time stepping @@ -24,67 +24,67 @@ # dt = 0.0005 # N = 12000 give 6 flow through times #--------------------------------------- - TIME_STEP 0.0005 - NUMBER_OF_TIME_STEPS 12000 + TIME_STEP 0.0005 + NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 + SAVE_RESULTS_AT_BOUNDARIES no #----------------------------- # Monitoring points and plane #----------------------------- - POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.1 0.2 0.2 + POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.1 0.2 0.2 #---------------------- # Numerical parameters #---------------------- - CHOI_CORRECTION yes - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-6 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-7 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-6 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-7 + CHOI_CORRECTION yes + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-6 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-7 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-6 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-7 - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - MIN_SIMPLE_ITERATIONS 3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + MIN_SIMPLE_ITERATIONS 3 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 240 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 240 #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cylinder/Horizontal/Re_100_D/control-m1-p2-s1-g2 b/Tests/Laminar/Cylinder/Horizontal/Re_100_D/control-m1-p2-s1-g2 index ce2fa00b0..92135f9cb 100644 --- a/Tests/Laminar/Cylinder/Horizontal/Re_100_D/control-m1-p2-s1-g2 +++ b/Tests/Laminar/Cylinder/Horizontal/Re_100_D/control-m1-p2-s1-g2 @@ -1,7 +1,7 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #----------------------- # Physical properties @@ -11,7 +11,7 @@ # nu = 2.0e-3 # Re = U * D / nu = 100 #----------------------- - DYNAMIC_VISCOSITY 2.0e-3 + DYNAMIC_VISCOSITY 2.0e-3 #--------------------------------------- # Time stepping @@ -24,67 +24,67 @@ # dt = 0.0005 # N = 12000 give 6 flow through times #--------------------------------------- - TIME_STEP 0.0005 - NUMBER_OF_TIME_STEPS 12000 + TIME_STEP 0.0005 + NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 + SAVE_RESULTS_AT_BOUNDARIES no #----------------------------- # Monitoring points and plane #----------------------------- - POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.1 0.2 0.2 + POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.1 0.2 0.2 #---------------------- # Numerical parameters #---------------------- - CHOI_CORRECTION yes - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-1 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-2 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-1 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 + CHOI_CORRECTION yes + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-1 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-2 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-1 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - MIN_SIMPLE_ITERATIONS 3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + MIN_SIMPLE_ITERATIONS 3 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 240 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 240 #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cylinder/Horizontal/Re_100_D/control-m2-p3-s2-g3 b/Tests/Laminar/Cylinder/Horizontal/Re_100_D/control-m2-p3-s2-g3 index f6de771c7..f601b48e7 100644 --- a/Tests/Laminar/Cylinder/Horizontal/Re_100_D/control-m2-p3-s2-g3 +++ b/Tests/Laminar/Cylinder/Horizontal/Re_100_D/control-m2-p3-s2-g3 @@ -1,7 +1,7 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #----------------------- # Physical properties @@ -11,7 +11,7 @@ # nu = 2.0e-3 # Re = U * D / nu = 100 #----------------------- - DYNAMIC_VISCOSITY 2.0e-3 + DYNAMIC_VISCOSITY 2.0e-3 #--------------------------------------- # Time stepping @@ -24,67 +24,67 @@ # dt = 0.0005 # N = 12000 give 6 flow through times #--------------------------------------- - TIME_STEP 0.0005 - NUMBER_OF_TIME_STEPS 12000 + TIME_STEP 0.0005 + NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 + SAVE_RESULTS_AT_BOUNDARIES no #----------------------------- # Monitoring points and plane #----------------------------- - POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.1 0.2 0.2 + POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.1 0.2 0.2 #---------------------- # Numerical parameters #---------------------- - CHOI_CORRECTION yes - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-2 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-2 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 + CHOI_CORRECTION yes + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-2 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-2 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - MIN_SIMPLE_ITERATIONS 3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + MIN_SIMPLE_ITERATIONS 3 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 240 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 240 #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cylinder/Horizontal/Re_100_D/control-m3-p4-s3-g4 b/Tests/Laminar/Cylinder/Horizontal/Re_100_D/control-m3-p4-s3-g4 index f07525687..f41519ed2 100644 --- a/Tests/Laminar/Cylinder/Horizontal/Re_100_D/control-m3-p4-s3-g4 +++ b/Tests/Laminar/Cylinder/Horizontal/Re_100_D/control-m3-p4-s3-g4 @@ -1,7 +1,7 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #----------------------- # Physical properties @@ -11,7 +11,7 @@ # nu = 2.0e-3 # Re = U * D / nu = 100 #----------------------- - DYNAMIC_VISCOSITY 2.0e-3 + DYNAMIC_VISCOSITY 2.0e-3 #--------------------------------------- # Time stepping @@ -24,67 +24,67 @@ # dt = 0.0005 # N = 12000 give 6 flow through times #--------------------------------------- - TIME_STEP 0.0005 - NUMBER_OF_TIME_STEPS 12000 + TIME_STEP 0.0005 + NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 + SAVE_RESULTS_AT_BOUNDARIES no #----------------------------- # Monitoring points and plane #----------------------------- - POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.1 0.2 0.2 + POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.1 0.2 0.2 #---------------------- # Numerical parameters #---------------------- - CHOI_CORRECTION yes - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 + CHOI_CORRECTION yes + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - MIN_SIMPLE_ITERATIONS 3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + MIN_SIMPLE_ITERATIONS 3 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 240 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 240 #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cylinder/Horizontal/Re_100_D/control-m4-p5-s4-g5 b/Tests/Laminar/Cylinder/Horizontal/Re_100_D/control-m4-p5-s4-g5 index d7e92a50b..ad8bc5725 100644 --- a/Tests/Laminar/Cylinder/Horizontal/Re_100_D/control-m4-p5-s4-g5 +++ b/Tests/Laminar/Cylinder/Horizontal/Re_100_D/control-m4-p5-s4-g5 @@ -1,7 +1,7 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #----------------------- # Physical properties @@ -11,7 +11,7 @@ # nu = 2.0e-3 # Re = U * D / nu = 100 #----------------------- - DYNAMIC_VISCOSITY 2.0e-3 + DYNAMIC_VISCOSITY 2.0e-3 #--------------------------------------- # Time stepping @@ -24,67 +24,67 @@ # dt = 0.0005 # N = 12000 give 6 flow through times #--------------------------------------- - TIME_STEP 0.0005 - NUMBER_OF_TIME_STEPS 12000 + TIME_STEP 0.0005 + NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 + SAVE_RESULTS_AT_BOUNDARIES no #----------------------------- # Monitoring points and plane #----------------------------- - POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.1 0.2 0.2 + POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.1 0.2 0.2 #---------------------- # Numerical parameters #---------------------- - CHOI_CORRECTION yes - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 + CHOI_CORRECTION yes + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - MIN_SIMPLE_ITERATIONS 3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + MIN_SIMPLE_ITERATIONS 3 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 240 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 240 #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cylinder/Horizontal/Re_100_D/control-m5-p6-s5-g6 b/Tests/Laminar/Cylinder/Horizontal/Re_100_D/control-m5-p6-s5-g6 index 547af2747..d098d9c85 100644 --- a/Tests/Laminar/Cylinder/Horizontal/Re_100_D/control-m5-p6-s5-g6 +++ b/Tests/Laminar/Cylinder/Horizontal/Re_100_D/control-m5-p6-s5-g6 @@ -1,7 +1,7 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #----------------------- # Physical properties @@ -11,7 +11,7 @@ # nu = 2.0e-3 # Re = U * D / nu = 100 #----------------------- - DYNAMIC_VISCOSITY 2.0e-3 + DYNAMIC_VISCOSITY 2.0e-3 #--------------------------------------- # Time stepping @@ -24,67 +24,67 @@ # dt = 0.0005 # N = 12000 give 6 flow through times #--------------------------------------- - TIME_STEP 0.0005 - NUMBER_OF_TIME_STEPS 12000 + TIME_STEP 0.0005 + NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 + SAVE_RESULTS_AT_BOUNDARIES no #----------------------------- # Monitoring points and plane #----------------------------- - POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.1 0.2 0.2 + POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.1 0.2 0.2 #---------------------- # Numerical parameters #---------------------- - CHOI_CORRECTION yes - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-5 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 + CHOI_CORRECTION yes + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-5 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - MIN_SIMPLE_ITERATIONS 3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + MIN_SIMPLE_ITERATIONS 3 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 240 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 240 #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cylinder/Horizontal/Re_100_D/control-m6-p7-s6-g7 b/Tests/Laminar/Cylinder/Horizontal/Re_100_D/control-m6-p7-s6-g7 index dcd0aab7c..4142b4253 100644 --- a/Tests/Laminar/Cylinder/Horizontal/Re_100_D/control-m6-p7-s6-g7 +++ b/Tests/Laminar/Cylinder/Horizontal/Re_100_D/control-m6-p7-s6-g7 @@ -1,7 +1,7 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #----------------------- # Physical properties @@ -11,7 +11,7 @@ # nu = 2.0e-3 # Re = U * D / nu = 100 #----------------------- - DYNAMIC_VISCOSITY 2.0e-3 + DYNAMIC_VISCOSITY 2.0e-3 #--------------------------------------- # Time stepping @@ -24,67 +24,67 @@ # dt = 0.0005 # N = 12000 give 6 flow through times #--------------------------------------- - TIME_STEP 0.0005 - NUMBER_OF_TIME_STEPS 12000 + TIME_STEP 0.0005 + NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 + SAVE_RESULTS_AT_BOUNDARIES no #----------------------------- # Monitoring points and plane #----------------------------- - POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.1 0.2 0.2 + POINT_FOR_MONITORING_PLANES 1.1 0.2 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.1 0.2 0.2 #---------------------- # Numerical parameters #---------------------- - CHOI_CORRECTION yes - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-6 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-7 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-6 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 + CHOI_CORRECTION yes + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-6 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-7 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-6 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.e-3 - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_POTENTIAL_SOLVER 1.e-6 - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - MIN_SIMPLE_ITERATIONS 3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + MIN_SIMPLE_ITERATIONS 3 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 240 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 240 #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Laminar/Cylinder/Vertical/control-ra-1e05 b/Tests/Laminar/Cylinder/Vertical/control-ra-1e05 index 6352e6e2b..3df43207a 100644 --- a/Tests/Laminar/Cylinder/Vertical/control-ra-1e05 +++ b/Tests/Laminar/Cylinder/Vertical/control-ra-1e05 @@ -1,61 +1,61 @@ #---------- # Prologue #---------- - PROBLEM_NAME cylinder - HEAT_TRANSFER yes - BUOYANCY thermal + PROBLEM_NAME cylinder + HEAT_TRANSFER yes + BUOYANCY thermal - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 1200 - STARTING_TIME_STEP_FOR_TURB_STATISTICS 1200000 - RESULTS_SAVE_INTERVAL 150 - BACKUP_SAVE_INTERVAL 600 + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 1200 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 1200000 + RESULTS_SAVE_INTERVAL 150 + BACKUP_SAVE_INTERVAL 600 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 1.0 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 1.0 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models for Ra = 10^5 #----------------- - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 0.0206 - DYNAMIC_VISCOSITY 0.0146 - HEAT_CAPACITY 1.0 - REFERENCE_TEMPERATURE 20.0 + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 0.0206 + DYNAMIC_VISCOSITY 0.0146 + HEAT_CAPACITY 1.0 + REFERENCE_TEMPERATURE 20.0 - GRAVITATIONAL_VECTOR 0.0, -1.0, 0.0 + GRAVITATIONAL_VECTOR 0.0, -1.0, 0.0 - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM smart - ADVECTION_SCHEME_FOR_ENERGY smart - ADVECTION_SCHEME_FOR_TURBULENCE smart + ADVECTION_SCHEME_FOR_MOMENTUM smart + ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_TURBULENCE smart - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 - MIN_SIMPLE_ITERATIONS 6 - MAX_SIMPLE_ITERATIONS 12 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 + MIN_SIMPLE_ITERATIONS 6 + MAX_SIMPLE_ITERATIONS 12 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Cylinder/Vertical/control-ra-1e06 b/Tests/Laminar/Cylinder/Vertical/control-ra-1e06 index 7123b8b87..c6898bddb 100644 --- a/Tests/Laminar/Cylinder/Vertical/control-ra-1e06 +++ b/Tests/Laminar/Cylinder/Vertical/control-ra-1e06 @@ -1,64 +1,63 @@ #---------- # Prologue #---------- - PROBLEM_NAME cylinder - HEAT_TRANSFER yes - BUOYANCY thermal + PROBLEM_NAME cylinder + HEAT_TRANSFER yes + BUOYANCY thermal - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 2400 - STARTING_TIME_STEP_FOR_TURB_STATISTICS 1200000 - RESULTS_SAVE_INTERVAL 150 - BACKUP_SAVE_INTERVAL 600 + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 2400 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 1200000 + RESULTS_SAVE_INTERVAL 150 + BACKUP_SAVE_INTERVAL 600 - LOAD_BACKUP_NAME cylinder-ts001200.backup + LOAD_BACKUP_NAME cylinder-ts001200.backup #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 1.0 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 1.0 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models for Ra = 10^6 #----------------- - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 0.0065 - DYNAMIC_VISCOSITY 0.00462 - HEAT_CAPACITY 1.0 - REFERENCE_TEMPERATURE 20.0 + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 0.0065 + DYNAMIC_VISCOSITY 0.00462 + HEAT_CAPACITY 1.0 + REFERENCE_TEMPERATURE 20.0 - GRAVITATIONAL_VECTOR 0.0, -1.0, 0.0 + GRAVITATIONAL_VECTOR 0.0, -1.0, 0.0 - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM smart - ADVECTION_SCHEME_FOR_ENERGY smart - ADVECTION_SCHEME_FOR_TURBULENCE smart + ADVECTION_SCHEME_FOR_MOMENTUM smart + ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_TURBULENCE smart + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 - - MIN_SIMPLE_ITERATIONS 6 - MAX_SIMPLE_ITERATIONS 12 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 + MIN_SIMPLE_ITERATIONS 6 + MAX_SIMPLE_ITERATIONS 12 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 #-------------------- # Initial conditions @@ -67,7 +66,6 @@ VARIABLES u v w t kin eps zeta f22 VALUES 0.0 0.0 0.0 20.0 0.01 0.001 0.1 0.1 - #--------------------- # Boundary conditions #--------------------- diff --git a/Tests/Laminar/Cylinder/Vertical/control-ra-1e07 b/Tests/Laminar/Cylinder/Vertical/control-ra-1e07 index 1a4bc1501..413726e5f 100644 --- a/Tests/Laminar/Cylinder/Vertical/control-ra-1e07 +++ b/Tests/Laminar/Cylinder/Vertical/control-ra-1e07 @@ -1,64 +1,63 @@ #---------- # Prologue #---------- - PROBLEM_NAME cylinder - HEAT_TRANSFER yes - BUOYANCY thermal + PROBLEM_NAME cylinder + HEAT_TRANSFER yes + BUOYANCY thermal - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 3600 - STARTING_TIME_STEP_FOR_TURB_STATISTICS 1200000 - RESULTS_SAVE_INTERVAL 150 - BACKUP_SAVE_INTERVAL 600 + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 3600 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 1200000 + RESULTS_SAVE_INTERVAL 150 + BACKUP_SAVE_INTERVAL 600 - LOAD_BACKUP_NAME cylinder-ts002400.backup + LOAD_BACKUP_NAME cylinder-ts002400.backup #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 1.0 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 1.0 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models for Ra = 10^7 #----------------- - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 0.00206 - DYNAMIC_VISCOSITY 0.00146 - HEAT_CAPACITY 1.0 - REFERENCE_TEMPERATURE 20.0 + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 0.00206 + DYNAMIC_VISCOSITY 0.00146 + HEAT_CAPACITY 1.0 + REFERENCE_TEMPERATURE 20.0 - GRAVITATIONAL_VECTOR 0.0, -1.0, 0.0 + GRAVITATIONAL_VECTOR 0.0, -1.0, 0.0 - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM smart - ADVECTION_SCHEME_FOR_ENERGY smart - ADVECTION_SCHEME_FOR_TURBULENCE smart + ADVECTION_SCHEME_FOR_MOMENTUM smart + ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_TURBULENCE smart + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 - - MIN_SIMPLE_ITERATIONS 6 - MAX_SIMPLE_ITERATIONS 12 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 + MIN_SIMPLE_ITERATIONS 6 + MAX_SIMPLE_ITERATIONS 12 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 #-------------------- # Initial conditions @@ -67,7 +66,6 @@ VARIABLES u v w t kin eps zeta f22 VALUES 0.0 0.0 0.0 20.0 0.01 0.001 0.1 0.1 - #--------------------- # Boundary conditions #--------------------- diff --git a/Tests/Laminar/Cylinder/Vertical/control-ra-1e08 b/Tests/Laminar/Cylinder/Vertical/control-ra-1e08 index e505203fe..fed524d6f 100644 --- a/Tests/Laminar/Cylinder/Vertical/control-ra-1e08 +++ b/Tests/Laminar/Cylinder/Vertical/control-ra-1e08 @@ -1,64 +1,63 @@ #---------- # Prologue #---------- - PROBLEM_NAME cylinder - HEAT_TRANSFER yes - BUOYANCY thermal + PROBLEM_NAME cylinder + HEAT_TRANSFER yes + BUOYANCY thermal - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 4800 - STARTING_TIME_STEP_FOR_TURB_STATISTICS 1200000 - RESULTS_SAVE_INTERVAL 150 - BACKUP_SAVE_INTERVAL 600 + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 4800 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 1200000 + RESULTS_SAVE_INTERVAL 150 + BACKUP_SAVE_INTERVAL 600 - LOAD_BACKUP_NAME cylinder-ts003600.backup + LOAD_BACKUP_NAME cylinder-ts003600.backup #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 1.0 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 1.0 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models for Ra = 10^8 #----------------- - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 0.00065 - DYNAMIC_VISCOSITY 0.000462 - HEAT_CAPACITY 1.0 - REFERENCE_TEMPERATURE 20.0 + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 0.00065 + DYNAMIC_VISCOSITY 0.000462 + HEAT_CAPACITY 1.0 + REFERENCE_TEMPERATURE 20.0 - GRAVITATIONAL_VECTOR 0.0, -1.0, 0.0 + GRAVITATIONAL_VECTOR 0.0, -1.0, 0.0 - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM smart - ADVECTION_SCHEME_FOR_ENERGY smart - ADVECTION_SCHEME_FOR_TURBULENCE smart + ADVECTION_SCHEME_FOR_MOMENTUM smart + ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_TURBULENCE smart + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 - - MIN_SIMPLE_ITERATIONS 6 - MAX_SIMPLE_ITERATIONS 12 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 + MIN_SIMPLE_ITERATIONS 6 + MAX_SIMPLE_ITERATIONS 12 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 #-------------------- # Initial conditions @@ -67,7 +66,6 @@ VARIABLES u v w t kin eps zeta f22 VALUES 0.0 0.0 0.0 20.0 0.01 0.001 0.1 0.1 - #--------------------- # Boundary conditions #--------------------- diff --git a/Tests/Laminar/Cylinder/Vertical/control-ra-1e5 b/Tests/Laminar/Cylinder/Vertical/control-ra-1e5 index 22521babb..709513847 100644 --- a/Tests/Laminar/Cylinder/Vertical/control-ra-1e5 +++ b/Tests/Laminar/Cylinder/Vertical/control-ra-1e5 @@ -1,63 +1,60 @@ #---------- # Prologue #---------- - PROBLEM_NAME cylinder - HEAT_TRANSFER yes - BUOYANCY thermal + PROBLEM_NAME cylinder + HEAT_TRANSFER yes + BUOYANCY thermal - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 1200 - STARTING_TIME_STEP_FOR_TURB_STATISTICS 1200000 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 600 - -# LOAD_BACKUP_NAME cylinder-ts000600.backup + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 1200 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 1200000 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 600 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 1.0 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 1.0 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models for Ra = 10^5 #----------------- - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 0.0206 - DYNAMIC_VISCOSITY 0.0146 - HEAT_CAPACITY 1.0 - REFERENCE_TEMPERATURE 20.0 + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 0.0206 + DYNAMIC_VISCOSITY 0.0146 + HEAT_CAPACITY 1.0 + REFERENCE_TEMPERATURE 20.0 - GRAVITATIONAL_VECTOR 0.0, -1.0, 0.0 + GRAVITATIONAL_VECTOR 0.0, -1.0, 0.0 - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + PRESSURE_MOMENTUM_COUPLING simple - TIME_INTEGRATION_SCHEME parabolic + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - ADVECTION_SCHEME_FOR_MOMENTUM smart - ADVECTION_SCHEME_FOR_ENERGY smart - ADVECTION_SCHEME_FOR_TURBULENCE smart + TIME_INTEGRATION_SCHEME parabolic + ADVECTION_SCHEME_FOR_MOMENTUM smart + ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_TURBULENCE smart - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 - MIN_SIMPLE_ITERATIONS 6 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 160 + MIN_SIMPLE_ITERATIONS 6 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 160 #-------------------- # Initial conditions @@ -66,7 +63,6 @@ VARIABLES u v w t kin eps zeta f22 VALUES 0.0 0.0 0.0 20.0 0.01 0.001 0.1 0.1 - #--------------------- # Boundary conditions #--------------------- diff --git a/Tests/Laminar/Cylinder/Vertical/control-ra-1e6 b/Tests/Laminar/Cylinder/Vertical/control-ra-1e6 index bd797998f..25a0c465e 100644 --- a/Tests/Laminar/Cylinder/Vertical/control-ra-1e6 +++ b/Tests/Laminar/Cylinder/Vertical/control-ra-1e6 @@ -1,63 +1,62 @@ #---------- # Prologue #---------- - PROBLEM_NAME cylinder - HEAT_TRANSFER yes - BUOYANCY thermal + PROBLEM_NAME cylinder + HEAT_TRANSFER yes + BUOYANCY thermal - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 2400 - STARTING_TIME_STEP_FOR_TURB_STATISTICS 1200000 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 600 + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 2400 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 1200000 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 600 - LOAD_BACKUP_NAME cylinder-ts001200.backup + LOAD_BACKUP_NAME cylinder-ts001200.backup #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 1.0 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 1.0 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models for Ra = 10^6 #----------------- - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 0.0065 - DYNAMIC_VISCOSITY 0.00462 - HEAT_CAPACITY 1.0 - REFERENCE_TEMPERATURE 20.0 + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 0.0065 + DYNAMIC_VISCOSITY 0.00462 + HEAT_CAPACITY 1.0 + REFERENCE_TEMPERATURE 20.0 - GRAVITATIONAL_VECTOR 0.0, -1.0, 0.0 + GRAVITATIONAL_VECTOR 0.0, -1.0, 0.0 - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM smart - ADVECTION_SCHEME_FOR_ENERGY smart - ADVECTION_SCHEME_FOR_TURBULENCE smart + ADVECTION_SCHEME_FOR_MOMENTUM smart + ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_TURBULENCE smart + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 - - MIN_SIMPLE_ITERATIONS 6 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 160 + MIN_SIMPLE_ITERATIONS 6 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 160 #-------------------- # Initial conditions @@ -66,7 +65,6 @@ VARIABLES u v w t kin eps zeta f22 VALUES 0.0 0.0 0.0 20.0 0.01 0.001 0.1 0.1 - #--------------------- # Boundary conditions #--------------------- diff --git a/Tests/Laminar/Cylinder/Vertical/control-ra-1e7 b/Tests/Laminar/Cylinder/Vertical/control-ra-1e7 index cfe5c1bc6..eed6e8056 100644 --- a/Tests/Laminar/Cylinder/Vertical/control-ra-1e7 +++ b/Tests/Laminar/Cylinder/Vertical/control-ra-1e7 @@ -1,63 +1,62 @@ #---------- # Prologue #---------- - PROBLEM_NAME cylinder - HEAT_TRANSFER yes - BUOYANCY thermal + PROBLEM_NAME cylinder + HEAT_TRANSFER yes + BUOYANCY thermal - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 3600 - STARTING_TIME_STEP_FOR_TURB_STATISTICS 1200000 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 600 + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 3600 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 1200000 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 600 - LOAD_BACKUP_NAME cylinder-ts002400.backup + LOAD_BACKUP_NAME cylinder-ts002400.backup #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 1.0 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 1.0 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models for Ra = 10^7 #----------------- - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 0.00206 - DYNAMIC_VISCOSITY 0.00146 - HEAT_CAPACITY 1.0 - REFERENCE_TEMPERATURE 20.0 + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 0.00206 + DYNAMIC_VISCOSITY 0.00146 + HEAT_CAPACITY 1.0 + REFERENCE_TEMPERATURE 20.0 - GRAVITATIONAL_VECTOR 0.0, -1.0, 0.0 + GRAVITATIONAL_VECTOR 0.0, -1.0, 0.0 - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM smart - ADVECTION_SCHEME_FOR_ENERGY smart - ADVECTION_SCHEME_FOR_TURBULENCE smart + ADVECTION_SCHEME_FOR_MOMENTUM smart + ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_TURBULENCE smart + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 - - MIN_SIMPLE_ITERATIONS 6 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 160 + MIN_SIMPLE_ITERATIONS 6 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 160 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Flat_Plate/control b/Tests/Laminar/Flat_Plate/control index 5ebaf498c..4d646f830 100644 --- a/Tests/Laminar/Flat_Plate/control +++ b/Tests/Laminar/Flat_Plate/control @@ -1,83 +1,79 @@ #-------------------- # Problem definition #-------------------- - - PROBLEM_NAME plate - - HEAT_TRANSFER yes + PROBLEM_NAME plate + HEAT_TRANSFER yes #--------------- # Time stepping #--------------- - TIME_STEP 5.0 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 150 - BACKUP_SAVE_INTERVAL 200 + TIME_STEP 5.0 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 150 + BACKUP_SAVE_INTERVAL 200 -# LOAD_BACKUP_NAME plate-ts001200.backup #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 10 + NUMBER_OF_MONITORING_POINTS 10 - MONITORING_POINT_001 0.1 0.5 0.5 - MONITORING_POINT_002 0.5 0.5 0.5 - MONITORING_POINT_003 1.0 0.5 0.5 - MONITORING_POINT_004 1.5 0.5 0.5 - MONITORING_POINT_005 2.0 0.5 0.5 - MONITORING_POINT_006 3.0 0.5 0.5 - MONITORING_POINT_007 4.0 0.5 0.5 - MONITORING_POINT_008 5.0 0.5 0.5 - MONITORING_POINT_009 10.0 0.5 0.5 - MONITORING_POINT_010 20.0 0.5 0.5 + MONITORING_POINT_001 0.1 0.5 0.5 + MONITORING_POINT_002 0.5 0.5 0.5 + MONITORING_POINT_003 1.0 0.5 0.5 + MONITORING_POINT_004 1.5 0.5 0.5 + MONITORING_POINT_005 2.0 0.5 0.5 + MONITORING_POINT_006 3.0 0.5 0.5 + MONITORING_POINT_007 4.0 0.5 0.5 + MONITORING_POINT_008 5.0 0.5 0.5 + MONITORING_POINT_009 10.0 0.5 0.5 + MONITORING_POINT_010 20.0 0.5 0.5 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #---------------------------------------- # Fluid properties # Dry air at 27oC in SI units #---------------------------------------- - MASS_DENSITY 1.177 - DYNAMIC_VISCOSITY 1.846e-5 - - THERMAL_CONDUCTIVITY 2.6240e-2 - HEAT_CAPACITY 1000.0 + MASS_DENSITY 1.177 + DYNAMIC_VISCOSITY 1.846e-5 + THERMAL_CONDUCTIVITY 2.6240e-2 + HEAT_CAPACITY 1000.0 #---------------------------------------- # Physical models #---------------------------------------- - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.4 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.4 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.4 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM smart - ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_MOMENTUM smart + ADVECTION_SCHEME_FOR_ENERGY smart #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-6 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-5 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-6 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-5 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 #-------------------- # Initial conditions #-------------------- INITIAL_CONDITION - VARIABLES u v w t + VARIABLES u v w t VALUES 0.0 0.0 0.0 20.0 #--------------------- @@ -85,25 +81,25 @@ #--------------------- BOUNDARY_CONDITION bottom TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 25.0 + VARIABLES u v w t + VALUES 0.0 0.0 0.0 25.0 BOUNDARY_CONDITION entrance TYPE symmetry - VARIABLES u v w t - VALUES 0.0 0.0 0.0 20.0 + VARIABLES u v w t + VALUES 0.0 0.0 0.0 20.0 BOUNDARY_CONDITION top TYPE pressure - VARIABLES u v w t - VALUES 0.0 0.0 0.0 20.0 + VARIABLES u v w t + VALUES 0.0 0.0 0.0 20.0 BOUNDARY_CONDITION inlet TYPE inflow - VARIABLES u v w t - VALUES 0.05 0.0 0.0 20.0 + VARIABLES u v w t + VALUES 0.05 0.0 0.0 20.0 - BOUNDARY_CONDITION outlet + BOUNDARY_CONDITION outlet TYPE pressure - VARIABLES u v w t - VALUES 0.0 0.0 0.0 20.0 + VARIABLES u v w t + VALUES 0.0 0.0 0.0 20.0 diff --git a/Tests/Laminar/Heat_Exchanger/2_Domains/control.0 b/Tests/Laminar/Heat_Exchanger/2_Domains/control.0 index ba41be872..1dc0b9480 100644 --- a/Tests/Laminar/Heat_Exchanger/2_Domains/control.0 +++ b/Tests/Laminar/Heat_Exchanger/2_Domains/control.0 @@ -1,13 +1,13 @@ - NUMBER_OF_DOMAINS 2 + NUMBER_OF_DOMAINS 2 - NUMBER_OF_TIME_STEPS 90 - RESULTS_SAVE_INTERVAL 30 - BACKUP_SAVE_INTERVAL 120 + NUMBER_OF_TIME_STEPS 90 + RESULTS_SAVE_INTERVAL 30 + BACKUP_SAVE_INTERVAL 120 - TIME_STEP 0.1 + TIME_STEP 0.1 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - INTERFACE_CONDITION upper_dom lower_dom - BOUNDARY_CONDITIONS bottom_wall top_wall + INTERFACE_CONDITION upper_dom lower_dom + BOUNDARY_CONDITIONS bottom_wall top_wall diff --git a/Tests/Laminar/Heat_Exchanger/2_Domains/control.1 b/Tests/Laminar/Heat_Exchanger/2_Domains/control.1 index 2fe424c05..304389fa8 100644 --- a/Tests/Laminar/Heat_Exchanger/2_Domains/control.1 +++ b/Tests/Laminar/Heat_Exchanger/2_Domains/control.1 @@ -1,54 +1,52 @@ #---------- # Prologue #---------- - PROBLEM_NAME upper_dom - HEAT_TRANSFER yes + PROBLEM_NAME upper_dom + HEAT_TRANSFER yes - NUMBER_OF_TIME_STEPS 90 - RESULTS_SAVE_INTERVAL 30 - BACKUP_SAVE_INTERVAL 120 + NUMBER_OF_TIME_STEPS 90 + RESULTS_SAVE_INTERVAL 30 + BACKUP_SAVE_INTERVAL 120 - TIME_STEP 0.1 + TIME_STEP 0.1 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 0.05 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 0.05 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.05 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.05 #----------------- # Physical models #----------------- + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 1.4080e-4 + DYNAMIC_VISCOSITY 0.001 + HEAT_CAPACITY 1.0 - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 1.4080e-4 - DYNAMIC_VISCOSITY 0.001 - HEAT_CAPACITY 1.0 - - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Heat_Exchanger/2_Domains/control.2 b/Tests/Laminar/Heat_Exchanger/2_Domains/control.2 index 35e136d9a..da56f5219 100644 --- a/Tests/Laminar/Heat_Exchanger/2_Domains/control.2 +++ b/Tests/Laminar/Heat_Exchanger/2_Domains/control.2 @@ -1,46 +1,44 @@ #---------- # Prologue #---------- - PROBLEM_NAME lower_dom - HEAT_TRANSFER yes + PROBLEM_NAME lower_dom + HEAT_TRANSFER yes - NUMBER_OF_TIME_STEPS 90 - RESULTS_SAVE_INTERVAL 30 - BACKUP_SAVE_INTERVAL 120 + NUMBER_OF_TIME_STEPS 90 + RESULTS_SAVE_INTERVAL 30 + BACKUP_SAVE_INTERVAL 120 - TIME_STEP 0.1 + TIME_STEP 0.1 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 -0.1 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 -0.1 - POINT_FOR_MONITORING_PLANES 0.5 0.5 -0.1 + POINT_FOR_MONITORING_PLANES 0.5 0.5 -0.1 #----------------- # Physical models #----------------- + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 1.4080e-4 + DYNAMIC_VISCOSITY 0.001 + HEAT_CAPACITY 1.0 - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 1.4080e-4 - DYNAMIC_VISCOSITY 0.001 - HEAT_CAPACITY 1.0 - - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings diff --git a/Tests/Laminar/Heat_Exchanger/3_Domains/control.0 b/Tests/Laminar/Heat_Exchanger/3_Domains/control.0 index a109a32b9..2c99088bb 100644 --- a/Tests/Laminar/Heat_Exchanger/3_Domains/control.0 +++ b/Tests/Laminar/Heat_Exchanger/3_Domains/control.0 @@ -1,15 +1,15 @@ - NUMBER_OF_DOMAINS 3 + NUMBER_OF_DOMAINS 3 - NUMBER_OF_TIME_STEPS 360 - RESULTS_SAVE_INTERVAL 30 - BACKUP_SAVE_INTERVAL 120 + NUMBER_OF_TIME_STEPS 360 + RESULTS_SAVE_INTERVAL 30 + BACKUP_SAVE_INTERVAL 120 - TIME_STEP 0.1 + TIME_STEP 0.1 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - INTERFACE_CONDITION upper_dom membrane - BOUNDARY_CONDITIONS bottom_wall top_wall + INTERFACE_CONDITION upper_dom membrane + BOUNDARY_CONDITIONS bottom_wall top_wall - INTERFACE_CONDITION membrane lower_dom - BOUNDARY_CONDITIONS bottom_wall top_wall + INTERFACE_CONDITION membrane lower_dom + BOUNDARY_CONDITIONS bottom_wall top_wall diff --git a/Tests/Laminar/Heat_Exchanger/3_Domains/control.1 b/Tests/Laminar/Heat_Exchanger/3_Domains/control.1 index 22188419e..4c59cd3d1 100644 --- a/Tests/Laminar/Heat_Exchanger/3_Domains/control.1 +++ b/Tests/Laminar/Heat_Exchanger/3_Domains/control.1 @@ -1,54 +1,52 @@ #---------- # Prologue #---------- - PROBLEM_NAME upper_dom - HEAT_TRANSFER yes + PROBLEM_NAME upper_dom + HEAT_TRANSFER yes - NUMBER_OF_TIME_STEPS 12 - RESULTS_SAVE_INTERVAL 3 - BACKUP_SAVE_INTERVAL 12 + NUMBER_OF_TIME_STEPS 12 + RESULTS_SAVE_INTERVAL 3 + BACKUP_SAVE_INTERVAL 12 - TIME_STEP 0.1 + TIME_STEP 0.1 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.1 0.75 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.1 0.75 - POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 + POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 #----------------- # Physical models #----------------- + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 0.025 + DYNAMIC_VISCOSITY 0.001 + HEAT_CAPACITY 1.0 - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 0.025 - DYNAMIC_VISCOSITY 0.001 - HEAT_CAPACITY 1.0 - - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Heat_Exchanger/3_Domains/control.2 b/Tests/Laminar/Heat_Exchanger/3_Domains/control.2 index 92ae43e26..827dc1521 100644 --- a/Tests/Laminar/Heat_Exchanger/3_Domains/control.2 +++ b/Tests/Laminar/Heat_Exchanger/3_Domains/control.2 @@ -1,54 +1,52 @@ #---------- # Prologue #---------- - PROBLEM_NAME lower_dom - HEAT_TRANSFER yes + PROBLEM_NAME lower_dom + HEAT_TRANSFER yes - NUMBER_OF_TIME_STEPS 12 - RESULTS_SAVE_INTERVAL 3 - BACKUP_SAVE_INTERVAL 12 + NUMBER_OF_TIME_STEPS 12 + RESULTS_SAVE_INTERVAL 3 + BACKUP_SAVE_INTERVAL 12 - TIME_STEP 0.1 + TIME_STEP 0.1 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.1 0.75 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.1 0.75 - POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 + POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 #----------------- # Physical models #----------------- + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 0.025 + DYNAMIC_VISCOSITY 0.001 + HEAT_CAPACITY 1.0 - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 0.025 - DYNAMIC_VISCOSITY 0.001 - HEAT_CAPACITY 1.0 - - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Heat_Exchanger/3_Domains/control.3 b/Tests/Laminar/Heat_Exchanger/3_Domains/control.3 index 626c67ae7..0328bbef9 100644 --- a/Tests/Laminar/Heat_Exchanger/3_Domains/control.3 +++ b/Tests/Laminar/Heat_Exchanger/3_Domains/control.3 @@ -1,54 +1,52 @@ #---------- # Prologue #---------- - PROBLEM_NAME membrane - HEAT_TRANSFER yes + PROBLEM_NAME membrane + HEAT_TRANSFER yes - NUMBER_OF_TIME_STEPS 12 - RESULTS_SAVE_INTERVAL 3 - BACKUP_SAVE_INTERVAL 12 + NUMBER_OF_TIME_STEPS 12 + RESULTS_SAVE_INTERVAL 3 + BACKUP_SAVE_INTERVAL 12 - TIME_STEP 0.1 + TIME_STEP 0.1 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.1 0.75 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.1 0.75 - POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 + POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 #----------------- # Physical models #----------------- + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 240 + DYNAMIC_VISCOSITY 1.0e+6 + HEAT_CAPACITY 1.0e-3 - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 240 - DYNAMIC_VISCOSITY 1.0e+6 - HEAT_CAPACITY 1.0e-3 - - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Membrane/2_Domains/control.0 b/Tests/Laminar/Membrane/2_Domains/control.0 index 1f85a251c..1ae50ffde 100644 --- a/Tests/Laminar/Membrane/2_Domains/control.0 +++ b/Tests/Laminar/Membrane/2_Domains/control.0 @@ -1,13 +1,13 @@ - NUMBER_OF_DOMAINS 2 + NUMBER_OF_DOMAINS 2 - NUMBER_OF_TIME_STEPS 48000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 4800 + NUMBER_OF_TIME_STEPS 48000 + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 4800 - TIME_STEP 0.0025 + TIME_STEP 0.0025 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - INTERFACE_CONDITION upper_dom lower_dom - BOUNDARY_CONDITIONS bottom_wall top_wall + INTERFACE_CONDITION upper_dom lower_dom + BOUNDARY_CONDITIONS bottom_wall top_wall diff --git a/Tests/Laminar/Membrane/2_Domains/control.1 b/Tests/Laminar/Membrane/2_Domains/control.1 index 8aabcf8eb..d4e023e96 100644 --- a/Tests/Laminar/Membrane/2_Domains/control.1 +++ b/Tests/Laminar/Membrane/2_Domains/control.1 @@ -1,55 +1,55 @@ #---------- # Prologue #---------- - PROBLEM_NAME upper_dom - HEAT_TRANSFER yes + PROBLEM_NAME upper_dom + HEAT_TRANSFER yes - NUMBER_OF_TIME_STEPS 120 - RESULTS_SAVE_INTERVAL 12 - BACKUP_SAVE_INTERVAL 120 + NUMBER_OF_TIME_STEPS 120 + RESULTS_SAVE_INTERVAL 12 + BACKUP_SAVE_INTERVAL 120 - TIME_STEP 0.025 + TIME_STEP 0.025 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.05 0.05 0.005 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.05 0.05 0.005 - POINT_FOR_MONITORING_PLANES 0.05 0.05 0.005 + POINT_FOR_MONITORING_PLANES 0.05 0.05 0.005 #----------------- # Physical models #----------------- - NUMBER_OF_SCALARS 1 + NUMBER_OF_SCALARS 1 - MASS_DENSITY 1000.0 - THERMAL_CONDUCTIVITY 0.6680 - DYNAMIC_VISCOSITY 0.355E-3 - HEAT_CAPACITY 4198.0 - SCALARS_DIFFUSIVITY 1.99E-09 + MASS_DENSITY 1000.0 + THERMAL_CONDUCTIVITY 0.6680 + DYNAMIC_VISCOSITY 0.355E-3 + HEAT_CAPACITY 4198.0 + SCALARS_DIFFUSIVITY 1.99E-09 - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM upwind + ADVECTION_SCHEME_FOR_MOMENTUM upwind #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Membrane/2_Domains/control.2 b/Tests/Laminar/Membrane/2_Domains/control.2 index e0702f255..48173641a 100644 --- a/Tests/Laminar/Membrane/2_Domains/control.2 +++ b/Tests/Laminar/Membrane/2_Domains/control.2 @@ -1,58 +1,57 @@ #---------- # Prologue #---------- - PROBLEM_NAME lower_dom - HEAT_TRANSFER yes + PROBLEM_NAME lower_dom + HEAT_TRANSFER yes - NUMBER_OF_TIME_STEPS 120 - RESULTS_SAVE_INTERVAL 12 - BACKUP_SAVE_INTERVAL 120 + NUMBER_OF_TIME_STEPS 120 + RESULTS_SAVE_INTERVAL 12 + BACKUP_SAVE_INTERVAL 120 - TIME_STEP 0.025 + TIME_STEP 0.025 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.05 0.05 -0.01 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.05 0.05 -0.01 - POINT_FOR_MONITORING_PLANES 0.05 0.05 -0.01 + POINT_FOR_MONITORING_PLANES 0.05 0.05 -0.01 #----------------- # Physical models #----------------- - NUMBER_OF_SCALARS 1 + NUMBER_OF_SCALARS 1 - MASS_DENSITY 1.2 - THERMAL_CONDUCTIVITY 0.0278 - DYNAMIC_VISCOSITY 17.935e-6 - HEAT_CAPACITY 1007.0 - SCALARS_DIFFUSIVITY 3.5E-5 + MASS_DENSITY 1.2 + THERMAL_CONDUCTIVITY 0.0278 + DYNAMIC_VISCOSITY 17.935e-6 + HEAT_CAPACITY 1007.0 + SCALARS_DIFFUSIVITY 3.5E-5 - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_SCALARS 1.0 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 1.0 - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_SCALAR 1.0 - SIMPLE_UNDERRELAXATION_FOR_TEMPERATURE 1.0 + TIME_INTEGRATION_SCHEME linear - TIME_INTEGRATION_SCHEME linear - - ADVECTION_SCHEME_FOR_MOMENTUM upwind + ADVECTION_SCHEME_FOR_MOMENTUM upwind #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Membrane/Spacers/Concave/control b/Tests/Laminar/Membrane/Spacers/Concave/control index 0268fcb81..2fa3e46fd 100644 --- a/Tests/Laminar/Membrane/Spacers/Concave/control +++ b/Tests/Laminar/Membrane/Spacers/Concave/control @@ -11,37 +11,37 @@ #----------------- # Physical models #----------------- - MASS_DENSITY 1.0e+3 - DYNAMIC_VISCOSITY 1.0e-3 - THERMAL_CONDUCTIVITY 0.6 - HEAT_CAPACITY 1.0 + MASS_DENSITY 1.0e+3 + DYNAMIC_VISCOSITY 1.0e-3 + THERMAL_CONDUCTIVITY 0.6 + HEAT_CAPACITY 1.0 - TURBULENCE_MODEL none + TURBULENCE_MODEL none - POINT_FOR_MONITORING_PLANES 0.0125 0.0125 0.075 - PRESSURE_DROPS 30.0 30.0 0.0 - MASS_FLOW_RATES 0.025 0.025 0.0 + POINT_FOR_MONITORING_PLANES 0.0125 0.0125 0.075 + PRESSURE_DROPS 30.0 30.0 0.0 + MASS_FLOW_RATES 0.025 0.025 0.0 #------------------ # Numerical models #------------------ - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION bottom - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 10 - - BOUNDARY_CONDITION top - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 20 - - BOUNDARY_CONDITION spacer_walls - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0.0 + BOUNDARY_CONDITION bottom + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 10 + + BOUNDARY_CONDITION top + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 20 + + BOUNDARY_CONDITION spacer_walls + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0.0 diff --git a/Tests/Laminar/Membrane/Spacers/Parallelogram/control b/Tests/Laminar/Membrane/Spacers/Parallelogram/control index 9dc1e42ff..17e968255 100644 --- a/Tests/Laminar/Membrane/Spacers/Parallelogram/control +++ b/Tests/Laminar/Membrane/Spacers/Parallelogram/control @@ -11,37 +11,37 @@ #----------------- # Physical models #----------------- - MASS_DENSITY 1.0e+3 - DYNAMIC_VISCOSITY 1.0e-3 - THERMAL_CONDUCTIVITY 0.6 - HEAT_CAPACITY 1.0 + MASS_DENSITY 1.0e+3 + DYNAMIC_VISCOSITY 1.0e-3 + THERMAL_CONDUCTIVITY 0.6 + HEAT_CAPACITY 1.0 - TURBULENCE_MODEL none + TURBULENCE_MODEL none - POINT_FOR_MONITORING_PLANES 0.0125 0.0125 0.075 - PRESSURE_DROPS 30.0 30.0 0.0 - MASS_FLOW_RATES 0.025 0.025 0.0 + POINT_FOR_MONITORING_PLANES 0.0125 0.0125 0.075 + PRESSURE_DROPS 30.0 30.0 0.0 + MASS_FLOW_RATES 0.025 0.025 0.0 #------------------ # Numerical models #------------------ - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION bottom - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 10 - - BOUNDARY_CONDITION top - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 20 - - BOUNDARY_CONDITION spacer_walls - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0.0 + BOUNDARY_CONDITION bottom + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 10 + + BOUNDARY_CONDITION top + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 20 + + BOUNDARY_CONDITION spacer_walls + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0.0 diff --git a/Tests/Laminar/Membrane/Spacers/Teardrop/control b/Tests/Laminar/Membrane/Spacers/Teardrop/control index eae37317f..6594df558 100644 --- a/Tests/Laminar/Membrane/Spacers/Teardrop/control +++ b/Tests/Laminar/Membrane/Spacers/Teardrop/control @@ -13,38 +13,38 @@ #----------------- # Physical models #----------------- - MASS_DENSITY 1.0e+3 - DYNAMIC_VISCOSITY 1.0e-3 - THERMAL_CONDUCTIVITY 0.6 - HEAT_CAPACITY 1.0 + MASS_DENSITY 1.0e+3 + DYNAMIC_VISCOSITY 1.0e-3 + THERMAL_CONDUCTIVITY 0.6 + HEAT_CAPACITY 1.0 - TURBULENCE_MODEL none + TURBULENCE_MODEL none - POINT_FOR_MONITORING_PLANES 0.0125 0.0125 0.075 - PRESSURE_DROPS 30.0 30.0 0.0 - MASS_FLOW_RATES 0.025 0.025 0.0 + POINT_FOR_MONITORING_PLANES 0.0125 0.0125 0.075 + PRESSURE_DROPS 30.0 30.0 0.0 + MASS_FLOW_RATES 0.025 0.025 0.0 #------------------ # Numerical models #------------------ - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 - MAX_ITERATIONS_FOR_MOMENTUM_SOLVER 20 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + MAX_ITERATIONS_FOR_MOMENTUM_SOLVER 20 #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION bottom - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 10 - - BOUNDARY_CONDITION top - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 20 - - BOUNDARY_CONDITION spacer_walls - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0.0 + BOUNDARY_CONDITION bottom + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 10 + + BOUNDARY_CONDITION top + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 20 + + BOUNDARY_CONDITION spacer_walls + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0.0 diff --git a/Tests/Laminar/Membrane/Spiral/control.0 b/Tests/Laminar/Membrane/Spiral/control.0 index a0f300ae7..9be02fa19 100644 --- a/Tests/Laminar/Membrane/Spiral/control.0 +++ b/Tests/Laminar/Membrane/Spiral/control.0 @@ -1,13 +1,13 @@ - NUMBER_OF_DOMAINS 2 + NUMBER_OF_DOMAINS 2 - NUMBER_OF_TIME_STEPS 120 - RESULTS_SAVE_INTERVAL 12 - BACKUP_SAVE_INTERVAL 120 + NUMBER_OF_TIME_STEPS 120 + RESULTS_SAVE_INTERVAL 12 + BACKUP_SAVE_INTERVAL 120 - TIME_STEP 0.1 + TIME_STEP 0.1 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - INTERFACE_CONDITION spiral_cold spiral_hot - BOUNDARY_CONDITIONS membrane membrane + INTERFACE_CONDITION spiral_cold spiral_hot + BOUNDARY_CONDITIONS membrane membrane diff --git a/Tests/Laminar/Membrane/Spiral/control.1 b/Tests/Laminar/Membrane/Spiral/control.1 index 7b56e52ee..e7c71606f 100644 --- a/Tests/Laminar/Membrane/Spiral/control.1 +++ b/Tests/Laminar/Membrane/Spiral/control.1 @@ -1,55 +1,55 @@ #---------- # Prologue #---------- - PROBLEM_NAME spiral_cold - HEAT_TRANSFER yes + PROBLEM_NAME spiral_cold + HEAT_TRANSFER yes - NUMBER_OF_TIME_STEPS 7200 - RESULTS_SAVE_INTERVAL 240 - BACKUP_SAVE_INTERVAL 3600 + NUMBER_OF_TIME_STEPS 7200 + RESULTS_SAVE_INTERVAL 240 + BACKUP_SAVE_INTERVAL 3600 - TIME_STEP 0.1 + TIME_STEP 0.1 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.05 0.05 0.005 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.05 0.05 0.005 - POINT_FOR_MONITORING_PLANES 0.05 0.05 0.005 + POINT_FOR_MONITORING_PLANES 0.05 0.05 0.005 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 0.02 - DYNAMIC_VISCOSITY 0.01 - HEAT_CAPACITY 1.0 - SCALARS_DIFFUSIVITY 0.001 + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 0.02 + DYNAMIC_VISCOSITY 0.01 + HEAT_CAPACITY 1.0 + SCALARS_DIFFUSIVITY 0.001 - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 300 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 300 #-------------------- # Initial conditions diff --git a/Tests/Laminar/Membrane/Spiral/control.2 b/Tests/Laminar/Membrane/Spiral/control.2 index a94d2ce85..13d917531 100644 --- a/Tests/Laminar/Membrane/Spiral/control.2 +++ b/Tests/Laminar/Membrane/Spiral/control.2 @@ -1,55 +1,55 @@ #---------- # Prologue #---------- - PROBLEM_NAME spiral_hot - HEAT_TRANSFER yes + PROBLEM_NAME spiral_hot + HEAT_TRANSFER yes - NUMBER_OF_TIME_STEPS 7200 - RESULTS_SAVE_INTERVAL 240 - BACKUP_SAVE_INTERVAL 3600 + NUMBER_OF_TIME_STEPS 7200 + RESULTS_SAVE_INTERVAL 240 + BACKUP_SAVE_INTERVAL 3600 - TIME_STEP 0.1 + TIME_STEP 0.1 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.05 0.05 0.005 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.05 0.05 0.005 - POINT_FOR_MONITORING_PLANES 0.05 0.05 0.005 + POINT_FOR_MONITORING_PLANES 0.05 0.05 0.005 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 0.02 - DYNAMIC_VISCOSITY 0.01 - HEAT_CAPACITY 1.0 - SCALARS_DIFFUSIVITY 0.001 + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 0.02 + DYNAMIC_VISCOSITY 0.01 + HEAT_CAPACITY 1.0 + SCALARS_DIFFUSIVITY 0.001 - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 300 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 300 #-------------------- # Initial conditions @@ -58,7 +58,7 @@ VARIABLES u v w t VALUES 0.0 0.0 0.0 5.0 - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions diff --git a/Tests/Laminar/Membrane/Spiral_Poly/control.0 b/Tests/Laminar/Membrane/Spiral_Poly/control.0 index 8def3553a..be651f2ea 100644 --- a/Tests/Laminar/Membrane/Spiral_Poly/control.0 +++ b/Tests/Laminar/Membrane/Spiral_Poly/control.0 @@ -1,13 +1,13 @@ - NUMBER_OF_DOMAINS 2 + NUMBER_OF_DOMAINS 2 - NUMBER_OF_TIME_STEPS 2400 - RESULTS_SAVE_INTERVAL 24 - BACKUP_SAVE_INTERVAL 2400 + NUMBER_OF_TIME_STEPS 2400 + RESULTS_SAVE_INTERVAL 24 + BACKUP_SAVE_INTERVAL 2400 - TIME_STEP 0.1 + TIME_STEP 0.1 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - INTERFACE_CONDITION spiral_cold_dual spiral_hot_dual - BOUNDARY_CONDITIONS membrane membrane + INTERFACE_CONDITION spiral_cold_dual spiral_hot_dual + BOUNDARY_CONDITIONS membrane membrane diff --git a/Tests/Laminar/Membrane/Spiral_Poly/control.1 b/Tests/Laminar/Membrane/Spiral_Poly/control.1 index a714e6b22..b938dd42c 100644 --- a/Tests/Laminar/Membrane/Spiral_Poly/control.1 +++ b/Tests/Laminar/Membrane/Spiral_Poly/control.1 @@ -1,55 +1,55 @@ #---------- # Prologue #---------- - PROBLEM_NAME spiral_cold_dual - HEAT_TRANSFER yes + PROBLEM_NAME spiral_cold_dual + HEAT_TRANSFER yes - NUMBER_OF_TIME_STEPS 7200 - RESULTS_SAVE_INTERVAL 240 - BACKUP_SAVE_INTERVAL 3600 + NUMBER_OF_TIME_STEPS 7200 + RESULTS_SAVE_INTERVAL 240 + BACKUP_SAVE_INTERVAL 3600 - TIME_STEP 0.1 + TIME_STEP 0.1 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.0 0.0 0.005 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.0 0.0 0.005 - POINT_FOR_MONITORING_PLANES 0.0 0.0 0.005 + POINT_FOR_MONITORING_PLANES 0.0 0.0 0.005 #----------------- # Physical models #----------------- - MASS_DENSITY 100.0 - THERMAL_CONDUCTIVITY 0.002 - DYNAMIC_VISCOSITY 0.001 - HEAT_CAPACITY 420.0 - SCALARS_DIFFUSIVITY 0.001 + MASS_DENSITY 100.0 + THERMAL_CONDUCTIVITY 0.002 + DYNAMIC_VISCOSITY 0.001 + HEAT_CAPACITY 420.0 + SCALARS_DIFFUSIVITY 0.001 - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 300 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 300 #-------------------- # Initial conditions @@ -58,7 +58,7 @@ VARIABLES u v w t VALUES 0.0 0.0 0.0 5.0 - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions diff --git a/Tests/Laminar/Membrane/Spiral_Poly/control.2 b/Tests/Laminar/Membrane/Spiral_Poly/control.2 index 12656aa87..643cc16a8 100644 --- a/Tests/Laminar/Membrane/Spiral_Poly/control.2 +++ b/Tests/Laminar/Membrane/Spiral_Poly/control.2 @@ -1,55 +1,55 @@ #---------- # Prologue #---------- - PROBLEM_NAME spiral_hot_dual - HEAT_TRANSFER yes + PROBLEM_NAME spiral_hot_dual + HEAT_TRANSFER yes - NUMBER_OF_TIME_STEPS 7200 - RESULTS_SAVE_INTERVAL 240 - BACKUP_SAVE_INTERVAL 3600 + NUMBER_OF_TIME_STEPS 7200 + RESULTS_SAVE_INTERVAL 240 + BACKUP_SAVE_INTERVAL 3600 - TIME_STEP 0.1 + TIME_STEP 0.1 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.0 0.0 0.005 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.0 0.0 0.005 - POINT_FOR_MONITORING_PLANES 0.0 0.0 0.005 + POINT_FOR_MONITORING_PLANES 0.0 0.0 0.005 #----------------- # Physical models #----------------- - MASS_DENSITY 100.0 - THERMAL_CONDUCTIVITY 0.002 - DYNAMIC_VISCOSITY 0.001 - HEAT_CAPACITY 420.0 - SCALARS_DIFFUSIVITY 0.001 + MASS_DENSITY 100.0 + THERMAL_CONDUCTIVITY 0.002 + DYNAMIC_VISCOSITY 0.001 + HEAT_CAPACITY 420.0 + SCALARS_DIFFUSIVITY 0.001 - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 300 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 300 #-------------------- # Initial conditions @@ -58,7 +58,7 @@ VARIABLES u v w t VALUES 0.0 0.0 0.0 5.0 - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions diff --git a/Tests/Laminar/Module/control b/Tests/Laminar/Module/control index 975581e9c..4bd638cf2 100644 --- a/Tests/Laminar/Module/control +++ b/Tests/Laminar/Module/control @@ -1,54 +1,53 @@ #---------- # Prologue #--------- - PROBLEM_NAME module_dual - HEAT_TRANSFER yes + PROBLEM_NAME module_dual + HEAT_TRANSFER yes - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 600 - TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 600 + TIME_STEP 0.01 # LOAD_BACKUP_NAME backstep_orthogonal-ts000001.backup #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 0.2 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - DYNAMIC_VISCOSITY 1.0e-4 - THERMAL_CONDUCTIVITY 1.0e-4 - HEAT_CAPACITY 1.0 + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 1.0e-4 + THERMAL_CONDUCTIVITY 1.0e-4 + HEAT_CAPACITY 1.0 - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + TIME_INTEGRATION_SCHEME linear - TIME_INTEGRATION_SCHEME linear - - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 #-------------------- # Initial conditions diff --git a/Tests/Les/Barc/control b/Tests/Les/Barc/control index 9c70f0b06..8803bccee 100644 --- a/Tests/Les/Barc/control +++ b/Tests/Les/Barc/control @@ -1,89 +1,86 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME yvarc_15c + PROBLEM_NAME yvarc_15c - STARTING_TIME_STEP_FOR_TURB_STATISTICS 100000 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 100000 #--------------- # Time stepping #--------------- - TIME_STEP 0.002 - NUMBER_OF_TIME_STEPS 6000000 - RESULTS_SAVE_INTERVAL 100 - BACKUP_SAVE_INTERVAL 1000 - - WALL_TIME_MAX_HOURS 1000000 - - ###SAVE_INITIAL_CONDITION no + TIME_STEP 0.002 + NUMBER_OF_TIME_STEPS 6000000 + RESULTS_SAVE_INTERVAL 100 + BACKUP_SAVE_INTERVAL 1000 + + WALL_TIME_MAX_HOURS 1000000 #--------------------- # Physical properties #--------------------- - DYNAMIC_VISCOSITY 3.3333333e-4 - MASS_DENSITY 1 + DYNAMIC_VISCOSITY 3.3333333e-4 + MASS_DENSITY 1 - TURBULENCE_MODEL les_dynamic + TURBULENCE_MODEL les_dynamic - POINT_FOR_MONITORING_PLANES -5.0 -0.5 2.5 + POINT_FOR_MONITORING_PLANES -5.0 -0.5 2.5 #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING piso - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.95 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.0e-3 - MIN_SIMPLE_ITERATIONS 2 - MAX_SIMPLE_ITERATIONS 25 + PRESSURE_MOMENTUM_COUPLING piso + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.95 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.0e-3 + MIN_SIMPLE_ITERATIONS 2 + MAX_SIMPLE_ITERATIONS 25 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic -ADVECTION_SCHEME_FOR_MOMENTUM smart -### BLENDING_COEFFICIENT_FOR_MOMENTUM 0.8 + ADVECTION_SCHEME_FOR_MOMENTUM smart + # BLENDING_COEFFICIENT_FOR_MOMENTUM 0.8 #-------------------------- # Linear solver parameters #-------------------------- - TOLERANCE_FOR_POTENTIAL_SOLVER 1.0e-4 - TOLERANCE_FOR_WALL_DISTANCE_SOLVER 1.0e-4 + TOLERANCE_FOR_POTENTIAL_SOLVER 1.0e-4 + TOLERANCE_FOR_WALL_DISTANCE_SOLVER 1.0e-4 - TOLERANCE_FOR_PRESSURE_SOLVER 1.0e-6 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_MOMENTUM_SOLVER 25 + TOLERANCE_FOR_PRESSURE_SOLVER 1.0e-6 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_MOMENTUM_SOLVER 25 #------------------- # Initial conditions #------------------- - - INITIAL_CONDITION - VARIABLES u v w - VALUES 1.0 0.0 0.0 + INITIAL_CONDITION + VARIABLES u v w + VALUES 1.0 0.0 0.0 #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION IN - TYPE inflow - VARIABLES u v w - VALUES 1.0 0.0 0.0 - - BOUNDARY_CONDITION OUT - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 - - BOUNDARY_CONDITION WALL - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 - - BOUNDARY_CONDITION TOP - TYPE wall - VARIABLES u v w - VALUES 1.0 0.0 0.0 - - BOUNDARY_CONDITION BOTTOM - TYPE wall - VARIABLES u v w - VALUES 1.0 0.0 0.0 + BOUNDARY_CONDITION IN + TYPE inflow + VARIABLES u v w + VALUES 1.0 0.0 0.0 + + BOUNDARY_CONDITION OUT + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 + + BOUNDARY_CONDITION WALL + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 + + BOUNDARY_CONDITION TOP + TYPE wall + VARIABLES u v w + VALUES 1.0 0.0 0.0 + + BOUNDARY_CONDITION BOTTOM + TYPE wall + VARIABLES u v w + VALUES 1.0 0.0 0.0 diff --git a/Tests/Les/Channel_Re_Tau_180/Long_Domain/control b/Tests/Les/Channel_Re_Tau_180/Long_Domain/control index 7d35d8692..c54251003 100644 --- a/Tests/Les/Channel_Re_Tau_180/Long_Domain/control +++ b/Tests/Les/Channel_Re_Tau_180/Long_Domain/control @@ -1,58 +1,57 @@ -Prologue +#---------- +# Prologue +#---------- + PROBLEM_NAME chan - PROBLEM_NAME chan + HEAT_TRANSFER yes - HEAT_TRANSFER yes + TIME_STEP 0.02 + NUMBER_OF_TIME_STEPS 36000 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 24000 - TIME_STEP 0.02 - NUMBER_OF_TIME_STEPS 36000 - STARTING_TIME_STEP_FOR_TURB_STATISTICS 24000 - - RESULTS_SAVE_INTERVAL 60 - BACKUP_SAVE_INTERVAL 1800 - -# LOAD_BACKUP_NAME chan-ts012985.backup + RESULTS_SAVE_INTERVAL 60 + BACKUP_SAVE_INTERVAL 1800 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 1.0 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 1.0 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 4.70e-4 - DYNAMIC_VISCOSITY 3.33333e-4 - HEAT_CAPACITY 1.0 + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 4.70e-4 + DYNAMIC_VISCOSITY 3.33333e-4 + HEAT_CAPACITY 1.0 - TURBULENCE_MODEL les_dynamic + TURBULENCE_MODEL les_dynamic #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM central + ADVECTION_SCHEME_FOR_MOMENTUM central # BLENDING_COEFFICIENT_FOR_MOMENTUM 0.0 - ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_ENERGY smart - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-4 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-4 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 #-------------------- # Initial conditions diff --git a/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/control b/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/control index 8ac4be04b..306a97a2c 100644 --- a/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/control +++ b/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/control @@ -1,60 +1,58 @@ -Prologue +#---------- +# Prologue +#---------- + PROBLEM_NAME chan + HEAT_TRANSFER yes - PROBLEM_NAME chan + TIME_STEP 0.05 + NUMBER_OF_TIME_STEPS 18000 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 12000 - HEAT_TRANSFER yes - - TIME_STEP 0.05 - NUMBER_OF_TIME_STEPS 18000 - STARTING_TIME_STEP_FOR_TURB_STATISTICS 12000 - - RESULTS_SAVE_INTERVAL 1800 - BACKUP_SAVE_INTERVAL 1800 - -# LOAD_BACKUP_NAME chan-ts012985.backup + RESULTS_SAVE_INTERVAL 1800 + BACKUP_SAVE_INTERVAL 1800 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 1.0 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 1.0 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 4.70e-4 - DYNAMIC_VISCOSITY 3.33333e-4 - HEAT_CAPACITY 1.0 + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 4.70e-4 + DYNAMIC_VISCOSITY 3.33333e-4 + HEAT_CAPACITY 1.0 - TURBULENCE_MODEL les_dynamic + TURBULENCE_MODEL les_dynamic - PRESSURE_DROPS 0.0036 0.0 0.0 - MASS_FLOW_RATES 7.28 0.0 0.0 + PRESSURE_DROPS 0.0036 0.0 0.0 + MASS_FLOW_RATES 7.28 0.0 0.0 #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.8 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.8 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.8 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.8 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM central - ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_MOMENTUM central + ADVECTION_SCHEME_FOR_ENERGY smart - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-4 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-4 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 #-------------------- # Initial conditions diff --git a/Tests/Les/Forrest/control b/Tests/Les/Forrest/control index 7a24469e1..100902c0a 100644 --- a/Tests/Les/Forrest/control +++ b/Tests/Les/Forrest/control @@ -1,35 +1,33 @@ #---------- # Prologue #---------- - PROBLEM_NAME domain - HEAT_TRANSFER no + PROBLEM_NAME domain + HEAT_TRANSFER no - TIME_STEP 0.5 - NUMBER_OF_TIME_STEPS 14400 (this is two hours) - STARTING_TIME_STEP_FOR_TURB_STATISTICS 7200 (this is one hour) - RESULTS_SAVE_INTERVAL 600 (five minutes) - BACKUP_SAVE_INTERVAL 600 - -# LOAD_BACKUP_NAME domain-ts003600.backup + TIME_STEP 0.5 + NUMBER_OF_TIME_STEPS 14400 (this is two hours) + STARTING_TIME_STEP_FOR_TURB_STATISTICS 7200 (this is one hour) + RESULTS_SAVE_INTERVAL 600 (five minutes) + BACKUP_SAVE_INTERVAL 600 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 2 - MONITORING_POINT_001 10.5 10.5 11.0 - MONITORING_POINT_002 10.5 10.5 59.0 - POINT_FOR_MONITORING_PLANES 10.5 10.5 10.5 + NUMBER_OF_MONITORING_POINTS 2 + MONITORING_POINT_001 10.5 10.5 11.0 + MONITORING_POINT_002 10.5 10.5 59.0 + POINT_FOR_MONITORING_PLANES 10.5 10.5 10.5 #----------------- # Physical models #----------------- - MASS_DENSITY 1.2 - DYNAMIC_VISCOSITY 1.8e-5 - HEAT_CAPACITY 1006.0 + MASS_DENSITY 1.2 + DYNAMIC_VISCOSITY 1.8e-5 + HEAT_CAPACITY 1006.0 - TURBULENCE_MODEL les_dynamic + TURBULENCE_MODEL les_dynamic - MASS_FLOW_RATES 13824.0 0.0 0.0 + MASS_FLOW_RATES 13824.0 0.0 0.0 #---------------- # Porous regions @@ -41,22 +39,22 @@ #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING piso + PRESSURE_MOMENTUM_COUPLING piso - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.95 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.95 - MIN_SIMPLE_ITERATIONS 1 + MIN_SIMPLE_ITERATIONS 1 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM superbee + ADVECTION_SCHEME_FOR_MOMENTUM superbee - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 #-------------------- # Initial conditions diff --git a/Tests/Les/Matrix_Of_Cubes/control b/Tests/Les/Matrix_Of_Cubes/control index d8b2b0054..f659e3f03 100644 --- a/Tests/Les/Matrix_Of_Cubes/control +++ b/Tests/Les/Matrix_Of_Cubes/control @@ -57,46 +57,46 @@ #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING piso - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 - MIN_SIMPLE_ITERATIONS 2 + PRESSURE_MOMENTUM_COUPLING piso + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 + MIN_SIMPLE_ITERATIONS 2 - TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM central + TIME_INTEGRATION_SCHEME parabolic + ADVECTION_SCHEME_FOR_MOMENTUM central - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 3 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 3 #------------------------ # Linear solver settings #------------------------ - LINEAR_SOLVERS native - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 200 - MAX_ITERATIONS_FOR_WALL_DISTANCE_SOLVER 100 - - PETSC_OPTIONS_FOR_PRESSURE - SOLVER cg - PREC hypre # asm or hypre - PREC_OPTS - TOLERANCE 1.0e-3 - - PETSC_OPTIONS_FOR_WALL_DISTANCE - SOLVER cg - PREC hypre # asm or hypre - PREC_OPTS - TOLERANCE 1.0e-6 - - PETSC_OPTIONS_FOR_MOMENTUM - SOLVER bicg - PREC asm - PREC_OPTS - TOLERANCE 1.0e-7 + LINEAR_SOLVERS native + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 200 + MAX_ITERATIONS_FOR_WALL_DISTANCE_SOLVER 100 + + PETSC_OPTIONS_FOR_PRESSURE + SOLVER cg + PREC hypre # asm or hypre + PREC_OPTS + TOLERANCE 1.0e-3 + + PETSC_OPTIONS_FOR_WALL_DISTANCE + SOLVER cg + PREC hypre # asm or hypre + PREC_OPTS + TOLERANCE 1.0e-6 + + PETSC_OPTIONS_FOR_MOMENTUM + SOLVER bicg + PREC asm + PREC_OPTS + TOLERANCE 1.0e-7 #--------------------- # Boundary conditions diff --git a/Tests/Les/Pipe_Re_Tau_180/control b/Tests/Les/Pipe_Re_Tau_180/control index aaad0c1d4..67d474be4 100644 --- a/Tests/Les/Pipe_Re_Tau_180/control +++ b/Tests/Les/Pipe_Re_Tau_180/control @@ -1,61 +1,62 @@ #---------- # Prologue #---------- + PROBLEM_NAME pipe - PROBLEM_NAME pipe + HEAT_TRANSFER yes - HEAT_TRANSFER yes + TIME_STEP 0.02 + NUMBER_OF_TIME_STEPS 27000 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 9000 - TIME_STEP 0.02 - NUMBER_OF_TIME_STEPS 27000 - STARTING_TIME_STEP_FOR_TURB_STATISTICS 9000 + RESULTS_SAVE_INTERVAL 1200 + BACKUP_SAVE_INTERVAL 1200 - RESULTS_SAVE_INTERVAL 1200 - BACKUP_SAVE_INTERVAL 1200 -#LOAD_BACKUP_NAME pipe-ts000001.backup +# Keep the line below, it is needed by test_build.sh script for backup tests +# LOAD_BACKUP_NAME pipe-ts001200.backup #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 1.0 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 1.0 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 4.694e-4 - DYNAMIC_VISCOSITY 3.33333e-4 - HEAT_CAPACITY 1.0 + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 4.694e-4 + DYNAMIC_VISCOSITY 3.33333e-4 + HEAT_CAPACITY 1.0 - TURBULENCE_MODEL les_dynamic + TURBULENCE_MODEL les_dynamic - PRESSURE_DROPS 0.0 0.0 -0.0072 - MASS_FLOW_RATES 0.0 0.0 -2.8 + PRESSURE_DROPS 0.0 0.0 -0.0072 + MASS_FLOW_RATES 0.0 0.0 -2.8 #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.8 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.8 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.8 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.8 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM central - ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_MOMENTUM central + ADVECTION_SCHEME_FOR_ENERGY smart - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-4 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 #-------------------- # Initial conditions @@ -68,7 +69,6 @@ # Boundary conditions #--------------------- BOUNDARY_CONDITION cylinder - TYPE wall VARIABLES u v w q VALUES 0.0 0.0 0.0 0.1 diff --git a/Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/control b/Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/control index 8a53f1962..12243d15c 100644 --- a/Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/control +++ b/Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/control @@ -1,67 +1,65 @@ #----------- # Prologue #----------- + PROBLEM_NAME rb_conv - PROBLEM_NAME rb_conv + HEAT_TRANSFER yes - HEAT_TRANSFER yes + TIME_STEP 0.05 + NUMBER_OF_TIME_STEPS 4230 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 4222 - TIME_STEP 0.05 - NUMBER_OF_TIME_STEPS 4230 - STARTING_TIME_STEP_FOR_TURB_STATISTICS 4222 - -# LOAD_BACKUP_NAME rb_conv-ts004220.backup - RESULTS_SAVE_INTERVAL 1200 - BACKUP_SAVE_INTERVAL 1200 + RESULTS_SAVE_INTERVAL 1200 + BACKUP_SAVE_INTERVAL 1200 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 1.0 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 1.0 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models #----------------- - BUOYANCY thermal - GRAVITATIONAL_VECTOR 0.0, 0.0, -0.03215 - REFERENCE_TEMPERATURE 10.0 + BUOYANCY thermal + GRAVITATIONAL_VECTOR 0.0, 0.0, -0.03215 + REFERENCE_TEMPERATURE 10.0 - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 21.28e-6 - DYNAMIC_VISCOSITY 15.11e-6 - HEAT_CAPACITY 1.0 + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 21.28e-6 + DYNAMIC_VISCOSITY 15.11e-6 + HEAT_CAPACITY 1.0 - TURBULENCE_MODEL les_dynamic + TURBULENCE_MODEL les_dynamic #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.8 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.8 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.8 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.8 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM blended - BLENDING_COEFFICIENT_FOR_MOMENTUM 0.99 - ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_MOMENTUM blended + BLENDING_COEFFICIENT_FOR_MOMENTUM 0.99 + ADVECTION_SCHEME_FOR_ENERGY smart - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 5.e-4 - TOLERANCE_FOR_PRESSURE_SOLVER 5.e-4 - TOLERANCE_FOR_ENERGY_SOLVER 5.e-4 - TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 + TOLERANCE_FOR_MOMENTUM_SOLVER 5.e-4 + TOLERANCE_FOR_PRESSURE_SOLVER 5.e-4 + TOLERANCE_FOR_ENERGY_SOLVER 5.e-4 + TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 #-------------------- # Initial conditions #-------------------- INITIAL_CONDITION - VARIABLES u v w t + VARIABLES u v w t VALUES 0.0 0.0 0.0 10.0 #--------------------- diff --git a/Tests/Manual/Channel_Re_Tau_590/Stretched_Mesh/control b/Tests/Manual/Channel_Re_Tau_590/Stretched_Mesh/control index 59ae89563..b1133fe04 100644 --- a/Tests/Manual/Channel_Re_Tau_590/Stretched_Mesh/control +++ b/Tests/Manual/Channel_Re_Tau_590/Stretched_Mesh/control @@ -1,35 +1,35 @@ #-------------------- # Problem definition #-------------------- - PROBLEM_NAME chan + PROBLEM_NAME chan #--------------- # Time stepping #--------------- - TIME_STEP 1.0 - NUMBER_OF_TIME_STEPS 3000 - RESULTS_SAVE_INTERVAL 3000 - BACKUP_SAVE_INTERVAL 3000 + TIME_STEP 1.0 + NUMBER_OF_TIME_STEPS 3000 + RESULTS_SAVE_INTERVAL 3000 + BACKUP_SAVE_INTERVAL 3000 #-------------------------------------- # Monitoring plane and mass flow rates #-------------------------------------- - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 - MASS_FLOW_RATES 0.2 0.0 0.0 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + MASS_FLOW_RATES 0.2 0.0 0.0 #---------------------------------------- # Fluid properties # Dry air at 27oC in SI units #---------------------------------------- - MASS_DENSITY 1.177 - DYNAMIC_VISCOSITY 1.846e-5 - THERMAL_CONDUCTIVITY 2.6240e-2 - HEAT_CAPACITY 1000.0 + MASS_DENSITY 1.177 + DYNAMIC_VISCOSITY 1.846e-5 + THERMAL_CONDUCTIVITY 2.6240e-2 + HEAT_CAPACITY 1000.0 #---------------------------------------- # Physical models #---------------------------------------- - TURBULENCE_MODEL k_eps_zeta_f + TURBULENCE_MODEL k_eps_zeta_f #-------------------- # Initial conditions diff --git a/Tests/Manual/Conjugate/control b/Tests/Manual/Conjugate/control index 6a569a0c1..5a74c5b64 100644 --- a/Tests/Manual/Conjugate/control +++ b/Tests/Manual/Conjugate/control @@ -1,16 +1,16 @@ - NUMBER_OF_DOMAINS 3 + NUMBER_OF_DOMAINS 3 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 30 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 30 - TIME_STEP 0.1 + TIME_STEP 0.1 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - # Connection between hot solid and the fluid: - INTERFACE_CONDITION hot_solid fluid - BOUNDARY_CONDITIONS right_wall left_wall + # Connection between hot solid and the fluid: + INTERFACE_CONDITION hot_solid fluid + BOUNDARY_CONDITIONS right_wall left_wall - # Connection between fluid and the cold solid - INTERFACE_CONDITION fluid cold_solid - BOUNDARY_CONDITIONS right_wall left_wall + # Connection between fluid and the cold solid + INTERFACE_CONDITION fluid cold_solid + BOUNDARY_CONDITIONS right_wall left_wall diff --git a/Tests/Manual/Conjugate/control.1 b/Tests/Manual/Conjugate/control.1 index e06a4670f..e230d1a1f 100644 --- a/Tests/Manual/Conjugate/control.1 +++ b/Tests/Manual/Conjugate/control.1 @@ -1,87 +1,87 @@ #------- # Intro #------- - PROBLEM_NAME hot_solid + PROBLEM_NAME hot_solid - HEAT_TRANSFER yes - POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 + HEAT_TRANSFER yes + POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 - TIME_STEP 1.0e-2 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 999999 + TIME_STEP 1.0e-2 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 999999 #----------------------------------------------- # Physical models # (Properties are read from file for this case) #----------------------------------------------- - TURBULENCE_MODEL none - - # Properties based on Pr and Ra numbers: - # Pr = 0.7 - # Ra = 10e5 - # mu = sqrt(Pr / Ra) = 0.00264575131 - # lambda = 1.0 / sqrt(Pr * Ra) = 0.00377964473 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.00264575131 - THERMAL_CONDUCTIVITY 0.00377964473 + TURBULENCE_MODEL none + + # Properties based on Pr and Ra numbers: + # Pr = 0.7 + # Ra = 10e5 + # mu = sqrt(Pr / Ra) = 0.00264575131 + # lambda = 1.0 / sqrt(Pr * Ra) = 0.00377964473 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.00264575131 + THERMAL_CONDUCTIVITY 0.00377964473 #-------------------- # Initial conditions #-------------------- - INITIAL_CONDITION - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.25 + INITIAL_CONDITION + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.25 #---------------------- # Numerical parameters #---------------------- - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 - MIN_SIMPLE_ITERATIONS 3 + MIN_SIMPLE_ITERATIONS 3 #-------------------------- # Boundary conditions #-------------------------- -BOUNDARY_CONDITION top_wall - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION bottom_wall - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION side_walls - TYPE symmetry - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.25 - -BOUNDARY_CONDITION left_wall - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION right_wall - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 + BOUNDARY_CONDITION top_wall + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION bottom_wall + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION side_walls + TYPE symmetry + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.25 + + BOUNDARY_CONDITION left_wall + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION right_wall + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 diff --git a/Tests/Manual/Conjugate/control.2 b/Tests/Manual/Conjugate/control.2 index d68ea0061..f3f408439 100644 --- a/Tests/Manual/Conjugate/control.2 +++ b/Tests/Manual/Conjugate/control.2 @@ -1,95 +1,95 @@ #------- # Intro #------- - PROBLEM_NAME fluid + PROBLEM_NAME fluid - HEAT_TRANSFER yes - BUOYANCY thermal - REFERENCE_TEMPERATURE 0.5 + HEAT_TRANSFER yes + BUOYANCY thermal + REFERENCE_TEMPERATURE 0.5 - POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 + POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 - TIME_STEP 1.0e-2 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 999999 + TIME_STEP 1.0e-2 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 999999 #----------------------------------------------- # Physical models # (Properties are read from file for this case) #----------------------------------------------- - TURBULENCE_MODEL none + TURBULENCE_MODEL none - GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 + GRAVITATIONAL_VECTOR 0.0 0.0 -1.0 - # Properties based on Pr and Ra numbers: - # Pr = 0.7 - # Ra = 10e5 - # mu = sqrt(Pr / Ra) = 0.00264575131 - # lambda = 1.0 / sqrt(Pr * Ra) = 0.00377964473 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.00264575131 - THERMAL_CONDUCTIVITY 0.00377964473 + # Properties based on Pr and Ra numbers: + # Pr = 0.7 + # Ra = 10e5 + # mu = sqrt(Pr / Ra) = 0.00264575131 + # lambda = 1.0 / sqrt(Pr * Ra) = 0.00377964473 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.00264575131 + THERMAL_CONDUCTIVITY 0.00377964473 #-------------------- # Initial conditions #-------------------- - INITIAL_CONDITION - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 + INITIAL_CONDITION + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 #---------------------- # Numerical parameters #---------------------- - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 - ADVECTION_SCHEME_FOR_ENERGY superbee - ADVECTION_SCHEME_FOR_MOMENTUM superbee + ADVECTION_SCHEME_FOR_ENERGY superbee + ADVECTION_SCHEME_FOR_MOMENTUM superbee - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 - MIN_SIMPLE_ITERATIONS 3 + MIN_SIMPLE_ITERATIONS 3 #-------------------------- # Boundary conditions #-------------------------- -BOUNDARY_CONDITION top_wall - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION bottom_wall - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION side_walls - TYPE symmetry - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 - -BOUNDARY_CONDITION left_wall - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 - -BOUNDARY_CONDITION right_wall - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 + BOUNDARY_CONDITION top_wall + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION bottom_wall + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION side_walls + TYPE symmetry + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 + + BOUNDARY_CONDITION left_wall + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 + + BOUNDARY_CONDITION right_wall + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 diff --git a/Tests/Manual/Conjugate/control.3 b/Tests/Manual/Conjugate/control.3 index 6d72ec952..76b02fd13 100644 --- a/Tests/Manual/Conjugate/control.3 +++ b/Tests/Manual/Conjugate/control.3 @@ -1,31 +1,31 @@ #------- # Intro #------- - PROBLEM_NAME cold_solid + PROBLEM_NAME cold_solid - HEAT_TRANSFER yes - POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 + HEAT_TRANSFER yes + POINT_FOR_MONITORING_PLANES 0.5, 0.5, 0.05 - TIME_STEP 1.0e-2 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 999999 + TIME_STEP 1.0e-2 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 999999 #----------------------------------------------- # Physical models # (Properties are read from file for this case) #----------------------------------------------- - TURBULENCE_MODEL none - - # Properties based on Pr and Ra numbers: - # Pr = 0.7 - # Ra = 10e5 - # mu = sqrt(Pr / Ra) = 0.00264575131 - # lambda = 1.0 / sqrt(Pr * Ra) = 0.00377964473 - MASS_DENSITY 1.0 - HEAT_CAPACITY 1.0 - DYNAMIC_VISCOSITY 0.00264575131 - THERMAL_CONDUCTIVITY 0.00377964473 + TURBULENCE_MODEL none + + # Properties based on Pr and Ra numbers: + # Pr = 0.7 + # Ra = 10e5 + # mu = sqrt(Pr / Ra) = 0.00264575131 + # lambda = 1.0 / sqrt(Pr * Ra) = 0.00377964473 + MASS_DENSITY 1.0 + HEAT_CAPACITY 1.0 + DYNAMIC_VISCOSITY 0.00264575131 + THERMAL_CONDUCTIVITY 0.00377964473 #-------------------- # Initial conditions @@ -37,51 +37,51 @@ #---------------------- # Numerical parameters #---------------------- - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 - MIN_SIMPLE_ITERATIONS 3 + MIN_SIMPLE_ITERATIONS 3 #-------------------------- # Boundary conditions #-------------------------- -BOUNDARY_CONDITION top_wall - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION bottom_wall - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION side_walls - TYPE symmetry - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.75 - -BOUNDARY_CONDITION left_wall - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 0.5 - -BOUNDARY_CONDITION right_wall - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 1.0 + BOUNDARY_CONDITION top_wall + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION bottom_wall + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION side_walls + TYPE symmetry + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.75 + + BOUNDARY_CONDITION left_wall + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 0.5 + + BOUNDARY_CONDITION right_wall + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 1.0 diff --git a/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/control b/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/control index 2546f273d..1306ae653 100644 --- a/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/control +++ b/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/control @@ -1,65 +1,65 @@ #---------- # Prologue #---------- - PROBLEM_NAME jet - HEAT_TRANSFER yes + PROBLEM_NAME jet + HEAT_TRANSFER yes - TIME_STEP 0.05 - NUMBER_OF_TIME_STEPS 3600 - MIN_SIMPLE_ITERATIONS 3 - MAX_SIMPLE_ITERATIONS 6 + TIME_STEP 0.05 + NUMBER_OF_TIME_STEPS 3600 + MIN_SIMPLE_ITERATIONS 3 + MAX_SIMPLE_ITERATIONS 6 #------------------ # Saving intervals #------------------ - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 1200 + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 1200 #------------------- # Monitoring points #------------------- - POINT_FOR_MONITORING_PLANES 0.17 0.17 1.51 + POINT_FOR_MONITORING_PLANES 0.17 0.17 1.51 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 1.4e-4 - DYNAMIC_VISCOSITY 1.0e-4 - HEAT_CAPACITY 1.0 + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 1.4e-4 + DYNAMIC_VISCOSITY 1.0e-4 + HEAT_CAPACITY 1.0 - TURBULENCE_MODEL k_eps_zeta_f + TURBULENCE_MODEL k_eps_zeta_f #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.4 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.3 - SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.3 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.4 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.3 + SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.3 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM smart - ADVECTION_SCHEME_FOR_ENERGY smart - ADVECTION_SCHEME_FOR_TURBULENCE smart + ADVECTION_SCHEME_FOR_MOMENTUM smart + ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_TURBULENCE smart - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem #------------------------ # Linear solver settings #------------------------ - LINEAR_SOLVERS petsc - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-7 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 - TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-5 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-7 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + LINEAR_SOLVERS petsc + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-7 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 + TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-5 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-7 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 #-------------------- # Initial conditions diff --git a/Tests/Manual/Inflows/Option_1/control b/Tests/Manual/Inflows/Option_1/control index 6aca79739..0ac22d0d6 100644 --- a/Tests/Manual/Inflows/Option_1/control +++ b/Tests/Manual/Inflows/Option_1/control @@ -1,66 +1,66 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #--------------- # Time stepping #--------------- - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 6000 + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 6000 #--------------------- # Physical properties #--------------------- - DYNAMIC_VISCOSITY 2.000e-4 + DYNAMIC_VISCOSITY 2.000e-4 - TURBULENCE_MODEL les_smagorinsky + TURBULENCE_MODEL les_smagorinsky - POINT_FOR_MONITORING_PLANES 6.0 0.5 0.5 + POINT_FOR_MONITORING_PLANES 6.0 0.5 0.5 #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING piso - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.0e-3 - MIN_SIMPLE_ITERATIONS 2 + PRESSURE_MOMENTUM_COUPLING piso + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.0e-3 + MIN_SIMPLE_ITERATIONS 2 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem #-------------------------- # Linear solver parameters #-------------------------- - TOLERANCE_FOR_POTENTIAL_SOLVER 1.0e-4 - TOLERANCE_FOR_WALL_DISTANCE_SOLVER 1.0e-4 + TOLERANCE_FOR_POTENTIAL_SOLVER 1.0e-4 + TOLERANCE_FOR_WALL_DISTANCE_SOLVER 1.0e-4 #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES u v w - VALUES 1.0 0.0 0.0 + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES u v w + VALUES 1.0 0.0 0.0 - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Manual/Inflows/Option_2/control b/Tests/Manual/Inflows/Option_2/control index 47a27a2e2..58d132195 100644 --- a/Tests/Manual/Inflows/Option_2/control +++ b/Tests/Manual/Inflows/Option_2/control @@ -1,66 +1,66 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #--------------- # Time stepping #--------------- - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 6000 + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 6000 #--------------------- # Physical properties #--------------------- - DYNAMIC_VISCOSITY 2.000e-4 + DYNAMIC_VISCOSITY 2.000e-4 - TURBULENCE_MODEL les_smagorinsky + TURBULENCE_MODEL les_smagorinsky - POINT_FOR_MONITORING_PLANES 6.0 0.5 0.5 + POINT_FOR_MONITORING_PLANES 6.0 0.5 0.5 #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING piso - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.0e-3 - MIN_SIMPLE_ITERATIONS 2 + PRESSURE_MOMENTUM_COUPLING piso + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.0e-3 + MIN_SIMPLE_ITERATIONS 2 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem #-------------------------- # Linear solver parameters #-------------------------- - TOLERANCE_FOR_POTENTIAL_SOLVER 1.0e-4 - TOLERANCE_FOR_WALL_DISTANCE_SOLVER 1.0e-4 + TOLERANCE_FOR_POTENTIAL_SOLVER 1.0e-4 + TOLERANCE_FOR_WALL_DISTANCE_SOLVER 1.0e-4 #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES y u - FILE profile.dat + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES y u + FILE profile.dat - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Manual/Inflows/Option_3/control b/Tests/Manual/Inflows/Option_3/control index 255c3e9bc..9ca65716b 100644 --- a/Tests/Manual/Inflows/Option_3/control +++ b/Tests/Manual/Inflows/Option_3/control @@ -1,72 +1,72 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #--------------- # Time stepping #--------------- - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 6000 + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 6000 #--------------------- # Physical properties #--------------------- - DYNAMIC_VISCOSITY 2.000e-4 + DYNAMIC_VISCOSITY 2.000e-4 - TURBULENCE_MODEL les_smagorinsky + TURBULENCE_MODEL les_smagorinsky - POINT_FOR_MONITORING_PLANES 6.0 0.5 0.5 + POINT_FOR_MONITORING_PLANES 6.0 0.5 0.5 #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING piso - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.0e-3 - MIN_SIMPLE_ITERATIONS 2 + PRESSURE_MOMENTUM_COUPLING piso + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.0e-3 + MIN_SIMPLE_ITERATIONS 2 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem #-------------------------- # Linear solver parameters #-------------------------- - TOLERANCE_FOR_POTENTIAL_SOLVER 1.0e-4 - TOLERANCE_FOR_WALL_DISTANCE_SOLVER 1.0e-4 + TOLERANCE_FOR_POTENTIAL_SOLVER 1.0e-4 + TOLERANCE_FOR_WALL_DISTANCE_SOLVER 1.0e-4 #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES u v w - VALUES 1.0 0.0 0.0 + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES u v w + VALUES 1.0 0.0 0.0 - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - SYNTHETIC_EDDIES in - NUMBER_OF_EDDIES 40 - MAX_EDDY_RADIUS 0.5 - EDDY_INTENSITY 0.2 + SYNTHETIC_EDDIES in + NUMBER_OF_EDDIES 40 + MAX_EDDY_RADIUS 0.5 + EDDY_INTENSITY 0.2 diff --git a/Tests/Manual/Inflows/Option_4/control b/Tests/Manual/Inflows/Option_4/control index 8ea6486db..2c7c30aca 100644 --- a/Tests/Manual/Inflows/Option_4/control +++ b/Tests/Manual/Inflows/Option_4/control @@ -1,23 +1,23 @@ #---------------------------------------------------------- # Specify number of domains you are simultaneously solving #---------------------------------------------------------- - NUMBER_OF_DOMAINS 2 + NUMBER_OF_DOMAINS 2 #--------------- # Time stepping #--------------- - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 6000 + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 6000 #---------------------- # Numerical parameters #---------------------- - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MIN_SIMPLE_ITERATIONS 2 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + MIN_SIMPLE_ITERATIONS 2 #---------------------- # Interface conditions #---------------------- - INTERFACE_CONDITION precursor cylinder - BOUNDARY_CONDITIONS periodic_x in + INTERFACE_CONDITION precursor cylinder + BOUNDARY_CONDITIONS periodic_x in diff --git a/Tests/Manual/Inflows/Option_4/control.1 b/Tests/Manual/Inflows/Option_4/control.1 index c090580fc..051aaa93e 100644 --- a/Tests/Manual/Inflows/Option_4/control.1 +++ b/Tests/Manual/Inflows/Option_4/control.1 @@ -1,56 +1,56 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME precursor + PROBLEM_NAME precursor #--------------- # Time stepping #--------------- - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 6000 + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 6000 #--------------------- # Physical properties #--------------------- - DYNAMIC_VISCOSITY 2.000e-4 + DYNAMIC_VISCOSITY 2.000e-4 - TURBULENCE_MODEL les_smagorinsky + TURBULENCE_MODEL les_smagorinsky - MASS_FLOW_RATES 16.4 0.0 0.0 - POINT_FOR_MONITORING_PLANES -6.0 0.5 0.5 + MASS_FLOW_RATES 16.4 0.0 0.0 + POINT_FOR_MONITORING_PLANES -6.0 0.5 0.5 #---------------------- # Numerical parameters #---------------------- - ADVECTION_SCHEME_FOR_MOMENTUM central + ADVECTION_SCHEME_FOR_MOMENTUM central - PRESSURE_MOMENTUM_COUPLING piso - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.0e-3 - MIN_SIMPLE_ITERATIONS 2 + PRESSURE_MOMENTUM_COUPLING piso + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.0e-3 + MIN_SIMPLE_ITERATIONS 2 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem #-------------------------- # Linear solver parameters #-------------------------- - TOLERANCE_FOR_POTENTIAL_SOLVER 1.0e-4 - TOLERANCE_FOR_WALL_DISTANCE_SOLVER 1.0e-4 + TOLERANCE_FOR_POTENTIAL_SOLVER 1.0e-4 + TOLERANCE_FOR_WALL_DISTANCE_SOLVER 1.0e-4 #------------------- # Initial condition #------------------- - INITIAL_CONDITION - VARIABLES u v w - VALUES 1.0 0.0 0.0 + INITIAL_CONDITION + VARIABLES u v w + VALUES 1.0 0.0 0.0 #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Manual/Inflows/Option_4/control.2 b/Tests/Manual/Inflows/Option_4/control.2 index 6aca79739..0ac22d0d6 100644 --- a/Tests/Manual/Inflows/Option_4/control.2 +++ b/Tests/Manual/Inflows/Option_4/control.2 @@ -1,66 +1,66 @@ #-------------- # Problem name #-------------- - PROBLEM_NAME cylinder + PROBLEM_NAME cylinder #--------------- # Time stepping #--------------- - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 6000 + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 6000 #--------------------- # Physical properties #--------------------- - DYNAMIC_VISCOSITY 2.000e-4 + DYNAMIC_VISCOSITY 2.000e-4 - TURBULENCE_MODEL les_smagorinsky + TURBULENCE_MODEL les_smagorinsky - POINT_FOR_MONITORING_PLANES 6.0 0.5 0.5 + POINT_FOR_MONITORING_PLANES 6.0 0.5 0.5 #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING piso - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.0e-3 - MIN_SIMPLE_ITERATIONS 2 + PRESSURE_MOMENTUM_COUPLING piso + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.0e-3 + MIN_SIMPLE_ITERATIONS 2 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem #-------------------------- # Linear solver parameters #-------------------------- - TOLERANCE_FOR_POTENTIAL_SOLVER 1.0e-4 - TOLERANCE_FOR_WALL_DISTANCE_SOLVER 1.0e-4 + TOLERANCE_FOR_POTENTIAL_SOLVER 1.0e-4 + TOLERANCE_FOR_WALL_DISTANCE_SOLVER 1.0e-4 #------------------- # Initial condition #------------------- - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #--------------------- # Boundary conditions #--------------------- - BOUNDARY_CONDITION in - TYPE inflow - VARIABLES u v w - VALUES 1.0 0.0 0.0 + BOUNDARY_CONDITION in + TYPE inflow + VARIABLES u v w + VALUES 1.0 0.0 0.0 - BOUNDARY_CONDITION out - TYPE convective - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION out + TYPE convective + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION flat_walls - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION flat_walls + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 - BOUNDARY_CONDITION cylinder_wall - TYPE wall - VARIABLES u v w - VALUES 0.0 0.0 0.0 + BOUNDARY_CONDITION cylinder_wall + TYPE wall + VARIABLES u v w + VALUES 0.0 0.0 0.0 diff --git a/Tests/Manual/Matrix_Of_Cubes/control b/Tests/Manual/Matrix_Of_Cubes/control index 8a9fcbe6b..50bfa4d12 100644 --- a/Tests/Manual/Matrix_Of_Cubes/control +++ b/Tests/Manual/Matrix_Of_Cubes/control @@ -13,7 +13,7 @@ RESULTS_SAVE_INTERVAL 200 BACKUP_SAVE_INTERVAL 3000 - # LOAD_BACKUP_NAME matrix-ts060000.backup + # LOAD_BACKUP_NAME matrix-ts060000.backup #------------------- # Monitoring points @@ -56,46 +56,46 @@ #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING piso - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 - MIN_SIMPLE_ITERATIONS 2 + PRESSURE_MOMENTUM_COUPLING piso + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 + MIN_SIMPLE_ITERATIONS 2 - TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM central + TIME_INTEGRATION_SCHEME parabolic + ADVECTION_SCHEME_FOR_MOMENTUM central - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 3 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 3 #------------------------ # Linear solver settings #------------------------ - LINEAR_SOLVERS native - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 200 - MAX_ITERATIONS_FOR_WALL_DISTANCE_SOLVER 100 - - PETSC_OPTIONS_FOR_PRESSURE - SOLVER cg - PREC hypre # asm or hypre - PREC_OPTS - TOLERANCE 1.0e-3 - - PETSC_OPTIONS_FOR_WALL_DISTANCE - SOLVER cg - PREC hypre # asm or hypre - PREC_OPTS - TOLERANCE 1.0e-6 - - PETSC_OPTIONS_FOR_MOMENTUM - SOLVER bicg - PREC asm - PREC_OPTS - TOLERANCE 1.0e-7 + LINEAR_SOLVERS native + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 200 + MAX_ITERATIONS_FOR_WALL_DISTANCE_SOLVER 100 + + PETSC_OPTIONS_FOR_PRESSURE + SOLVER cg + PREC hypre # asm or hypre + PREC_OPTS + TOLERANCE 1.0e-3 + + PETSC_OPTIONS_FOR_WALL_DISTANCE + SOLVER cg + PREC hypre # asm or hypre + PREC_OPTS + TOLERANCE 1.0e-6 + + PETSC_OPTIONS_FOR_MOMENTUM + SOLVER bicg + PREC asm + PREC_OPTS + TOLERANCE 1.0e-7 #--------------------- # Boundary conditions diff --git a/Tests/Manual/Parallel/control b/Tests/Manual/Parallel/control index 1197c0aa3..948bbb9b1 100644 --- a/Tests/Manual/Parallel/control +++ b/Tests/Manual/Parallel/control @@ -1,56 +1,55 @@ #---------- # Prologue #--------- - PROBLEM_NAME rod_tet_dual - HEAT_TRANSFER no + PROBLEM_NAME rod_tet_dual + HEAT_TRANSFER no - NUMBER_OF_TIME_STEPS 6000 + NUMBER_OF_TIME_STEPS 6000 - RESULTS_SAVE_INTERVAL 1200 - BACKUP_SAVE_INTERVAL 3000 - TIME_STEP 0.005 + RESULTS_SAVE_INTERVAL 1200 + BACKUP_SAVE_INTERVAL 3000 + TIME_STEP 0.005 #------------------- -# Monitoring points +# Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.007 0.00 0.002 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.007 0.00 0.002 - POINT_FOR_MONITORING_PLANES 0.007 0.00 0.002 + POINT_FOR_MONITORING_PLANES 0.007 0.00 0.002 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - DYNAMIC_VISCOSITY 2.0e-5 - HEAT_CAPACITY 1.0 - GRAVITATIONAL_VECTOR 0.0 0.0 0.0 + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 2.0e-5 + HEAT_CAPACITY 1.0 + GRAVITATIONAL_VECTOR 0.0 0.0 0.0 - TURBULENCE_MODEL les_smagorinsky - PRESSURE_DROPS 3.6 0.0 0.0 - MASS_FLOW_RATES 0.5 0.0 0.0 + TURBULENCE_MODEL les_smagorinsky + PRESSURE_DROPS 3.6 0.0 0.0 + MASS_FLOW_RATES 0.5 0.0 0.0 #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 250 - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 250 + TIME_INTEGRATION_SCHEME linear - TIME_INTEGRATION_SCHEME linear - - ADVECTION_SCHEME_FOR_MOMENTUM superbee + ADVECTION_SCHEME_FOR_MOMENTUM superbee #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 #-------------------- # Initial conditions diff --git a/Tests/Manual/Rising_Bubble/control b/Tests/Manual/Rising_Bubble/control index 2bf14f679..834867082 100644 --- a/Tests/Manual/Rising_Bubble/control +++ b/Tests/Manual/Rising_Bubble/control @@ -1,71 +1,68 @@ #---------- # Prologue #---------- - PROBLEM_NAME bubble - INTERFACE_TRACKING yes + PROBLEM_NAME bubble + INTERFACE_TRACKING yes #-------------------------- # Time should be 3 seconds #-------------------------- - NUMBER_OF_TIME_STEPS 1200 - TIME_STEP 0.0025 + NUMBER_OF_TIME_STEPS 1200 + TIME_STEP 0.0025 - RESULTS_SAVE_INTERVAL 12 - BACKUP_SAVE_INTERVAL 999999 + RESULTS_SAVE_INTERVAL 12 + BACKUP_SAVE_INTERVAL 999999 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 0 - MONITORING_POINT_001 0.0 0.0 0.0 + NUMBER_OF_MONITORING_POINTS 0 + MONITORING_POINT_001 0.0 0.0 0.0 - POINT_FOR_MONITORING_PLANES 0.0 0.0 0.0 + POINT_FOR_MONITORING_PLANES 0.0 0.0 0.0 #----------------- # Physical models #----------------- - PHASE_DENSITIES 1.0e2 1.0e3 - PHASE_VISCOSITIES 1.0e0 1.0e1 - SURFACE_TENSION 24.5 - TURBULENCE_MODEL none - GRAVITATIONAL_VECTOR 0.0 0.0 -0.98 + PHASE_DENSITIES 1.0e2 1.0e3 + PHASE_VISCOSITIES 1.0e0 1.0e1 + SURFACE_TENSION 24.5 + TURBULENCE_MODEL none + GRAVITATIONAL_VECTOR 0.0 0.0 -0.98 #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING piso - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 + PRESSURE_MOMENTUM_COUPLING piso + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM quick - ADVECTION_SCHEME_FOR_VOF cicsam + ADVECTION_SCHEME_FOR_MOMENTUM quick + ADVECTION_SCHEME_FOR_VOF cicsam - GU_CORRECTION yes - CHOI_CORRECTION yes + GU_CORRECTION yes + CHOI_CORRECTION yes - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - GRADIENT_METHOD_FOR_VOF gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 200 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-4 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + GRADIENT_METHOD_FOR_VOF gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 200 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-4 #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-12 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-03 - TOLERANCE_FOR_VOF_SOLVER 1.e-12 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 100 - MAX_SIMPLE_ITERATIONS 20 - MAX_SMOOTHING_CYCLES_CURVATURE_VOF 12 - MAX_SMOOTHING_CYCLES_NORMAL_VOF 0 - COMPRESION_VOF no - COMPRESION_FACTOR_VOF 1.0 - MIN_SIMPLE_ITERATIONS 3 - + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-12 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-03 + TOLERANCE_FOR_VOF_SOLVER 1.e-12 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 100 + MAX_SIMPLE_ITERATIONS 20 + MAX_SMOOTHING_CYCLES_CURVATURE_VOF 12 + MAX_SMOOTHING_CYCLES_NORMAL_VOF 0 + MIN_SIMPLE_ITERATIONS 3 #--------------------- # Boundary conditions diff --git a/Tests/Manual/Thermally_Driven/Varible/control b/Tests/Manual/Thermally_Driven/Varible/control index 95e08255f..06f1fc00f 100644 --- a/Tests/Manual/Thermally_Driven/Varible/control +++ b/Tests/Manual/Thermally_Driven/Varible/control @@ -1,25 +1,25 @@ #------- # Intro #------- - PROBLEM_NAME air + PROBLEM_NAME air - HEAT_TRANSFER yes + HEAT_TRANSFER yes - POINT_FOR_MONITORING_PLANES 0.0, 0.0, 0.06 + POINT_FOR_MONITORING_PLANES 0.0, 0.0, 0.06 -#LOAD_BACKUP_NAME zyrconium-ts009600.backup +# LOAD_BACKUP_NAME zyrconium-ts009600.backup - TIME_STEP 1.0e-2 - NUMBER_OF_TIME_STEPS 6000 - RESULTS_SAVE_INTERVAL 120 + TIME_STEP 1.0e-2 + NUMBER_OF_TIME_STEPS 6000 + RESULTS_SAVE_INTERVAL 120 #----------------------------------------------- # Physical models # (Properties are read from file for this case) #----------------------------------------------- - GRAVITATIONAL_VECTOR 0.0, 0.0, -9.81 + GRAVITATIONAL_VECTOR 0.0, 0.0, -9.81 - TURBULENCE_MODEL none + TURBULENCE_MODEL none #-------------------- # Initial conditions @@ -31,51 +31,51 @@ #---------------------- # Numerical parameters #---------------------- - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.9 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 24 - MIN_SIMPLE_ITERATIONS 3 + MIN_SIMPLE_ITERATIONS 3 #-------------------------- # Boundary conditions #-------------------------- -BOUNDARY_CONDITION TOP - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION BOTTOM - TYPE wall - VARIABLES u v w q - VALUES 0.0 0.0 0.0 0 - -BOUNDARY_CONDITION SIDE - TYPE symmetry - VARIABLES u v w t - VALUES 0.0 0.0 0.0 10 - -BOUNDARY_CONDITION LEFT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 10 - -BOUNDARY_CONDITION RIGHT - TYPE wall - VARIABLES u v w t - VALUES 0.0 0.0 0.0 30 + BOUNDARY_CONDITION TOP + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION BOTTOM + TYPE wall + VARIABLES u v w q + VALUES 0.0 0.0 0.0 0 + + BOUNDARY_CONDITION SIDE + TYPE symmetry + VARIABLES u v w t + VALUES 0.0 0.0 0.0 10 + + BOUNDARY_CONDITION LEFT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 10 + + BOUNDARY_CONDITION RIGHT + TYPE wall + VARIABLES u v w t + VALUES 0.0 0.0 0.0 30 diff --git a/Tests/Rans/Backstep_Re_05100/control b/Tests/Rans/Backstep_Re_05100/control index ec777a76c..bc50a1758 100644 --- a/Tests/Rans/Backstep_Re_05100/control +++ b/Tests/Rans/Backstep_Re_05100/control @@ -1,11 +1,9 @@ Problem name (this line is a comment) - PROBLEM_NAME backstep + PROBLEM_NAME backstep - BACKUP_SAVE_INTERVAL 600 - RESULTS_SAVE_INTERVAL 600 - -# LOAD_BACKUP_NAME backstep-ts000001.backup + BACKUP_SAVE_INTERVAL 600 + RESULTS_SAVE_INTERVAL 600 This line is a comment too, just like any which doesn't start with a keyword. Keywords are written all in upper case and ARE case sensitive! @@ -14,42 +12,40 @@ Problem name (this line is a comment) Time resolution - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 1800 + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 1800 Monitoring - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.314 0.1 -0.038 - POINT_FOR_MONITORING_PLANES 0.1 0.1 0.1 - PRESSURE_DROPS 0.0 0.0 0.0 - MASS_FLOW_RATES 0.0 0.0 0.0 - + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.314 0.1 -0.038 + POINT_FOR_MONITORING_PLANES 0.1 0.1 0.1 + PRESSURE_DROPS 0.0 0.0 0.0 + MASS_FLOW_RATES 0.0 0.0 0.0 Physical part - MASS_DENSITY 1.0 - DYNAMIC_VISCOSITY 1.43e-5 - - TURBULENCE_MODEL rsm_manceau_hanjalic - TURBULENCE_MODEL_VARIANT stabilized + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 1.43e-5 + TURBULENCE_MODEL rsm_manceau_hanjalic + TURBULENCE_MODEL_VARIANT stabilized Numerical part - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.4 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.3 - TIME_INTEGRATION_SCHEME linear - - ADVECTION_SCHEME_FOR_MOMENTUM smart - ADVECTION_SCHEME_FOR_TURBULENCE smart - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-4 - TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.4 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.3 + TIME_INTEGRATION_SCHEME linear + + ADVECTION_SCHEME_FOR_MOMENTUM smart + ADVECTION_SCHEME_FOR_TURBULENCE smart + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-4 + TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 Initial values diff --git a/Tests/Rans/Backstep_Re_28000/control b/Tests/Rans/Backstep_Re_28000/control index f0435654a..e8c259edb 100644 --- a/Tests/Rans/Backstep_Re_28000/control +++ b/Tests/Rans/Backstep_Re_28000/control @@ -1,66 +1,64 @@ Problem - PROBLEM_NAME backstep + PROBLEM_NAME backstep Time integration - NUMBER_OF_TIME_STEPS 5000 - TIME_STEP 0.001 + NUMBER_OF_TIME_STEPS 5000 + TIME_STEP 0.001 Saving intervals - RESULTS_SAVE_INTERVAL 1000 - BACKUP_SAVE_INTERVAL 1000 -# LOAD_BACKUP_NAME backstep-ts000647.backup - + RESULTS_SAVE_INTERVAL 1000 + BACKUP_SAVE_INTERVAL 1000 Monitoring - NUMBER_OF_MONITORING_POINTS 9 - MONITORING_POINT_001 0.01 0.1 -0.028 - MONITORING_POINT_002 0.03 0.1 -0.028 - MONITORING_POINT_003 0.09 0.1 -0.028 - MONITORING_POINT_004 0.12 0.1 -0.028 - MONITORING_POINT_005 0.15 0.1 -0.028 - MONITORING_POINT_006 0.17 0.1 -0.028 - MONITORING_POINT_007 0.19 0.1 -0.028 - MONITORING_POINT_008 0.2 0.1 -0.028 - MONITORING_POINT_009 0.22 0.1 -0.028 - POINT_FOR_MONITORING_PLANES 0.1 0.01 0.05 + NUMBER_OF_MONITORING_POINTS 9 + MONITORING_POINT_001 0.01 0.1 -0.028 + MONITORING_POINT_002 0.03 0.1 -0.028 + MONITORING_POINT_003 0.09 0.1 -0.028 + MONITORING_POINT_004 0.12 0.1 -0.028 + MONITORING_POINT_005 0.15 0.1 -0.028 + MONITORING_POINT_006 0.17 0.1 -0.028 + MONITORING_POINT_007 0.19 0.1 -0.028 + MONITORING_POINT_008 0.2 0.1 -0.028 + MONITORING_POINT_009 0.22 0.1 -0.028 + POINT_FOR_MONITORING_PLANES 0.1 0.01 0.05 Physics - HEAT_TRANSFER yes - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 2.2e-5 - DYNAMIC_VISCOSITY 1.567e-5 - HEAT_CAPACITY 1.0 - TURBULENCE_MODEL k_eps_zeta_f + HEAT_TRANSFER yes + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 2.2e-5 + DYNAMIC_VISCOSITY 1.567e-5 + HEAT_CAPACITY 1.0 + TURBULENCE_MODEL k_eps_zeta_f Numerics - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.4 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.3 - SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.4 - MAX_SIMPLE_ITERATIONS 8 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.4 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.3 + SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.4 + MAX_SIMPLE_ITERATIONS 8 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM smart - ADVECTION_SCHEME_FOR_ENERGY smart - ADVECTION_SCHEME_FOR_TURBULENCE smart + ADVECTION_SCHEME_FOR_MOMENTUM smart + ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_TURBULENCE smart - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky Linear solvers - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-4 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-4 - TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 - - MAX_ITERATIONS_FOR_MOMENTUM_SOLVER 40 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 - MAX_ITERATIONS_FOR_TURBULENCE_SOLVER 40 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 40 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-4 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-4 + TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 + + MAX_ITERATIONS_FOR_MOMENTUM_SOLVER 40 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_TURBULENCE_SOLVER 40 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 40 Initial values INITIAL_CONDITION diff --git a/Tests/Rans/Channel_Re_Tau_590/Long_Domain/control b/Tests/Rans/Channel_Re_Tau_590/Long_Domain/control index 3c3f8a5e0..1396db842 100644 --- a/Tests/Rans/Channel_Re_Tau_590/Long_Domain/control +++ b/Tests/Rans/Channel_Re_Tau_590/Long_Domain/control @@ -1,73 +1,68 @@ #-------------------- # Problem definition #-------------------- - PROBLEM_NAME chan - HEAT_TRANSFER yes + PROBLEM_NAME chan + HEAT_TRANSFER yes #--------------- # Time stepping #--------------- - TIME_STEP 0.6 - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 600 - -# LOAD_BACKUP_NAME chan-ts000600.backup + TIME_STEP 0.6 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 600 #------------------- # Monitoring points #------------------- + NUMBER_OF_MONITORING_POINTS 5 + MONITORING_POINT_001 0.5 0.5 1.0 + MONITORING_POINT_002 0.5 0.5 0.001 + MONITORING_POINT_003 0.5 0.5 0.01 + MONITORING_POINT_004 0.5 0.5 0.1 + MONITORING_POINT_005 0.5 0.5 0.2 - NUMBER_OF_MONITORING_POINTS 5 - MONITORING_POINT_001 0.5 0.5 1.0 - MONITORING_POINT_002 0.5 0.5 0.001 - MONITORING_POINT_003 0.5 0.5 0.01 - MONITORING_POINT_004 0.5 0.5 0.1 - MONITORING_POINT_005 0.5 0.5 0.2 - - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.514 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.514 #----------------- # Physical models #----------------- + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 1.4080e-4 + DYNAMIC_VISCOSITY 1.0e-4 + HEAT_CAPACITY 1.0 - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 1.4080e-4 - DYNAMIC_VISCOSITY 1.0e-4 - HEAT_CAPACITY 1.0 - - TURBULENCE_MODEL k_eps_zeta_f + TURBULENCE_MODEL k_eps_zeta_f #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.4 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.4 + SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.4 - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.4 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.4 - SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.4 + TIME_INTEGRATION_SCHEME linear - TIME_INTEGRATION_SCHEME linear + ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_ENERGY superbee + ADVECTION_SCHEME_FOR_TURBULENCE smart - ADVECTION_SCHEME_FOR_MOMENTUM minmod - ADVECTION_SCHEME_FOR_ENERGY superbee - ADVECTION_SCHEME_FOR_TURBULENCE smart + MIN_SIMPLE_ITERATIONS 3 - MIN_SIMPLE_ITERATIONS 3 #------------------------ # Linear solver settings #------------------------ - - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-7 - TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-5 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-7 + TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-5 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 #-------------------- # Initial conditions diff --git a/Tests/Rans/Channel_Re_Tau_590/Rsm/control_air b/Tests/Rans/Channel_Re_Tau_590/Rsm/control_air index 24188202d..7baf937e1 100644 --- a/Tests/Rans/Channel_Re_Tau_590/Rsm/control_air +++ b/Tests/Rans/Channel_Re_Tau_590/Rsm/control_air @@ -1,94 +1,84 @@ #-------------------- # Problem definition #-------------------- - PROBLEM_NAME chan - HEAT_TRANSFER yes + PROBLEM_NAME chan + HEAT_TRANSFER yes - PRESSURE_DROPS 0.0036 0.0 0.0 - MASS_FLOW_RATES 2.32 0.0 0.0 + PRESSURE_DROPS 0.0036 0.0 0.0 + MASS_FLOW_RATES 2.32 0.0 0.0 #--------------- # Time stepping #--------------- - - TIME_STEP 0.5 - NUMBER_OF_TIME_STEPS 3000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 600 - -# LOAD_BACKUP_NAME chan-ts003000.backup + TIME_STEP 0.5 + NUMBER_OF_TIME_STEPS 3000 + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 600 #------------------- # Monitoring points #------------------- + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 0.0 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 0.0 - - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models #----------------- + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 1.4e-4 + DYNAMIC_VISCOSITY 1.0e-4 + HEAT_CAPACITY 1.0 - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 1.4e-4 - DYNAMIC_VISCOSITY 1.0e-4 - HEAT_CAPACITY 1.0 - - TURBULENCE_MODEL rsm_manceau_hanjalic + TURBULENCE_MODEL rsm_manceau_hanjalic # TURBULENCE_MODEL rsm_hanjalic_jakirlic - TURBULENCE_MODEL_VARIANT none + TURBULENCE_MODEL_VARIANT none # TURBULENCE_MODEL_VARIANT stabilized #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.4 - SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.4 + SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod - ADVECTION_SCHEME_FOR_ENERGY superbee - ADVECTION_SCHEME_FOR_TURBULENCE smart + ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_ENERGY superbee + ADVECTION_SCHEME_FOR_TURBULENCE smart #------------------------ # Linear solver settings #------------------------ - - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 - TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-5 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 + TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-5 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 #-------------------- # Initial conditions #-------------------- - - INITIAL_CONDITION - VARIABLES u v w t uu vv ww uv uw vw eps f22 - VALUES 0.001 0.0 0.0 20.0 0.0001 0.0001 0.0001 0.00 0.0001 0.0 0.0002 0.1 + INITIAL_CONDITION + VARIABLES u v w t uu vv ww uv uw vw eps f22 + VALUES 0.001 0.0 0.0 20.0 0.0001 0.0001 0.0001 0.00 0.0001 0.0 0.0002 0.1 #--------------------- # Boundary conditions #--------------------- - - BOUNDARY_CONDITION top_wall - TYPE wall - VARIABLES u v w t uu vv ww uv uw vw eps f22 - VALUES 0.0 0.0 0.0 22 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 - - BOUNDARY_CONDITION bottom_wall - TYPE wall - VARIABLES u v w t uu vv ww uv uw vw eps f22 - VALUES 0.0 0.0 0.0 22 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + BOUNDARY_CONDITION top_wall + TYPE wall + VARIABLES u v w t uu vv ww uv uw vw eps f22 + VALUES 0.0 0.0 0.0 22 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + + BOUNDARY_CONDITION bottom_wall + TYPE wall + VARIABLES u v w t uu vv ww uv uw vw eps f22 + VALUES 0.0 0.0 0.0 22 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 diff --git a/Tests/Rans/Channel_Re_Tau_590/Rsm/control_water b/Tests/Rans/Channel_Re_Tau_590/Rsm/control_water index ecc85fbcb..9ba28ee19 100644 --- a/Tests/Rans/Channel_Re_Tau_590/Rsm/control_water +++ b/Tests/Rans/Channel_Re_Tau_590/Rsm/control_water @@ -1,94 +1,87 @@ #-------------------- # Problem definition #-------------------- - PROBLEM_NAME chan - HEAT_TRANSFER yes + PROBLEM_NAME chan + HEAT_TRANSFER yes - PRESSURE_DROPS 0.0036 0.0 0.0 - MASS_FLOW_RATES 20.32 0.0 0.0 + PRESSURE_DROPS 0.0036 0.0 0.0 + MASS_FLOW_RATES 20.32 0.0 0.0 #--------------- # Time stepping #--------------- - - TIME_STEP 3.5 - NUMBER_OF_TIME_STEPS 3000 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 600 + TIME_STEP 3.5 + NUMBER_OF_TIME_STEPS 3000 + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 600 # LOAD_BACKUP_NAME chan-ts003000.backup #------------------- # Monitoring points #------------------- + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 0.0 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 0.0 - - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models #----------------- + MASS_DENSITY 998.0 + THERMAL_CONDUCTIVITY 0.587 + DYNAMIC_VISCOSITY 1.0e-3 + HEAT_CAPACITY 4187.0 - MASS_DENSITY 998.0 - THERMAL_CONDUCTIVITY 0.587 - DYNAMIC_VISCOSITY 1.0e-3 - HEAT_CAPACITY 4187.0 - - TURBULENCE_MODEL rsm_manceau_hanjalic + TURBULENCE_MODEL rsm_manceau_hanjalic # TURBULENCE_MODEL rsm_hanjalic_jakirlic - TURBULENCE_MODEL_VARIANT none + TURBULENCE_MODEL_VARIANT none # TURBULENCE_MODEL_VARIANT stabilized #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.4 - SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.4 + SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod - ADVECTION_SCHEME_FOR_ENERGY superbee - ADVECTION_SCHEME_FOR_TURBULENCE smart + ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_ENERGY superbee + ADVECTION_SCHEME_FOR_TURBULENCE smart #------------------------ # Linear solver settings #------------------------ - - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 - TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-5 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 + TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-5 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 #-------------------- # Initial conditions #-------------------- - - INITIAL_CONDITION - VARIABLES u v w t uu vv ww uv uw vw eps f22 - VALUES 0.001 0.0 0.0 20.0 0.0001 0.0001 0.0001 0.00 0.0001 0.0 0.0002 0.1 + INITIAL_CONDITION + VARIABLES u v w t uu vv ww uv uw vw eps f22 + VALUES 0.001 0.0 0.0 20.0 0.0001 0.0001 0.0001 0.00 0.0001 0.0 0.0002 0.1 #--------------------- # Boundary conditions #--------------------- - - BOUNDARY_CONDITION top_wall - TYPE wall - VARIABLES u v w t uu vv ww uv uw vw eps f22 - VALUES 0.0 0.0 0.0 22 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 - - BOUNDARY_CONDITION bottom_wall - TYPE wall - VARIABLES u v w t uu vv ww uv uw vw eps f22 - VALUES 0.0 0.0 0.0 22 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + BOUNDARY_CONDITION top_wall + TYPE wall + VARIABLES u v w t uu vv ww uv uw vw eps f22 + VALUES 0.0 0.0 0.0 22 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + + BOUNDARY_CONDITION bottom_wall + TYPE wall + VARIABLES u v w t uu vv ww uv uw vw eps f22 + VALUES 0.0 0.0 0.0 22 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 diff --git a/Tests/Rans/Channel_Re_Tau_590/Stretched_Mesh/control b/Tests/Rans/Channel_Re_Tau_590/Stretched_Mesh/control index d4a6480b1..a7d43a0a6 100644 --- a/Tests/Rans/Channel_Re_Tau_590/Stretched_Mesh/control +++ b/Tests/Rans/Channel_Re_Tau_590/Stretched_Mesh/control @@ -1,78 +1,71 @@ #-------------------- # Problem definition #-------------------- + PROBLEM_NAME chan + HEAT_TRANSFER yes - PROBLEM_NAME chan - - HEAT_TRANSFER yes - - PRESSURE_DROPS 0.0036 0.0 0.0 - MASS_FLOW_RATES 0.2 0.0 0.0 + PRESSURE_DROPS 0.0036 0.0 0.0 + MASS_FLOW_RATES 0.2 0.0 0.0 #--------------- # Time stepping #--------------- - - TIME_STEP 1.0 - NUMBER_OF_TIME_STEPS 7200 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 600 - -# LOAD_BACKUP_NAME chan-ts001800.backup + TIME_STEP 1.0 + NUMBER_OF_TIME_STEPS 7200 + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 600 #------------------- # Monitoring points #------------------- + NUMBER_OF_MONITORING_POINTS 5 + MONITORING_POINT_001 0.5 0.5 1.0 + MONITORING_POINT_002 0.5 0.5 0.001 + MONITORING_POINT_003 0.5 0.5 0.01 + MONITORING_POINT_004 0.5 0.5 0.1 + MONITORING_POINT_005 0.5 0.5 0.2 - NUMBER_OF_MONITORING_POINTS 5 - MONITORING_POINT_001 0.5 0.5 1.0 - MONITORING_POINT_002 0.5 0.5 0.001 - MONITORING_POINT_003 0.5 0.5 0.01 - MONITORING_POINT_004 0.5 0.5 0.1 - MONITORING_POINT_005 0.5 0.5 0.2 - - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.514 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.514 #---------------------------------------- # Fluid properties # Dry air at 27oC in SI units #---------------------------------------- - MASS_DENSITY 1.177 - DYNAMIC_VISCOSITY 1.846e-5 - - THERMAL_CONDUCTIVITY 2.6240e-2 - HEAT_CAPACITY 1000.0 + MASS_DENSITY 1.177 + DYNAMIC_VISCOSITY 1.846e-5 + THERMAL_CONDUCTIVITY 2.6240e-2 + HEAT_CAPACITY 1000.0 #---------------------------------------- # Physical models #---------------------------------------- - TURBULENCE_MODEL k_eps_zeta_f + TURBULENCE_MODEL k_eps_zeta_f #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.4 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.4 - SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.4 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.4 + SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM smart - ADVECTION_SCHEME_FOR_ENERGY smart - ADVECTION_SCHEME_FOR_TURBULENCE smart + ADVECTION_SCHEME_FOR_MOMENTUM smart + ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_TURBULENCE smart #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-6 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-6 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-6 #-------------------- # Initial conditions diff --git a/Tests/Rans/Fuel_Bundle/control b/Tests/Rans/Fuel_Bundle/control index 026847ab5..7d67b1a96 100644 --- a/Tests/Rans/Fuel_Bundle/control +++ b/Tests/Rans/Fuel_Bundle/control @@ -1,41 +1,35 @@ Prologue - PROBLEM_NAME subflow -#LOAD_RESTART_NAME subflow-ts000001 + PROBLEM_NAME subflow Time stepping - NUMBER_OF_TIME_STEPS 1000 - TIME_STEP 1.e-1 - - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 600 - + NUMBER_OF_TIME_STEPS 1000 + TIME_STEP 1.e-1 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 600 Monitoring points and plane - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.034 0.034 0.05 - POINT_FOR_MONITORING_PLANES 0.015 0.051 0.05 - + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.034 0.034 0.05 + POINT_FOR_MONITORING_PLANES 0.015 0.051 0.05 Physical models - assuming T = 26 C - - units: [kg/m^3] - MASS_DENSITY 1.0 - - units: [m^2/s] - DYNAMIC_VISCOSITY 9e-8 + assuming T = 26 C + units: [kg/m^3] + MASS_DENSITY 1.0 - TURBULENCE_MODEL rsm_hanjalic_jakirlic - TURBULENCE_MODEL_VARIANT stabilized + units: [m^2/s] + DYNAMIC_VISCOSITY 9e-8 -units: [kg/s] - MASS_FLOW_RATES 0.0 0.0 0.0020975 + TURBULENCE_MODEL rsm_hanjalic_jakirlic + TURBULENCE_MODEL_VARIANT stabilized + units: [kg/s] + MASS_FLOW_RATES 0.0 0.0 0.0020975 Initial and boundary conditions @@ -55,32 +49,32 @@ Initial and boundary conditions Linear solver settings - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - PRESSURE_MOMENTUM_COUPLING simple - MAX_SIMPLE_ITERATIONS 12 - MIN_SIMPLE_ITERATIONS 5 - MAX_ITERATIONS_FOR_MOMENTUM_SOLVER 20 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 250 - MAX_ITERATIONS_FOR_TURBULENCE_SOLVER 10 + PRESSURE_MOMENTUM_COUPLING simple + MAX_SIMPLE_ITERATIONS 12 + MIN_SIMPLE_ITERATIONS 5 + MAX_ITERATIONS_FOR_MOMENTUM_SOLVER 20 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 250 + MAX_ITERATIONS_FOR_TURBULENCE_SOLVER 10 - TOLERANCE_FOR_MOMENTUM_SOLVER 1.0e-6 - TOLERANCE_FOR_TURBULENCE_SOLVER 1.0e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.0e-6 - TOLERANCE_FOR_PRESSURE_SOLVER 1.0e-8 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.0e-8 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.0e-6 + TOLERANCE_FOR_TURBULENCE_SOLVER 1.0e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.0e-6 + TOLERANCE_FOR_PRESSURE_SOLVER 1.0e-8 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.0e-8 - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.2 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.6 - SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.2 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.6 + SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - # after initialization from file you can use these schemes - #ADVECTION_SCHEME_FOR_MOMENTUM minmod - #ADVECTION_SCHEME_FOR_ENERGY smart - #ADVECTION_SCHEME_FOR_TURBULENCE smart + ADVECTION_SCHEME_FOR_MOMENTUM upwind + ADVECTION_SCHEME_FOR_ENERGY upwind + ADVECTION_SCHEME_FOR_TURBULENCE upwind - ADVECTION_SCHEME_FOR_MOMENTUM upwind - ADVECTION_SCHEME_FOR_ENERGY upwind - ADVECTION_SCHEME_FOR_TURBULENCE upwind + # after initialization from file you can use these schemes + #ADVECTION_SCHEME_FOR_MOMENTUM minmod + #ADVECTION_SCHEME_FOR_ENERGY smart + #ADVECTION_SCHEME_FOR_TURBULENCE smart diff --git a/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/control b/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/control index d1a578639..e132a4c37 100644 --- a/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/control +++ b/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/control @@ -1,82 +1,81 @@ #---------- # Prologue #---------- - PROBLEM_NAME jet - HEAT_TRANSFER yes + PROBLEM_NAME jet + HEAT_TRANSFER yes - TIME_STEP 0.05 - NUMBER_OF_TIME_STEPS 3600 - MIN_SIMPLE_ITERATIONS 3 - MAX_SIMPLE_ITERATIONS 6 + TIME_STEP 0.05 + NUMBER_OF_TIME_STEPS 3600 + MIN_SIMPLE_ITERATIONS 3 + MAX_SIMPLE_ITERATIONS 6 #------------------ # Saving intervals #------------------ - RESULTS_SAVE_INTERVAL 60 - BACKUP_SAVE_INTERVAL 120 + RESULTS_SAVE_INTERVAL 60 + BACKUP_SAVE_INTERVAL 120 - # LOAD_BACKUP_NAME jet-ts000120.backup +# LOAD_BACKUP_NAME jet-ts000120.backup #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 10 - MONITORING_POINT_001 0.0 0.0 0.001 - MONITORING_POINT_002 0.2 0.2 0.001 - MONITORING_POINT_003 0.4 0.4 0.05 - MONITORING_POINT_004 0.0 0.0 2.0 - MONITORING_POINT_005 0.0 0.0 2.5 - MONITORING_POINT_006 0.0 0.0 3.0 - MONITORING_POINT_007 0.0 0.0 3.5 - MONITORING_POINT_008 0.0 0.0 4.0 - MONITORING_POINT_009 0.0 0.0 4.5 - MONITORING_POINT_010 0.0 0.0 5.0 - - POINT_FOR_MONITORING_PLANES 0.17 0.17 1.51 + NUMBER_OF_MONITORING_POINTS 10 + MONITORING_POINT_001 0.0 0.0 0.001 + MONITORING_POINT_002 0.2 0.2 0.001 + MONITORING_POINT_003 0.4 0.4 0.05 + MONITORING_POINT_004 0.0 0.0 2.0 + MONITORING_POINT_005 0.0 0.0 2.5 + MONITORING_POINT_006 0.0 0.0 3.0 + MONITORING_POINT_007 0.0 0.0 3.5 + MONITORING_POINT_008 0.0 0.0 4.0 + MONITORING_POINT_009 0.0 0.0 4.5 + MONITORING_POINT_010 0.0 0.0 5.0 + + POINT_FOR_MONITORING_PLANES 0.17 0.17 1.51 #----------------- # Physical models #----------------- + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 1.4e-4 + DYNAMIC_VISCOSITY 1.0e-4 + HEAT_CAPACITY 1.0 - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 1.4e-4 - DYNAMIC_VISCOSITY 1.0e-4 - HEAT_CAPACITY 1.0 - - TURBULENCE_MODEL k_eps_zeta_f -#TURBULENCE_MODEL k_eps + TURBULENCE_MODEL k_eps_zeta_f +# TURBULENCE_MODEL k_eps #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.4 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.3 - SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.3 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.4 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.3 + SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.3 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM smart - ADVECTION_SCHEME_FOR_ENERGY smart - ADVECTION_SCHEME_FOR_TURBULENCE smart + ADVECTION_SCHEME_FOR_MOMENTUM smart + ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_TURBULENCE smart - POTENTIAL_INITIALIZATION yes + POTENTIAL_INITIALIZATION yes #------------------------ # Linear solver settings #------------------------ - LINEAR_SOLVERS petsc - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 - TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-5 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-7 + LINEAR_SOLVERS petsc + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 + TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-5 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-7 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 #-------------------- # Initial conditions @@ -89,37 +88,31 @@ # Boundary conditions #--------------------- BOUNDARY_CONDITION pipe_wall - TYPE wall VARIABLES u v w q kin eps zeta f22 VALUES 0.0 0.0 0.0 0.0 0.0 1.0e-3 0.0 0.0 BOUNDARY_CONDITION symmetry_plane - TYPE symmetry VARIABLES u v w t kin eps zeta f22 VALUES 0.0 0.0 0.0 20.0 1.0E-2 1.0E-3 6.6E-2 1.0e-3 BOUNDARY_CONDITION top_plane - TYPE pressure VARIABLES u v w t kin eps zeta f22 VALUES 0.0 0.0 -0.01 20.0 1.0E-4 1.0E-5 6.6E-4 1.0e-4 BOUNDARY_CONDITION lower_wall - TYPE wall VARIABLES u v w q kin eps zeta f22 VALUES 0.0 0.0 0.0 0.1 0.0 1.0e-3 0.0 0.0 BOUNDARY_CONDITION pipe_inlet - TYPE inflow VARIABLES rz u v w t kin eps zeta f22 FILE inlet_profile_zeta_re_23000.dat BOUNDARY_CONDITION cyl_outlet - TYPE pressure VARIABLES u v w t kin eps zeta f22 VALUES 0.0 0.0 0.0 20.0 1.0E-2 1.0E-3 6.6E-2 1.0e-3 diff --git a/Tests/Rans/Membrane/control.0 b/Tests/Rans/Membrane/control.0 index 1ed49869d..ad449f774 100644 --- a/Tests/Rans/Membrane/control.0 +++ b/Tests/Rans/Membrane/control.0 @@ -1,15 +1,15 @@ - NUMBER_OF_DOMAINS 3 + NUMBER_OF_DOMAINS 3 - NUMBER_OF_TIME_STEPS 600 - RESULTS_SAVE_INTERVAL 60 - BACKUP_SAVE_INTERVAL 120 + NUMBER_OF_TIME_STEPS 600 + RESULTS_SAVE_INTERVAL 60 + BACKUP_SAVE_INTERVAL 120 - TIME_STEP 0.01 + TIME_STEP 0.01 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - INTERFACE_CONDITION upper membrane - BOUNDARY_CONDITIONS bottom top + INTERFACE_CONDITION upper membrane + BOUNDARY_CONDITIONS bottom top - INTERFACE_CONDITION membrane lower - BOUNDARY_CONDITIONS bottom top + INTERFACE_CONDITION membrane lower + BOUNDARY_CONDITIONS bottom top diff --git a/Tests/Rans/Membrane/control.1 b/Tests/Rans/Membrane/control.1 index b8e7bc5d8..9318c134d 100644 --- a/Tests/Rans/Membrane/control.1 +++ b/Tests/Rans/Membrane/control.1 @@ -1,53 +1,53 @@ #---------- # Prologue #---------- - PROBLEM_NAME upper - HEAT_TRANSFER yes - - #LOAD_BACKUP_NAME upper-ts000120.backup + PROBLEM_NAME upper + HEAT_TRANSFER yes #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.0 0.0 0.0125 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.0 0.0 0.0125 + + POINT_FOR_MONITORING_PLANES 0.0 0.0 0.0125 - POINT_FOR_MONITORING_PLANES 0.0 0.0 0.0125 +# Keep the line below, it is needed by test_build.sh script for backup tests +# LOAD_BACKUP_NAME upper-ts000120.backup #----------------- # Physical models #----------------- + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 0.025 + DYNAMIC_VISCOSITY 0.001 + HEAT_CAPACITY 1.0 - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 0.025 - DYNAMIC_VISCOSITY 0.001 - HEAT_CAPACITY 1.0 - - TURBULENCE_MODEL k_eps_zeta_f + TURBULENCE_MODEL k_eps_zeta_f #---------------------- # Numerical parameters #---------------------- - TIME_STEP 0.01 + TIME_STEP 0.01 - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 #-------------------- # Initial conditions diff --git a/Tests/Rans/Membrane/control.2 b/Tests/Rans/Membrane/control.2 index 9ae4f802a..c30c78443 100644 --- a/Tests/Rans/Membrane/control.2 +++ b/Tests/Rans/Membrane/control.2 @@ -1,53 +1,53 @@ #---------- # Prologue #---------- - PROBLEM_NAME lower - HEAT_TRANSFER yes - - #LOAD_BACKUP_NAME lower-ts000120.backup + PROBLEM_NAME lower + HEAT_TRANSFER yes #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.0 0.0 -0.2 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.0 0.0 -0.2 + + POINT_FOR_MONITORING_PLANES 0.0 0.0 -0.2 - POINT_FOR_MONITORING_PLANES 0.0 0.0 -0.2 +# Keep the line below, it is needed by test_build.sh script for backup tests +# LOAD_BACKUP_NAME lower-ts000120.backup #----------------- # Physical models #----------------- + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 0.025 + DYNAMIC_VISCOSITY 0.001 + HEAT_CAPACITY 1.0 - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 0.025 - DYNAMIC_VISCOSITY 0.001 - HEAT_CAPACITY 1.0 - - TURBULENCE_MODEL k_eps_zeta_f + TURBULENCE_MODEL k_eps_zeta_f #---------------------- # Numerical parameters #---------------------- - TIME_STEP 0.01 + TIME_STEP 0.01 - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 #-------------------- # Initial conditions diff --git a/Tests/Rans/Membrane/control.3 b/Tests/Rans/Membrane/control.3 index 884983650..536b1e947 100644 --- a/Tests/Rans/Membrane/control.3 +++ b/Tests/Rans/Membrane/control.3 @@ -1,53 +1,50 @@ #---------- # Prologue #---------- - PROBLEM_NAME membrane - HEAT_TRANSFER yes - - #LOAD_BACKUP_NAME membrane-ts000120.backup + PROBLEM_NAME membrane + HEAT_TRANSFER yes #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.0 0.0 0.0 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.0 0.0 0.0 - POINT_FOR_MONITORING_PLANES 0.0 0.0 0.0 + POINT_FOR_MONITORING_PLANES 0.0 0.0 0.0 #----------------- # Physical models #----------------- + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 0.025 + DYNAMIC_VISCOSITY 0.001 + HEAT_CAPACITY 1.0e-3 - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 0.025 - DYNAMIC_VISCOSITY 0.001 - HEAT_CAPACITY 1.0e-3 - - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- - TIME_STEP 0.01 + TIME_STEP 0.01 - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 12 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 12 #-------------------- # Initial conditions diff --git a/Tests/Rans/Negative_Buoyant_Fountain/control-1 b/Tests/Rans/Negative_Buoyant_Fountain/control-1 index d66ff12e2..88504b40a 100644 --- a/Tests/Rans/Negative_Buoyant_Fountain/control-1 +++ b/Tests/Rans/Negative_Buoyant_Fountain/control-1 @@ -1,84 +1,83 @@ #---------- # Prologue #---------- - PROBLEM_NAME nbf - HEAT_TRANSFER yes + PROBLEM_NAME nbf + HEAT_TRANSFER yes - TIME_STEP 0.02 - NUMBER_OF_TIME_STEPS 36000 + TIME_STEP 0.02 + NUMBER_OF_TIME_STEPS 36000 #------------------ # Saving intervals #------------------ - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 2000 + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 2000 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 12 - MONITORING_POINT_001 0.02 0.1 0.5 - MONITORING_POINT_002 0.02 0.3 0.5 - MONITORING_POINT_003 0.02 0.5 0.5 - MONITORING_POINT_004 0.24 0.1 0.5 - MONITORING_POINT_005 0.24 0.3 0.5 - MONITORING_POINT_006 0.24 0.5 0.5 - MONITORING_POINT_007 0.02 0.1 1.5 - MONITORING_POINT_008 0.02 0.3 1.5 - MONITORING_POINT_009 0.02 0.5 1.5 - MONITORING_POINT_010 0.24 0.1 1.5 - MONITORING_POINT_011 0.24 0.3 1.5 - MONITORING_POINT_012 0.24 0.5 1.5 - - POINT_FOR_MONITORING_PLANES 0.1 0.1 0.1 + NUMBER_OF_MONITORING_POINTS 12 + MONITORING_POINT_001 0.02 0.1 0.5 + MONITORING_POINT_002 0.02 0.3 0.5 + MONITORING_POINT_003 0.02 0.5 0.5 + MONITORING_POINT_004 0.24 0.1 0.5 + MONITORING_POINT_005 0.24 0.3 0.5 + MONITORING_POINT_006 0.24 0.5 0.5 + MONITORING_POINT_007 0.02 0.1 1.5 + MONITORING_POINT_008 0.02 0.3 1.5 + MONITORING_POINT_009 0.02 0.5 1.5 + MONITORING_POINT_010 0.24 0.1 1.5 + MONITORING_POINT_011 0.24 0.3 1.5 + MONITORING_POINT_012 0.24 0.5 1.5 + + POINT_FOR_MONITORING_PLANES 0.1 0.1 0.1 #----------------- # Physical models #----------------- + MASS_DENSITY 1000.0 + HEAT_CAPACITY 4184.0 + DYNAMIC_VISCOSITY 0.0010005 + THERMAL_CONDUCTIVITY 0.59803 + VOLUME_EXPANSION_COEFFICIENT 0.000385 + REFERENCE_TEMPERATURE 0.0 - MASS_DENSITY 1000.0 - HEAT_CAPACITY 4184.0 - DYNAMIC_VISCOSITY 0.0010005 - THERMAL_CONDUCTIVITY 0.59803 - VOLUME_EXPANSION_COEFFICIENT 0.000385 - REFERENCE_TEMPERATURE 0.0 + GRAVITATIONAL_VECTOR 0.0 0.0 -9.81 - GRAVITATIONAL_VECTOR 0.0 0.0 -9.81 - - TURBULENCE_MODEL k_eps_zeta_f + TURBULENCE_MODEL k_eps_zeta_f # TURBULENCE_MODEL k_eps #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.3 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.3 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM smart - ADVECTION_SCHEME_FOR_ENERGY smart - ADVECTION_SCHEME_FOR_TURBULENCE smart + ADVECTION_SCHEME_FOR_MOMENTUM smart + ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_TURBULENCE smart #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-4 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-4 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 40 - - MIN_SIMPLE_ITERATIONS 5 - MAX_SIMPLE_ITERATIONS 20 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-4 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-4 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 40 + + MIN_SIMPLE_ITERATIONS 5 + MAX_SIMPLE_ITERATIONS 20 #-------------------- # Initial conditions diff --git a/Tests/Rans/Negative_Buoyant_Fountain/control-2 b/Tests/Rans/Negative_Buoyant_Fountain/control-2 index 3d4242280..209662a7a 100644 --- a/Tests/Rans/Negative_Buoyant_Fountain/control-2 +++ b/Tests/Rans/Negative_Buoyant_Fountain/control-2 @@ -1,86 +1,83 @@ #---------- # Prologue #---------- - PROBLEM_NAME nbf - HEAT_TRANSFER yes + PROBLEM_NAME nbf + HEAT_TRANSFER yes - TIME_STEP 0.02 - NUMBER_OF_TIME_STEPS 36000 + TIME_STEP 0.02 + NUMBER_OF_TIME_STEPS 36000 #------------------ # Saving intervals #------------------ - RESULTS_SAVE_INTERVAL 1200 - BACKUP_SAVE_INTERVAL 600 - - LOAD_BACKUP_NAME nbf-ts004000.backup + RESULTS_SAVE_INTERVAL 1200 + BACKUP_SAVE_INTERVAL 600 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 12 - MONITORING_POINT_001 0.02 0.1 0.5 - MONITORING_POINT_002 0.02 0.3 0.5 - MONITORING_POINT_003 0.02 0.5 0.5 - MONITORING_POINT_004 0.24 0.1 0.5 - MONITORING_POINT_005 0.24 0.3 0.5 - MONITORING_POINT_006 0.24 0.5 0.5 - MONITORING_POINT_007 0.02 0.1 1.5 - MONITORING_POINT_008 0.02 0.3 1.5 - MONITORING_POINT_009 0.02 0.5 1.5 - MONITORING_POINT_010 0.24 0.1 1.5 - MONITORING_POINT_011 0.24 0.3 1.5 - MONITORING_POINT_012 0.24 0.5 1.5 - - POINT_FOR_MONITORING_PLANES 0.1 0.1 0.1 + NUMBER_OF_MONITORING_POINTS 12 + MONITORING_POINT_001 0.02 0.1 0.5 + MONITORING_POINT_002 0.02 0.3 0.5 + MONITORING_POINT_003 0.02 0.5 0.5 + MONITORING_POINT_004 0.24 0.1 0.5 + MONITORING_POINT_005 0.24 0.3 0.5 + MONITORING_POINT_006 0.24 0.5 0.5 + MONITORING_POINT_007 0.02 0.1 1.5 + MONITORING_POINT_008 0.02 0.3 1.5 + MONITORING_POINT_009 0.02 0.5 1.5 + MONITORING_POINT_010 0.24 0.1 1.5 + MONITORING_POINT_011 0.24 0.3 1.5 + MONITORING_POINT_012 0.24 0.5 1.5 + + POINT_FOR_MONITORING_PLANES 0.1 0.1 0.1 #----------------- # Physical models #----------------- + MASS_DENSITY 1000.0 + HEAT_CAPACITY 4184.0 + DYNAMIC_VISCOSITY 0.0010005 + THERMAL_CONDUCTIVITY 0.59803 + VOLUME_EXPANSION_COEFFICIENT 0.000385 + REFERENCE_TEMPERATURE 0.0 - MASS_DENSITY 1000.0 - HEAT_CAPACITY 4184.0 - DYNAMIC_VISCOSITY 0.0010005 - THERMAL_CONDUCTIVITY 0.59803 - VOLUME_EXPANSION_COEFFICIENT 0.000385 - REFERENCE_TEMPERATURE 0.0 - - GRAVITATIONAL_VECTOR 0.0 0.0 -9.81 + GRAVITATIONAL_VECTOR 0.0 0.0 -9.81 - TURBULENCE_MODEL k_eps_zeta_f + TURBULENCE_MODEL k_eps_zeta_f # TURBULENCE_MODEL k_eps #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.3 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.3 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM smart - ADVECTION_SCHEME_FOR_ENERGY smart - ADVECTION_SCHEME_FOR_TURBULENCE smart + ADVECTION_SCHEME_FOR_MOMENTUM smart + ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_TURBULENCE smart #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-4 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-4 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 40 - - MIN_SIMPLE_ITERATIONS 5 - MAX_SIMPLE_ITERATIONS 20 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-4 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-4 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 40 + + MIN_SIMPLE_ITERATIONS 5 + MAX_SIMPLE_ITERATIONS 20 #-------------------- # Initial conditions diff --git a/Tests/Rans/Negative_Buoyant_Fountain/control-3 b/Tests/Rans/Negative_Buoyant_Fountain/control-3 index 5b00634e6..675f43d49 100644 --- a/Tests/Rans/Negative_Buoyant_Fountain/control-3 +++ b/Tests/Rans/Negative_Buoyant_Fountain/control-3 @@ -1,86 +1,85 @@ #---------- # Prologue #---------- - PROBLEM_NAME nbf - HEAT_TRANSFER yes + PROBLEM_NAME nbf + HEAT_TRANSFER yes - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 24000 + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 24000 #------------------ # Saving intervals #------------------ - RESULTS_SAVE_INTERVAL 1200 - BACKUP_SAVE_INTERVAL 600 + RESULTS_SAVE_INTERVAL 1200 + BACKUP_SAVE_INTERVAL 600 - LOAD_BACKUP_NAME nbf-ts016200.backup + LOAD_BACKUP_NAME nbf-ts016200.backup #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 12 - MONITORING_POINT_001 0.02 0.1 0.5 - MONITORING_POINT_002 0.02 0.3 0.5 - MONITORING_POINT_003 0.02 0.5 0.5 - MONITORING_POINT_004 0.24 0.1 0.5 - MONITORING_POINT_005 0.24 0.3 0.5 - MONITORING_POINT_006 0.24 0.5 0.5 - MONITORING_POINT_007 0.02 0.1 1.5 - MONITORING_POINT_008 0.02 0.3 1.5 - MONITORING_POINT_009 0.02 0.5 1.5 - MONITORING_POINT_010 0.24 0.1 1.5 - MONITORING_POINT_011 0.24 0.3 1.5 - MONITORING_POINT_012 0.24 0.5 1.5 - - POINT_FOR_MONITORING_PLANES 0.1 0.1 0.1 + NUMBER_OF_MONITORING_POINTS 12 + MONITORING_POINT_001 0.02 0.1 0.5 + MONITORING_POINT_002 0.02 0.3 0.5 + MONITORING_POINT_003 0.02 0.5 0.5 + MONITORING_POINT_004 0.24 0.1 0.5 + MONITORING_POINT_005 0.24 0.3 0.5 + MONITORING_POINT_006 0.24 0.5 0.5 + MONITORING_POINT_007 0.02 0.1 1.5 + MONITORING_POINT_008 0.02 0.3 1.5 + MONITORING_POINT_009 0.02 0.5 1.5 + MONITORING_POINT_010 0.24 0.1 1.5 + MONITORING_POINT_011 0.24 0.3 1.5 + MONITORING_POINT_012 0.24 0.5 1.5 + + POINT_FOR_MONITORING_PLANES 0.1 0.1 0.1 #----------------- # Physical models #----------------- + MASS_DENSITY 1000.0 + HEAT_CAPACITY 4184.0 + DYNAMIC_VISCOSITY 0.0010005 + THERMAL_CONDUCTIVITY 0.59803 + VOLUME_EXPANSION_COEFFICIENT 0.000385 + REFERENCE_TEMPERATURE 0.0 - MASS_DENSITY 1000.0 - HEAT_CAPACITY 4184.0 - DYNAMIC_VISCOSITY 0.0010005 - THERMAL_CONDUCTIVITY 0.59803 - VOLUME_EXPANSION_COEFFICIENT 0.000385 - REFERENCE_TEMPERATURE 0.0 + GRAVITATIONAL_VECTOR 0.0 0.0 -9.81 - GRAVITATIONAL_VECTOR 0.0 0.0 -9.81 - - TURBULENCE_MODEL k_eps_zeta_f + TURBULENCE_MODEL k_eps_zeta_f # TURBULENCE_MODEL k_eps #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.3 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.3 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM smart - ADVECTION_SCHEME_FOR_ENERGY smart - ADVECTION_SCHEME_FOR_TURBULENCE smart + ADVECTION_SCHEME_FOR_MOMENTUM smart + ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_TURBULENCE smart #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-4 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-4 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 40 - - MIN_SIMPLE_ITERATIONS 5 - MAX_SIMPLE_ITERATIONS 20 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-4 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-4 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 40 + + MIN_SIMPLE_ITERATIONS 5 + MAX_SIMPLE_ITERATIONS 20 #-------------------- # Initial conditions diff --git a/Tests/Rans/Negative_Buoyant_Fountain/control-4 b/Tests/Rans/Negative_Buoyant_Fountain/control-4 index bdba2e0b9..70f101840 100644 --- a/Tests/Rans/Negative_Buoyant_Fountain/control-4 +++ b/Tests/Rans/Negative_Buoyant_Fountain/control-4 @@ -1,86 +1,86 @@ #---------- # Prologue #---------- - PROBLEM_NAME nbf - HEAT_TRANSFER yes + PROBLEM_NAME nbf + HEAT_TRANSFER yes - TIME_STEP 0.01 - NUMBER_OF_TIME_STEPS 36000 + TIME_STEP 0.01 + NUMBER_OF_TIME_STEPS 36000 #------------------ # Saving intervals #------------------ - RESULTS_SAVE_INTERVAL 1200 - BACKUP_SAVE_INTERVAL 600 + RESULTS_SAVE_INTERVAL 1200 + BACKUP_SAVE_INTERVAL 600 - LOAD_BACKUP_NAME nbf-ts034200.backup + LOAD_BACKUP_NAME nbf-ts034200.backup #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 12 - MONITORING_POINT_001 0.02 0.1 0.5 - MONITORING_POINT_002 0.02 0.3 0.5 - MONITORING_POINT_003 0.02 0.5 0.5 - MONITORING_POINT_004 0.24 0.1 0.5 - MONITORING_POINT_005 0.24 0.3 0.5 - MONITORING_POINT_006 0.24 0.5 0.5 - MONITORING_POINT_007 0.02 0.1 1.5 - MONITORING_POINT_008 0.02 0.3 1.5 - MONITORING_POINT_009 0.02 0.5 1.5 - MONITORING_POINT_010 0.24 0.1 1.5 - MONITORING_POINT_011 0.24 0.3 1.5 - MONITORING_POINT_012 0.24 0.5 1.5 - - POINT_FOR_MONITORING_PLANES 0.1 0.1 0.1 + NUMBER_OF_MONITORING_POINTS 12 + MONITORING_POINT_001 0.02 0.1 0.5 + MONITORING_POINT_002 0.02 0.3 0.5 + MONITORING_POINT_003 0.02 0.5 0.5 + MONITORING_POINT_004 0.24 0.1 0.5 + MONITORING_POINT_005 0.24 0.3 0.5 + MONITORING_POINT_006 0.24 0.5 0.5 + MONITORING_POINT_007 0.02 0.1 1.5 + MONITORING_POINT_008 0.02 0.3 1.5 + MONITORING_POINT_009 0.02 0.5 1.5 + MONITORING_POINT_010 0.24 0.1 1.5 + MONITORING_POINT_011 0.24 0.3 1.5 + MONITORING_POINT_012 0.24 0.5 1.5 + + POINT_FOR_MONITORING_PLANES 0.1 0.1 0.1 #----------------- # Physical models #----------------- - MASS_DENSITY 1000.0 - HEAT_CAPACITY 4184.0 - DYNAMIC_VISCOSITY 0.0010005 - THERMAL_CONDUCTIVITY 0.59803 - VOLUME_EXPANSION_COEFFICIENT 0.000385 - REFERENCE_TEMPERATURE 0.0 + MASS_DENSITY 1000.0 + HEAT_CAPACITY 4184.0 + DYNAMIC_VISCOSITY 0.0010005 + THERMAL_CONDUCTIVITY 0.59803 + VOLUME_EXPANSION_COEFFICIENT 0.000385 + REFERENCE_TEMPERATURE 0.0 - GRAVITATIONAL_VECTOR 0.0 0.0 -9.81 + GRAVITATIONAL_VECTOR 0.0 0.0 -9.81 - TURBULENCE_MODEL k_eps_zeta_f + TURBULENCE_MODEL k_eps_zeta_f # TURBULENCE_MODEL k_eps #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.3 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.3 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM smart - ADVECTION_SCHEME_FOR_ENERGY smart - ADVECTION_SCHEME_FOR_TURBULENCE smart + ADVECTION_SCHEME_FOR_MOMENTUM smart + ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_TURBULENCE smart #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-4 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-4 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 40 - - MIN_SIMPLE_ITERATIONS 5 - MAX_SIMPLE_ITERATIONS 20 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-4 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-4 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 40 + + MIN_SIMPLE_ITERATIONS 5 + MAX_SIMPLE_ITERATIONS 20 #-------------------- # Initial conditions diff --git a/Tests/Rans/Pipe_Re_Tau_550/control b/Tests/Rans/Pipe_Re_Tau_550/control index b200c483a..fd09f088f 100644 --- a/Tests/Rans/Pipe_Re_Tau_550/control +++ b/Tests/Rans/Pipe_Re_Tau_550/control @@ -1,82 +1,77 @@ #-------------------- # Problem definition #-------------------- + PROBLEM_NAME pipe_full - PROBLEM_NAME pipe_full -# LOAD_BACKUP_NAME pipe_full-ts000600.backup + HEAT_TRANSFER yes - HEAT_TRANSFER yes - - PRESSURE_DROPS 0.0 0.0 0.0036 - MASS_FLOW_RATES 0.0 0.0 11.5 + PRESSURE_DROPS 0.0 0.0 0.0036 + MASS_FLOW_RATES 0.0 0.0 11.5 #--------------- # Time stepping #--------------- - - TIME_STEP 0.05 - NUMBER_OF_TIME_STEPS 7200 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 600 + TIME_STEP 0.05 + NUMBER_OF_TIME_STEPS 7200 + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 600 #------------------- # Monitoring points #------------------- + NUMBER_OF_MONITORING_POINTS 5 + MONITORING_POINT_001 0.0 0.99 0.5 + MONITORING_POINT_002 0.0 0.8 0.5 + MONITORING_POINT_003 0.0 0.7 0.5 + MONITORING_POINT_004 0.0 0.2 0.5 + MONITORING_POINT_005 0.0 0.0 0.5 - NUMBER_OF_MONITORING_POINTS 5 - MONITORING_POINT_001 0.0 0.99 0.5 - MONITORING_POINT_002 0.0 0.8 0.5 - MONITORING_POINT_003 0.0 0.7 0.5 - MONITORING_POINT_004 0.0 0.2 0.5 - MONITORING_POINT_005 0.0 0.0 0.5 - - POINT_FOR_MONITORING_PLANES 0.05 0.05 0.514 + POINT_FOR_MONITORING_PLANES 0.05 0.05 0.514 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 1.4e-4 - REFERENCE_TEMPERATURE 0. - DYNAMIC_VISCOSITY 3.8296e-4 - HEAT_CAPACITY 1.0 - NUMBER_OF_SCALARS 1 - SPECIES_DIFFUSIVITY 1.4e-4 + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 1.4e-4 + REFERENCE_TEMPERATURE 0. + DYNAMIC_VISCOSITY 3.8296e-4 + HEAT_CAPACITY 1.0 + NUMBER_OF_SCALARS 1 + SPECIES_DIFFUSIVITY 1.4e-4 - TURBULENCE_MODEL k_eps_zeta_f - #TURBULENCE_MODEL rsm_hanjalic_jakirlic - #TURBULENCE_MODEL_VARIANT none - #TURBULENCE_WALL_TREATMENT high_re + TURBULENCE_MODEL k_eps_zeta_f +# TURBULENCE_MODEL rsm_hanjalic_jakirlic +# TURBULENCE_MODEL_VARIANT none +# TURBULENCE_WALL_TREATMENT high_re #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.4 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.4 + SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.4 - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.4 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.4 - SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.4 + TIME_INTEGRATION_SCHEME linear - TIME_INTEGRATION_SCHEME linear + ADVECTION_SCHEME_FOR_MOMENTUM superbee + ADVECTION_SCHEME_FOR_ENERGY superbee + ADVECTION_SCHEME_FOR_TURBULENCE superbee - ADVECTION_SCHEME_FOR_MOMENTUM superbee - ADVECTION_SCHEME_FOR_ENERGY superbee - ADVECTION_SCHEME_FOR_TURBULENCE superbee + MIN_SIMPLE_ITERATIONS 3 - MIN_SIMPLE_ITERATIONS 3 #------------------------ # Linear solver settings #------------------------ - - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1e-5 - TOLERANCE_FOR_TURBULENCE_SOLVER 1e-5 - TOLERANCE_FOR_ENERGY_SOLVER 1e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1e-5 + TOLERANCE_FOR_TURBULENCE_SOLVER 1e-5 + TOLERANCE_FOR_ENERGY_SOLVER 1e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1e-3 #-------------------- # Initial conditions diff --git a/Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/control b/Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/control index e5cf73298..1c5d7d96b 100644 --- a/Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/control +++ b/Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/control @@ -1,83 +1,82 @@ #----------- # Prologue #----------- + PROBLEM_NAME rb_conv - PROBLEM_NAME rb_conv + HEAT_TRANSFER yes - HEAT_TRANSFER yes + TIME_STEP 0.05 + NUMBER_OF_TIME_STEPS 3600 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 60 - TIME_STEP 0.05 - NUMBER_OF_TIME_STEPS 3600 - STARTING_TIME_STEP_FOR_TURB_STATISTICS 60 - -# LOAD_BACKUP_NAME rb_conv-ts000060.backup - RESULTS_SAVE_INTERVAL 60 - BACKUP_SAVE_INTERVAL 3600 + RESULTS_SAVE_INTERVAL 60 + BACKUP_SAVE_INTERVAL 3600 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 15 - MONITORING_POINT_001 0.5 0.5 1.0 - MONITORING_POINT_002 0.5 0.5 0.9 - MONITORING_POINT_003 0.5 0.5 0.8 - MONITORING_POINT_004 0.5 0.5 0.7 - MONITORING_POINT_005 0.5 0.5 0.6 - MONITORING_POINT_006 0.5 0.5 0.5 - MONITORING_POINT_007 0.1 0.1 0.5 - MONITORING_POINT_008 0.2 0.2 0.5 - MONITORING_POINT_009 0.3 0.3 0.5 - MONITORING_POINT_010 0.4 0.4 0.5 - MONITORING_POINT_011 0.5 0.5 0.5 - MONITORING_POINT_012 0.6 0.6 0.5 - MONITORING_POINT_013 0.7 0.7 0.5 - MONITORING_POINT_014 0.8 0.8 0.5 - MONITORING_POINT_015 0.9 0.9 0.5 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + NUMBER_OF_MONITORING_POINTS 15 + MONITORING_POINT_001 0.5 0.5 1.0 + MONITORING_POINT_002 0.5 0.5 0.9 + MONITORING_POINT_003 0.5 0.5 0.8 + MONITORING_POINT_004 0.5 0.5 0.7 + MONITORING_POINT_005 0.5 0.5 0.6 + MONITORING_POINT_006 0.5 0.5 0.5 + MONITORING_POINT_007 0.1 0.1 0.5 + MONITORING_POINT_008 0.2 0.2 0.5 + MONITORING_POINT_009 0.3 0.3 0.5 + MONITORING_POINT_010 0.4 0.4 0.5 + MONITORING_POINT_011 0.5 0.5 0.5 + MONITORING_POINT_012 0.6 0.6 0.5 + MONITORING_POINT_013 0.7 0.7 0.5 + MONITORING_POINT_014 0.8 0.8 0.5 + MONITORING_POINT_015 0.9 0.9 0.5 + + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models #----------------- - BUOYANCY thermal - GRAVITATIONAL_VECTOR 0.0, 0.0, -0.0327 - REFERENCE_TEMPERATURE 12.5 + BUOYANCY thermal + GRAVITATIONAL_VECTOR 0.0, 0.0, -0.0327 + REFERENCE_TEMPERATURE 12.5 - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 2.594e-5 - DYNAMIC_VISCOSITY 1.846e-5 - HEAT_CAPACITY 1.0 + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 2.594e-5 + DYNAMIC_VISCOSITY 1.846e-5 + HEAT_CAPACITY 1.0 - TURBULENCE_MODEL k_eps_zeta_f + TURBULENCE_MODEL k_eps_zeta_f #TURBULENCE_MODEL k_eps - TURBULENT_HEAT_FLUX_MODEL GGDH + TURBULENT_HEAT_FLUX_MODEL GGDH #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.5 - SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.5 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.7 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.5 + SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.5 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM smart - ADVECTION_SCHEME_FOR_ENERGY smart - ADVECTION_SCHEME_FOR_TURBULENCE smart + ADVECTION_SCHEME_FOR_MOMENTUM smart + ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_TURBULENCE smart - GU_CORRECTION yes + GU_CORRECTION yes - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-4 - TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-4 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-4 + TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-4 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 120 #-------------------- # Initial conditions @@ -86,7 +85,6 @@ VARIABLES u v w t t2 kin eps zeta f22 VALUES 0.0 0.0 0.0 12.5 0.1 0.005 0.001 0.05 0.1 - #--------------------- # Boundary conditions #--------------------- diff --git a/Tests/Rans/Single_Rod/control.0 b/Tests/Rans/Single_Rod/control.0 index 5a48f146d..16c3fac52 100644 --- a/Tests/Rans/Single_Rod/control.0 +++ b/Tests/Rans/Single_Rod/control.0 @@ -1,20 +1,20 @@ - NUMBER_OF_DOMAINS 3 + NUMBER_OF_DOMAINS 3 - NUMBER_OF_TIME_STEPS 600 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 120 + NUMBER_OF_TIME_STEPS 600 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 120 - TIME_STEP 0.0001 + TIME_STEP 0.0001 - TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 - MIN_SIMPLE_ITERATIONS 6 - MAX_SIMPLE_ITERATIONS 12 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 + MIN_SIMPLE_ITERATIONS 6 + MAX_SIMPLE_ITERATIONS 12 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 - INTERFACE_CONDITION fuel cladding - BOUNDARY_CONDITIONS fuel_wall cladding_inner_wall + INTERFACE_CONDITION fuel cladding + BOUNDARY_CONDITIONS fuel_wall cladding_inner_wall - INTERFACE_CONDITION cladding water - BOUNDARY_CONDITIONS cladding_outer_wall cylinder_wall + INTERFACE_CONDITION cladding water + BOUNDARY_CONDITIONS cladding_outer_wall cylinder_wall diff --git a/Tests/Rans/Single_Rod/control.1 b/Tests/Rans/Single_Rod/control.1 index f83c2ae92..ebfa4258e 100644 --- a/Tests/Rans/Single_Rod/control.1 +++ b/Tests/Rans/Single_Rod/control.1 @@ -1,58 +1,56 @@ #---------- # Prologue #---------- - PROBLEM_NAME fuel - HEAT_TRANSFER yes + PROBLEM_NAME fuel + HEAT_TRANSFER yes - NUMBER_OF_TIME_STEPS 12 - RESULTS_SAVE_INTERVAL 3 - BACKUP_SAVE_INTERVAL 12 + NUMBER_OF_TIME_STEPS 12 + RESULTS_SAVE_INTERVAL 3 + BACKUP_SAVE_INTERVAL 12 - LOAD_BACKUP_NAME fuel-ts000240.backup + LOAD_BACKUP_NAME fuel-ts000240.backup - TIME_STEP 0.1 + TIME_STEP 0.1 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.0 0.0 0.0 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.0 0.0 0.0 - POINT_FOR_MONITORING_PLANES 0.0 0.0 0.0 + POINT_FOR_MONITORING_PLANES 0.0 0.0 0.0 #----------------- # Physical models #----------------- + MASS_DENSITY 6 + THERMAL_CONDUCTIVITY 0.24 + DYNAMIC_VISCOSITY 1.0e+6 + HEAT_CAPACITY 1.0 - MASS_DENSITY 6 - THERMAL_CONDUCTIVITY 0.24 - DYNAMIC_VISCOSITY 1.0e+6 - HEAT_CAPACITY 1.0 - - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 12 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 12 #-------------------- # Initial conditions diff --git a/Tests/Rans/Single_Rod/control.2 b/Tests/Rans/Single_Rod/control.2 index ae9a963da..6f900f703 100644 --- a/Tests/Rans/Single_Rod/control.2 +++ b/Tests/Rans/Single_Rod/control.2 @@ -1,58 +1,54 @@ #---------- # Prologue #---------- - PROBLEM_NAME cladding - HEAT_TRANSFER yes + PROBLEM_NAME cladding + HEAT_TRANSFER yes - NUMBER_OF_TIME_STEPS 12 - RESULTS_SAVE_INTERVAL 3 - BACKUP_SAVE_INTERVAL 12 + NUMBER_OF_TIME_STEPS 12 + RESULTS_SAVE_INTERVAL 3 + BACKUP_SAVE_INTERVAL 12 - LOAD_BACKUP_NAME cladding-ts000240.backup - - TIME_STEP 0.1 + TIME_STEP 0.1 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.0 0.0 0.0 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.0 0.0 0.0 - POINT_FOR_MONITORING_PLANES 0.0 0.0 0.0 + POINT_FOR_MONITORING_PLANES 0.0 0.0 0.0 #----------------- # Physical models #----------------- + MASS_DENSITY 10 + THERMAL_CONDUCTIVITY 240 + DYNAMIC_VISCOSITY 1.0e+6 + HEAT_CAPACITY 1.0 - MASS_DENSITY 10 - THERMAL_CONDUCTIVITY 240 - DYNAMIC_VISCOSITY 1.0e+6 - HEAT_CAPACITY 1.0 - - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 12 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 12 #-------------------- # Initial conditions diff --git a/Tests/Rans/Single_Rod/control.3 b/Tests/Rans/Single_Rod/control.3 index 46739a936..c60b5139f 100644 --- a/Tests/Rans/Single_Rod/control.3 +++ b/Tests/Rans/Single_Rod/control.3 @@ -1,61 +1,61 @@ #---------- # Prologue #---------- - PROBLEM_NAME water - HEAT_TRANSFER yes - BUOYANCY none + PROBLEM_NAME water + HEAT_TRANSFER yes + BUOYANCY none - TIME_STEP 0.0001 - NUMBER_OF_TIME_STEPS 12 - STARTING_TIME_STEP_FOR_TURB_STATISTICS 1200000 - RESULTS_SAVE_INTERVAL 150 - BACKUP_SAVE_INTERVAL 600 + TIME_STEP 0.0001 + NUMBER_OF_TIME_STEPS 12 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 1200000 + RESULTS_SAVE_INTERVAL 150 + BACKUP_SAVE_INTERVAL 600 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 1.0 - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 1.0 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models #----------------- - MASS_DENSITY 1000 - THERMAL_CONDUCTIVITY 0.007 - DYNAMIC_VISCOSITY 0.001 - HEAT_CAPACITY 1.0 - REFERENCE_TEMPERATURE 20.0 + MASS_DENSITY 1000 + THERMAL_CONDUCTIVITY 0.007 + DYNAMIC_VISCOSITY 0.001 + HEAT_CAPACITY 1.0 + REFERENCE_TEMPERATURE 20.0 - GRAVITATIONAL_VECTOR 0.0, 0.0, 0.0 + GRAVITATIONAL_VECTOR 0.0, 0.0, 0.0 - TURBULENCE_MODEL k_eps_zeta_f + TURBULENCE_MODEL k_eps_zeta_f #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.6 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM smart - ADVECTION_SCHEME_FOR_ENERGY smart - ADVECTION_SCHEME_FOR_TURBULENCE smart + ADVECTION_SCHEME_FOR_MOMENTUM smart + ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_TURBULENCE smart - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 - TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 5.e-3 - MIN_SIMPLE_ITERATIONS 6 - MAX_SIMPLE_ITERATIONS 12 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 + MIN_SIMPLE_ITERATIONS 6 + MAX_SIMPLE_ITERATIONS 12 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 #-------------------- # Initial conditions diff --git a/Tests/Swarm/Bend_90_Degrees/Control_Flow_Development/control b/Tests/Swarm/Bend_90_Degrees/Control_Flow_Development/control index e1c173259..fd419df49 100644 --- a/Tests/Swarm/Bend_90_Degrees/Control_Flow_Development/control +++ b/Tests/Swarm/Bend_90_Degrees/Control_Flow_Development/control @@ -1,18 +1,18 @@ - NUMBER_OF_DOMAINS 2 + NUMBER_OF_DOMAINS 2 # Integrate in time for five seconds - TIME_STEP 0.005 - NUMBER_OF_TIME_STEPS 1000 + TIME_STEP 0.005 + NUMBER_OF_TIME_STEPS 1000 - RESULTS_SAVE_INTERVAL 100 - BACKUP_SAVE_INTERVAL 500 - SWARM_SAVE_INTERVAL 100 - STARTING_TIME_STEP_FOR_SWARM_COMPUTATION 1001 + RESULTS_SAVE_INTERVAL 100 + BACKUP_SAVE_INTERVAL 500 + SWARM_SAVE_INTERVAL 100 + STARTING_TIME_STEP_FOR_SWARM_COMPUTATION 1001 - SAVE_RESULTS_AT_BOUNDARIES no + SAVE_RESULTS_AT_BOUNDARIES no - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - INTERFACE_CONDITION pipe bend - BOUNDARY_CONDITIONS periodic_y bend_inlet + INTERFACE_CONDITION pipe bend + BOUNDARY_CONDITIONS periodic_y bend_inlet diff --git a/Tests/Swarm/Bend_90_Degrees/Control_Flow_Development/control.1 b/Tests/Swarm/Bend_90_Degrees/Control_Flow_Development/control.1 index 540c71a18..099632e26 100644 --- a/Tests/Swarm/Bend_90_Degrees/Control_Flow_Development/control.1 +++ b/Tests/Swarm/Bend_90_Degrees/Control_Flow_Development/control.1 @@ -1,50 +1,50 @@ #---------- # Prologue #---------- - PROBLEM_NAME pipe - HEAT_TRANSFER no + PROBLEM_NAME pipe + HEAT_TRANSFER no #------------------- # Monitoring points #------------------- - POINT_FOR_MONITORING_PLANES 0.0 0.145 0.0 + POINT_FOR_MONITORING_PLANES 0.0 0.145 0.0 #----------------- # Physical models #----------------- - MASS_DENSITY 1.2 - DYNAMIC_VISCOSITY 1.8e-5 + MASS_DENSITY 1.2 + DYNAMIC_VISCOSITY 1.8e-5 - TURBULENCE_MODEL k_eps - PRESSURE_DROPS 0.0 -9.0 0.0 - MASS_FLOW_RATES 0.0 -9.42e-4 0.0 + TURBULENCE_MODEL k_eps + PRESSURE_DROPS 0.0 -9.0 0.0 + MASS_FLOW_RATES 0.0 -9.42e-4 0.0 #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 - SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.3 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 + SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.3 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear # ADVECTION_SCHEME_FOR_MOMENTUM upwind - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MIN_SIMPLE_ITERATIONS 3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 480 + MIN_SIMPLE_ITERATIONS 3 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 480 - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem #-------------------- # Initial conditions diff --git a/Tests/Swarm/Bend_90_Degrees/Control_Flow_Development/control.2 b/Tests/Swarm/Bend_90_Degrees/Control_Flow_Development/control.2 index 206c1328f..53320f03f 100644 --- a/Tests/Swarm/Bend_90_Degrees/Control_Flow_Development/control.2 +++ b/Tests/Swarm/Bend_90_Degrees/Control_Flow_Development/control.2 @@ -1,59 +1,59 @@ #---------- # Prologue #---------- - PROBLEM_NAME bend - HEAT_TRANSFER no + PROBLEM_NAME bend + HEAT_TRANSFER no #------------------- # Monitoring points #------------------- - POINT_FOR_MONITORING_PLANES 0.07 0.0 0.0 + POINT_FOR_MONITORING_PLANES 0.07 0.0 0.0 #----------------- # Physical models #----------------- - MASS_DENSITY 1.2 - DYNAMIC_VISCOSITY 1.8e-5 + MASS_DENSITY 1.2 + DYNAMIC_VISCOSITY 1.8e-5 - TURBULENCE_MODEL k_eps + TURBULENCE_MODEL k_eps #---------------- # Swarm related #---------------- - PARTICLE_TRACKING yes + PARTICLE_TRACKING yes # SWARM_SUBGRID_SCALE_MODEL brownian_fukagata - SWARM_DIAMETER 2.5e-5 - SWARM_DENSITY 1000.0 - NUMBER_OF_SWARM_SUB_STEPS 8 - MAX_PARTICLES 10000 - SWARM_COEFFICIENT_OF_RESTITUTION 1.0 + SWARM_DIAMETER 2.5e-5 + SWARM_DENSITY 1000.0 + NUMBER_OF_SWARM_SUB_STEPS 8 + MAX_PARTICLES 10000 + SWARM_COEFFICIENT_OF_RESTITUTION 1.0 #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 - SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.3 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 + SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.3 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear # ADVECTION_SCHEME_FOR_MOMENTUM upwind - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MIN_SIMPLE_ITERATIONS 3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 480 + MIN_SIMPLE_ITERATIONS 3 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 480 - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem #-------------------- # Initial conditions diff --git a/Tests/Swarm/Bend_90_Degrees/Control_Particle_Tracking/control b/Tests/Swarm/Bend_90_Degrees/Control_Particle_Tracking/control index a3976733f..9245e2ae9 100644 --- a/Tests/Swarm/Bend_90_Degrees/Control_Particle_Tracking/control +++ b/Tests/Swarm/Bend_90_Degrees/Control_Particle_Tracking/control @@ -1,18 +1,18 @@ - NUMBER_OF_DOMAINS 2 + NUMBER_OF_DOMAINS 2 # Integrate in time for two seconds - TIME_STEP 0.0001 - NUMBER_OF_TIME_STEPS 20000 + TIME_STEP 0.0001 + NUMBER_OF_TIME_STEPS 20000 - RESULTS_SAVE_INTERVAL 5000 - SWARM_SAVE_INTERVAL 10 - BACKUP_SAVE_INTERVAL 5000 - STARTING_TIME_STEP_FOR_SWARM_COMPUTATION 1001 + RESULTS_SAVE_INTERVAL 5000 + SWARM_SAVE_INTERVAL 10 + BACKUP_SAVE_INTERVAL 5000 + STARTING_TIME_STEP_FOR_SWARM_COMPUTATION 1001 - SAVE_RESULTS_AT_BOUNDARIES yes + SAVE_RESULTS_AT_BOUNDARIES yes - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - INTERFACE_CONDITION pipe bend - BOUNDARY_CONDITIONS periodic_y bend_inlet + INTERFACE_CONDITION pipe bend + BOUNDARY_CONDITIONS periodic_y bend_inlet diff --git a/Tests/Swarm/Bend_90_Degrees/Control_Particle_Tracking/control.1 b/Tests/Swarm/Bend_90_Degrees/Control_Particle_Tracking/control.1 index 9300baf68..95296359d 100644 --- a/Tests/Swarm/Bend_90_Degrees/Control_Particle_Tracking/control.1 +++ b/Tests/Swarm/Bend_90_Degrees/Control_Particle_Tracking/control.1 @@ -1,52 +1,50 @@ #---------- # Prologue #---------- - PROBLEM_NAME pipe - HEAT_TRANSFER no - - LOAD_BACKUP_NAME pipe-ts001000.backup + PROBLEM_NAME pipe + HEAT_TRANSFER no #------------------- # Monitoring points #------------------- - POINT_FOR_MONITORING_PLANES 0.0 0.145 0.0 + POINT_FOR_MONITORING_PLANES 0.0 0.145 0.0 #----------------- # Physical models #----------------- - MASS_DENSITY 1.2 - DYNAMIC_VISCOSITY 1.8e-5 + MASS_DENSITY 1.2 + DYNAMIC_VISCOSITY 1.8e-5 - TURBULENCE_MODEL k_eps - PRESSURE_DROPS 0.0 -9.0 0.0 - MASS_FLOW_RATES 0.0 -9.42e-4 0.0 + TURBULENCE_MODEL k_eps + PRESSURE_DROPS 0.0 -9.0 0.0 + MASS_FLOW_RATES 0.0 -9.42e-4 0.0 #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 - SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.3 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 + SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.3 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear # ADVECTION_SCHEME_FOR_MOMENTUM upwind - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MIN_SIMPLE_ITERATIONS 3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 480 + MIN_SIMPLE_ITERATIONS 3 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 480 - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem #-------------------- # Initial conditions diff --git a/Tests/Swarm/Bend_90_Degrees/Control_Particle_Tracking/control.2 b/Tests/Swarm/Bend_90_Degrees/Control_Particle_Tracking/control.2 index 09adeba58..978c2cee3 100644 --- a/Tests/Swarm/Bend_90_Degrees/Control_Particle_Tracking/control.2 +++ b/Tests/Swarm/Bend_90_Degrees/Control_Particle_Tracking/control.2 @@ -1,30 +1,28 @@ #---------- # Prologue #---------- - PROBLEM_NAME bend - HEAT_TRANSFER no - - LOAD_BACKUP_NAME bend-ts001000.backup + PROBLEM_NAME bend + HEAT_TRANSFER no #------------------- # Monitoring points #------------------- - POINT_FOR_MONITORING_PLANES 0.07 0.0 0.0 + POINT_FOR_MONITORING_PLANES 0.07 0.0 0.0 #----------------- # Physical models #----------------- - MASS_DENSITY 1.2 - DYNAMIC_VISCOSITY 1.8e-5 + MASS_DENSITY 1.2 + DYNAMIC_VISCOSITY 1.8e-5 - TURBULENCE_MODEL k_eps + TURBULENCE_MODEL k_eps #---------------- # Swarm related #---------------- - PARTICLE_TRACKING yes + PARTICLE_TRACKING yes # SWARM_SUBGRID_SCALE_MODEL brownian_fukagata - SWARM_DIAMETER 3.0e-6 + SWARM_DIAMETER 3.0e-6 # SWARM_DIAMETER 5.0e-6 # SWARM_DIAMETER 10.0e-6 # SWARM_DIAMETER 15.0e-6 @@ -33,37 +31,37 @@ # SWARM_DIAMETER 30.0e-6 # SWARM_DIAMETER 40.0e-6 # SWARM_DIAMETER 50.0e-6 - SWARM_DENSITY 1000.0 - NUMBER_OF_SWARM_SUB_STEPS 16 - MAX_PARTICLES 10000 - SWARM_COEFFICIENT_OF_RESTITUTION 0.0 + SWARM_DENSITY 1000.0 + NUMBER_OF_SWARM_SUB_STEPS 16 + MAX_PARTICLES 10000 + SWARM_COEFFICIENT_OF_RESTITUTION 0.0 #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 - SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.3 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 + SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.3 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear # ADVECTION_SCHEME_FOR_MOMENTUM upwind - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MIN_SIMPLE_ITERATIONS 3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 480 + MIN_SIMPLE_ITERATIONS 3 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 480 - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem #-------------------- # Initial conditions diff --git a/Tests/Swarm/Channel_Re_Tau_150/control_a_flow_development b/Tests/Swarm/Channel_Re_Tau_150/control_a_flow_development index 26d4ed826..21926bf23 100644 --- a/Tests/Swarm/Channel_Re_Tau_150/control_a_flow_development +++ b/Tests/Swarm/Channel_Re_Tau_150/control_a_flow_development @@ -1,66 +1,66 @@ #---------- # Prologue #---------- - PROBLEM_NAME chan + PROBLEM_NAME chan - TIME_STEP 0.5 - NUMBER_OF_TIME_STEPS 24000 - STARTING_TIME_STEP_FOR_TURB_STATISTICS 18001 # 6000 for statistics - STARTING_TIME_STEP_FOR_SWARM_COMPUTATION 24001 # after the last time step - STARTING_TIME_STEP_FOR_SWARM_STATISTICS 30001 # beyond this computation + TIME_STEP 0.5 + NUMBER_OF_TIME_STEPS 24000 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 18001 # 6000 for statistics + STARTING_TIME_STEP_FOR_SWARM_COMPUTATION 24001 # after the last time step + STARTING_TIME_STEP_FOR_SWARM_STATISTICS 30001 # beyond this computation - RESULTS_SAVE_INTERVAL 600 - SWARM_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 + RESULTS_SAVE_INTERVAL 600 + SWARM_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 #------------------- # Monitoring points #------------------- - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - DYNAMIC_VISCOSITY 3.0e-5 + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 3.0e-5 #---------------- # Swarm related #---------------- - PARTICLE_TRACKING yes + PARTICLE_TRACKING yes # SWARM_SUBGRID_SCALE_MODEL brownian_fukagata - SWARM_DIAMETER 3.66356E-03 - SWARM_DENSITY 1000 - NUMBER_OF_SWARM_SUB_STEPS 2 - MAX_PARTICLES 100000 - SWARM_COEFFICIENT_OF_RESTITUTION 1.0 + SWARM_DIAMETER 3.66356E-03 + SWARM_DENSITY 1000 + NUMBER_OF_SWARM_SUB_STEPS 2 + MAX_PARTICLES 100000 + SWARM_COEFFICIENT_OF_RESTITUTION 1.0 #------------------- # Turbulence model #------------------- - TURBULENCE_MODEL HYBRID_LES_RANS + TURBULENCE_MODEL HYBRID_LES_RANS - PRESSURE_DROPS 2.0e-5 0.0 0.0 - MASS_FLOW_RATES 0.4046 0.0 0.0 + PRESSURE_DROPS 2.0e-5 0.0 0.0 + MASS_FLOW_RATES 0.4046 0.0 0.0 #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.8 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.8 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.8 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.8 - TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM central + TIME_INTEGRATION_SCHEME parabolic + ADVECTION_SCHEME_FOR_MOMENTUM central - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 #-------------------- # Initial conditions diff --git a/Tests/Swarm/Channel_Re_Tau_150/control_b_particles b/Tests/Swarm/Channel_Re_Tau_150/control_b_particles index ad2f4ac2e..be269a700 100644 --- a/Tests/Swarm/Channel_Re_Tau_150/control_b_particles +++ b/Tests/Swarm/Channel_Re_Tau_150/control_b_particles @@ -1,68 +1,68 @@ #---------- # Prologue #---------- - PROBLEM_NAME chan + PROBLEM_NAME chan - TIME_STEP 0.5 - NUMBER_OF_TIME_STEPS 36000 - STARTING_TIME_STEP_FOR_TURB_STATISTICS 30001 # wait 6000 for statistics - STARTING_TIME_STEP_FOR_SWARM_COMPUTATION 24001 # start right from restart - STARTING_TIME_STEP_FOR_SWARM_STATISTICS 30001 # wait 6000 for statistics + TIME_STEP 0.5 + NUMBER_OF_TIME_STEPS 36000 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 30001 # wait 6000 for statistics + STARTING_TIME_STEP_FOR_SWARM_COMPUTATION 24001 # start right from restart + STARTING_TIME_STEP_FOR_SWARM_STATISTICS 30001 # wait 6000 for statistics - RESULTS_SAVE_INTERVAL 600 - SWARM_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 12000 + RESULTS_SAVE_INTERVAL 600 + SWARM_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 12000 - LOAD_BACKUP_NAME chan-ts024000.backup + LOAD_BACKUP_NAME chan-ts024000.backup #------------------- # Monitoring points #------------------- - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - DYNAMIC_VISCOSITY 3.0e-5 + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 3.0e-5 #---------------- # Swarm related #---------------- - PARTICLE_TRACKING yes + PARTICLE_TRACKING yes # SWARM_SUBGRID_SCALE_MODEL brownian_fukagata - SWARM_DIAMETER 3.66356E-03 - SWARM_DENSITY 1000 - NUMBER_OF_SWARM_SUB_STEPS 2 - MAX_PARTICLES 100000 - SWARM_COEFFICIENT_OF_RESTITUTION 1.0 + SWARM_DIAMETER 3.66356E-03 + SWARM_DENSITY 1000 + NUMBER_OF_SWARM_SUB_STEPS 2 + MAX_PARTICLES 100000 + SWARM_COEFFICIENT_OF_RESTITUTION 1.0 #------------------- # Turbulence model #------------------- - TURBULENCE_MODEL HYBRID_LES_RANS + TURBULENCE_MODEL HYBRID_LES_RANS - PRESSURE_DROPS 2.0e-5 0.0 0.0 - MASS_FLOW_RATES 0.4046 0.0 0.0 + PRESSURE_DROPS 2.0e-5 0.0 0.0 + MASS_FLOW_RATES 0.4046 0.0 0.0 #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.8 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.8 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.8 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.8 - TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM central + TIME_INTEGRATION_SCHEME parabolic + ADVECTION_SCHEME_FOR_MOMENTUM central - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 #-------------------- # Initial conditions diff --git a/Tests/Swarm/Channel_Re_Tau_590/control_a_flow_development b/Tests/Swarm/Channel_Re_Tau_590/control_a_flow_development index ebec6085b..b956aa827 100644 --- a/Tests/Swarm/Channel_Re_Tau_590/control_a_flow_development +++ b/Tests/Swarm/Channel_Re_Tau_590/control_a_flow_development @@ -1,66 +1,66 @@ #---------- # Prologue #---------- - PROBLEM_NAME chan + PROBLEM_NAME chan - TIME_STEP 0.05 - NUMBER_OF_TIME_STEPS 24000 - STARTING_TIME_STEP_FOR_TURB_STATISTICS 18001 # 6000 for statistics - STARTING_TIME_STEP_FOR_SWARM_COMPUTATION 24001 # after the last time step - STARTING_TIME_STEP_FOR_SWARM_STATISTICS 30001 # beyond this computation + TIME_STEP 0.05 + NUMBER_OF_TIME_STEPS 24000 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 18001 # 6000 for statistics + STARTING_TIME_STEP_FOR_SWARM_COMPUTATION 24001 # after the last time step + STARTING_TIME_STEP_FOR_SWARM_STATISTICS 30001 # beyond this computation - RESULTS_SAVE_INTERVAL 1200 - SWARM_SAVE_INTERVAL 1200 - BACKUP_SAVE_INTERVAL 12000 + RESULTS_SAVE_INTERVAL 1200 + SWARM_SAVE_INTERVAL 1200 + BACKUP_SAVE_INTERVAL 12000 #------------------- # Monitoring points #------------------- - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - DYNAMIC_VISCOSITY 3.0e-5 + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 3.0e-5 #---------------- # Swarm related #---------------- - PARTICLE_TRACKING yes + PARTICLE_TRACKING yes # SWARM_SUBGRID_SCALE_MODEL brownian_fukagata - SWARM_DIAMETER 9.144936E-04 - SWARM_DENSITY 1000 - NUMBER_OF_SWARM_SUB_STEPS 2 - MAX_PARTICLES 100000 - SWARM_COEFFICIENT_OF_RESTITUTION 1.0 + SWARM_DIAMETER 9.144936E-04 + SWARM_DENSITY 1000 + NUMBER_OF_SWARM_SUB_STEPS 2 + MAX_PARTICLES 100000 + SWARM_COEFFICIENT_OF_RESTITUTION 1.0 #------------------- # Turbulence model #------------------- - TURBULENCE_MODEL HYBRID_LES_RANS + TURBULENCE_MODEL HYBRID_LES_RANS - PRESSURE_DROPS 0.0003133 0.0 0.0 - MASS_FLOW_RATES 1.98 0.0 0.0 + PRESSURE_DROPS 0.0003133 0.0 0.0 + MASS_FLOW_RATES 1.98 0.0 0.0 #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.8 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.8 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.8 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.8 - TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM central + TIME_INTEGRATION_SCHEME parabolic + ADVECTION_SCHEME_FOR_MOMENTUM central - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 #-------------------- # Initial conditions diff --git a/Tests/Swarm/Channel_Re_Tau_590/control_b_particles b/Tests/Swarm/Channel_Re_Tau_590/control_b_particles index c92246d01..4029fb878 100644 --- a/Tests/Swarm/Channel_Re_Tau_590/control_b_particles +++ b/Tests/Swarm/Channel_Re_Tau_590/control_b_particles @@ -1,68 +1,68 @@ #---------- # Prologue #---------- - PROBLEM_NAME chan + PROBLEM_NAME chan - TIME_STEP 0.05 - NUMBER_OF_TIME_STEPS 36000 - STARTING_TIME_STEP_FOR_TURB_STATISTICS 30001 # wait 6000 for statistics - STARTING_TIME_STEP_FOR_SWARM_COMPUTATION 24001 # start right from restart - STARTING_TIME_STEP_FOR_SWARM_STATISTICS 30001 # wait 6000 for statistics + TIME_STEP 0.05 + NUMBER_OF_TIME_STEPS 36000 + STARTING_TIME_STEP_FOR_TURB_STATISTICS 30001 # wait 6000 for statistics + STARTING_TIME_STEP_FOR_SWARM_COMPUTATION 24001 # start right from restart + STARTING_TIME_STEP_FOR_SWARM_STATISTICS 30001 # wait 6000 for statistics - RESULTS_SAVE_INTERVAL 1200 - SWARM_SAVE_INTERVAL 1200 - BACKUP_SAVE_INTERVAL 12000 + RESULTS_SAVE_INTERVAL 1200 + SWARM_SAVE_INTERVAL 1200 + BACKUP_SAVE_INTERVAL 12000 - LOAD_BACKUP_NAME chan-ts024000.backup + LOAD_BACKUP_NAME chan-ts024000.backup #------------------- # Monitoring points #------------------- - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - DYNAMIC_VISCOSITY 3.0e-5 + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 3.0e-5 #---------------- # Swarm related #---------------- - PARTICLE_TRACKING yes + PARTICLE_TRACKING yes # SWARM_SUBGRID_SCALE_MODEL brownian_fukagata - SWARM_DIAMETER 9.144936E-04 - SWARM_DENSITY 1000 - NUMBER_OF_SWARM_SUB_STEPS 2 - MAX_PARTICLES 100000 - SWARM_COEFFICIENT_OF_RESTITUTION 1.0 + SWARM_DIAMETER 9.144936E-04 + SWARM_DENSITY 1000 + NUMBER_OF_SWARM_SUB_STEPS 2 + MAX_PARTICLES 100000 + SWARM_COEFFICIENT_OF_RESTITUTION 1.0 #------------------- # Turbulence model #------------------- - TURBULENCE_MODEL HYBRID_LES_RANS + TURBULENCE_MODEL HYBRID_LES_RANS - PRESSURE_DROPS 0.0003133 0.0 0.0 - MASS_FLOW_RATES 1.98 0.0 0.0 + PRESSURE_DROPS 0.0003133 0.0 0.0 + MASS_FLOW_RATES 1.98 0.0 0.0 #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.8 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.8 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.8 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.8 - TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM central + TIME_INTEGRATION_SCHEME parabolic + ADVECTION_SCHEME_FOR_MOMENTUM central - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-4 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-4 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 240 #-------------------- # Initial conditions diff --git a/Tests/Swarm/Cylinders_Periodic/control b/Tests/Swarm/Cylinders_Periodic/control index acb4e68cc..8952fb689 100644 --- a/Tests/Swarm/Cylinders_Periodic/control +++ b/Tests/Swarm/Cylinders_Periodic/control @@ -1,66 +1,65 @@ #---------- # Prologue #--------- - PROBLEM_NAME cylinder - HEAT_TRANSFER no + PROBLEM_NAME cylinder + HEAT_TRANSFER no - NUMBER_OF_TIME_STEPS 3600 - RESULTS_SAVE_INTERVAL 6 - SWARM_SAVE_INTERVAL 6 - BACKUP_SAVE_INTERVAL 300 - TIME_STEP 0.1 + NUMBER_OF_TIME_STEPS 3600 + RESULTS_SAVE_INTERVAL 6 + SWARM_SAVE_INTERVAL 6 + BACKUP_SAVE_INTERVAL 300 + TIME_STEP 0.1 #------------------- -# Monitoring points +# Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 1.5 0.5 0.5 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 1.5 0.5 0.5 - POINT_FOR_MONITORING_PLANES 1.5 0.5 0.5 + POINT_FOR_MONITORING_PLANES 1.5 0.5 0.5 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - DYNAMIC_VISCOSITY 1.0e-4 - HEAT_CAPACITY 1.0 - GRAVITATIONAL_VECTOR 0.0 0.0 0.0 + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 1.0e-4 + HEAT_CAPACITY 1.0 + GRAVITATIONAL_VECTOR 0.0 0.0 0.0 - TURBULENCE_MODEL none - MASS_FLOW_RATES 2.0 0.0 0.0 + TURBULENCE_MODEL none + MASS_FLOW_RATES 2.0 0.0 0.0 #---------------- # Swarm related #---------------- - PARTICLE_TRACKING yes - SWARM_DIAMETER 1.8e-3 - SWARM_DENSITY 1.0e+3 - NUMBER_OF_SWARM_SUB_STEPS 12 - MAX_PARTICLES 64 - SWARM_COEFFICIENT_OF_RESTITUTION 1.00 - STARTING_TIME_STEP_FOR_SWARM_COMPUTATION 30 + PARTICLE_TRACKING yes + SWARM_DIAMETER 1.8e-3 + SWARM_DENSITY 1.0e+3 + NUMBER_OF_SWARM_SUB_STEPS 12 + MAX_PARTICLES 64 + SWARM_COEFFICIENT_OF_RESTITUTION 1.00 + STARTING_TIME_STEP_FOR_SWARM_COMPUTATION 30 #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 250 - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 250 + TIME_INTEGRATION_SCHEME linear - TIME_INTEGRATION_SCHEME linear - - ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 #-------------------- # Initial conditions diff --git a/Tests/Swarm/Rod_Bundle_Hexagonal/control b/Tests/Swarm/Rod_Bundle_Hexagonal/control index 690d78c11..0c74208ca 100644 --- a/Tests/Swarm/Rod_Bundle_Hexagonal/control +++ b/Tests/Swarm/Rod_Bundle_Hexagonal/control @@ -1,67 +1,67 @@ #---------- # Prologue #--------- - PROBLEM_NAME rod_hex - HEAT_TRANSFER no + PROBLEM_NAME rod_hex + HEAT_TRANSFER no - NUMBER_OF_TIME_STEPS 24000 - RESULTS_SAVE_INTERVAL 10 - BACKUP_SAVE_INTERVAL 3000 - TIME_STEP 0.003 + NUMBER_OF_TIME_STEPS 24000 + RESULTS_SAVE_INTERVAL 10 + BACKUP_SAVE_INTERVAL 3000 + TIME_STEP 0.003 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.007 0.00 0.002 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.007 0.00 0.002 - POINT_FOR_MONITORING_PLANES 0.007 0.00 0.002 + POINT_FOR_MONITORING_PLANES 0.007 0.00 0.002 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - DYNAMIC_VISCOSITY 2.0e-4 - HEAT_CAPACITY 1.0 - GRAVITATIONAL_VECTOR 0.0 0.0 0.0 + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 2.0e-4 + HEAT_CAPACITY 1.0 + GRAVITATIONAL_VECTOR 0.0 0.0 0.0 - TURBULENCE_MODEL les_smagorinsky - PRESSURE_DROPS 3.6 0.0 0.0 - MASS_FLOW_RATES 0.5 0.0 0.0 + TURBULENCE_MODEL les_smagorinsky + PRESSURE_DROPS 3.6 0.0 0.0 + MASS_FLOW_RATES 0.5 0.0 0.0 #---------------- # Swarm related #---------------- - PARTICLE_TRACKING yes - SWARM_DIAMETER 5.0e-04 - SWARM_DENSITY 1.0e+03 - NUMBER_OF_SWARM_SUB_STEPS 12 - MAX_PARTICLES 256 - SWARM_COEFFICIENT_OF_RESTITUTION 1.00 - STARTING_TIME_STEP_FOR_SWARM_COMPUTATION 3000 + PARTICLE_TRACKING yes + SWARM_DIAMETER 5.0e-04 + SWARM_DENSITY 1.0e+03 + NUMBER_OF_SWARM_SUB_STEPS 12 + MAX_PARTICLES 256 + SWARM_COEFFICIENT_OF_RESTITUTION 1.00 + STARTING_TIME_STEP_FOR_SWARM_COMPUTATION 3000 #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 250 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 250 - TIME_INTEGRATION_SCHEME parabolic + TIME_INTEGRATION_SCHEME parabolic - ADVECTION_SCHEME_FOR_MOMENTUM central - CHOI_CORRECTION yes + ADVECTION_SCHEME_FOR_MOMENTUM central + CHOI_CORRECTION yes #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 #-------------------- # Initial conditions diff --git a/Tests/Swarm/Rod_Bundle_Polyhedral/control b/Tests/Swarm/Rod_Bundle_Polyhedral/control index 16c6f3e54..264b254ff 100644 --- a/Tests/Swarm/Rod_Bundle_Polyhedral/control +++ b/Tests/Swarm/Rod_Bundle_Polyhedral/control @@ -1,64 +1,64 @@ #---------- # Prologue #--------- - PROBLEM_NAME rod_tet_dual - HEAT_TRANSFER no + PROBLEM_NAME rod_tet_dual + HEAT_TRANSFER no - NUMBER_OF_TIME_STEPS 4500 - RESULTS_SAVE_INTERVAL 10 - SWARM_SAVE_INTERVAL 10 - BACKUP_SAVE_INTERVAL 500 - TIME_STEP 0.003 + NUMBER_OF_TIME_STEPS 4500 + RESULTS_SAVE_INTERVAL 10 + SWARM_SAVE_INTERVAL 10 + BACKUP_SAVE_INTERVAL 500 + TIME_STEP 0.003 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.007 0.00 0.002 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.007 0.00 0.002 - POINT_FOR_MONITORING_PLANES 0.007 0.00 0.002 + POINT_FOR_MONITORING_PLANES 0.007 0.00 0.002 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - DYNAMIC_VISCOSITY 2.0e-4 - HEAT_CAPACITY 1.0 - GRAVITATIONAL_VECTOR 0.0 0.0 0.0 + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 2.0e-4 + HEAT_CAPACITY 1.0 + GRAVITATIONAL_VECTOR 0.0 0.0 0.0 - TURBULENCE_MODEL none - PRESSURE_DROPS 3.6 0.0 0.0 - MASS_FLOW_RATES 0.5 0.0 0.0 + TURBULENCE_MODEL none + PRESSURE_DROPS 3.6 0.0 0.0 + MASS_FLOW_RATES 0.5 0.0 0.0 #---------------- # Swarm related #---------------- - PARTICLE_TRACKING yes - SWARM_DIAMETER 5.0e-04 - SWARM_DENSITY 1.0e+03 - NUMBER_OF_SWARM_SUB_STEPS 12 - MAX_PARTICLES 256 - SWARM_COEFFICIENT_OF_RESTITUTION 1.00 - STARTING_TIME_STEP_FOR_SWARM_COMPUTATION 500 + PARTICLE_TRACKING yes + SWARM_DIAMETER 5.0e-04 + SWARM_DENSITY 1.0e+03 + NUMBER_OF_SWARM_SUB_STEPS 12 + MAX_PARTICLES 256 + SWARM_COEFFICIENT_OF_RESTITUTION 1.00 + STARTING_TIME_STEP_FOR_SWARM_COMPUTATION 500 #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 250 + PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 250 - TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod + TIME_INTEGRATION_SCHEME linear + ADVECTION_SCHEME_FOR_MOMENTUM minmod #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 #-------------------- # Initial conditions diff --git a/Tests/Swarm/T_Junction_Circular/control b/Tests/Swarm/T_Junction_Circular/control index e11eb8890..b5c59d9e8 100644 --- a/Tests/Swarm/T_Junction_Circular/control +++ b/Tests/Swarm/T_Junction_Circular/control @@ -1,56 +1,54 @@ #---------- # Prologue #---------- - PROBLEM_NAME t_junction - HEAT_TRANSFER no + PROBLEM_NAME t_junction + HEAT_TRANSFER no - NUMBER_OF_TIME_STEPS 1200 + NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 600 + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 600 - TIME_STEP 0.001 + TIME_STEP 0.001 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.0 0.0 0.0 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.0 0.0 0.0 - POINT_FOR_MONITORING_PLANES 0.0 0.0 0.0 + POINT_FOR_MONITORING_PLANES 0.0 0.0 0.0 #----------------- # Physical models #----------------- + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 1.8e-5 - MASS_DENSITY 1.0 - DYNAMIC_VISCOSITY 1.8e-5 - - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM upwind + ADVECTION_SCHEME_FOR_MOMENTUM upwind #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MIN_SIMPLE_ITERATIONS 6 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 666 + MIN_SIMPLE_ITERATIONS 6 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 666 #-------------------- # Initial conditions diff --git a/Tests/Swarm/T_Junction_Square/control-1 b/Tests/Swarm/T_Junction_Square/control-1 index fca96a3b6..4d120b2e7 100644 --- a/Tests/Swarm/T_Junction_Square/control-1 +++ b/Tests/Swarm/T_Junction_Square/control-1 @@ -1,55 +1,55 @@ #---------- # Prologue #---------- - PROBLEM_NAME t_junction - HEAT_TRANSFER no + PROBLEM_NAME t_junction + HEAT_TRANSFER no - NUMBER_OF_TIME_STEPS 1200 + NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 120 - BACKUP_SAVE_INTERVAL 600 - SAVE_INITIAL_CONDITION no - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 120 + BACKUP_SAVE_INTERVAL 600 + SAVE_INITIAL_CONDITION no + SAVE_RESULTS_AT_BOUNDARIES no - TIME_STEP 1.0e-3 + TIME_STEP 1.0e-3 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.0 0.0 0.0 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.0 0.0 0.0 - POINT_FOR_MONITORING_PLANES 0.0 0.0 0.0 + POINT_FOR_MONITORING_PLANES 0.0 0.0 0.0 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - DYNAMIC_VISCOSITY 1.8e-5 + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 1.8e-5 - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING piso - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.5 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.5 + PRESSURE_MOMENTUM_COUPLING piso + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.5 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.5 - TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM upwind + TIME_INTEGRATION_SCHEME linear + ADVECTION_SCHEME_FOR_MOMENTUM upwind #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MIN_SIMPLE_ITERATIONS 3 - MAX_ITERATIONS_FOR_MOMENTUM_SOLVER 33 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 333 + MIN_SIMPLE_ITERATIONS 3 + MAX_ITERATIONS_FOR_MOMENTUM_SOLVER 33 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 333 #-------------------- # Initial conditions diff --git a/Tests/Swarm/T_Junction_Square/control-2 b/Tests/Swarm/T_Junction_Square/control-2 index 827d2db8b..674778aa3 100644 --- a/Tests/Swarm/T_Junction_Square/control-2 +++ b/Tests/Swarm/T_Junction_Square/control-2 @@ -1,63 +1,63 @@ #---------- # Prologue #---------- - PROBLEM_NAME t_junction - HEAT_TRANSFER no - PARTICLE_TRACKING yes + PROBLEM_NAME t_junction + HEAT_TRANSFER no + PARTICLE_TRACKING yes - NUMBER_OF_TIME_STEPS 3600 + NUMBER_OF_TIME_STEPS 3600 - RESULTS_SAVE_INTERVAL 120 - SWARM_SAVE_INTERVAL 6 - BACKUP_SAVE_INTERVAL 600 - SAVE_INITIAL_CONDITION no - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 120 + SWARM_SAVE_INTERVAL 6 + BACKUP_SAVE_INTERVAL 600 + SAVE_INITIAL_CONDITION no + SAVE_RESULTS_AT_BOUNDARIES no - LOAD_BACKUP_NAME t_junction-ts001200.backup - TIME_STEP 1.0e-4 + LOAD_BACKUP_NAME t_junction-ts001200.backup + TIME_STEP 1.0e-4 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.0 0.0 0.0 + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.0 0.0 0.0 - POINT_FOR_MONITORING_PLANES 0.0 0.0 0.0 + POINT_FOR_MONITORING_PLANES 0.0 0.0 0.0 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - DYNAMIC_VISCOSITY 1.8e-5 - MAX_PARTICLES 16 - SWARM_DENSITY 1000.0 - SWARM_DIAMETER 2.5e-5 - SWARM_COEFFICIENT_OF_RESTITUTION 0.0 + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 1.8e-5 + MAX_PARTICLES 16 + SWARM_DENSITY 1000.0 + SWARM_DIAMETER 2.5e-5 + SWARM_COEFFICIENT_OF_RESTITUTION 0.0 # NUMBER_OF_SWARM_SUBSTEPS 120 - TURBULENCE_MODEL none + TURBULENCE_MODEL none #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING piso - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.5 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.5 + PRESSURE_MOMENTUM_COUPLING piso + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.5 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.5 - TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM upwind + TIME_INTEGRATION_SCHEME linear + ADVECTION_SCHEME_FOR_MOMENTUM upwind #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-3 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 - MIN_SIMPLE_ITERATIONS 1 - MAX_ITERATIONS_FOR_MOMENTUM_SOLVER 33 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 333 + MIN_SIMPLE_ITERATIONS 1 + MAX_ITERATIONS_FOR_MOMENTUM_SOLVER 33 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 333 #-------------------- # Initial conditions diff --git a/Tests/Swarm/Three_Phase_Flow/control b/Tests/Swarm/Three_Phase_Flow/control index 8e886ead6..ac267287c 100644 --- a/Tests/Swarm/Three_Phase_Flow/control +++ b/Tests/Swarm/Three_Phase_Flow/control @@ -1,98 +1,93 @@ #---------- # Prologue #---------- - PROBLEM_NAME cavity - HEAT_TRANSFER no -INTERFACE_TRACKING yes - TRACK_FRONT yes + PROBLEM_NAME cavity + HEAT_TRANSFER no + INTERFACE_TRACKING yes + TRACK_FRONT yes - NUMBER_OF_TIME_STEPS 1200 + NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 5 - SWARM_SAVE_INTERVAL 5 - BACKUP_SAVE_INTERVAL 3000 + RESULTS_SAVE_INTERVAL 5 + SWARM_SAVE_INTERVAL 5 + BACKUP_SAVE_INTERVAL 3000 #----------------------------------------------------- # dt <= sqrt( (rho_L + rho_G) * min_vol/(8 * sigma)) # # dt <= sqrt( 1001 * 5.5e-12 / (8 * 0.1)) = 8.29e-5 #----------------------------------------------------- - TIME_STEP 0.0001 # original (for finer grid) was 0.0005 + TIME_STEP 0.0001 # original (for finer grid) was 0.0005 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 0 - MONITORING_POINT_001 0.0 0.0 0.0 + NUMBER_OF_MONITORING_POINTS 0 + MONITORING_POINT_001 0.0 0.0 0.0 - POINT_FOR_MONITORING_PLANES 0.0 0.0 0.0 + POINT_FOR_MONITORING_PLANES 0.0 0.0 0.0 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0e+3 - THERMAL_CONDUCTIVITY 1.4080e-4 - DYNAMIC_VISCOSITY 0.001 - HEAT_CAPACITY 1.0 + MASS_DENSITY 1.0e+3 + THERMAL_CONDUCTIVITY 1.4080e-4 + DYNAMIC_VISCOSITY 0.001 + HEAT_CAPACITY 1.0 #--------------------------------------------- # La = gamma * rho * L / mu^2 # = 0.05 * 1000 * 0.005 / 0.005^2 = 10'000 #--------------------------------------------- - PHASE_DENSITIES 1.0 1.0e3 - PHASE_VISCOSITIES 0.005 0.005 # 0.01 0.01 - SURFACE_TENSION 0.05 # 0.36 -TURBULENCE_MODEL none - GRAVITATIONAL_VECTOR 0.0 0.0 -9.81 - -PARTICLE_TRACKING yes - SWARM_DIAMETER 5.0e-04 - SWARM_DENSITY 1.0e+04 - NUMBER_OF_SWARM_SUB_STEPS 12 - MAX_PARTICLES 1250 - SWARM_COEFFICIENT_OF_RESTITUTION 1.00 - STARTING_TIME_STEP_FOR_SWARM_COMPUTATION 1 + PHASE_DENSITIES 1.0 1.0e3 + PHASE_VISCOSITIES 0.005 0.005 # 0.01 0.01 + SURFACE_TENSION 0.05 # 0.36 + + GRAVITATIONAL_VECTOR 0.0 0.0 -9.81 + + PARTICLE_TRACKING yes + SWARM_DIAMETER 5.0e-04 + SWARM_DENSITY 1.0e+04 + NUMBER_OF_SWARM_SUB_STEPS 12 + MAX_PARTICLES 1250 + SWARM_COEFFICIENT_OF_RESTITUTION 1.00 + STARTING_TIME_STEP_FOR_SWARM_COMPUTATION 1 #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - - TIME_INTEGRATION_SCHEME linear + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - ADVECTION_SCHEME_FOR_MOMENTUM quick - ADVECTION_SCHEME_FOR_VOF cicsam - GU_CORRECTION yes - CHOI_CORRECTION yes + TIME_INTEGRATION_SCHEME linear - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - GRADIENT_METHOD_FOR_VOF gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 200 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-4 + ADVECTION_SCHEME_FOR_MOMENTUM quick + ADVECTION_SCHEME_FOR_VOF cicsam + GU_CORRECTION yes + CHOI_CORRECTION yes -# NODAL_CURVATURE yes + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + GRADIENT_METHOD_FOR_VOF gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 200 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-4 #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-6 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-03 - TOLERANCE_FOR_VOF_SOLVER 1.e-6 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 100 - MAX_SIMPLE_ITERATIONS 20 - MAX_SMOOTHING_CYCLES_CURVATURE_VOF 12 - MAX_SMOOTHING_CYCLES_NORMAL_VOF 0 - COMPRESION_VOF no - COMPRESION_FACTOR_VOF 1.0 - MIN_SIMPLE_ITERATIONS 3 - #DUAL_TIME_STEP_VOF yes + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-6 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-3 + TOLERANCE_FOR_VOF_SOLVER 1.e-6 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 100 + MAX_SIMPLE_ITERATIONS 20 + MAX_SMOOTHING_CYCLES_CURVATURE_VOF 12 + MAX_SMOOTHING_CYCLES_NORMAL_VOF 0 + MIN_SIMPLE_ITERATIONS 3 +# DUAL_TIME_STEP_VOF yes #-------------------- # Initial conditions diff --git a/Tests/Vof/Dam_Break_2d/control b/Tests/Vof/Dam_Break_2d/control index f68c5c6e4..c1cf7809e 100644 --- a/Tests/Vof/Dam_Break_2d/control +++ b/Tests/Vof/Dam_Break_2d/control @@ -1,73 +1,69 @@ #---------- # Prologue #---------- - PROBLEM_NAME dam_2d -INTERFACE_TRACKING yes + PROBLEM_NAME dam_2d + INTERFACE_TRACKING yes # sqrt(9.81/0.6) = 4.04351332383 # if dt = 1.0 / sqrt(9.81/0.6) / 1200 = 0.0002060914; # 1200 time steps will correspond to 1 in the thesis # 9600 time steps will correspond to 8 in the thesis # 12000 time steps will correspond to 8 in the thesis - TIME_STEP 0.0002060914 + TIME_STEP 0.0002060914 - NUMBER_OF_TIME_STEPS 12000 - RESULTS_SAVE_INTERVAL 300 - BACKUP_SAVE_INTERVAL 3000 - SAVE_RESULTS_AT_BOUNDARIES no + NUMBER_OF_TIME_STEPS 12000 + RESULTS_SAVE_INTERVAL 300 + BACKUP_SAVE_INTERVAL 3000 + SAVE_RESULTS_AT_BOUNDARIES no #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 0 - MONITORING_POINT_001 1.5 0.0 0.75 + NUMBER_OF_MONITORING_POINTS 0 + MONITORING_POINT_001 1.5 0.0 0.75 - POINT_FOR_MONITORING_PLANES 1.5 0.0 0.75 + POINT_FOR_MONITORING_PLANES 1.5 0.0 0.75 #----------------- # Physical models #----------------- - MASS_DENSITY 1.0 - DYNAMIC_VISCOSITY 1.0 + MASS_DENSITY 1.0 + DYNAMIC_VISCOSITY 1.0 - PHASE_DENSITIES 1.0e3 1.0e0 - PHASE_VISCOSITIES 1.0e-3 1.8e-5 - SURFACE_TENSION 0.0 -TURBULENCE_MODEL none - GRAVITATIONAL_VECTOR 0.0 0.0 -9.81 + PHASE_DENSITIES 1.0e3 1.0e0 + PHASE_VISCOSITIES 1.0e-3 1.8e-5 + SURFACE_TENSION 0.0 - REFERENCE_DENSITY 1.0 + GRAVITATIONAL_VECTOR 0.0 0.0 -9.81 + + REFERENCE_DENSITY 1.0 #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING piso - PRESSURE_MOMENTUM_COUPLING piso - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.9 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod - ADVECTION_SCHEME_FOR_VOF cicsam + ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_VOF cicsam #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-12 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-03 - TOLERANCE_FOR_VOF_SOLVER 1.e-12 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 80 - MAX_SIMPLE_ITERATIONS 20 - MAX_SMOOTHING_CYCLES_CURVATURE_VOF 8 - MAX_SMOOTHING_CYCLES_NORMAL_VOF 0 - COMPRESION_VOF no - COMPRESION_FACTOR_VOF 1.0 - MIN_SIMPLE_ITERATIONS 1 - #DUAL_TIME_STEP_VOF yes + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-12 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-03 + TOLERANCE_FOR_VOF_SOLVER 1.e-12 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 80 + MAX_SIMPLE_ITERATIONS 20 + MAX_SMOOTHING_CYCLES_CURVATURE_VOF 8 + MAX_SMOOTHING_CYCLES_NORMAL_VOF 0 + MIN_SIMPLE_ITERATIONS 1 #-------------------- # Initial conditions diff --git a/Tests/Vof/Dam_Break_3d/control b/Tests/Vof/Dam_Break_3d/control index a21772b19..eb9fedfe2 100644 --- a/Tests/Vof/Dam_Break_3d/control +++ b/Tests/Vof/Dam_Break_3d/control @@ -1,72 +1,66 @@ #---------- # Prologue #---------- - PROBLEM_NAME obstacle - HEAT_TRANSFER no - INTERFACE_TRACKING yes + PROBLEM_NAME obstacle + HEAT_TRANSFER no + INTERFACE_TRACKING yes - NUMBER_OF_TIME_STEPS 7000 + NUMBER_OF_TIME_STEPS 7000 - RESULTS_SAVE_INTERVAL 60 - BACKUP_SAVE_INTERVAL 60 - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 60 + BACKUP_SAVE_INTERVAL 60 + SAVE_RESULTS_AT_BOUNDARIES no - #LOAD_BACKUP_NAME obstacle-ts005580.backup - TIME_STEP 1.0e-3 + TIME_STEP 1.0e-3 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 0 - MONITORING_POINT_001 0.5 0.1 0.75 + NUMBER_OF_MONITORING_POINTS 0 + MONITORING_POINT_001 0.5 0.1 0.75 - POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 + POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 #----------------- # Physical models #----------------- + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 1.4080e-4 + DYNAMIC_VISCOSITY 1.0 + HEAT_CAPACITY 1.0 - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 1.4080e-4 - DYNAMIC_VISCOSITY 1.0 - HEAT_CAPACITY 1.0 - - PHASE_DENSITIES 1.0e3 1.0e0 - PHASE_VISCOSITIES 1.0e-3 1.8e-5 - SURFACE_TENSION 0.0 - TURBULENCE_MODEL none - GRAVITATIONAL_VECTOR 0.0 0.0 -9.81 + PHASE_DENSITIES 1.0e3 1.0e0 + PHASE_VISCOSITIES 1.0e-3 1.8e-5 + SURFACE_TENSION 0.0 + TURBULENCE_MODEL none + GRAVITATIONAL_VECTOR 0.0 0.0 -9.81 #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING piso - PRESSURE_MOMENTUM_COUPLING piso - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.9 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.9 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod - ADVECTION_SCHEME_FOR_VOF cicsam + ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_VOF cicsam #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-12 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-03 - TOLERANCE_FOR_VOF_SOLVER 1.e-12 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 80 - MAX_SIMPLE_ITERATIONS 20 - MAX_SMOOTHING_CYCLES_CURVATURE_VOF 8 - MAX_SMOOTHING_CYCLES_NORMAL_VOF 0 - COMPRESION_VOF no - COMPRESION_FACTOR_VOF 1.0 - MIN_SIMPLE_ITERATIONS 1 - #DUAL_TIME_STEP_VOF yes + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-12 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-03 + TOLERANCE_FOR_VOF_SOLVER 1.e-12 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 80 + MAX_SIMPLE_ITERATIONS 20 + MAX_SMOOTHING_CYCLES_CURVATURE_VOF 8 + MAX_SMOOTHING_CYCLES_NORMAL_VOF 0 + MIN_SIMPLE_ITERATIONS 1 #-------------------- # Initial conditions diff --git a/Tests/Vof/Fuel_Bundle/control b/Tests/Vof/Fuel_Bundle/control index 6883aecc4..f7f845c82 100644 --- a/Tests/Vof/Fuel_Bundle/control +++ b/Tests/Vof/Fuel_Bundle/control @@ -1,71 +1,67 @@ #---------- # Prologue #---------- - PROBLEM_NAME fuel_bundle - HEAT_TRANSFER no - INTERFACE_TRACKING yes - TRACK_FRONT yes + PROBLEM_NAME fuel_bundle + HEAT_TRANSFER no + INTERFACE_TRACKING yes + TRACK_FRONT yes - NUMBER_OF_TIME_STEPS 1200 - RESULTS_SAVE_INTERVAL 10 - BACKUP_SAVE_INTERVAL 120 + NUMBER_OF_TIME_STEPS 1200 + RESULTS_SAVE_INTERVAL 10 + BACKUP_SAVE_INTERVAL 120 - TIME_STEP 0.005 + TIME_STEP 0.005 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 0 - MONITORING_POINT_001 0.5 0.1 0.75 + NUMBER_OF_MONITORING_POINTS 0 + MONITORING_POINT_001 0.5 0.1 0.75 - POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 + POINT_FOR_MONITORING_PLANES 0.5 0.1 0.75 #----------------- # Physical models #----------------- - PHASE_DENSITIES 1.0e2 1.0e3 - PHASE_VISCOSITIES 1.0e0 1.0e1 - SURFACE_TENSION 24.5 - TURBULENCE_MODEL none - GRAVITATIONAL_VECTOR 0.0 0.0 -0.98 + PHASE_DENSITIES 1.0e2 1.0e3 + PHASE_VISCOSITIES 1.0e0 1.0e1 + SURFACE_TENSION 24.5 + TURBULENCE_MODEL none + GRAVITATIONAL_VECTOR 0.0 0.0 -0.98 #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING piso - PRESSURE_MOMENTUM_COUPLING piso + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 + TIME_INTEGRATION_SCHEME linear - TIME_INTEGRATION_SCHEME linear + ADVECTION_SCHEME_FOR_MOMENTUM quick + ADVECTION_SCHEME_FOR_VOF cicsam - ADVECTION_SCHEME_FOR_MOMENTUM quick - ADVECTION_SCHEME_FOR_VOF cicsam + GU_CORRECTION yes + CHOI_CORRECTION yes - GU_CORRECTION yes - CHOI_CORRECTION yes - - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 200 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-4 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 200 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-4 #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-12 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-03 - TOLERANCE_FOR_VOF_SOLVER 1.e-12 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 100 - MAX_SIMPLE_ITERATIONS 20 - MAX_SMOOTHING_CYCLES_CURVATURE_VOF 12 - MAX_SMOOTHING_CYCLES_NORMAL_VOF 0 - COMPRESION_VOF no - COMPRESION_FACTOR_VOF 1.0 - MIN_SIMPLE_ITERATIONS 3 - #DUAL_TIME_STEP_VOF yes + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-12 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-03 + TOLERANCE_FOR_VOF_SOLVER 1.e-12 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 100 + MAX_SIMPLE_ITERATIONS 20 + MAX_SMOOTHING_CYCLES_CURVATURE_VOF 12 + MAX_SMOOTHING_CYCLES_NORMAL_VOF 0 + MIN_SIMPLE_ITERATIONS 3 #-------------------- # Initial conditions diff --git a/Tests/Vof/Mencinger_And_Zun/control b/Tests/Vof/Mencinger_And_Zun/control index 206c1fa80..2e9cb07a8 100644 --- a/Tests/Vof/Mencinger_And_Zun/control +++ b/Tests/Vof/Mencinger_And_Zun/control @@ -1,85 +1,81 @@ #---------- # Prologue #---------- - PROBLEM_NAME menc - HEAT_TRANSFER no - INTERFACE_TRACKING yes + PROBLEM_NAME menc + HEAT_TRANSFER no + INTERFACE_TRACKING yes - TIME_STEP 100 - TIME_INTEGRATION_SCHEME parabolic + TIME_STEP 100 + TIME_INTEGRATION_SCHEME parabolic + + CHOI_CORRECTION yes + GU_CORRECTION yes - CHOI_CORRECTION yes - GU_CORRECTION yes # 6000 time steps seems to be enough to reach a steady state with dt= 0.1 # 600 time steps seems to be enough to reach a steady state with dt= 1 # 200 time steps seems to be enough to reach a steady state with dt= 10 # 60 time steps seems to be enough to reach a steady state with dt=100 # 10 time steps seems to be enough to reach a steady state with dt=1e+5 - NUMBER_OF_TIME_STEPS 600 - MAX_SIMPLE_ITERATIONS 6 - MIN_SIMPLE_ITERATIONS 6 + NUMBER_OF_TIME_STEPS 600 + MAX_SIMPLE_ITERATIONS 6 + MIN_SIMPLE_ITERATIONS 6 - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 - MAX_GAUSS_GRADIENTS_ITERATIONS 2000 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-15 - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 2000 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-15 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - RESULTS_SAVE_INTERVAL 10 - BACKUP_SAVE_INTERVAL 10000 - SAVE_INITIAL_CONDITION yes - SAVE_RESULTS_AT_BOUNDARIES no + RESULTS_SAVE_INTERVAL 10 + BACKUP_SAVE_INTERVAL 10000 + SAVE_INITIAL_CONDITION yes + SAVE_RESULTS_AT_BOUNDARIES no #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 0 - MONITORING_POINT_001 0.6 0.05 0.05 + NUMBER_OF_MONITORING_POINTS 0 + MONITORING_POINT_001 0.6 0.05 0.05 - POINT_FOR_MONITORING_PLANES 0.6 0.05 0.05 + POINT_FOR_MONITORING_PLANES 0.6 0.05 0.05 #----------------- # Physical models #----------------- # Phase 1 is liquid - PHASE_DENSITIES 1.00 1.0e+3 - PHASE_VISCOSITIES 1.0e-3 1.0e-3 - SURFACE_TENSION 0.0 - MASS_TRANSFER no - TRACK_FRONT no - SATURATION_TEMPERATURE 100.0 + PHASE_DENSITIES 1.00 1.0e+3 + PHASE_VISCOSITIES 1.0e-3 1.0e-3 + SURFACE_TENSION 0.0 + MASS_TRANSFER no + TRACK_FRONT no + SATURATION_TEMPERATURE 100.0 - TURBULENCE_MODEL none - GRAVITATIONAL_VECTOR 10.0 0.0 0.0 + TURBULENCE_MODEL none + GRAVITATIONAL_VECTOR 10.0 0.0 0.0 - REFERENCE_DENSITY 0.0 + REFERENCE_DENSITY 0.0 #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - ADVECTION_SCHEME_FOR_MOMENTUM minmod - ADVECTION_SCHEME_FOR_VOF cicsam + ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_VOF cicsam #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-12 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-16 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-04 - TOLERANCE_FOR_VOF_SOLVER 1.e-06 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 900 - MAX_SMOOTHING_CYCLES_CURVATURE_VOF 8 - MAX_SMOOTHING_CYCLES_NORMAL_VOF 0 - TEMPORAL_PRESSURE_CORRECTION no - COMPRESION_VOF no - COMPRESION_FACTOR_VOF 1.0 - #DUAL_TIME_STEP_VOF yes + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-12 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-16 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-04 + TOLERANCE_FOR_VOF_SOLVER 1.e-06 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 900 + MAX_SMOOTHING_CYCLES_CURVATURE_VOF 8 + MAX_SMOOTHING_CYCLES_NORMAL_VOF 0 #-------------------- # Initial conditions velocity was 0.05 for nice transport of vof diff --git a/Tests/Vof/Rising_Bubble/control b/Tests/Vof/Rising_Bubble/control index 37ad0125f..45b23c955 100644 --- a/Tests/Vof/Rising_Bubble/control +++ b/Tests/Vof/Rising_Bubble/control @@ -1,78 +1,73 @@ #---------- # Prologue #---------- - PROBLEM_NAME cavity - HEAT_TRANSFER no - INTERFACE_TRACKING yes + PROBLEM_NAME cavity + HEAT_TRANSFER no + INTERFACE_TRACKING yes - NUMBER_OF_TIME_STEPS 600 - TIME_STEP 0.005 # original (for finer grid) was 0.0005 + NUMBER_OF_TIME_STEPS 600 + TIME_STEP 0.005 # original (for finer grid) was 0.0005 - RESULTS_SAVE_INTERVAL 60 - BACKUP_SAVE_INTERVAL 300 - # LOAD_BACKUP_NAME cavity-ts000060.backup + RESULTS_SAVE_INTERVAL 60 + BACKUP_SAVE_INTERVAL 300 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 0 - MONITORING_POINT_001 0.0 0.0 0.0 + NUMBER_OF_MONITORING_POINTS 0 + MONITORING_POINT_001 0.0 0.0 0.0 - POINT_FOR_MONITORING_PLANES 0.0 0.0 0.0 + POINT_FOR_MONITORING_PLANES 0.0 0.0 0.0 #----------------- # Physical models #----------------- - PHASE_DENSITIES 1.0e2 1.0e3 - PHASE_VISCOSITIES 1.0e0 1.0e1 - SURFACE_TENSION 24.5 - TURBULENCE_MODEL none - GRAVITATIONAL_VECTOR 0.0 0.0 -0.98 + PHASE_DENSITIES 1.0e2 1.0e3 + PHASE_VISCOSITIES 1.0e0 1.0e1 + SURFACE_TENSION 24.5 + TURBULENCE_MODEL none + GRAVITATIONAL_VECTOR 0.0 0.0 -0.98 #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING piso - PRESSURE_MOMENTUM_COUPLING piso + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 1.0 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 1.0 + TIME_INTEGRATION_SCHEME linear - TIME_INTEGRATION_SCHEME linear + ADVECTION_SCHEME_FOR_MOMENTUM quick + ADVECTION_SCHEME_FOR_VOF cicsam - ADVECTION_SCHEME_FOR_MOMENTUM quick - ADVECTION_SCHEME_FOR_VOF cicsam + GU_CORRECTION yes + CHOI_CORRECTION yes - GU_CORRECTION yes - CHOI_CORRECTION yes - - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - MAX_GAUSS_GRADIENTS_ITERATIONS 200 - TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-4 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + MAX_GAUSS_GRADIENTS_ITERATIONS 200 + TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-4 #------------------------ # Linear solver settings #------------------------ - LINEAR_SOLVERS native - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-12 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-03 - TOLERANCE_FOR_VOF_SOLVER 1.e-12 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 100 - MAX_SIMPLE_ITERATIONS 20 - MAX_SMOOTHING_CYCLES_CURVATURE_VOF 12 - MAX_SMOOTHING_CYCLES_NORMAL_VOF 0 - COMPRESION_VOF no - COMPRESION_FACTOR_VOF 1.0 - MIN_SIMPLE_ITERATIONS 3 - #DUAL_TIME_STEP_VOF yes - - PETSC_OPTIONS_FOR_PRESSURE - SOLVER cg - PREC hypre # asm or hypre - PREC_OPTS - TOLERANCE 1.0e-3 + LINEAR_SOLVERS native + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-12 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-03 + TOLERANCE_FOR_VOF_SOLVER 1.e-12 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 100 + MAX_SIMPLE_ITERATIONS 20 + MAX_SMOOTHING_CYCLES_CURVATURE_VOF 12 + MAX_SMOOTHING_CYCLES_NORMAL_VOF 0 + MIN_SIMPLE_ITERATIONS 3 + + PETSC_OPTIONS_FOR_PRESSURE + SOLVER cg + PREC hypre # asm or hypre + PREC_OPTS + TOLERANCE 1.0e-3 #-------------------- # Initial conditions diff --git a/Tests/Vof/Stefan/control b/Tests/Vof/Stefan/control index 02f3fc3fa..3c9ab2150 100644 --- a/Tests/Vof/Stefan/control +++ b/Tests/Vof/Stefan/control @@ -36,59 +36,54 @@ #----------------- # Phase 0 is vapor, phase 1 is liquid - PHASE_DENSITIES 0.597 958.4 - PHASE_VISCOSITIES 1.0e-3 1.0e-3 - PHASE_CONDUCTIVITIES 0.025 0.679 - PHASE_CAPACITIES 2030.0 4216.0 - SURFACE_TENSION 0.0 - MASS_TRANSFER yes - SATURATION_TEMPERATURE 0.1 + PHASE_DENSITIES 0.597 958.4 + PHASE_VISCOSITIES 1.0e-3 1.0e-3 + PHASE_CONDUCTIVITIES 0.025 0.679 + PHASE_CAPACITIES 2030.0 4216.0 + SURFACE_TENSION 0.0 + MASS_TRANSFER yes + SATURATION_TEMPERATURE 0.1 - TURBULENCE_MODEL none - GRAVITATIONAL_VECTOR 0.0 0.0 0.0 + TURBULENCE_MODEL none + GRAVITATIONAL_VECTOR 0.0 0.0 0.0 - REFERENCE_DENSITY 1.0 + REFERENCE_DENSITY 1.0 #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.95 - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.95 + TIME_INTEGRATION_SCHEME linear - TIME_INTEGRATION_SCHEME linear + ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_VOF cicsam - ADVECTION_SCHEME_FOR_MOMENTUM minmod - ADVECTION_SCHEME_FOR_VOF cicsam + GU_CORRECTION yes + CHOI_CORRECTION yes - GU_CORRECTION yes - CHOI_CORRECTION yes - - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - GRADIENT_METHOD_FOR_VOF gauss_theorem - TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-4 - MAX_GAUSS_GRADIENTS_ITERATIONS 200 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + GRADIENT_METHOD_FOR_VOF gauss_theorem + TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-4 + MAX_GAUSS_GRADIENTS_ITERATIONS 200 #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-05 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-05 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-03 - TOLERANCE_FOR_VOF_SOLVER 1.e-05 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 8 - MAX_SMOOTHING_CYCLES_CURVATURE_VOF 8 - MAX_SMOOTHING_CYCLES_NORMAL_VOF 0 - TEMPORAL_PRESSURE_CORRECTION yes - COMPRESION_VOF no - COMPRESION_FACTOR_VOF 1.0 - #DUAL_TIME_STEP_VOF yes + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-05 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-05 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-03 + TOLERANCE_FOR_VOF_SOLVER 1.e-05 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 8 + MAX_SMOOTHING_CYCLES_CURVATURE_VOF 8 + MAX_SMOOTHING_CYCLES_NORMAL_VOF 0 #--------------------- # Boundary conditions diff --git a/Tests/Vof/Sucking/control b/Tests/Vof/Sucking/control index 678172d89..2b815cc23 100644 --- a/Tests/Vof/Sucking/control +++ b/Tests/Vof/Sucking/control @@ -1,94 +1,90 @@ #---------- # Prologue #---------- - PROBLEM_NAME sucking - HEAT_TRANSFER yes - INTERFACE_TRACKING yes - TRACK_FRONT yes + PROBLEM_NAME sucking + HEAT_TRANSFER yes + INTERFACE_TRACKING yes + TRACK_FRONT yes # TIME_STEP 2.5e-3 # NUMBER_OF_TIME_STEPS 3600 - TIME_STEP 2.5e-3 - NUMBER_OF_TIME_STEPS 12 + TIME_STEP 2.5e-3 + NUMBER_OF_TIME_STEPS 12 # TIME_STEP 1.0e-2 # NUMBER_OF_TIME_STEPS 900 - MAX_SIMPLE_ITERATIONS 12 - MIN_SIMPLE_ITERATIONS 6 + MAX_SIMPLE_ITERATIONS 12 + MIN_SIMPLE_ITERATIONS 6 - RESULTS_SAVE_INTERVAL 1 - SAVE_INITIAL_CONDITION yes - SAVE_RESULTS_AT_BOUNDARIES no - BACKUP_SAVE_INTERVAL 1200 + RESULTS_SAVE_INTERVAL 1 + SAVE_INITIAL_CONDITION yes + SAVE_RESULTS_AT_BOUNDARIES no + BACKUP_SAVE_INTERVAL 1200 #------------------- # Monitoring points #------------------- - NUMBER_OF_MONITORING_POINTS 0 - MONITORING_POINT_001 0.6 0.05 0.05 + NUMBER_OF_MONITORING_POINTS 0 + MONITORING_POINT_001 0.6 0.05 0.05 - POINT_FOR_MONITORING_PLANES 0.6 0.05 0.05 + POINT_FOR_MONITORING_PLANES 0.6 0.05 0.05 #----------------- # Physical models #----------------- # Phase 0 is vapor, phase 1 is liquid - PHASE_DENSITIES 0.597 958.4 - PHASE_VISCOSITIES 1.0e-3 1.0e-3 - PHASE_CONDUCTIVITIES 0.025 0.679 - PHASE_CAPACITIES 2030.0 4216.0 - SURFACE_TENSION 0.0 - MASS_TRANSFER yes - SATURATION_TEMPERATURE 10.0 + PHASE_DENSITIES 0.597 958.4 + PHASE_VISCOSITIES 1.0e-3 1.0e-3 + PHASE_CONDUCTIVITIES 0.025 0.679 + PHASE_CAPACITIES 2030.0 4216.0 + SURFACE_TENSION 0.0 + MASS_TRANSFER yes + SATURATION_TEMPERATURE 10.0 - TURBULENCE_MODEL none - GRAVITATIONAL_VECTOR 0.0 0.0 0.0 + TURBULENCE_MODEL none + GRAVITATIONAL_VECTOR 0.0 0.0 0.0 - REFERENCE_DENSITY 1.0 + REFERENCE_DENSITY 1.0 #---------------------- # Numerical parameters #---------------------- - PRESSURE_MOMENTUM_COUPLING simple + PRESSURE_MOMENTUM_COUPLING simple - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.95 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.7 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.3 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.95 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod - ADVECTION_SCHEME_FOR_VOF cicsam + ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_VOF cicsam - GU_CORRECTION yes - CHOI_CORRECTION yes + GU_CORRECTION yes + CHOI_CORRECTION yes - GRADIENT_METHOD_FOR_PRESSURE gauss_theorem - GRADIENT_METHOD_FOR_VOF gauss_theorem - TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-4 - MAX_GAUSS_GRADIENTS_ITERATIONS 200 + GRADIENT_METHOD_FOR_PRESSURE gauss_theorem + GRADIENT_METHOD_FOR_VOF gauss_theorem + TOLERANCE_FOR_GAUSS_GRADIENTS 1.0e-4 + MAX_GAUSS_GRADIENTS_ITERATIONS 200 #------------------------ # Linear solver settings #------------------------ - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-05 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-05 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-03 - TOLERANCE_FOR_VOF_SOLVER 1.e-05 - MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 - MAX_ITERATIONS_FOR_ENERGY_SOLVER 8 - MAX_SMOOTHING_CYCLES_CURVATURE_VOF 8 - MAX_SMOOTHING_CYCLES_NORMAL_VOF 0 - TEMPORAL_PRESSURE_CORRECTION yes - COMPRESION_VOF no - COMPRESION_FACTOR_VOF 1.0 - #DUAL_TIME_STEP_VOF yes + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-05 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-05 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-12 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-03 + TOLERANCE_FOR_VOF_SOLVER 1.e-05 + MAX_ITERATIONS_FOR_PRESSURE_SOLVER 256 + MAX_ITERATIONS_FOR_ENERGY_SOLVER 8 + MAX_SMOOTHING_CYCLES_CURVATURE_VOF 8 + MAX_SMOOTHING_CYCLES_NORMAL_VOF 0 #--------------------- # Boundary conditions From ee549a15296ef4f1c25be941ce0e2246a66eecce Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 28 Mar 2023 13:02:09 +0200 Subject: [PATCH 161/223] IMPORTANT: Removed an extra blank like ... ... which was preventing perfornance of backup tests On branch bojan_more_robust_communicator modified: test_build.sh --- Tests/test_build.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests/test_build.sh b/Tests/test_build.sh index bbc4440eb..f821a9347 100755 --- a/Tests/test_build.sh +++ b/Tests/test_build.sh @@ -1019,7 +1019,6 @@ function process_backup_tests { replace_line_with_first_occurence_in_file \ "TURBULENCE_MODEL" \ "TURBULENCE_MODEL rsm_manceau_hanjalic" \ - $TEST_DIR/$RANS_CHANNEL_LR_RSM_DIR/control process_backup_test \ From fa30df882f23cf0f6c9f3dd83c943e7ec6418810 Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 28 Mar 2023 13:10:43 +0200 Subject: [PATCH 162/223] Cosmetic changes in control files --- Tests/Rans/Channel_Re_Tau_590/Rsm/control | 102 ++++++++---------- .../Channel_Re_Tau_590/Uniform_Mesh/control | 83 +++++++------- 2 files changed, 85 insertions(+), 100 deletions(-) diff --git a/Tests/Rans/Channel_Re_Tau_590/Rsm/control b/Tests/Rans/Channel_Re_Tau_590/Rsm/control index 53ec98e4d..f4c8b892d 100644 --- a/Tests/Rans/Channel_Re_Tau_590/Rsm/control +++ b/Tests/Rans/Channel_Re_Tau_590/Rsm/control @@ -1,96 +1,88 @@ #-------------------- # Problem definition #-------------------- - PROBLEM_NAME chan - HEAT_TRANSFER yes - TURBULENT_HEAT_FLUX_MODEL ggdh + PROBLEM_NAME chan + HEAT_TRANSFER yes + TURBULENT_HEAT_FLUX_MODEL ggdh - - PRESSURE_DROPS 0.0036 0.0 0.0 - MASS_FLOW_RATES 2.32 0.0 0.0 + PRESSURE_DROPS 0.0036 0.0 0.0 + MASS_FLOW_RATES 2.32 0.0 0.0 #--------------- # Time stepping #--------------- + TIME_STEP 0.5 + NUMBER_OF_TIME_STEPS 2400 + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 600 - TIME_STEP 0.5 - NUMBER_OF_TIME_STEPS 2400 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 600 - +# Keep the line below, it is needed by test_build.sh script for backup tests # LOAD_BACKUP_NAME chan-ts001800.backup #------------------- -# Monitoring points +# Monitoring points #------------------- + NUMBER_OF_MONITORING_POINTS 1 + MONITORING_POINT_001 0.5 0.5 0.0 - NUMBER_OF_MONITORING_POINTS 1 - MONITORING_POINT_001 0.5 0.5 0.0 - - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.5 #----------------- # Physical models #----------------- - - MASS_DENSITY 1.0 - THERMAL_CONDUCTIVITY 1.4e-4 - DYNAMIC_VISCOSITY 1.0e-4 - HEAT_CAPACITY 1.0 + MASS_DENSITY 1.0 + THERMAL_CONDUCTIVITY 1.4e-4 + DYNAMIC_VISCOSITY 1.0e-4 + HEAT_CAPACITY 1.0 # TURBULENCE_MODEL rsm_manceau_hanjalic - TURBULENCE_MODEL rsm_hanjalic_jakirlic + TURBULENCE_MODEL rsm_hanjalic_jakirlic - TURBULENCE_MODEL_VARIANT none + TURBULENCE_MODEL_VARIANT none # TURBULENCE_MODEL_VARIANT stabilized #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple - - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.4 - SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.4 + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.6 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.4 + SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.4 - TIME_INTEGRATION_SCHEME linear + TIME_INTEGRATION_SCHEME linear - ADVECTION_SCHEME_FOR_MOMENTUM minmod - ADVECTION_SCHEME_FOR_ENERGY smart - ADVECTION_SCHEME_FOR_TURBULENCE smart + ADVECTION_SCHEME_FOR_MOMENTUM minmod + ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_TURBULENCE smart #------------------------ # Linear solver settings #------------------------ - - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 - TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-5 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-7 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 - + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-5 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-5 + TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-5 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-7 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-4 #-------------------- # Initial conditions #-------------------- - - INITIAL_CONDITION - VARIABLES u v w t uu vv ww uv uw vw eps f22 - VALUES 0.1 0.0 0.0 20.0 0.005 0.005 0.005 0.00 0.001 0.0 0.002 0.1 + INITIAL_CONDITION + VARIABLES u v w t uu vv ww uv uw vw eps f22 + VALUES 0.1 0.0 0.0 20 0.005 0.005 0.005 0.00 0.001 0.0 0.002 0.1 #--------------------- # Boundary conditions #--------------------- - - BOUNDARY_CONDITION top_wall - TYPE wall - VARIABLES u v w t uu vv ww uv uw vw eps f22 - VALUES 0.0 0.0 0.0 22 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 - - BOUNDARY_CONDITION bottom_wall - TYPE wall - VARIABLES u v w t uu vv ww uv uw vw eps f22 - VALUES 0.0 0.0 0.0 22 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + BOUNDARY_CONDITION top_wall + TYPE wall + VARIABLES u v w t uu vv ww uv uw vw eps f22 + VALUES 0.0 0.0 0.0 22 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + + BOUNDARY_CONDITION bottom_wall + TYPE wall + VARIABLES u v w t uu vv ww uv uw vw eps f22 + VALUES 0.0 0.0 0.0 22 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 diff --git a/Tests/Rans/Channel_Re_Tau_590/Uniform_Mesh/control b/Tests/Rans/Channel_Re_Tau_590/Uniform_Mesh/control index eda9b2333..c2a05713c 100644 --- a/Tests/Rans/Channel_Re_Tau_590/Uniform_Mesh/control +++ b/Tests/Rans/Channel_Re_Tau_590/Uniform_Mesh/control @@ -1,83 +1,76 @@ #-------------------- # Problem definition #-------------------- + PROBLEM_NAME chan + HEAT_TRANSFER yes - PROBLEM_NAME chan - - HEAT_TRANSFER yes - - PRESSURE_DROPS 0.0036 0.0 0.0 - MASS_FLOW_RATES 0.2 0.0 0.0 + PRESSURE_DROPS 0.0036 0.0 0.0 + MASS_FLOW_RATES 0.2 0.0 0.0 #--------------- # Time stepping #--------------- + TIME_STEP 0.6 + NUMBER_OF_TIME_STEPS 1800 + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 600 - TIME_STEP 0.6 - NUMBER_OF_TIME_STEPS 1800 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 600 - +# Keep the line below, it is needed by test_build.sh script for backup tests # LOAD_BACKUP_NAME chan-ts001800.backup #------------------- -# Monitoring points +# Monitoring points #------------------- + NUMBER_OF_MONITORING_POINTS 5 + MONITORING_POINT_001 0.5 0.5 1.0 + MONITORING_POINT_002 0.5 0.5 0.001 + MONITORING_POINT_003 0.5 0.5 0.01 + MONITORING_POINT_004 0.5 0.5 0.1 + MONITORING_POINT_005 0.5 0.5 0.2 - NUMBER_OF_MONITORING_POINTS 5 - MONITORING_POINT_001 0.5 0.5 1.0 - MONITORING_POINT_002 0.5 0.5 0.001 - MONITORING_POINT_003 0.5 0.5 0.01 - MONITORING_POINT_004 0.5 0.5 0.1 - MONITORING_POINT_005 0.5 0.5 0.2 - - POINT_FOR_MONITORING_PLANES 0.5 0.5 0.514 + POINT_FOR_MONITORING_PLANES 0.5 0.5 0.514 #---------------------------------------- # Fluid properties # Dry air at 27oC in SI units #---------------------------------------- - - MASS_DENSITY 1.177 - DYNAMIC_VISCOSITY 1.846e-5 - - THERMAL_CONDUCTIVITY 2.6240e-2 - HEAT_CAPACITY 1000.0 + MASS_DENSITY 1.177 + DYNAMIC_VISCOSITY 1.846e-5 + THERMAL_CONDUCTIVITY 2.6240e-2 + HEAT_CAPACITY 1000.0 #---------------------------------------- # Physical models #---------------------------------------- - - TURBULENCE_MODEL k_eps_zeta_f + TURBULENCE_MODEL k_eps_zeta_f #---------------------- # Numerical parameters #---------------------- + PRESSURE_MOMENTUM_COUPLING simple - PRESSURE_MOMENTUM_COUPLING simple + SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.4 + SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 + SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.4 + SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.4 - SIMPLE_UNDERRELAXATION_FOR_MOMENTUM 0.4 - SIMPLE_UNDERRELAXATION_FOR_PRESSURE 0.4 - SIMPLE_UNDERRELAXATION_FOR_ENERGY 0.4 - SIMPLE_UNDERRELAXATION_FOR_TURBULENCE 0.4 + TIME_INTEGRATION_SCHEME linear - TIME_INTEGRATION_SCHEME linear + ADVECTION_SCHEME_FOR_MOMENTUM smart + ADVECTION_SCHEME_FOR_ENERGY smart + ADVECTION_SCHEME_FOR_TURBULENCE smart - ADVECTION_SCHEME_FOR_MOMENTUM smart - ADVECTION_SCHEME_FOR_ENERGY smart - ADVECTION_SCHEME_FOR_TURBULENCE smart + MIN_SIMPLE_ITERATIONS 3 - MIN_SIMPLE_ITERATIONS 3 #------------------------ # Linear solver settings #------------------------ - - PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky - TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-6 - TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 - TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-6 - TOLERANCE_FOR_ENERGY_SOLVER 1.e-6 - TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-6 + PRECONDITIONER_FOR_SYSTEM_MATRIX incomplete_cholesky + TOLERANCE_FOR_MOMENTUM_SOLVER 1.e-6 + TOLERANCE_FOR_PRESSURE_SOLVER 1.e-6 + TOLERANCE_FOR_TURBULENCE_SOLVER 1.e-6 + TOLERANCE_FOR_ENERGY_SOLVER 1.e-6 + TOLERANCE_FOR_SIMPLE_ALGORITHM 1.e-6 #-------------------- # Initial conditions From ac57fa73539b87a6d7e0693d0e133c21b33a97a2 Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 28 Mar 2023 13:35:38 +0200 Subject: [PATCH 163/223] Introduced vim syntax files for control That's actually pretty useful since T-Flows ignores lines which it doesn't recognize, thus leaving potentially many errors un-recognized. On branch bojan_more_robust_communicator new file: Documentation/Syntax/.vim/ftdetect/control.vim new file: Documentation/Syntax/.vim/syntax/control.vim renamed: Documentation/fortran.vim -> Documentation/Syntax/.vim/syntax/fortran.vim new file: Documentation/Syntax/readme --- .../Syntax/.vim/ftdetect/control.vim | 1 + Documentation/Syntax/.vim/syntax/control.vim | 245 ++++++++++++++++++ .../{ => Syntax/.vim/syntax}/fortran.vim | 0 Documentation/Syntax/readme | 3 + 4 files changed, 249 insertions(+) create mode 100644 Documentation/Syntax/.vim/ftdetect/control.vim create mode 100644 Documentation/Syntax/.vim/syntax/control.vim rename Documentation/{ => Syntax/.vim/syntax}/fortran.vim (100%) create mode 100644 Documentation/Syntax/readme diff --git a/Documentation/Syntax/.vim/ftdetect/control.vim b/Documentation/Syntax/.vim/ftdetect/control.vim new file mode 100644 index 000000000..6b16aa478 --- /dev/null +++ b/Documentation/Syntax/.vim/ftdetect/control.vim @@ -0,0 +1 @@ +autocmd BufNewFile,BufRead control* setf control diff --git a/Documentation/Syntax/.vim/syntax/control.vim b/Documentation/Syntax/.vim/syntax/control.vim new file mode 100644 index 000000000..150fb1971 --- /dev/null +++ b/Documentation/Syntax/.vim/syntax/control.vim @@ -0,0 +1,245 @@ +" Vim syntax file +" Language: control + +au BufNewFile,BufRead control* setf control + +" quit when a syntax file was already loaded +if exists("b:current_syntax") + finish +endif + +" ============================================================================== +" Comments: +syn region controlComment start="\#" end="\n" +syn region controlComment start="\!" end="\n" +syn region controlComment start="%" end="\n" + +" List of keyords was obtained with command: +" cat ../Documentation/all_control_keywords | awk '{print "syn keyword controlKeyword " $1}' | grep -v '|' | grep -v KEYWORD +" ============================================================================== +" Mandatory problem name and boundary conditions +syn keyword controlKeyword PROBLEM_NAME +syn keyword controlKeyword BOUNDARY_CONDITION +syn keyword controlKeyword TYPE +syn keyword controlKeyword VARIABLES +syn keyword controlKeyword VALUES +syn keyword controlKeyword FILE +syn keyword controlKeyword INTERFACE_CONDITION +syn keyword controlKeyword BOUNDARY_CONDITIONS +" Some other non-mandatory but often used kewords +syn keyword controlKeyword INITIAL_CONDITION +syn keyword controlKeyword SYNTHETIC_EDDIES +syn keyword controlKeyword NUMBER_OF_EDDIES +syn keyword controlKeyword MAX_EDDY_RADIUS +syn keyword controlKeyword EDDY_INTENSITY +" Input-output +syn keyword controlKeyword BACKUP_SAVE_INTERVAL +syn keyword controlKeyword LOAD_BACKUP_NAME +syn keyword controlKeyword NUMBER_OF_MONITORING_POINTS +syn keyword controlKeyword MONITORING_POINT_001 +syn keyword controlKeyword MONITORING_POINT_002 +syn keyword controlKeyword MONITORING_POINT_003 +syn keyword controlKeyword MONITORING_POINT_004 +syn keyword controlKeyword MONITORING_POINT_005 +syn keyword controlKeyword MONITORING_POINT_006 +syn keyword controlKeyword MONITORING_POINT_007 +syn keyword controlKeyword MONITORING_POINT_008 +syn keyword controlKeyword MONITORING_POINT_009 +syn keyword controlKeyword MONITORING_POINT_010 +syn keyword controlKeyword MONITORING_POINT_011 +syn keyword controlKeyword MONITORING_POINT_012 +syn keyword controlKeyword MONITORING_POINT_013 +syn keyword controlKeyword MONITORING_POINT_014 +syn keyword controlKeyword MONITORING_POINT_015 +syn keyword controlKeyword MONITORING_POINT_016 +syn keyword controlKeyword RESULTS_SAVE_INTERVAL +syn keyword controlKeyword SAVE_BACKUP_NAME +syn keyword controlKeyword SAVE_INITIAL_CONDITION +syn keyword controlKeyword SAVE_RESULTS_AT_BOUNDARIES +syn keyword controlKeyword SWARM_SAVE_INTERVAL +syn keyword controlKeyword WALL_TIME_MAX_HOURS +syn keyword controlKeyword PROFILER_INFO +" Numerics +syn keyword controlKeyword ADVECTION_SCHEME_FOR_ENERGY +syn keyword controlKeyword ADVECTION_SCHEME_FOR_MOMENTUM +syn keyword controlKeyword ADVECTION_SCHEME_FOR_SCALARS +syn keyword controlKeyword ADVECTION_SCHEME_FOR_TURBULENCE +syn keyword controlKeyword ADVECTION_SCHEME_FOR_VOF +syn keyword controlKeyword BLENDING_COEFFICIENT_FOR_ENERGY +syn keyword controlKeyword BLENDING_COEFFICIENT_FOR_MOMENTUM +syn keyword controlKeyword BLENDING_COEFFICIENT_FOR_SCALARS +syn keyword controlKeyword BLENDING_COEFFICIENT_FOR_TURBULENCE +syn keyword controlKeyword BLENDING_COEFFICIENT_FOR_VOF +syn keyword controlKeyword CHOI_CORRECTION +syn keyword controlKeyword GRADIENT_METHOD_FOR_ENERGY +syn keyword controlKeyword GRADIENT_METHOD_FOR_MOMENTUM +syn keyword controlKeyword GRADIENT_METHOD_FOR_PRESSURE +syn keyword controlKeyword GRADIENT_METHOD_FOR_SCALARS +syn keyword controlKeyword GRADIENT_METHOD_FOR_TURBULENCE +syn keyword controlKeyword GRADIENT_METHOD_FOR_VOF +syn keyword controlKeyword GRADIENT_METHOD_FOR_WALL_DISTANCE +syn keyword controlKeyword GU_CORRECTION +syn keyword controlKeyword LINEAR_SOLVERS +syn keyword controlKeyword MAX_CORRECTION_CYCLES_BETA_VOF +syn keyword controlKeyword MAX_COURANT_VOF +syn keyword controlKeyword MAX_GAUSS_GRADIENTS_ITERATIONS +syn keyword controlKeyword MAX_ITERATIONS_FOR_ENERGY_SOLVER +syn keyword controlKeyword MAX_ITERATIONS_FOR_MOMENTUM_SOLVER +syn keyword controlKeyword MAX_ITERATIONS_FOR_POTENTIAL_SOLVER +syn keyword controlKeyword MAX_ITERATIONS_FOR_PRESSURE_SOLVER +syn keyword controlKeyword MAX_ITERATIONS_FOR_SCALARS_SOLVER +syn keyword controlKeyword MAX_ITERATIONS_FOR_TURBULENCE_SOLVER +syn keyword controlKeyword MAX_ITERATIONS_FOR_VOF_SOLVER +syn keyword controlKeyword MAX_ITERATIONS_FOR_WALL_DISTANCE_SOLVER +syn keyword controlKeyword MAX_LEAST_SQUARES_GRADIENTS_ITERATIONS +syn keyword controlKeyword MAX_SIMPLE_ITERATIONS +syn keyword controlKeyword MAX_SMOOTHING_CYCLES_CURVATURE_VOF +syn keyword controlKeyword MAX_SMOOTHING_CYCLES_NORMAL_VOF +syn keyword controlKeyword MAX_SUBSTEP_CYCLES_VOF +syn keyword controlKeyword MAX_THREADS +syn keyword controlKeyword MIN_SIMPLE_ITERATIONS +syn keyword controlKeyword NORMALIZATION_FOR_ENERGY_SOLVER +syn keyword controlKeyword NORMALIZATION_FOR_MOMENTUM_SOLVER +syn keyword controlKeyword NORMALIZATION_FOR_PRESSURE_SOLVER +syn keyword controlKeyword NORMALIZATION_FOR_SIMPLE_ALGORITHM +syn keyword controlKeyword NORMALIZATION_FOR_SCALARS_SOLVER +syn keyword controlKeyword NORMALIZATION_FOR_TURBULENCE_SOLVER +syn keyword controlKeyword NUMBER_OF_PISO_CORRECTIONS +syn keyword controlKeyword NUMBER_OF_TIME_STEPS +syn keyword controlKeyword NUMBER_OF_SWARM_SUB_STEPS +syn keyword controlKeyword PRECONDITIONER_FOR_SYSTEM_MATRIX +syn keyword controlKeyword PRESSURE_MOMENTUM_COUPLING +syn keyword controlKeyword REPORT_VOLUME_BALANCE +syn keyword controlKeyword SIMPLE_UNDERRELAXATION_FOR_ENERGY +syn keyword controlKeyword SIMPLE_UNDERRELAXATION_FOR_MOMENTUM +syn keyword controlKeyword SIMPLE_UNDERRELAXATION_FOR_PRESSURE +syn keyword controlKeyword SIMPLE_UNDERRELAXATION_FOR_SCALARS +syn keyword controlKeyword SIMPLE_UNDERRELAXATION_FOR_TURBULENCE +syn keyword controlKeyword SIMPLE_UNDERRELAXATION_FOR_VOF +syn keyword controlKeyword SKEWNESS_CORRECTION_VOF +syn keyword controlKeyword SOLVER_FOR_ENERGY +syn keyword controlKeyword SOLVER_FOR_MOMENTUM +syn keyword controlKeyword SOLVER_FOR_POTENTIAL +syn keyword controlKeyword SOLVER_FOR_PRESSURE +syn keyword controlKeyword SOLVER_FOR_SCALARS +syn keyword controlKeyword SOLVER_FOR_TURBULENCE +syn keyword controlKeyword SOLVER_FOR_VOF +syn keyword controlKeyword SOLVER_FOR_WALL_DISTANCE +syn keyword controlKeyword TIME_INTEGRATION_SCHEME +syn keyword controlKeyword TIME_STEP +syn keyword controlKeyword TOLERANCE_FOR_GAUSS_GRADIENTS +syn keyword controlKeyword TOLERANCE_FOR_ENERGY_SOLVER +syn keyword controlKeyword TOLERANCE_FOR_MOMENTUM_SOLVER +syn keyword controlKeyword TOLERANCE_FOR_POTENTIAL_SOLVER +syn keyword controlKeyword TOLERANCE_FOR_PRESSURE_SOLVER +syn keyword controlKeyword TOLERANCE_FOR_SIMPLE_ALGORITHM +syn keyword controlKeyword TOLERANCE_FOR_SCALARS_SOLVER +syn keyword controlKeyword TOLERANCE_FOR_TURBULENCE_SOLVER +syn keyword controlKeyword TOLERANCE_FOR_VOF_SOLVER +syn keyword controlKeyword TOLERANCE_FOR_WALL_DISTANCE_SOLVER +" PETSc options +syn keyword controlKeyword PETSC_OPTIONS_FOR_MOMENTUM +syn keyword controlKeyword PETSC_OPTIONS_FOR_PRESSURE +syn keyword controlKeyword PETSC_OPTIONS_FOR_WALL_DISTANCE +syn keyword controlKeyword PETSC_OPTIONS_FOR_POTENTIAL +syn keyword controlKeyword PETSC_OPTIONS_FOR_VOF +syn keyword controlKeyword PETSC_OPTIONS_FOR_ENERGY +syn keyword controlKeyword PETSC_OPTIONS_FOR_SCALARS +syn keyword controlKeyword PETSC_OPTIONS_FOR_TURBULENCE +syn keyword controlKeyword SOLVER +syn keyword controlKeyword PREC +syn keyword controlKeyword PREC_OPTS +syn keyword controlKeyword TOLERANCE +" Physics +syn keyword controlKeyword ANGULAR_VELOCITY_VECTOR +syn keyword controlKeyword BUOYANCY +syn keyword controlKeyword DYNAMIC_VISCOSITY +syn keyword controlKeyword EXTRAPOLATE_TEMPERATURE_EXP +syn keyword controlKeyword GRAVITATIONAL_VECTOR +syn keyword controlKeyword HEAT_CAPACITY +syn keyword controlKeyword HEAT_TRANSFER +syn keyword controlKeyword HYBRID_LES_RANS_SWITCH +syn keyword controlKeyword INTERFACE_TRACKING +syn keyword controlKeyword LATENT_HEAT +syn keyword controlKeyword MASS_DENSITY +syn keyword controlKeyword MASS_FLOW_RATES +syn keyword controlKeyword MASS_TRANSFER +syn keyword controlKeyword MAX_PARTICLES +syn keyword controlKeyword NUMBER_OF_DOMAINS +syn keyword controlKeyword NUMBER_OF_PHASES +syn keyword controlKeyword NUMBER_OF_SCALARS +syn keyword controlKeyword NUMBER_OF_SWARM_SUBSTEPS +syn keyword controlKeyword PARTICLE_TRACKING +syn keyword controlKeyword PHASE_DENSITIES +syn keyword controlKeyword PHASE_VISCOSITIES +syn keyword controlKeyword PHASE_CAPACITIES +syn keyword controlKeyword PHASE_CONDUCTIVITIES +syn keyword controlKeyword POINT_FOR_MONITORING_PLANES +syn keyword controlKeyword POTENTIAL_INITIALIZATION +syn keyword controlKeyword PRESSURE_DROPS +syn keyword controlKeyword REFERENCE_DENSITY +syn keyword controlKeyword REFERENCE_TEMPERATURE +syn keyword controlKeyword ROUGHNESS_COEFFICIENT +syn keyword controlKeyword ROUGH_WALLS +syn keyword controlKeyword SATURATION_TEMPERATURE +syn keyword controlKeyword SCALARS_DIFFUSIVITY +syn keyword controlKeyword SMAGORINSKY_CONSTANT +syn keyword controlKeyword STARTING_TIME_STEP_FOR_SWARM_COMPUTATION +syn keyword controlKeyword STARTING_TIME_STEP_FOR_SWARM_STATISTICS +syn keyword controlKeyword STARTING_TIME_STEP_FOR_TURB_STATISTICS +syn keyword controlKeyword SURFACE_TENSION +syn keyword controlKeyword SWARM_COEFFICIENT_OF_RESTITUTION +syn keyword controlKeyword SWARM_DENSITY +syn keyword controlKeyword SWARM_DIAMETER +syn keyword controlKeyword SWARM_SUBGRID_SCALE_MODEL +syn keyword controlKeyword THERMAL_CONDUCTIVITY +syn keyword controlKeyword TRACK_FRONT +syn keyword controlKeyword TRACK_SURFACE +syn keyword controlKeyword TURBULENCE_MODEL +syn keyword controlKeyword TURBULENCE_MODEL_VARIANT +syn keyword controlKeyword TURBULENT_HEAT_FLUX_MODEL +syn keyword controlKeyword TURBULENT_PRANDTL_NUMBER +syn keyword controlKeyword TURBULENT_SCHMIDT_NUMBER +syn keyword controlKeyword VOLUME_EXPANSION_COEFFICIENT +" Porous regions +syn keyword controlKeyword NUMBER_OF_POROUS_REGIONS +syn keyword controlKeyword POROUS_REGION_001 +syn keyword controlKeyword POROUS_REGION_002 +syn keyword controlKeyword POROUS_REGION_003 +syn keyword controlKeyword POROUS_REGION_004 +syn keyword controlKeyword POROUS_REGION_005 +syn keyword controlKeyword POROUS_REGION_006 +syn keyword controlKeyword POROUS_REGION_007 +syn keyword controlKeyword POROUS_REGION_008 +syn keyword controlKeyword POROUS_REGION_009 +syn keyword controlKeyword POROUS_REGION_010 +syn keyword controlKeyword POROUS_REGION_011 +syn keyword controlKeyword POROUS_REGION_012 +syn keyword controlKeyword POROUS_REGION_013 +syn keyword controlKeyword POROUS_REGION_014 +syn keyword controlKeyword POROUS_REGION_015 +syn keyword controlKeyword POROUS_REGION_016 +syn keyword controlKeyword STL_FILE + +" ============================================================================== +" Numbers (integer must be before the float, otherwise things get messed up) +syn match controlInteger "-\=\<[0-9]*\>" +syn match controlFloat "-\=\d\+\.\d*\([eE][-+]\=\d\+\)\=[fl]\=\>" + +" Intrinsic (these are T-Flows variables) +syn keyword controlIntrinsic u v w t q p kin eps zeta f22 uu vv ww uv uw vw vof vof_c_ang +syn keyword controlIntrinsic c_01 c_02 c_03 c_04 c_05 c_06 q_01 q_02 q_03 q_04 q_05 q_06 +syn keyword controlIntrinsic x y z rx ry rz +syn keyword controlBoundaryConditon wall inflow outflow pressure convective symmetry + +" ============================================================================== +" The default methods for highlighting. Can be overridden later. +hi def link controlKeyword Type +hi def link controlComment Comment +hi def link controlInteger Number +hi def link controlFloat Number +hi def link controlIntrinsic Identifier +hi def link controlBoundaryConditon Keyword + +let b:current_syntax = "control" + diff --git a/Documentation/fortran.vim b/Documentation/Syntax/.vim/syntax/fortran.vim similarity index 100% rename from Documentation/fortran.vim rename to Documentation/Syntax/.vim/syntax/fortran.vim diff --git a/Documentation/Syntax/readme b/Documentation/Syntax/readme new file mode 100644 index 000000000..4adb707d7 --- /dev/null +++ b/Documentation/Syntax/readme @@ -0,0 +1,3 @@ +Here are the vim syntax files for T-Flows. + +Don't overlook the .vim directory here From bd8352160f00536c7b6db48d7f5f1941f226b240 Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 28 Mar 2023 14:47:19 +0200 Subject: [PATCH 164/223] IMPORTANT: Fixed the profiler!!! It seems that previously_running should be an array (for nested calls), not just a single integer number. On branch bojan_more_robust_communicator modified: Shared/Profiler_Mod.f90 modified: Shared/Profiler_Mod/Start.f90 modified: Shared/Profiler_Mod/Stop.f90 --- Sources/Shared/Profiler_Mod.f90 | 6 +-- Sources/Shared/Profiler_Mod/Start.f90 | 53 ++++++++++++++++++--------- Sources/Shared/Profiler_Mod/Stop.f90 | 23 ++++++++---- 3 files changed, 54 insertions(+), 28 deletions(-) diff --git a/Sources/Shared/Profiler_Mod.f90 b/Sources/Shared/Profiler_Mod.f90 index 4456966db..cfcbf4cbf 100644 --- a/Sources/Shared/Profiler_Mod.f90 +++ b/Sources/Shared/Profiler_Mod.f90 @@ -14,9 +14,9 @@ module Profiler_Mod !-------------------! type Profiler_Type - integer, private :: n_functions = 0 - integer, private :: currently_running = 0 - integer, private :: previously_running = 0 + integer, private :: n_functions = 0 + integer, private :: currently_running = 0 + integer, private :: previously_running(MAX_FUNCT) = 0 character(DL), private :: funct_name(MAX_FUNCT) integer(DP), private :: i_time_prev ! system clock at prev diff --git a/Sources/Shared/Profiler_Mod/Start.f90 b/Sources/Shared/Profiler_Mod/Start.f90 index 1bda8c45c..8d746a42b 100644 --- a/Sources/Shared/Profiler_Mod/Start.f90 +++ b/Sources/Shared/Profiler_Mod/Start.f90 @@ -11,31 +11,31 @@ subroutine Start(Profiler, f_name) integer :: i_fun ! function counter !==============================================================================! - !-----------------------------------------------------! - ! Store the function which was previously running ! - !-----------------------------------------------------! - Profiler % previously_running = Profiler % currently_running - - !----------------------------------------------! - ! If called for the first time, get system ! - ! clock clock rate and initial clock count ! - !----------------------------------------------! - if(Profiler % previously_running .eq. 0) then + !---------------------------------------------------------------------------! + ! If profiles is called for the first time, get system clock count rate ! + !---------------------------------------------------------------------------! + if(Profiler % n_functions .eq. 0) then call system_clock(count_rate = Profiler % sys_count_rate) end if !-------------------------------------------------------! + ! ! ! Determine the function which is currently running ! + ! (In other words, the caller function.) ! + ! ! !-------------------------------------------------------! - ! Check if this function was called before + !----------------------------------------------! + ! Check if this function was called before ! + !----------------------------------------------! do i_fun = 1, Profiler % n_functions - if(f_name .eq. Profiler % funct_name(i_fun)) then ! found the function - Profiler % currently_running = i_fun - goto 1 - end if + if(f_name .eq. Profiler % funct_name(i_fun)) goto 1 end do + !-----------------------------------------------------------------! + ! If you happen to be here, the function wasn't called before ! + !-----------------------------------------------------------------! + ! It wasn't called before, add it to the suite of analyzed function Profiler % n_functions = Profiler % n_functions + 1 Profiler % funct_name(Profiler % n_functions) = f_name @@ -43,14 +43,31 @@ subroutine Start(Profiler, f_name) ! Initialize times spent in the new function Profiler % funct_time(Profiler % n_functions) = 0.0 - ! Currently running function is the new one - Profiler % currently_running = Profiler % n_functions + ! Store currenlty running function to i_fun + i_fun = Profiler % n_functions + !--------------------------------------------------------------------------! + ! ! + ! Meeting point: you are here no matter if function was called before, ! + ! or if it was called for the first timei. Also important to note, ! + ! variable i_fun stores the currenly invoked function at this point. ! + ! ! + !--------------------------------------------------------------------------! 1 continue + !-----------------------------------------------------! + ! Store the function which was previously running ! + !-----------------------------------------------------! + Profiler % previously_running(i_fun) = Profiler % currently_running + !-------------------------------------------------------------------! ! Update the timer in the function which was previously running ! !-------------------------------------------------------------------! - call Profiler % Update_By_Rank(Profiler % previously_running) + call Profiler % Update_By_Rank(Profiler % previously_running(i_fun)) + + !---------------------------------------! + ! Set the currentl running function ! + !---------------------------------------! + Profiler % currently_running = i_fun end subroutine diff --git a/Sources/Shared/Profiler_Mod/Stop.f90 b/Sources/Shared/Profiler_Mod/Stop.f90 index ec14ce3f2..b8b465abe 100644 --- a/Sources/Shared/Profiler_Mod/Stop.f90 +++ b/Sources/Shared/Profiler_Mod/Stop.f90 @@ -12,23 +12,32 @@ subroutine Stop(Profiler, f_name) !==============================================================================! !----------------------------------------------------------! + ! ! ! Find the rank (number) of function which is stopping ! + ! ! !----------------------------------------------------------! - ! Browse through stored functions + !-------------------------------------! + ! Browse through stored functions ! + !-------------------------------------! do i_fun = 1, Profiler % n_functions - if(f_name .eq. Profiler % funct_name(i_fun)) then - goto 2 - end if + if(f_name .eq. Profiler % funct_name(i_fun)) goto 2 end do - ! If here, Profiler_Start wasn't invoked for this function + !----------------------------------------------! + ! If you happen to be here, Profiler_Start ! + ! wasn't invoked for this function ! + !----------------------------------------------! print *, 'CRITICAL ERROR in ''Profiler_End'':' print *, 'For function ''', trim(f_name), ''', ''Cpu_Ti' // & 'mer_Start'' wasn''t invoked. Exiting!' stop - ! Function has been found, continue + !------------------------------------------------------------------------! + ! ! + ! If here, function has been found and variable i_fun holds its rank ! + ! ! + !------------------------------------------------------------------------! 2 continue !-------------------------------------------------------------! @@ -39,6 +48,6 @@ subroutine Stop(Profiler, f_name) !-------------------------------------------------------! ! Restart the function which was previously running ! !-------------------------------------------------------! - Profiler % currently_running = Profiler % previously_running + Profiler % currently_running = Profiler % previously_running(i_fun) end subroutine From 3a7cc69c62673ce013b58be08d6ee0e2b87abd6e Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 28 Mar 2023 15:22:58 +0200 Subject: [PATCH 165/223] Set profiler info to be in seconds, just for kicks On branch bojan_more_robust_communicator modified: Tests/Laminar/Backstep/Nonorthogonal/control modified: Tests/Laminar/Backstep/Orthogonal/control modified: Tests/Laminar/Backstep/Orthogonal_With_Eddies/control modified: Tests/Laminar/Backstep/Polyhedral/control --- Tests/Laminar/Backstep/Nonorthogonal/control | 8 ++++---- Tests/Laminar/Backstep/Orthogonal/control | 8 +++++--- Tests/Laminar/Backstep/Orthogonal_With_Eddies/control | 4 +++- Tests/Laminar/Backstep/Polyhedral/control | 6 ++++-- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/Tests/Laminar/Backstep/Nonorthogonal/control b/Tests/Laminar/Backstep/Nonorthogonal/control index d866071d1..d8e1da492 100644 --- a/Tests/Laminar/Backstep/Nonorthogonal/control +++ b/Tests/Laminar/Backstep/Nonorthogonal/control @@ -1,6 +1,6 @@ #---------- # Prologue -#--------- +#---------- PROBLEM_NAME backstep_nonorthogonal HEAT_TRANSFER no @@ -8,12 +8,12 @@ NUMBER_OF_TIME_STEPS 1200 RESULTS_SAVE_INTERVAL 30 BACKUP_SAVE_INTERVAL 300 - SAVE_RESULTS_AT_BOUNDARIES no + SAVE_RESULTS_AT_BOUNDARIES no -# LOAD_BACKUP_NAME backstep_orthogonal-ts000001.backup + PROFILER_INFO seconds #------------------- -# Monitoring points +# Monitoring points #------------------- NUMBER_OF_MONITORING_POINTS 1 MONITORING_POINT_001 0.5 0.5 0.2 diff --git a/Tests/Laminar/Backstep/Orthogonal/control b/Tests/Laminar/Backstep/Orthogonal/control index 4c23ae738..eb57b7197 100644 --- a/Tests/Laminar/Backstep/Orthogonal/control +++ b/Tests/Laminar/Backstep/Orthogonal/control @@ -1,6 +1,6 @@ #---------- # Prologue -#--------- +#---------- PROBLEM_NAME backstep_orthogonal HEAT_TRANSFER no @@ -8,10 +8,12 @@ NUMBER_OF_TIME_STEPS 1200 RESULTS_SAVE_INTERVAL 30 BACKUP_SAVE_INTERVAL 300 - SAVE_RESULTS_AT_BOUNDARIES no + SAVE_RESULTS_AT_BOUNDARIES no + + PROFILER_INFO seconds #------------------- -# Monitoring points +# Monitoring points #------------------- NUMBER_OF_MONITORING_POINTS 1 MONITORING_POINT_001 0.5 0.5 0.2 diff --git a/Tests/Laminar/Backstep/Orthogonal_With_Eddies/control b/Tests/Laminar/Backstep/Orthogonal_With_Eddies/control index 3c9525f45..144b5ed0e 100644 --- a/Tests/Laminar/Backstep/Orthogonal_With_Eddies/control +++ b/Tests/Laminar/Backstep/Orthogonal_With_Eddies/control @@ -8,7 +8,9 @@ NUMBER_OF_TIME_STEPS 300 RESULTS_SAVE_INTERVAL 15 BACKUP_SAVE_INTERVAL 60 - SAVE_RESULTS_AT_BOUNDARIES no + SAVE_RESULTS_AT_BOUNDARIES no + + PROFILER_INFO seconds #------------------- # Monitoring points diff --git a/Tests/Laminar/Backstep/Polyhedral/control b/Tests/Laminar/Backstep/Polyhedral/control index a72063e33..235dd2cf4 100644 --- a/Tests/Laminar/Backstep/Polyhedral/control +++ b/Tests/Laminar/Backstep/Polyhedral/control @@ -8,10 +8,12 @@ NUMBER_OF_TIME_STEPS 1200 RESULTS_SAVE_INTERVAL 30 BACKUP_SAVE_INTERVAL 300 - SAVE_RESULTS_AT_BOUNDARIES no + SAVE_RESULTS_AT_BOUNDARIES no + + PROFILER_INFO seconds #------------------- -# Monitoring points +# Monitoring points #------------------- NUMBER_OF_MONITORING_POINTS 1 MONITORING_POINT_001 0.5 0.5 0.2 From 6bc188d0652f4e8d256a0d10296e6fb0c019b14e Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 28 Mar 2023 15:23:59 +0200 Subject: [PATCH 166/223] Shortened the syntax for Profiler. On branch bojan_more_robust_communicator modified: Documentation/Syntax/.vim/syntax/fortran.vim modified: Sources/Shared/Profiler_Mod.f90 modified: Sources/Shared/Profiler_Mod/Start.f90 modified: Sources/Shared/Profiler_Mod/Statistics.f90 modified: Sources/Shared/Profiler_Mod/Stop.f90 modified: Sources/Shared/Profiler_Mod/Update_By_Rank.f90 --- Documentation/Syntax/.vim/syntax/fortran.vim | 24 +++---- Sources/Shared/Profiler_Mod.f90 | 6 +- Sources/Shared/Profiler_Mod/Start.f90 | 26 +++---- Sources/Shared/Profiler_Mod/Statistics.f90 | 70 +++++++++---------- Sources/Shared/Profiler_Mod/Stop.f90 | 21 +++--- .../Shared/Profiler_Mod/Update_By_Rank.f90 | 14 ++-- 6 files changed, 81 insertions(+), 80 deletions(-) diff --git a/Documentation/Syntax/.vim/syntax/fortran.vim b/Documentation/Syntax/.vim/syntax/fortran.vim index e3c33df73..3631867d4 100644 --- a/Documentation/Syntax/.vim/syntax/fortran.vim +++ b/Documentation/Syntax/.vim/syntax/fortran.vim @@ -441,22 +441,22 @@ if b:fortran_dialect == "f08" syn keyword fortranConstant INFLOW WALL WALLFL OUTFLOW SYMMETRY CONVECT PRESSURE syn keyword fortranConstant INSIDE BUFFER PERIODIC_X PERIODIC_Y PERIODIC_Z UNDEFINED " After the constants, I have alternating definitions of types and objects derived from them - syn keyword fortranTypeTflows Domain_Type Point_Type Block_Type Line_Type Range_Type - syn keyword fortranObjectTflows Dom points blocks lines ranges + syn keyword fortranTypeTflows Domain_Type Point_Type Block_Type Line_Type Range_Type + syn keyword fortranObjectTflows Dom points blocks lines ranges syn keyword fortranTypeTflows Generate_Type Convert_Type Divide_Type Grid_Type syn keyword fortranObjectTflows Generate Convert Divide Grid Prim Dual - syn keyword fortranTypeTflows Math_Type Sort_Type File_Type String_Type Work_Type Tokenizer_Type - syn keyword fortranObjectTflows Math Sort File String Work Line Tok - syn keyword fortranTypeTflows Comm_Type Backup_Type Field_Type Turb_Type Vof_Type Swarm_Type - syn keyword fortranObjectTflows Comm Global Backup Bac Flow Fld Turb Tur Vof Swarm Swr + syn keyword fortranTypeTflows Math_Type Sort_Type File_Type String_Type Work_Type Tokenizer_Type + syn keyword fortranObjectTflows Math Sort File String Work Line Tok + syn keyword fortranTypeTflows Comm_Type Backup_Type Field_Type Turb_Type Vof_Type Swarm_Type + syn keyword fortranObjectTflows Comm Global Backup Bac Flow Fld Turb Tur Vof Swarm Swr syn keyword fortranTypeTflows Bulk_Type Face_Type syn keyword fortranObjectTflows bulk v_flux - syn keyword fortranTypeTflows Front_Type Surf_Type Elem_Type Side_Type Vert_Type Particle_Type - syn keyword fortranObjectTflows Front Surf Elem side Vert Part - syn keyword fortranTypeTflows Monitor_Type Results_Type Porosity_Type Profiler_Type Message_Type - syn keyword fortranObjectTflows Monitor Results Por Profiler Message - syn keyword fortranTypeTflows Matrix_Type Vector_Type Solver_Type Native_Type Petsc_Type Process_Type - syn keyword fortranObjectTflows A M vector Sol Nat Pet Process + syn keyword fortranTypeTflows Front_Type Surf_Type Elem_Type Side_Type Vert_Type Particle_Type + syn keyword fortranObjectTflows Front Surf Elem side Vert Part + syn keyword fortranTypeTflows Monitor_Type Results_Type Porosity_Type Profiler_Type Message_Type + syn keyword fortranObjectTflows Monitor Results Por Profiler Prof Message + syn keyword fortranTypeTflows Matrix_Type Vector_Type Solver_Type Native_Type Petsc_Type Process_Type + syn keyword fortranObjectTflows A M vector Sol Nat Pet Process syn keyword fortranTypeTflows Var_Type syn keyword fortranObjectTflows u v w ui uj uk p t kin eps zeta f22 uu vv ww uv vw uw ut vt wt t2 vis " Items which follow are not really objects, but I don't know where else to put them diff --git a/Sources/Shared/Profiler_Mod.f90 b/Sources/Shared/Profiler_Mod.f90 index cfcbf4cbf..ca3a0fa45 100644 --- a/Sources/Shared/Profiler_Mod.f90 +++ b/Sources/Shared/Profiler_Mod.f90 @@ -14,9 +14,9 @@ module Profiler_Mod !-------------------! type Profiler_Type - integer, private :: n_functions = 0 - integer, private :: currently_running = 0 - integer, private :: previously_running(MAX_FUNCT) = 0 + integer, private :: n_functs = 0 + integer, private :: curr_running = 0 + integer, private :: prev_running(MAX_FUNCT) = 0 character(DL), private :: funct_name(MAX_FUNCT) integer(DP), private :: i_time_prev ! system clock at prev diff --git a/Sources/Shared/Profiler_Mod/Start.f90 b/Sources/Shared/Profiler_Mod/Start.f90 index 8d746a42b..d0677a45c 100644 --- a/Sources/Shared/Profiler_Mod/Start.f90 +++ b/Sources/Shared/Profiler_Mod/Start.f90 @@ -1,11 +1,11 @@ !==============================================================================! - subroutine Start(Profiler, f_name) + subroutine Start(Prof, f_name) !------------------------------------------------------------------------------! ! This subroutine is called whenever new function is invoked ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Profiler_Type), target :: Profiler + class(Profiler_Type), target :: Prof character(len=*) :: f_name !-----------------------------------[Locals]-----------------------------------! integer :: i_fun ! function counter @@ -14,8 +14,8 @@ subroutine Start(Profiler, f_name) !---------------------------------------------------------------------------! ! If profiles is called for the first time, get system clock count rate ! !---------------------------------------------------------------------------! - if(Profiler % n_functions .eq. 0) then - call system_clock(count_rate = Profiler % sys_count_rate) + if(Prof % n_functs .eq. 0) then + call system_clock(count_rate = Prof % sys_count_rate) end if !-------------------------------------------------------! @@ -28,8 +28,8 @@ subroutine Start(Profiler, f_name) !----------------------------------------------! ! Check if this function was called before ! !----------------------------------------------! - do i_fun = 1, Profiler % n_functions - if(f_name .eq. Profiler % funct_name(i_fun)) goto 1 + do i_fun = 1, Prof % n_functs + if(f_name .eq. Prof % funct_name(i_fun)) goto 1 end do !-----------------------------------------------------------------! @@ -37,14 +37,14 @@ subroutine Start(Profiler, f_name) !-----------------------------------------------------------------! ! It wasn't called before, add it to the suite of analyzed function - Profiler % n_functions = Profiler % n_functions + 1 - Profiler % funct_name(Profiler % n_functions) = f_name + Prof % n_functs = Prof % n_functs + 1 + Prof % funct_name(Prof % n_functs) = f_name ! Initialize times spent in the new function - Profiler % funct_time(Profiler % n_functions) = 0.0 + Prof % funct_time(Prof % n_functs) = 0.0 ! Store currenlty running function to i_fun - i_fun = Profiler % n_functions + i_fun = Prof % n_functs !--------------------------------------------------------------------------! ! ! @@ -58,16 +58,16 @@ subroutine Start(Profiler, f_name) !-----------------------------------------------------! ! Store the function which was previously running ! !-----------------------------------------------------! - Profiler % previously_running(i_fun) = Profiler % currently_running + Prof % prev_running(i_fun) = Prof % curr_running !-------------------------------------------------------------------! ! Update the timer in the function which was previously running ! !-------------------------------------------------------------------! - call Profiler % Update_By_Rank(Profiler % previously_running(i_fun)) + call Prof % Update_By_Rank(Prof % prev_running(i_fun)) !---------------------------------------! ! Set the currentl running function ! !---------------------------------------! - Profiler % currently_running = i_fun + Prof % curr_running = i_fun end subroutine diff --git a/Sources/Shared/Profiler_Mod/Statistics.f90 b/Sources/Shared/Profiler_Mod/Statistics.f90 index 73c3cc792..5067a9c2a 100644 --- a/Sources/Shared/Profiler_Mod/Statistics.f90 +++ b/Sources/Shared/Profiler_Mod/Statistics.f90 @@ -1,9 +1,9 @@ !==============================================================================! - subroutine Statistics(Profiler, indent) + subroutine Statistics(Prof, indent) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Profiler_Type), target :: Profiler + class(Profiler_Type), target :: Prof integer, intent(in) :: indent ! 34 for Main_Pro, 1 for Main_con !-----------------------------------[Locals]-----------------------------------! integer :: i_fun @@ -25,23 +25,23 @@ subroutine Statistics(Profiler, indent) ! Compute average time spent in functions over all processors if(Parallel_Run()) then - do i_fun=1, Profiler % n_functions - call Global % Sum_Real(Profiler % funct_time(i_fun)) - Profiler % funct_time(i_fun) = Profiler % funct_time(i_fun) / N_Procs() + do i_fun=1, Prof % n_functs + call Global % Sum_Real(Prof % funct_time(i_fun)) + Prof % funct_time(i_fun) = Prof % funct_time(i_fun) / N_Procs() end do end if ! Perform bubble sort do swap = .false. - do i_fun=1, Profiler % n_functions-1 - if(Profiler % funct_time(i_fun+1) > Profiler % funct_time(i_fun)) then - t_temp = Profiler % funct_time(i_fun) - n_temp = Profiler % funct_name(i_fun) - Profiler % funct_time(i_fun) = Profiler % funct_time(i_fun+1) - Profiler % funct_name(i_fun) = Profiler % funct_name(i_fun+1) - Profiler % funct_time(i_fun+1) = t_temp - Profiler % funct_name(i_fun+1) = n_temp + do i_fun=1, Prof % n_functs-1 + if(Prof % funct_time(i_fun+1) > Prof % funct_time(i_fun)) then + t_temp = Prof % funct_time(i_fun) + n_temp = Prof % funct_name(i_fun) + Prof % funct_time(i_fun) = Prof % funct_time(i_fun+1) + Prof % funct_name(i_fun) = Prof % funct_name(i_fun+1) + Prof % funct_time(i_fun+1) = t_temp + Prof % funct_name(i_fun+1) = n_temp swap = .true. end if end do @@ -50,8 +50,8 @@ subroutine Statistics(Profiler, indent) 1 continue total_time = 0.0 - do i_fun = 1, Profiler % n_functions - total_time = total_time + Profiler % funct_time(i_fun) + do i_fun = 1, Prof % n_functs + total_time = total_time + Prof % funct_time(i_fun) end do if(First_Proc()) then @@ -91,42 +91,42 @@ subroutine Statistics(Profiler, indent) '#---------------------------------------------+-----------------#' print '(a)', trim(line) - do i_fun = 1, Profiler % n_functions + do i_fun = 1, Prof % n_functs line( 1:160) = ' ' line( 1+indent: 1+indent) = '#' line(65+indent:65+indent) = '#' line( 3+indent: 3+indent) = '-' - line( 5+indent: 5+indent+len_trim(Profiler % funct_name(i_fun))) & - = Profiler % funct_name(i_fun)(1:123) + line( 5+indent: 5+indent+len_trim(Prof % funct_name(i_fun))) & + = Prof % funct_name(i_fun)(1:123) line(47+indent:47+indent) = '|' - percent_time = Profiler % funct_time(i_fun) / total_time * 100.0 + percent_time = Prof % funct_time(i_fun) / total_time * 100.0 ! Write time in elapsed seconds if(in_sec) then ! I stick to kiss principle here: keep it simple and stupid - if(Profiler % funct_time(1) < 10) then - write(line(53+indent:56+indent), '(f4.2)') Profiler%funct_time(i_fun) + if(Prof % funct_time(1) < 10) then + write(line(53+indent:56+indent), '(f4.2)') Prof % funct_time(i_fun) line(58+indent:60+indent) = '[s]' - else if(Profiler % funct_time(1) < 100) then - write(line(52+indent:56+indent), '(f5.2)') Profiler%funct_time(i_fun) + else if(Prof % funct_time(1) < 100) then + write(line(52+indent:56+indent), '(f5.2)') Prof % funct_time(i_fun) line(58+indent:60+indent) = '[s]' - else if(Profiler % funct_time(1) < 1000) then - write(line(51+indent:56+indent), '(f6.2)') Profiler%funct_time(i_fun) + else if(Prof % funct_time(1) < 1000) then + write(line(51+indent:56+indent), '(f6.2)') Prof % funct_time(i_fun) line(58+indent:60+indent) = '[s]' - else if(Profiler % funct_time(1) < 10000) then - write(line(51+indent:57+indent), '(f7.2)') Profiler%funct_time(i_fun) + else if(Prof % funct_time(1) < 10000) then + write(line(51+indent:57+indent), '(f7.2)') Prof % funct_time(i_fun) line(59+indent:61+indent) = '[s]' - else if(Profiler % funct_time(1) < 100000) then - write(line(50+indent:57+indent), '(f8.2)') Profiler%funct_time(i_fun) + else if(Prof % funct_time(1) < 100000) then + write(line(50+indent:57+indent), '(f8.2)') Prof % funct_time(i_fun) line(59+indent:61+indent) = '[s]' - else if(Profiler % funct_time(1) < 1000000) then - write(line(50+indent:58+indent), '(f9.2)') Profiler%funct_time(i_fun) + else if(Prof % funct_time(1) < 1000000) then + write(line(50+indent:58+indent), '(f9.2)') Prof % funct_time(i_fun) line(60+indent:62+indent) = '[s]' - else if(Profiler % funct_time(1) < 10000000) then - write(line(49+indent:58+indent), '(f10.2)') Profiler%funct_time(i_fun) + else if(Prof % funct_time(1) < 10000000) then + write(line(49+indent:58+indent), '(f10.2)') Prof % funct_time(i_fun) line(60+indent:62+indent) = '[s]' - else if(Profiler % funct_time(1) < 100000000) then - write(line(49+indent:59+indent), '(f11.2)') Profiler%funct_time(i_fun) + else if(Prof % funct_time(1) < 100000000) then + write(line(49+indent:59+indent), '(f11.2)') Prof % funct_time(i_fun) line(61+indent:63+indent) = '[s]' end if diff --git a/Sources/Shared/Profiler_Mod/Stop.f90 b/Sources/Shared/Profiler_Mod/Stop.f90 index b8b465abe..34ff5836f 100644 --- a/Sources/Shared/Profiler_Mod/Stop.f90 +++ b/Sources/Shared/Profiler_Mod/Stop.f90 @@ -1,11 +1,11 @@ !==============================================================================! - subroutine Stop(Profiler, f_name) + subroutine Stop(Prof, f_name) !------------------------------------------------------------------------------! ! Stops a function by her name ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Profiler_Type), target :: Profiler + class(Profiler_Type), target :: Prof character(len=*) :: f_name !-----------------------------------[Locals]-----------------------------------! integer :: i_fun @@ -20,18 +20,19 @@ subroutine Stop(Profiler, f_name) !-------------------------------------! ! Browse through stored functions ! !-------------------------------------! - do i_fun = 1, Profiler % n_functions - if(f_name .eq. Profiler % funct_name(i_fun)) goto 2 + do i_fun = 1, Prof % n_functs + if(f_name .eq. Prof % funct_name(i_fun)) goto 2 end do !----------------------------------------------! ! If you happen to be here, Profiler_Start ! ! wasn't invoked for this function ! !----------------------------------------------! - print *, 'CRITICAL ERROR in ''Profiler_End'':' - print *, 'For function ''', trim(f_name), ''', ''Cpu_Ti' // & - 'mer_Start'' wasn''t invoked. Exiting!' - stop + call Message % Error(72, & + 'For function or section: "' // trim(f_name) // & + '", Profiler % Start was not invoked. This ' // & + ' error is critical. Exiting!', & + file=__FILE__, line=__LINE__, one_proc=.true.) !------------------------------------------------------------------------! ! ! @@ -43,11 +44,11 @@ subroutine Stop(Profiler, f_name) !-------------------------------------------------------------! ! Update the time for the function which is being stopped ! !-------------------------------------------------------------! - call Profiler % Update_By_Rank(i_fun) + call Prof % Update_By_Rank(i_fun) !-------------------------------------------------------! ! Restart the function which was previously running ! !-------------------------------------------------------! - Profiler % currently_running = Profiler % previously_running(i_fun) + Prof % curr_running = Prof % prev_running(i_fun) end subroutine diff --git a/Sources/Shared/Profiler_Mod/Update_By_Rank.f90 b/Sources/Shared/Profiler_Mod/Update_By_Rank.f90 index 33080d9d1..35f293f51 100644 --- a/Sources/Shared/Profiler_Mod/Update_By_Rank.f90 +++ b/Sources/Shared/Profiler_Mod/Update_By_Rank.f90 @@ -1,28 +1,28 @@ !==============================================================================! - subroutine Update_By_Rank(Profiler, i_fun) + subroutine Update_By_Rank(Prof, i_fun) !------------------------------------------------------------------------------! ! Updates function's timer by her rank (number) ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Profiler_Type), target :: Profiler + class(Profiler_Type), target :: Prof integer, intent(in) :: i_fun !-----------------------------------[Locals]-----------------------------------! real(DP) :: wall_time !==============================================================================! ! Store the last time which was recorded - Profiler % i_time_prev = Profiler % i_time_curr + Prof % i_time_prev = Prof % i_time_curr ! Refresh the value of time_curr - call system_clock(Profiler % i_time_curr) + call system_clock(Prof % i_time_curr) ! Calculate how much wall time has passed - wall_time = real(Profiler % i_time_curr - Profiler % i_time_prev) & - / real(Profiler % sys_count_rate) + wall_time = real(Prof % i_time_curr - Prof % i_time_prev) & + / real(Prof % sys_count_rate) if(i_fun > 0) then - Profiler % funct_time(i_fun) = Profiler % funct_time(i_fun) + wall_time + Prof % funct_time(i_fun) = Prof % funct_time(i_fun) + wall_time end if end subroutine From ee18bf8a8292da11e0872f8d83ff669511a28bee Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 28 Mar 2023 20:25:31 +0200 Subject: [PATCH 167/223] Introduced macros for RSM On branch bojan_more_robust_communicator modified: Sources/Process/Turb_Mod/Src_F22_Rsm_Manceau_Hanjalic.f90 modified: Sources/Process/Turb_Mod/Src_Rsm_Hanjalic_Jakirlic.f90 modified: Sources/Process/Turb_Mod/Src_Rsm_Manceau_Hanjalic.f90 modified: Sources/Process/Turb_Mod/Vis_T_Rsm.f90 --- .../Turb_Mod/Src_F22_Rsm_Manceau_Hanjalic.f90 | 30 +++++----- .../Turb_Mod/Src_Rsm_Hanjalic_Jakirlic.f90 | 60 ++++++++++--------- .../Turb_Mod/Src_Rsm_Manceau_Hanjalic.f90 | 36 ++++++----- Sources/Process/Turb_Mod/Vis_T_Rsm.f90 | 2 +- 4 files changed, 67 insertions(+), 61 deletions(-) diff --git a/Sources/Process/Turb_Mod/Src_F22_Rsm_Manceau_Hanjalic.f90 b/Sources/Process/Turb_Mod/Src_F22_Rsm_Manceau_Hanjalic.f90 index 0dfb135eb..88c6f9e33 100644 --- a/Sources/Process/Turb_Mod/Src_F22_Rsm_Manceau_Hanjalic.f90 +++ b/Sources/Process/Turb_Mod/Src_F22_Rsm_Manceau_Hanjalic.f90 @@ -14,9 +14,9 @@ subroutine Src_F22_Rsm_Manceau_Hanjalic(Turb, Sol) type(Var_Type), pointer :: f22 type(Matrix_Type), pointer :: A real, pointer :: b(:) - integer :: s, c, c1, c2 - real :: sor11, f22hg -!==============================================================================! + integer :: s, c, c1, c2, reg + real :: sor11, f22hg +!------------------------------------------------------------------------------! ! ! ! The form of source terms are : ! ! ! @@ -44,7 +44,7 @@ subroutine Src_F22_Rsm_Manceau_Hanjalic(Turb, Sol) ! f22 [-] ! ! l_scale [m] ! ! ! -!------------------------------------------------------------------------------! +!==============================================================================! ! Take aliases Flow => Turb % pnt_flow @@ -55,7 +55,7 @@ subroutine Src_F22_Rsm_Manceau_Hanjalic(Turb, Sol) call Turb % Time_And_Length_Scale(Grid) ! Source term f22hg - do c = 1, Grid % n_cells + do c = Cells_In_Domain() f22hg = 1.0 sor11 = Grid % vol(c) / Turb % l_scale(c)**2 A % val(A % dia(c)) = A % val(A % dia(c)) + sor11 @@ -63,17 +63,17 @@ subroutine Src_F22_Rsm_Manceau_Hanjalic(Turb, Sol) end do ! Source term - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0) then - if(Grid % Bnd_Cond_Type(c2) .eq. WALL .or. & - Grid % Bnd_Cond_Type(c2) .eq. WALLFL) then + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. WALL .or. & + Grid % region % type(reg) .eq. WALLFL) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) - f22 % n(c2) = 0.0 + f22 % n(c2) = 0.0 - end if ! end if of BC=wall - end if ! end if of c2<0 - end do + end do ! faces + end if ! boundary condition type + end do ! regions end subroutine diff --git a/Sources/Process/Turb_Mod/Src_Rsm_Hanjalic_Jakirlic.f90 b/Sources/Process/Turb_Mod/Src_Rsm_Hanjalic_Jakirlic.f90 index a42139ba0..b5971eb9f 100644 --- a/Sources/Process/Turb_Mod/Src_Rsm_Hanjalic_Jakirlic.f90 +++ b/Sources/Process/Turb_Mod/Src_Rsm_Hanjalic_Jakirlic.f90 @@ -17,7 +17,7 @@ subroutine Src_Rsm_Hanjalic_Jakirlic(Turb, Sol, name_phi) type(Var_Type), pointer :: uu, vv, ww, uv, uw, vw type(Matrix_Type), pointer :: A real, pointer :: b(:) - integer :: c, s, c1, c2, i, icont, nc, nb + integer :: c, s, c1, c2, i, icont, nc, nb, reg real :: mag real :: a11, a22, a33, a12, a13, a23 real :: s11, s22, s33, s12, s13, s23 @@ -67,8 +67,8 @@ subroutine Src_Rsm_Hanjalic_Jakirlic(Turb, Sol, name_phi) ! Take aliases Flow => Turb % pnt_flow Grid => Flow % pnt_grid - nc = Grid % n_cells nb = Grid % n_bnd_cells + nc = Grid % n_cells call Flow % Alias_Momentum (u, v, w) call Turb % Alias_K_Eps_Zeta_F(kin, eps, zeta, f22) call Turb % Alias_Stresses (uu, vv, ww, uv, uw, vw) @@ -79,9 +79,10 @@ subroutine Src_Rsm_Hanjalic_Jakirlic(Turb, Sol, name_phi) ee = 0.5 aa = 0.5 - do c = 1, Grid % n_cells + do c = Cells_In_Domain() kin % n(c) = max(0.5*(uu % n(c) + vv % n(c) + ww % n(c)), TINY) end do + call Grid % Exchange_Cells_Real(kin % n(-nb:nc)) ! !---------------------------------------------------! ! ! Below is one of versions of Hanjalic-Jakirlic ! @@ -251,7 +252,7 @@ subroutine Src_Rsm_Hanjalic_Jakirlic(Turb, Sol, name_phi) call Flow % Grad_Component(w % z, 3, ui_zz(-nb:nc)) ! d2w/dzdz end if - do c = 1, Grid % n_cells + do c = Cells_In_Domain() kin_vis = Flow % viscosity(c) / Flow % density(c) if(i == 1) then uxx = ui_xx(c) @@ -320,6 +321,8 @@ subroutine Src_Rsm_Hanjalic_Jakirlic(Turb, Sol, name_phi) + ww % n(c)*(uzx*uzx + uzy*uzy + uzz*uzz)) end if end do + call Grid % Exchange_Cells_Real(diss1(-nb:nc)) + end do ! i end if ! end if EPS == yes @@ -329,7 +332,7 @@ subroutine Src_Rsm_Hanjalic_Jakirlic(Turb, Sol, name_phi) r13 = ONE_THIRD r23 = TWO_THIRDS - do c = 1, Grid % n_cells + do c = Cells_In_Domain() kin_vis = Flow % viscosity(c) / Flow % density(c) Turb % p_kin(c) = max( & - ( uu % n(c)*u % x(c) + uv % n(c)*u % y(c) + uw % n(c)*u % z(c) & @@ -370,9 +373,9 @@ subroutine Src_Rsm_Hanjalic_Jakirlic(Turb, Sol, name_phi) 3*a12**2*(a11+a22) + 3*a13**2*(a11+a33) + & 3*a23**2*(a22+a33) + 6*a12*a13*a23 - aa=1.0 - (9.0/8.0)*(aa2-aa3) - aa=max(aa,0.0) - aa=min(aa,1.0) + aa = 1.0 - (9.0/8.0)*(aa2-aa3) + aa = max(aa, 0.0) + aa = min(aa, 1.0) uu_nn = (uu % n(c)*n1*n1+uv % n(c)*n1*n2+uw % n(c)*n1*n3 & + uv % n(c)*n2*n1+vv % n(c)*n2*n2+vw % n(c)*n2*n3 & @@ -489,12 +492,12 @@ subroutine Src_Rsm_Hanjalic_Jakirlic(Turb, Sol, name_phi) + 2.0 * Flow % omega_y * uv % n(c) & - 2.0 * Flow % omega_z * uw % n(c) - var1_11 = -cc1*eps%n(c)*a11 - var1_22 = -cc1*eps%n(c)*a22 - var1_33 = -cc1*eps%n(c)*a33 - var1_12 = -cc1*eps%n(c)*a12 - var1_13 = -cc1*eps%n(c)*a13 - var1_23 = -cc1*eps%n(c)*a23 + var1_11 = -cc1 * eps % n(c) * a11 + var1_22 = -cc1 * eps % n(c) * a22 + var1_33 = -cc1 * eps % n(c) * a33 + var1_12 = -cc1 * eps % n(c) * a12 + var1_13 = -cc1 * eps % n(c) * a13 + var1_23 = -cc1 * eps % n(c) * a23 var2_11 = -cc2*(p11 - r23 * Turb % p_kin(c)) var2_22 = -cc2*(p22 - r23 * Turb % p_kin(c)) @@ -685,15 +688,16 @@ subroutine Src_Rsm_Hanjalic_Jakirlic(Turb, Sol, name_phi) end if end do - do c = 1, Grid % n_cells + do c = Cells_In_Domain() kin_e(c) = sqrt( 0.5 * (uu % n(c) + vv % n(c) + ww % n(c)) ) end do + call Grid % Exchange_Cells_Real(kin_e(-nb:nc)) if(name_phi == 'EPS') then call Flow % Grad(kin_e(-nb:nc), kin_e_x(-nb:nc), & kin_e_y(-nb:nc), & kin_e_z(-nb:nc)) - do c = 1, Grid % n_cells + do c = Cells_In_Domain() kin_vis = Flow % viscosity(c) / Flow % density(c) re_t = (kin % n(c)**2) / (kin_vis*eps % n(c) + TINY) f_eps = 1.0 - ((c_2e-1.4)/c_2e) * exp(-(re_t/6.0)**2) @@ -707,23 +711,21 @@ subroutine Src_Rsm_Hanjalic_Jakirlic(Turb, Sol, name_phi) end if if(name_phi == 'EPS') then - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - ! Calculate a values of dissipation on wall - if(c2 < 0 ) then - if(Grid % Bnd_Cond_Type(c2) .eq. WALL .or. & - Grid % Bnd_Cond_Type(c2) .eq. WALLFL) then - + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. WALL .or. & + Grid % region % type(reg) .eq. WALLFL) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + + ! Calculate a values of dissipation on wall kin_vis = Flow % viscosity(c1) / Flow % density(c1) eps % n(c2) = kin_vis * ( kin_e_x(c1)**2 & + kin_e_y(c1)**2 & + kin_e_z(c1)**2) - - end if ! end if of BC=wall - end if ! end if of c2<0 - end do + end do ! faces + end if ! boundary condition type + end do ! regions end if call Work % Disconnect_Real_Cell(l_sc_x, l_sc_y, l_sc_z, & diff --git a/Sources/Process/Turb_Mod/Src_Rsm_Manceau_Hanjalic.f90 b/Sources/Process/Turb_Mod/Src_Rsm_Manceau_Hanjalic.f90 index 582a98c85..15acf6ed2 100644 --- a/Sources/Process/Turb_Mod/Src_Rsm_Manceau_Hanjalic.f90 +++ b/Sources/Process/Turb_Mod/Src_Rsm_Manceau_Hanjalic.f90 @@ -17,7 +17,7 @@ subroutine Src_Rsm_Manceau_Hanjalic(Turb, Sol, name_phi) type(Var_Type), pointer :: uu, vv, ww, uv, uw, vw type(Matrix_Type), pointer :: A real, pointer :: b(:) - integer :: c, s, c1, c2 + integer :: c, s, c1, c2, nb, nc, reg real :: prod, diss, phi_hom, phi_wall, mag, phi_tot real :: b11, b22, b33, b12, b13, b21, b31, b23, b32 real :: s11, s22, s33, s12, s13, s21, s31, s23, s32 @@ -29,7 +29,9 @@ subroutine Src_Rsm_Manceau_Hanjalic(Turb, Sol, name_phi) ! Take aliases Flow => Turb % pnt_flow Grid => Flow % pnt_grid - call Flow % Alias_Momentum(u, v, w) + nb = Grid % n_bnd_cells + nc = Grid % n_cells + call Flow % Alias_Momentum (u, v, w) call Turb % Alias_K_Eps_Zeta_F(kin, eps, zeta, f22) call Turb % Alias_Stresses (uu, vv, ww, uv, uw, vw) call Sol % Alias_Native (A, b) @@ -38,7 +40,7 @@ subroutine Src_Rsm_Manceau_Hanjalic(Turb, Sol, name_phi) call Flow % Grad_Variable(f22) - do c = 1, Grid % n_cells + do c = Cells_In_Domain() kin % n(c) = max(0.5*( uu % n(c) & + vv % n(c) & + ww % n(c)), TINY) @@ -233,7 +235,7 @@ subroutine Src_Rsm_Manceau_Hanjalic(Turb, Sol, name_phi) + b21*s11 + b22*s12 + b23*s13) & + g5*kin % n(c)*( b11*v21 + b12*v22 + b13*v23 & + b21*v11 + b22*v12 + b23*v13) - + prod = -( uu % n(c) * v % x(c) & + uw % n(c) * v % z(c) & + uv % n(c) *(v % y(c) + u % x(c)) & @@ -362,22 +364,24 @@ subroutine Src_Rsm_Manceau_Hanjalic(Turb, Sol, name_phi) + c_2e * esor * Flow % density(c) end if end do + call Grid % Exchange_Cells_Real(kin % n(-nb:nc)) + call Grid % Exchange_Cells_Real(Turb % p_kin(-nb:nc)) if(name_phi == 'EPS') then - do s = 1, Grid % n_faces - c1=Grid % faces_c(1,s) - c2=Grid % faces_c(2,s) - - ! Calculate a values of dissipation on wall - if(c2 < 0) then - kin_vis = Flow % viscosity(c1) / Flow % density(c1) - if(Grid % Bnd_Cond_Type(c2) .eq. WALL .or. & - Grid % Bnd_Cond_Type(c2) .eq. WALLFL) then + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. WALL .or. & + Grid % region % type(reg) .eq. WALLFL) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + + ! Calculate a values of dissipation on wall + kin_vis = Flow % viscosity(c1) / Flow % density(c1) eps % n(c2) = kin_vis*(uu % n(c1) + vv % n(c1) + ww % n(c1))& / Grid % wall_dist(c1)**2 - end if ! end if of BC=wall - end if ! end if of c2<0 - end do + end do ! faces + end if ! boundary condition type + end do ! regions end if end subroutine diff --git a/Sources/Process/Turb_Mod/Vis_T_Rsm.f90 b/Sources/Process/Turb_Mod/Vis_T_Rsm.f90 index 7d31821ba..a2fc0f17c 100644 --- a/Sources/Process/Turb_Mod/Vis_T_Rsm.f90 +++ b/Sources/Process/Turb_Mod/Vis_T_Rsm.f90 @@ -39,7 +39,7 @@ subroutine Vis_T_Rsm(Turb) call Calculate_Shear_And_Vorticity(Flow) - do c = 1, Grid % n_cells + do c = Cells_In_Domain() kin % n(c) = 0.5*max(uu % n(c) + vv % n(c) + ww % n(c), TINY) cmu_mod = max(-( uu % n(c) * u % x(c) & From 2b6356dcb65519ccb6a4f9b3dd235a462580bf8c Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 28 Mar 2023 20:59:17 +0200 Subject: [PATCH 168/223] Had to go back with User_Mod savings renamed: User_Mod/Save_Vtu_Results.f90 -> User_Mod/Save_Results.f90 renamed: User_Mod/Save_Vtu_Swarm.f90 -> User_Mod/Save_Swarm.f90 modified: Results_Mod/Main_Results.f90 modified: User_Mod.f90 --- Sources/Process/Results_Mod/Main_Results.f90 | 12 ++++++------ Sources/Process/User_Mod.f90 | 4 ++-- .../{Save_Vtu_Swarm.f90 => Save_Results.f90} | 2 +- .../{Save_Vtu_Results.f90 => Save_Swarm.f90} | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) rename Sources/Process/User_Mod/{Save_Vtu_Swarm.f90 => Save_Results.f90} (94%) rename Sources/Process/User_Mod/{Save_Vtu_Results.f90 => Save_Swarm.f90} (94%) diff --git a/Sources/Process/Results_Mod/Main_Results.f90 b/Sources/Process/Results_Mod/Main_Results.f90 index 05fc2e99a..599c9a298 100644 --- a/Sources/Process/Results_Mod/Main_Results.f90 +++ b/Sources/Process/Results_Mod/Main_Results.f90 @@ -62,11 +62,11 @@ subroutine Main_Results(Results, & end if ! Write results in user-customized format - call User_Mod_Save_Vtu_Results(Flow(d), Turb(d), Vof(d), Swarm(d), & - curr_dt, domain=d) + call User_Mod_Save_Results(Flow(d), Turb(d), Vof(d), Swarm(d), & + curr_dt, domain=d) if(Flow(d) % with_particles) then - call User_Mod_Save_Vtu_Swarm(Flow(d), Turb(d), Vof(d), Swarm(d), & - curr_dt, domain=d) + call User_Mod_Save_Swarm(Flow(d), Turb(d), Vof(d), Swarm(d), & + curr_dt, domain=d) end if end do ! through domains @@ -84,8 +84,8 @@ subroutine Main_Results(Results, & if(Flow(d) % with_particles) then call Results % Save_Vtu_Swarm(Swarm(d), curr_dt, domain=d) - call User_Mod_Save_Vtu_Swarm(Flow(d), Turb(d), Vof(d), Swarm(d), & - curr_dt, domain=d) + call User_Mod_Save_Swarm(Flow(d), Turb(d), Vof(d), Swarm(d), & + curr_dt, domain=d) end if end do ! through domains diff --git a/Sources/Process/User_Mod.f90 b/Sources/Process/User_Mod.f90 index 8f238ef81..07ba68b5f 100644 --- a/Sources/Process/User_Mod.f90 +++ b/Sources/Process/User_Mod.f90 @@ -41,8 +41,8 @@ module User_Mod # include "User_Mod/Insert_Particles.f90" # include "User_Mod/Interface_Exchange.f90" # include "User_Mod/Force.f90" -# include "User_Mod/Save_Vtu_Results.f90" -# include "User_Mod/Save_Vtu_Swarm.f90" +# include "User_Mod/Save_Results.f90" +# include "User_Mod/Save_Swarm.f90" # include "User_Mod/Source.f90" end module diff --git a/Sources/Process/User_Mod/Save_Vtu_Swarm.f90 b/Sources/Process/User_Mod/Save_Results.f90 similarity index 94% rename from Sources/Process/User_Mod/Save_Vtu_Swarm.f90 rename to Sources/Process/User_Mod/Save_Results.f90 index 563d4ccb6..f46b8e77a 100644 --- a/Sources/Process/User_Mod/Save_Vtu_Swarm.f90 +++ b/Sources/Process/User_Mod/Save_Results.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Save_Vtu_Swarm(Flow, Turb, Vof, Swarm, ts, domain) + subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !------------------------------------------------------------------------------! ! This subroutine is called each RESULTS_SAVE_INTERVAL (set in control ! ! file), at the end of a simulation and after 'save_now' command. ! diff --git a/Sources/Process/User_Mod/Save_Vtu_Results.f90 b/Sources/Process/User_Mod/Save_Swarm.f90 similarity index 94% rename from Sources/Process/User_Mod/Save_Vtu_Results.f90 rename to Sources/Process/User_Mod/Save_Swarm.f90 index e18962ced..20c8855fc 100644 --- a/Sources/Process/User_Mod/Save_Vtu_Results.f90 +++ b/Sources/Process/User_Mod/Save_Swarm.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Save_Vtu_Results(Flow, Turb, Vof, Swarm, ts, domain) + subroutine User_Mod_Save_Swarm(Flow, Turb, Vof, Swarm, ts, domain) !------------------------------------------------------------------------------! ! This subroutine is called each RESULTS_SAVE_INTERVAL (set in control ! ! file), at the end of a simulation and after 'save_now' command. ! From 614c2f16596e884d889407caabbae152c2f3a07f Mon Sep 17 00:00:00 2001 From: Niceno Date: Tue, 28 Mar 2023 21:18:28 +0200 Subject: [PATCH 169/223] Updated User_Mod_Save_Results with macros. On branch bojan_more_robust_communicator modified: User_Mod/Save_Results.f90 modified: control --- .../Pipe_Re_Tau_550/User_Mod/Save_Results.f90 | 58 +++++++++---------- Tests/Rans/Pipe_Re_Tau_550/control | 8 +-- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/Tests/Rans/Pipe_Re_Tau_550/User_Mod/Save_Results.f90 b/Tests/Rans/Pipe_Re_Tau_550/User_Mod/Save_Results.f90 index f0a0fa31d..c506ff8e9 100644 --- a/Tests/Rans/Pipe_Re_Tau_550/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Pipe_Re_Tau_550/User_Mod/Save_Results.f90 @@ -21,7 +21,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) type(Var_Type), pointer :: kin, eps, zeta, f22 type(Var_Type), pointer :: uu, vv, ww, uv, uw, vw type(Var_Type), pointer :: ut, vt, wt - integer :: n_prob, pl, c, i, count, s, c1, c2, n_points + integer :: n_prob, pl, c, i, count, s, c1, c2, n_points, reg character(SL) :: coord_name, res_name, res_name_plus real, allocatable :: z_p(:), u_p(:), v_p(:), w_p(:), y_plus_p(:), & kin_p(:), eps_p(:), f22_p(:), & @@ -104,7 +104,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) allocate(ind(n_prob*2)) ! Read the intervals positions - do pl=1,n_prob + do pl = 1, n_prob read(9,*) ind(pl), z_p(pl) end do close(9) @@ -136,7 +136,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) ! Average the results ! !-------------------------! do i = 1, n_prob-1 - do c = 1, Grid % n_cells - Grid % Comm % n_buff_cells + do c = Cells_In_Domain() rad = 1.0 - Grid % wall_dist(c) if( rad < (z_p(i)) .and. & rad > (z_p(i+1))) then @@ -254,7 +254,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) if(Flow % heat_transfer) then d_wall = 0.0 - do c = 1, Grid % n_cells - Grid % Comm % n_buff_cells + do c = Cells_In_Domain() if(Grid % wall_dist(c) > d_wall) then d_wall = Grid % wall_dist(c) t_inf = t % n(c) @@ -269,19 +269,19 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Global % Max_Real(t_inf) end if - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - if(c2 < 0) then - if( Grid % Bnd_Cond_Type(c2) .eq. WALL .or. & - Grid % Bnd_Cond_Type(c2) .eq. WALLFL) then + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. WALL .or. & + Grid % region % type(reg) .eq. WALLFL) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) t_wall = t_wall + t % n(c2) nu_mean = nu_mean + t % q(c2) / (cond_const*(t % n(c2) - t_inf)) n_points = n_points + 1 - end if - end if - end do + end do ! faces + end if ! boundary condition type + end do ! regions call Global % Sum_Real(t_wall) call Global % Sum_Real(nu_mean) @@ -303,17 +303,17 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) cf_dean = 0.0791*(re)**(-0.25) cf = u_tau_p**2/(0.5*ubulk**2) error = abs(cf_dean - cf)/cf_dean * 100.0 - write(i,'(a1,(a12,E12.6))') & + write(i,'(a1,(a12,e12.6))') & '#', 'ubulk = ', ubulk - write(i,'(a1,(a12,E12.6))') & + write(i,'(a1,(a12,e12.6))') & '#', 'Re = ', dens_const * ubulk * 2.0/visc_const - write(i,'(a1,(a12,E12.6))') & + write(i,'(a1,(a12,e12.6))') & '#', 'Re_tau = ', dens_const*u_tau_p/visc_const - write(i,'(a1,(a12,E12.6))') & + write(i,'(a1,(a12,e12.6))') & '#', 'Cf = ', 2.0*(u_tau_p/ubulk)**2 write(i,'(a1,(a12,F12.6))') & '#', 'Utau = ', u_tau_p - write(i,'(a1,(a12,F12.6,a2,a22))') & + write(i,'(a1,(a12,f12.6,a2,a22))') & '#', 'Cf_error = ', error, ' %', 'Dean formula is used.' if(Flow % heat_transfer) then write(i,'(a1,(a12, F12.6))')'#', 'Nu number =', nu_mean @@ -325,30 +325,30 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) if(Turb % model .eq. K_EPS) then if(Flow % heat_transfer) then - write(i,'(a1,2X,A60)') '#', ' r,' // & ! 1 - ' w,' // & ! 2 - ' kin, eps, uw,' // & ! 3, 4, 5 - ' vis_t/visc_const,' // & ! 6 - ' t, ut, vt, wt,' ! 7 - 10 + write(i,'(a1,2x,a60)') '#', ' r,' // & ! 1 + ' w,' // & ! 2 + ' kin, eps, uw,' // & ! 3, 4, 5 + ' vis_t/visc_const,' // & ! 6 + ' t, ut, vt, wt,' ! 7 - 10 else - write(i,'(a1,2X,A60)') '#', ' r,' // & ! 1 - ' w,' // & ! 2 + write(i,'(a1,2X,a60)') '#', ' r,' // & ! 1 + ' w,' // & ! 2 ' kin, eps, uw, vis_t/visc_const' ! 3-6 end if else if(Turb % model .eq. K_EPS_ZETA_F) then if(Flow % heat_transfer) then - write(i,'(a1,2X,A60)') '#', ' r,' // & ! 1 + write(i,'(a1,2x,a60)') '#', ' r,' // & ! 1 ' w,' // & ! 2 ' kin, eps, uw,' // & ! 3, 4, 5 ' f22, zeta,' // & ! 6, 7 - ' vis_t/visc_const,' // & ! 8 - 11 + ' vis_t/visc_const,' // & ! 8 - 11 ' t, ut, vt, wt' else - write(i,'(a1,2X,A50)') '#', ' r,' // & ! 1 + write(i,'(a1,2x,a50)') '#', ' r,' // & ! 1 ' w,' // & ! 2 ' kin, eps, uw,' // & ! 3, 4, 5 ' f22, zeta' // & ! 6, 7 - ' vis_t/visc_const,' ! 8 + ' vis_t/visc_const,' ! 8 end if end if end do diff --git a/Tests/Rans/Pipe_Re_Tau_550/control b/Tests/Rans/Pipe_Re_Tau_550/control index fd09f088f..cb26ad5ad 100644 --- a/Tests/Rans/Pipe_Re_Tau_550/control +++ b/Tests/Rans/Pipe_Re_Tau_550/control @@ -11,13 +11,13 @@ #--------------- # Time stepping #--------------- - TIME_STEP 0.05 + TIME_STEP 0.05 NUMBER_OF_TIME_STEPS 7200 - RESULTS_SAVE_INTERVAL 600 - BACKUP_SAVE_INTERVAL 600 + RESULTS_SAVE_INTERVAL 600 + BACKUP_SAVE_INTERVAL 600 #------------------- -# Monitoring points +# Monitoring points #------------------- NUMBER_OF_MONITORING_POINTS 5 MONITORING_POINT_001 0.0 0.99 0.5 From f6af8f3c869b4034a520cd8fd49312dcdfb4db5b Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 29 Mar 2023 18:11:56 +0200 Subject: [PATCH 170/223] This is more a warning than an error On branch bojan_more_robust_communicator modified: Process/Vof_Mod/Core/Initialize_From_Stl.f90 --- Sources/Process/Vof_Mod/Core/Initialize_From_Stl.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/Process/Vof_Mod/Core/Initialize_From_Stl.f90 b/Sources/Process/Vof_Mod/Core/Initialize_From_Stl.f90 index 77bedd8c6..58a1789aa 100644 --- a/Sources/Process/Vof_Mod/Core/Initialize_From_Stl.f90 +++ b/Sources/Process/Vof_Mod/Core/Initialize_From_Stl.f90 @@ -355,10 +355,10 @@ subroutine Initialize_From_Stl(Vof) dis_nod_int(i) = -1 end do - ! Throw an error if you come to this + ! Throw a warning if you come to this else ! cnt_p == cnt_m if(cnt_p .gt. 0 .and. cnt_m .gt. 0) then - PRINT *, __FILE__, __LINE__, 'HOW ON EARTH? CELL: ', C, CNT_P, CNT_M + ! PRINT *, __FILE__, __LINE__, DENTED CELL: ', C, CNT_P, CNT_M end if end if From 917848639911493cf1095cc4a9c7cabab74037df Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 30 Mar 2023 06:32:19 +0200 Subject: [PATCH 171/223] Convenient: creates .pvtu file for Front On branch bojan_more_robust_communicator modified: Process/Front_Mod/Save_Debug_Front_Vtu.f90 --- .../Front_Mod/Save_Debug_Front_Vtu.f90 | 624 ++++++++++-------- 1 file changed, 335 insertions(+), 289 deletions(-) diff --git a/Sources/Process/Front_Mod/Save_Debug_Front_Vtu.f90 b/Sources/Process/Front_Mod/Save_Debug_Front_Vtu.f90 index 7544c3909..f993528cb 100644 --- a/Sources/Process/Front_Mod/Save_Debug_Front_Vtu.f90 +++ b/Sources/Process/Front_Mod/Save_Debug_Front_Vtu.f90 @@ -10,9 +10,8 @@ subroutine Save_Debug_Front_Vtu(Front, time_step) !----------------------------------[Locals]------------------------------------! type(Vert_Type), pointer :: Vert type(Grid_Type), pointer :: Grid - integer :: v, e ! vertex and element counters - integer :: s, n_int - integer :: offset, fu + integer :: v, e, n, s, n_int, offset, fu + integer, allocatable :: n_elems(:) character(SL) :: name_out !-----------------------------[Local parameters]-------------------------------! character(len= 0) :: IN_0 = '' ! indentation levels @@ -29,6 +28,57 @@ subroutine Save_Debug_Front_Vtu(Front, time_step) ! Set precision for plotting (intp and floatp variables) call Vtk_Mod_Set_Precision() + !-----------------------------! + ! ! + ! Create .front.pvtu file ! + ! ! + !-----------------------------! + if(Parallel_Run()) then + + ! Work out how many elements are in each processor + allocate(n_elems(N_Procs())) + n_elems(:) = 0 + n_elems(This_Proc()) = Front % n_elems + call Global % Sum_Int_Array(N_Procs(), n_elems) + + if(First_Proc()) then + call File % Set_Name(name_out, & + time_step=time_step, & + appendix='-front', & + extension='.pvtu') + call File % Open_For_Writing_Ascii(name_out, fu) + + ! Header + write(fu,'(a,a)') IN_0, '' + write(fu,'(a,a)') IN_0, '' + write(fu,'(a,a)') IN_1, '' + + ! This section must be present + write(fu,'(a,a)') IN_2, '' + write(fu,'(a,a)') IN_3, '' + write(fu,'(a,a)') IN_2, '' + + ! Write out the names of all the pieces + do n = 1, N_Procs() + if(n_elems(n) > 0) then + call File % Set_Name(name_out, & + time_step=time_step, & + appendix='-front', & + processor=n, & + extension='.vtu') + write(fu, '(a,a,a,a)') IN_2, '' + end if + end do + + ! Footer + write(fu, '(a,a)') IN_1, '' + write(fu, '(a,a)') IN_0, '' + + close(fu) + end if + end if + if(Front % n_verts < 1) return !----------------------------! @@ -37,291 +87,287 @@ subroutine Save_Debug_Front_Vtu(Front, time_step) ! ! !----------------------------! -! if(First_Proc()) then - - call File % Set_Name(name_out, & - processor = This_Proc(), & - time_step = time_step, & - appendix = '-front', & - extension = '.vtu') - call File % Open_For_Writing_Ascii(name_out, fu) - - !------------! - ! ! - ! Header ! - ! ! - !------------! - write(fu,'(a,a)') IN_0, '' - write(fu,'(a,a)') IN_0, '' - write(fu,'(a,a)') IN_1, '' - - write(fu,'(a,a,i0.0,a,i0.0,a)') & - IN_2, '' - - !------------------------! - ! ! - ! Vertex coordinates ! - ! ! - !------------------------! - write(fu,'(a,a)') IN_3, '' - write(fu,'(a,a)') IN_4, '' - do v = 1, Front % n_verts - Vert => Front % Vert(v) - write(fu, '(a,1pe16.6e4,1pe16.6e4,1pe16.6e4)') & - IN_5, Vert % x_n, Vert % y_n, Vert % z_n - end do - write(fu,'(a,a)') IN_4, '' - write(fu,'(a,a)') IN_3, '' - - !----------------! - ! ! - ! Point data ! - ! ! - !----------------! - write(fu,'(a,a)') IN_3, '' - - !--------------------! - ! Particle i.d.s ! - !--------------------! - write(fu,'(a,a)') IN_4, '' - do v = 1, Front % n_verts - write(fu,'(a,i9)') IN_5, v - end do - write(fu,'(a,a)') IN_4, '' - - !--------------------------! - ! Number of neighbours ! - !--------------------------! - write(fu,'(a,a)') IN_4, '' - do v = 1, Front % n_verts - write(fu,'(a,i9)') IN_5, Front % Vert(v) % nne - end do - write(fu,'(a,a)') IN_4, '' - - !-----------------------------! - ! Curvatures at the nodes ! - !-----------------------------! - write(fu,'(a,a)') IN_4, '' - do v = 1, Front % n_verts - Vert => Front % Vert(v) - write(fu,'(a,1pe16.6e4)') IN_5, Vert % curv - end do - write(fu,'(a,a)') IN_4, '' - - write(fu,'(a,a)') IN_3, '' - - !-----------! - ! ! - ! Cells ! - ! ! - !-----------! - write(fu,'(a,a)') IN_3, '' - write(fu,'(a,a)') IN_4, '' - ! Cell topology - do e = 1, Front % n_elems - write(fu,'(a,99i9)') IN_5, Front % Elem(e) % v(1:Front % Elem(e) % nv)-1 - end do - - ! Cell offsets - write(fu,'(a,a)') IN_4, '' - write(fu,'(a,a)') IN_4, '' - offset = 0 - do e = 1, Front % n_elems - offset = offset + Front % Elem(e) % nv - write(fu,'(a,i9)') IN_5, offset - end do - - ! Cell types - write(fu,'(a,a)') IN_4, '' - write(fu,'(a,a)') IN_4, '' - do e = 1, Front % n_elems - write(fu,'(a,i9)') IN_5, VTK_POLYGON - end do - write(fu,'(a,a)') IN_4, '' - write(fu,'(a,a)') IN_3, '' - - !---------------! - ! ! - ! Cell data ! - ! ! - !---------------! - - ! Beginning of cell data - write(fu,'(a,a)') IN_3, '' - - !-------------------------------------! - ! Number of neighbouring elements ! - !-------------------------------------! - write(fu,'(a,a)') IN_4, '' - do e = 1, Front % n_elems - write(fu,'(a,i9)') IN_5, Front % Elem(e) % nne - end do - write(fu,'(a,a)') IN_4, '' - - !---------------------! - ! Surface normals ! - !---------------------! - write(fu,'(4a)') IN_4, & - '' - do e = 1, Front % n_elems - write(fu, '(a,1pe16.6e4,1pe16.6e4,1pe16.6e4)') & - IN_5, Front % Elem(e) % nx, & - Front % Elem(e) % ny, & - Front % Elem(e) % nz - end do - write(fu,'(a,a)') IN_4, '' - - !-------------------! - ! Element areas ! - !-------------------! - write(fu,'(4a)') IN_4, & - '' - do e = 1, Front % n_elems - write(fu,'(a,1pe16.6e4)') IN_5, Front % Elem(e) % area - end do - write(fu,'(a,a)') IN_4, '' - - !-------------------------! - ! Element coordinates ! - !-------------------------! - write(fu,'(4a)') IN_4, & - '' - do e = 1, Front % n_elems - write(fu, '(a,1pe16.6e4,1pe16.6e4,1pe16.6e4)') & - IN_5, Front % Elem(e) % xe, & - Front % Elem(e) % ye, & - Front % Elem(e) % ze - end do - write(fu,'(a,a)') IN_4, '' - - !------------------------! - ! Surface curvatures ! - !------------------------! - write(fu,'(4a)') IN_4, & - '' - do e = 1, Front % n_elems - write(fu,'(a,1pe16.6e4)') IN_5, Front % Elem(e) % curv - end do - write(fu,'(a,a)') IN_4, '' - - ! End of cell data - write(fu,'(a,a)') IN_3, '' - - !------------! - ! ! - ! Footer ! - ! ! - !------------! - write(fu,'(a,a)') IN_2, '' - write(fu,'(a,a)') IN_1, '' - write(fu,'(a,a)') IN_0, '' - close(fu) - - !------------------------------------! - ! ! - ! Create .intersections.vtu file ! - ! ! - !------------------------------------! - - ! Count number of intersections in a very simple way - n_int = 0 - do s = 1, Grid % n_faces - if(.not. Math % Approx_Real(Grid % xs(s), 0.0) .and. & - .not. Math % Approx_Real(Grid % ys(s), 0.0) .and. & - .not. Math % Approx_Real(Grid % zs(s), 0.0)) then - n_int = n_int + 1 - end if - end do - print *, '# Number of intersecton = ', n_int - - call File % Set_Name(name_out, & - time_step=time_step, & - appendix ='-intersections', & - extension='.vtu') - call File % Open_For_Writing_Ascii(name_out, fu) - - !------------! - ! ! - ! Header ! - ! ! - !------------! - write(fu,'(a,a)') IN_0, '' - write(fu,'(a,a)') IN_0, '' - write(fu,'(a,a)') IN_1, '' - - write(fu,'(a,a,i0.0,a)') & - IN_2, '' - - !-------------------------------! - ! ! - ! Intersections coordinates ! - ! ! - !-------------------------------! - write(fu,'(a,a)') IN_3, '' - write(fu,'(a,a)') IN_4, '' - do s = 1, Grid % n_faces - if(.not. Math % Approx_Real(Grid % xs(s), 0.0) .and. & - .not. Math % Approx_Real(Grid % ys(s), 0.0) .and. & - .not. Math % Approx_Real(Grid % zs(s), 0.0)) then - write(fu, '(a,1pe16.6e4,1pe16.6e4,1pe16.6e4)') & - IN_5, Grid % xs(s), Grid % ys(s), Grid % zs(s) - end if - end do - write(fu,'(a,a)') IN_4, '' - write(fu,'(a,a)') IN_3, '' - - !-----------! - ! ! - ! Cells ! - ! ! - !-----------! - write(fu,'(a,a)') IN_3, '' - write(fu,'(a,a)') IN_4, '' - write(fu,'(a,a)') IN_4, '' - write(fu,'(a,a)') IN_4, '' - write(fu,'(a,a)') IN_4, '' - write(fu,'(a,a)') IN_4, '' - write(fu,'(a,a)') IN_4, '' - write(fu,'(a,a)') IN_3, '' - - !------------! - ! ! - ! Footer ! - ! ! - !------------! - write(fu,'(a,a)') IN_2, '' - write(fu,'(a,a)') IN_1, '' - write(fu,'(a,a)') IN_0, '' - close(fu) - -! end if + call File % Set_Name(name_out, & + processor = This_Proc(), & + time_step = time_step, & + appendix = '-front', & + extension = '.vtu') + call File % Open_For_Writing_Ascii(name_out, fu) + + !------------! + ! ! + ! Header ! + ! ! + !------------! + write(fu,'(a,a)') IN_0, '' + write(fu,'(a,a)') IN_0, '' + write(fu,'(a,a)') IN_1, '' + + write(fu,'(a,a,i0.0,a,i0.0,a)') & + IN_2, '' + + !------------------------! + ! ! + ! Vertex coordinates ! + ! ! + !------------------------! + write(fu,'(a,a)') IN_3, '' + write(fu,'(a,a)') IN_4, '' + do v = 1, Front % n_verts + Vert => Front % Vert(v) + write(fu, '(a,1pe16.6e4,1pe16.6e4,1pe16.6e4)') & + IN_5, Vert % x_n, Vert % y_n, Vert % z_n + end do + write(fu,'(a,a)') IN_4, '' + write(fu,'(a,a)') IN_3, '' + + !----------------! + ! ! + ! Point data ! + ! ! + !----------------! + write(fu,'(a,a)') IN_3, '' + + !--------------------! + ! Particle i.d.s ! + !--------------------! + write(fu,'(a,a)') IN_4, '' + do v = 1, Front % n_verts + write(fu,'(a,i9)') IN_5, v + end do + write(fu,'(a,a)') IN_4, '' + + !--------------------------! + ! Number of neighbours ! + !--------------------------! + write(fu,'(a,a)') IN_4, '' + do v = 1, Front % n_verts + write(fu,'(a,i9)') IN_5, Front % Vert(v) % nne + end do + write(fu,'(a,a)') IN_4, '' + + !-----------------------------! + ! Curvatures at the nodes ! + !-----------------------------! + write(fu,'(a,a)') IN_4, '' + do v = 1, Front % n_verts + Vert => Front % Vert(v) + write(fu,'(a,1pe16.6e4)') IN_5, Vert % curv + end do + write(fu,'(a,a)') IN_4, '' + + write(fu,'(a,a)') IN_3, '' + + !-----------! + ! ! + ! Cells ! + ! ! + !-----------! + write(fu,'(a,a)') IN_3, '' + write(fu,'(a,a)') IN_4, '' + ! Cell topology + do e = 1, Front % n_elems + write(fu,'(a,99i9)') IN_5, Front % Elem(e) % v(1:Front % Elem(e) % nv)-1 + end do + + ! Cell offsets + write(fu,'(a,a)') IN_4, '' + write(fu,'(a,a)') IN_4, '' + offset = 0 + do e = 1, Front % n_elems + offset = offset + Front % Elem(e) % nv + write(fu,'(a,i9)') IN_5, offset + end do + + ! Cell types + write(fu,'(a,a)') IN_4, '' + write(fu,'(a,a)') IN_4, '' + do e = 1, Front % n_elems + write(fu,'(a,i9)') IN_5, VTK_POLYGON + end do + write(fu,'(a,a)') IN_4, '' + write(fu,'(a,a)') IN_3, '' + + !---------------! + ! ! + ! Cell data ! + ! ! + !---------------! + + ! Beginning of cell data + write(fu,'(a,a)') IN_3, '' + + !-------------------------------------! + ! Number of neighbouring elements ! + !-------------------------------------! + write(fu,'(a,a)') IN_4, '' + do e = 1, Front % n_elems + write(fu,'(a,i9)') IN_5, Front % Elem(e) % nne + end do + write(fu,'(a,a)') IN_4, '' + + !---------------------! + ! Surface normals ! + !---------------------! + write(fu,'(4a)') IN_4, & + '' + do e = 1, Front % n_elems + write(fu, '(a,1pe16.6e4,1pe16.6e4,1pe16.6e4)') & + IN_5, Front % Elem(e) % nx, & + Front % Elem(e) % ny, & + Front % Elem(e) % nz + end do + write(fu,'(a,a)') IN_4, '' + + !-------------------! + ! Element areas ! + !-------------------! + write(fu,'(4a)') IN_4, & + '' + do e = 1, Front % n_elems + write(fu,'(a,1pe16.6e4)') IN_5, Front % Elem(e) % area + end do + write(fu,'(a,a)') IN_4, '' + + !-------------------------! + ! Element coordinates ! + !-------------------------! + write(fu,'(4a)') IN_4, & + '' + do e = 1, Front % n_elems + write(fu, '(a,1pe16.6e4,1pe16.6e4,1pe16.6e4)') & + IN_5, Front % Elem(e) % xe, & + Front % Elem(e) % ye, & + Front % Elem(e) % ze + end do + write(fu,'(a,a)') IN_4, '' + + !------------------------! + ! Surface curvatures ! + !------------------------! + write(fu,'(4a)') IN_4, & + '' + do e = 1, Front % n_elems + write(fu,'(a,1pe16.6e4)') IN_5, Front % Elem(e) % curv + end do + write(fu,'(a,a)') IN_4, '' + + ! End of cell data + write(fu,'(a,a)') IN_3, '' + + !------------! + ! ! + ! Footer ! + ! ! + !------------! + write(fu,'(a,a)') IN_2, '' + write(fu,'(a,a)') IN_1, '' + write(fu,'(a,a)') IN_0, '' + close(fu) + + !------------------------------------! + ! ! + ! Create .intersections.vtu file ! + ! ! + !------------------------------------! + + ! Count number of intersections in a very simple way + n_int = 0 + do s = 1, Grid % n_faces + if(.not. Math % Approx_Real(Grid % xs(s), 0.0) .and. & + .not. Math % Approx_Real(Grid % ys(s), 0.0) .and. & + .not. Math % Approx_Real(Grid % zs(s), 0.0)) then + n_int = n_int + 1 + end if + end do + print *, '# Number of intersecton = ', n_int + + call File % Set_Name(name_out, & + time_step=time_step, & + appendix ='-intersections', & + extension='.vtu') + call File % Open_For_Writing_Ascii(name_out, fu) + + !------------! + ! ! + ! Header ! + ! ! + !------------! + write(fu,'(a,a)') IN_0, '' + write(fu,'(a,a)') IN_0, '' + write(fu,'(a,a)') IN_1, '' + + write(fu,'(a,a,i0.0,a)') & + IN_2, '' + + !-------------------------------! + ! ! + ! Intersections coordinates ! + ! ! + !-------------------------------! + write(fu,'(a,a)') IN_3, '' + write(fu,'(a,a)') IN_4, '' + do s = 1, Grid % n_faces + if(.not. Math % Approx_Real(Grid % xs(s), 0.0) .and. & + .not. Math % Approx_Real(Grid % ys(s), 0.0) .and. & + .not. Math % Approx_Real(Grid % zs(s), 0.0)) then + write(fu, '(a,1pe16.6e4,1pe16.6e4,1pe16.6e4)') & + IN_5, Grid % xs(s), Grid % ys(s), Grid % zs(s) + end if + end do + write(fu,'(a,a)') IN_4, '' + write(fu,'(a,a)') IN_3, '' + + !-----------! + ! ! + ! Cells ! + ! ! + !-----------! + write(fu,'(a,a)') IN_3, '' + write(fu,'(a,a)') IN_4, '' + write(fu,'(a,a)') IN_4, '' + write(fu,'(a,a)') IN_4, '' + write(fu,'(a,a)') IN_4, '' + write(fu,'(a,a)') IN_4, '' + write(fu,'(a,a)') IN_4, '' + write(fu,'(a,a)') IN_3, '' + + !------------! + ! ! + ! Footer ! + ! ! + !------------! + write(fu,'(a,a)') IN_2, '' + write(fu,'(a,a)') IN_1, '' + write(fu,'(a,a)') IN_0, '' + close(fu) end subroutine From ac4ec73cc75d4068a4e8e446a7ee979a1514c193 Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 30 Mar 2023 07:00:04 +0200 Subject: [PATCH 172/223] Got rid of some redundant declarations for indents On branch bojan_more_robust_communicator modified: Process/Front_Mod/Save_Debug_Front_Vtu.f90 modified: Process/Results_Mod/Save_Vtu_Front.f90 modified: Process/Results_Mod/Save_Vtu_Surf.f90 modified: Process/Results_Mod/Save_Vtu_Swarm.f90 --- Sources/Process/Front_Mod/Save_Debug_Front_Vtu.f90 | 7 ------- Sources/Process/Results_Mod/Save_Vtu_Front.f90 | 7 ------- Sources/Process/Results_Mod/Save_Vtu_Surf.f90 | 8 -------- Sources/Process/Results_Mod/Save_Vtu_Swarm.f90 | 7 ------- 4 files changed, 29 deletions(-) diff --git a/Sources/Process/Front_Mod/Save_Debug_Front_Vtu.f90 b/Sources/Process/Front_Mod/Save_Debug_Front_Vtu.f90 index f993528cb..d3bd0aada 100644 --- a/Sources/Process/Front_Mod/Save_Debug_Front_Vtu.f90 +++ b/Sources/Process/Front_Mod/Save_Debug_Front_Vtu.f90 @@ -13,13 +13,6 @@ subroutine Save_Debug_Front_Vtu(Front, time_step) integer :: v, e, n, s, n_int, offset, fu integer, allocatable :: n_elems(:) character(SL) :: name_out -!-----------------------------[Local parameters]-------------------------------! - character(len= 0) :: IN_0 = '' ! indentation levels - character(len= 2) :: IN_1 = ' ' - character(len= 4) :: IN_2 = ' ' - character(len= 6) :: IN_3 = ' ' - character(len= 8) :: IN_4 = ' ' - character(len=10) :: IN_5 = ' ' !==============================================================================! ! Take alias diff --git a/Sources/Process/Results_Mod/Save_Vtu_Front.f90 b/Sources/Process/Results_Mod/Save_Vtu_Front.f90 index 3b79fc0a3..00449002e 100644 --- a/Sources/Process/Results_Mod/Save_Vtu_Front.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Front.f90 @@ -14,13 +14,6 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) integer :: v, e ! vertex and element counters integer :: offset, n, f8, f9 character(SL) :: name_out_8, name_out_9 -!-----------------------------[Local parameters]-------------------------------! - character(len= 0) :: IN_0 = '' ! indentation levels - character(len= 2) :: IN_1 = ' ' - character(len= 4) :: IN_2 = ' ' - character(len= 6) :: IN_3 = ' ' - character(len= 8) :: IN_4 = ' ' - character(len=10) :: IN_5 = ' ' !------------------------[Avoid unused parent warning]-------------------------! Unused(Results) !==============================================================================! diff --git a/Sources/Process/Results_Mod/Save_Vtu_Surf.f90 b/Sources/Process/Results_Mod/Save_Vtu_Surf.f90 index 7897dc815..94a32c856 100644 --- a/Sources/Process/Results_Mod/Save_Vtu_Surf.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Surf.f90 @@ -13,14 +13,6 @@ subroutine Save_Vtu_Surf(Results, Surf, time_step) integer :: v, e ! vertex and element counters integer :: offset, fu character(SL) :: name_out -!-----------------------------[Local parameters]-------------------------------! - integer, parameter :: VTK_TRIANGLE = 5 ! cell shapes in VTK format - character(len= 0) :: IN_0 = '' ! indentation levels - character(len= 2) :: IN_1 = ' ' - character(len= 4) :: IN_2 = ' ' - character(len= 6) :: IN_3 = ' ' - character(len= 8) :: IN_4 = ' ' - character(len=10) :: IN_5 = ' ' !------------------------[Avoid unused parent warning]-------------------------! Unused(Results) !==============================================================================! diff --git a/Sources/Process/Results_Mod/Save_Vtu_Swarm.f90 b/Sources/Process/Results_Mod/Save_Vtu_Swarm.f90 index f89bea7ea..e13a970ce 100644 --- a/Sources/Process/Results_Mod/Save_Vtu_Swarm.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Swarm.f90 @@ -16,13 +16,6 @@ subroutine Save_Vtu_Swarm(Results, Swarm, time_step, domain) integer :: k, fu character(SL) :: name_out integer :: n_remaining_particles -!-----------------------------[Local parameters]-------------------------------! - character(len= 0) :: IN_0 = '' ! indentation levels - character(len= 2) :: IN_1 = ' ' - character(len= 4) :: IN_2 = ' ' - character(len= 6) :: IN_3 = ' ' - character(len= 8) :: IN_4 = ' ' - character(len=10) :: IN_5 = ' ' !------------------------[Avoid unused parent warning]-------------------------! Unused(Results) !==============================================================================! From ce8ae15d44537e6b20a0a53b6d3887125ba3e15c Mon Sep 17 00:00:00 2001 From: Niceno Date: Fri, 31 Mar 2023 20:42:23 +0200 Subject: [PATCH 173/223] Added a new member procedure: Volume_Average! On branch bojan_more_robust_communicator modified: Process/Field_Mod.f90 new file: Process/Field_Mod/Utilities/Volume_Average.f90 --- Sources/Process/Field_Mod.f90 | 2 + .../Field_Mod/Utilities/Volume_Average.f90 | 37 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 Sources/Process/Field_Mod/Utilities/Volume_Average.f90 diff --git a/Sources/Process/Field_Mod.f90 b/Sources/Process/Field_Mod.f90 index 9a9e88756..8e2b8e1d6 100644 --- a/Sources/Process/Field_Mod.f90 +++ b/Sources/Process/Field_Mod.f90 @@ -238,6 +238,7 @@ module Field_Mod procedure :: Report_Volume_Balance procedure :: Report_Volume_Balance_Start procedure :: Report_Volume_Balance_Stop + procedure :: Volume_Average end type @@ -303,5 +304,6 @@ module Field_Mod # include "Field_Mod/Utilities/Report_Volume_Balance.f90" # include "Field_Mod/Utilities/Report_Volume_Balance_Start.f90" # include "Field_Mod/Utilities/Report_Volume_Balance_Stop.f90" +# include "Field_Mod/Utilities/Volume_Average.f90" end module diff --git a/Sources/Process/Field_Mod/Utilities/Volume_Average.f90 b/Sources/Process/Field_Mod/Utilities/Volume_Average.f90 new file mode 100644 index 000000000..0f484d4fb --- /dev/null +++ b/Sources/Process/Field_Mod/Utilities/Volume_Average.f90 @@ -0,0 +1,37 @@ +!==============================================================================! + real function Volume_Average(Flow, val) +!------------------------------------------------------------------------------! +! Calculates the volume average of the values in array val ! +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Field_Type) :: Flow + real :: val( - Flow % pnt_grid % n_bnd_cells & + : Flow % pnt_grid % n_cells) +!-----------------------------------[Locals]-----------------------------------! + type(Grid_Type), pointer :: Grid + integer :: c + real :: sum_val, tot_vol +!==============================================================================! + + ! Take alias + Grid => Flow % pnt_grid + + ! Initialize sums + sum_val = 0.0 + tot_vol = 0.0 + + ! Integrate them over cells, avoiding buffers + do c = Cells_In_Domain() + sum_val = sum_val + val(c) * Grid % vol(c) + tot_vol = tot_vol + Grid % vol(c) + end do + + ! Perform sums over all processors + call Global % Sum_Real(sum_val) + call Global % Sum_Real(tot_vol) + + ! Work out the final resul + Volume_Average = sum_val / tot_vol + + end function From f9810b0d5c8dd46991d6b80c764d4ceb8ccf4da5 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 1 Apr 2023 07:25:00 +0200 Subject: [PATCH 174/223] Fixed: k_epsilon was missing in the list of models On branch bojan_more_robust_communicator modified: Process/Read_Controls_Mod/Physical_Models.f90 --- Sources/Process/Read_Controls_Mod/Physical_Models.f90 | 1 + 1 file changed, 1 insertion(+) diff --git a/Sources/Process/Read_Controls_Mod/Physical_Models.f90 b/Sources/Process/Read_Controls_Mod/Physical_Models.f90 index 6514a938b..54ff04187 100644 --- a/Sources/Process/Read_Controls_Mod/Physical_Models.f90 +++ b/Sources/Process/Read_Controls_Mod/Physical_Models.f90 @@ -141,6 +141,7 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) Turb % model .eq. DES_SPALART .or. & Turb % model .eq. HYBRID_LES_PRANDTL .or. & Turb % model .eq. HYBRID_LES_RANS .or. & + Turb % model .eq. K_EPS .or. & Turb % model .eq. K_EPS_ZETA_F) .and. & n_times > n_stat) then ! last line covers unsteady RANS models From 3dc0098195786fe709555c3e8d677fac14ba0bde Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 1 Apr 2023 09:53:26 +0200 Subject: [PATCH 175/223] Little reconstruction of the Info_Mod. Got rid of one ghost number along the way. On branch bojan_more_robust_communicator modified: Info_Mod.f90 modified: Info_Mod/Bulk_Fill.f90 modified: Info_Mod/Bulk_Print.f90 modified: Info_Mod/Bulk_Start.f90 modified: Info_Mod/Iter_Fill.f90 modified: Info_Mod/Iter_Fill_At.f90 new file: Info_Mod/Iter_Fill_Scalar_At.f90 deleted: Info_Mod/Iter_Fill_User_At.f90 modified: Info_Mod/Iter_Print.f90 modified: Info_Mod/Iter_Start.f90 modified: Info_Mod/Start.f90 modified: Info_Mod/Time_Fill.f90 modified: Info_Mod/Time_Print.f90 modified: Info_Mod/Time_Start.f90 modified: Info_Mod/Time_To_Exit.f90 modified: Main_Pro.f90 modified: Process_Mod/Compute_Energy.f90 modified: Process_Mod/Compute_Momentum.f90 modified: Process_Mod/Compute_Pressure.f90 modified: Process_Mod/Compute_Scalar.f90 modified: Process_Mod/Correct_Velocity.f90 modified: Process_Mod/Piso_Algorithm.f90 modified: Turb_Mod/Compute_F22.f90 modified: Turb_Mod/Compute_Stress.f90 modified: Turb_Mod/Compute_Variable.f90 modified: Vof_Mod/Core/Solve_System.f90 --- Sources/Process/Info_Mod.f90 | 29 +++++---- Sources/Process/Info_Mod/Bulk_Fill.f90 | 34 +++++----- Sources/Process/Info_Mod/Bulk_Print.f90 | 18 +++--- Sources/Process/Info_Mod/Bulk_Start.f90 | 62 +++++++++---------- Sources/Process/Info_Mod/Iter_Fill.f90 | 14 ++--- Sources/Process/Info_Mod/Iter_Fill_At.f90 | 34 +++++----- .../Process/Info_Mod/Iter_Fill_Scalar_At.f90 | 33 ++++++++++ .../Process/Info_Mod/Iter_Fill_User_At.f90 | 33 ---------- Sources/Process/Info_Mod/Iter_Print.f90 | 24 +++---- Sources/Process/Info_Mod/Iter_Start.f90 | 30 ++++----- Sources/Process/Info_Mod/Start.f90 | 10 +-- Sources/Process/Info_Mod/Time_Fill.f90 | 33 +++++----- Sources/Process/Info_Mod/Time_Print.f90 | 8 +-- Sources/Process/Info_Mod/Time_Start.f90 | 36 +++++------ Sources/Process/Info_Mod/Time_To_Exit.f90 | 6 +- Sources/Process/Main_Pro.f90 | 2 +- .../Process/Process_Mod/Compute_Energy.f90 | 2 +- .../Process/Process_Mod/Compute_Momentum.f90 | 2 +- .../Process/Process_Mod/Compute_Pressure.f90 | 4 +- .../Process/Process_Mod/Compute_Scalar.f90 | 2 +- .../Process/Process_Mod/Correct_Velocity.f90 | 4 +- .../Process/Process_Mod/Piso_Algorithm.f90 | 6 +- Sources/Process/Turb_Mod/Compute_F22.f90 | 4 +- Sources/Process/Turb_Mod/Compute_Stress.f90 | 14 ++--- Sources/Process/Turb_Mod/Compute_Variable.f90 | 8 +-- Sources/Process/Vof_Mod/Core/Solve_System.f90 | 4 +- 26 files changed, 231 insertions(+), 225 deletions(-) create mode 100644 Sources/Process/Info_Mod/Iter_Fill_Scalar_At.f90 delete mode 100644 Sources/Process/Info_Mod/Iter_Fill_User_At.f90 diff --git a/Sources/Process/Info_Mod.f90 b/Sources/Process/Info_Mod.f90 index 6e8c74fe9..a74c1ac51 100644 --- a/Sources/Process/Info_Mod.f90 +++ b/Sources/Process/Info_Mod.f90 @@ -28,18 +28,18 @@ module Info_Mod type Time_Info_Type character(len=L_LINE) :: line_lead = '' character(len=L_LINE) :: line_trail = '' - character(len=L_LINE) :: lines(6) = '' + character(len=L_LINE) :: line(6) = '' end type !--------------------! ! Iter_Info type ! !--------------------! type Iter_Info_Type - integer :: n_user_lines = 0 - character(len=L_LINE) :: line_lead = '' - character(len=L_LINE) :: line_sep = '' - character(len=L_LINE) :: line_iter = '' - character(len=L_LINE) :: lines(4) = '' + integer :: n_user_lines = 0 + character(len=L_LINE) :: line_lead = '' + character(len=L_LINE) :: line_sep = '' + character(len=L_LINE) :: line_iter = '' + character(len=L_LINE) :: line(4) = '' character(len=L_LINE) :: lines_user(MAX_USER_LINES) = '' end type @@ -51,13 +51,18 @@ module Info_Mod character(len=L_LINE) :: line_foll = '' character(len=L_LINE) :: line_sep = '' character(len=L_LINE) :: line_trail = '' - character(len=L_LINE) :: lines(3) = '' + character(len=L_LINE) :: line(3) = '' end type - type(System_Clock_Type), save :: sys_clock - type(Time_Info_Type), save :: time_info - type(Iter_Info_Type), save :: iter_info - type(Bulk_Info_Type), save :: bulk_info + type Info_Type + type(System_Clock_Type), private :: clock + type(Time_Info_Type), private :: time + type(Iter_Info_Type), private :: iter + type(Bulk_Info_Type), private :: bulk + end type + + ! Singletone type Info object ! + type(Info_Type) :: Info contains @@ -71,7 +76,7 @@ module Info_Mod # include "Info_Mod/Iter_Start.f90" # include "Info_Mod/Iter_Fill.f90" # include "Info_Mod/Iter_Fill_At.f90" -# include "Info_Mod/Iter_Fill_User_At.f90" +# include "Info_Mod/Iter_Fill_Scalar_At.f90" # include "Info_Mod/Iter_Print.f90" # include "Info_Mod/Bulk_Start.f90" diff --git a/Sources/Process/Info_Mod/Bulk_Fill.f90 b/Sources/Process/Info_Mod/Bulk_Fill.f90 index c8be8644a..18bca47da 100644 --- a/Sources/Process/Info_Mod/Bulk_Fill.f90 +++ b/Sources/Process/Info_Mod/Bulk_Fill.f90 @@ -5,31 +5,31 @@ subroutine Info_Mod_Bulk_Fill(Flow) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type) :: Flow + type(Field_Type), intent(in) :: Flow !==============================================================================! if(First_Proc()) then ! Courant and Peclet numbers - write(bulk_info % lines(1)( 27: 49), '(a23)') 'Maximum Courant number:' - write(bulk_info % lines(1)( 51: 60), '(1pe9.3)') Flow % cfl_max + write(Info % bulk % line(1)( 27: 49), '(a23)') 'Maximum Courant number:' + write(Info % bulk % line(1)( 51: 60), '(1pe9.3)') Flow % cfl_max - write(bulk_info % lines(1)( 69: 90), '(a22)') 'Maximum Peclet number:' - write(bulk_info % lines(1)( 92:100), '(1pe9.3)') Flow % pe_max + write(Info % bulk % line(1)( 69: 90), '(a22)') 'Maximum Peclet number:' + write(Info % bulk % line(1)( 92:100), '(1pe9.3)') Flow % pe_max - write(bulk_info % lines(2)( 27: 34), '(a8)') 'Flux x :' - write(bulk_info % lines(2)( 36: 45), '(1pe10.3)') Flow % bulk % flux_x - write(bulk_info % lines(2)( 55: 62), '(a8)') 'Flux y :' - write(bulk_info % lines(2)( 64: 75), '(1pe10.2)') Flow % bulk % flux_y - write(bulk_info % lines(2)( 83: 90), '(a8)') 'Flux z :' - write(bulk_info % lines(2)( 92:101), '(1pe10.2)') Flow % bulk % flux_z + write(Info % bulk % line(2)( 27: 34), '(a8)') 'Flux x :' + write(Info % bulk % line(2)( 36: 45), '(1pe10.3)') Flow % bulk % flux_x + write(Info % bulk % line(2)( 55: 62), '(a8)') 'Flux y :' + write(Info % bulk % line(2)( 64: 75), '(1pe10.2)') Flow % bulk % flux_y + write(Info % bulk % line(2)( 83: 90), '(a8)') 'Flux z :' + write(Info % bulk % line(2)( 92:101), '(1pe10.2)') Flow % bulk % flux_z - write(bulk_info % lines(3)( 27: 34), '(a8)') 'Pdrop x:' - write(bulk_info % lines(3)( 36: 45), '(1pe10.3)') Flow % bulk % p_drop_x - write(bulk_info % lines(3)( 55: 62), '(a8)') 'Pdrop y:' - write(bulk_info % lines(3)( 64: 75), '(1pe10.2)') Flow % bulk % p_drop_y - write(bulk_info % lines(3)( 83: 90), '(a8)') 'Pdrop z:' - write(bulk_info % lines(3)( 92:101), '(1pe10.2)') Flow % bulk % p_drop_z + write(Info % bulk % line(3)( 27: 34), '(a8)') 'Pdrop x:' + write(Info % bulk % line(3)( 36: 45), '(1pe10.3)') Flow % bulk % p_drop_x + write(Info % bulk % line(3)( 55: 62), '(a8)') 'Pdrop y:' + write(Info % bulk % line(3)( 64: 75), '(1pe10.2)') Flow % bulk % p_drop_y + write(Info % bulk % line(3)( 83: 90), '(a8)') 'Pdrop z:' + write(Info % bulk % line(3)( 92:101), '(1pe10.2)') Flow % bulk % p_drop_z end if end subroutine diff --git a/Sources/Process/Info_Mod/Bulk_Print.f90 b/Sources/Process/Info_Mod/Bulk_Print.f90 index a31f0892a..0fef10432 100644 --- a/Sources/Process/Info_Mod/Bulk_Print.f90 +++ b/Sources/Process/Info_Mod/Bulk_Print.f90 @@ -5,8 +5,8 @@ subroutine Info_Mod_Bulk_Print(Flow, dom, n_dom) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type) :: Flow - integer :: dom, n_dom + type(Field_Type), intent(in) :: Flow + integer, intent(in) :: dom, n_dom !==============================================================================! call Info_Mod_Bulk_Fill(Flow) @@ -15,16 +15,16 @@ subroutine Info_Mod_Bulk_Print(Flow, dom, n_dom) ! String is L_LINE+2 long if(dom .eq. 1) then - print '(a129)', trim(bulk_info % line_lead) + print '(a129)', trim(Info % bulk % line_lead) else - print '(a108)', trim(bulk_info % line_foll) + print '(a108)', trim(Info % bulk % line_foll) end if - print '(a108)', trim(bulk_info % lines(1)) - print '(a108)', trim(bulk_info % line_sep) - print '(a108)', trim(bulk_info % lines(2)) - print '(a108)', trim(bulk_info % lines(3)) + print '(a108)', trim(Info % bulk % line(1)) + print '(a108)', trim(Info % bulk % line_sep) + print '(a108)', trim(Info % bulk % line(2)) + print '(a108)', trim(Info % bulk % line(3)) if(dom .eq. n_dom) then - print '(a108)', trim(bulk_info % line_trail) + print '(a108)', trim(Info % bulk % line_trail) print '(a)', '' end if diff --git a/Sources/Process/Info_Mod/Bulk_Start.f90 b/Sources/Process/Info_Mod/Bulk_Start.f90 index 7d5ac3d7d..87ed6744b 100644 --- a/Sources/Process/Info_Mod/Bulk_Start.f90 +++ b/Sources/Process/Info_Mod/Bulk_Start.f90 @@ -13,47 +13,47 @@ subroutine Info_Mod_Bulk_Start() ! Create a frame do i = 1, L_LINE - bulk_info % line_lead(i:i) = '-' - bulk_info % line_foll(i:i) = ' ' + Info % bulk % line_lead(i:i) = '-' + Info % bulk % line_foll(i:i) = ' ' end do - bulk_info % line_lead( 1: 1) = '#' - bulk_info % line_lead(L_LINE:L_LINE) = '#' + Info % bulk % line_lead( 1: 1) = '#' + Info % bulk % line_lead(L_LINE:L_LINE) = '#' do i = L_BOX + 1, 5*L_BOX + 1 - bulk_info % line_lead (i:i) = '=' - bulk_info % line_foll (i:i) = '=' - bulk_info % line_sep (i:i) = '-' - bulk_info % line_trail(i:i) = '-' + Info % bulk % line_lead (i:i) = '=' + Info % bulk % line_foll (i:i) = '=' + Info % bulk % line_sep (i:i) = '-' + Info % bulk % line_trail(i:i) = '-' end do - bulk_info % line_lead( L_BOX+1: L_BOX+1) = '+' - bulk_info % line_foll( L_BOX+1: L_BOX+1) = '+' - bulk_info % line_lead(5*L_BOX+1:5*L_BOX+1) = '+' - bulk_info % line_foll(5*L_BOX+1:5*L_BOX+1) = '+' + Info % bulk % line_lead( L_BOX+1: L_BOX+1) = '+' + Info % bulk % line_foll( L_BOX+1: L_BOX+1) = '+' + Info % bulk % line_lead(5*L_BOX+1:5*L_BOX+1) = '+' + Info % bulk % line_foll(5*L_BOX+1:5*L_BOX+1) = '+' do i = 22, 106, 106-22 - bulk_info % lines(1) (i:i) = '#' - bulk_info % line_sep (i:i) = '#' - bulk_info % lines(2) (i:i) = '#' - bulk_info % lines(3) (i:i) = '#' - bulk_info % line_trail(i:i) = '#' + Info % bulk % line(1) (i:i) = '#' + Info % bulk % line_sep (i:i) = '#' + Info % bulk % line(2) (i:i) = '#' + Info % bulk % line(3) (i:i) = '#' + Info % bulk % line_trail(i:i) = '#' end do ! Create separators - bulk_info % line_lead(L_LINE/2+1:L_LINE/2+1) = '+' - bulk_info % line_foll(L_LINE/2+1:L_LINE/2+1) = '+' - bulk_info % lines(1) (L_LINE/2+1:L_LINE/2+1) = '|' - bulk_info % line_sep (L_LINE/2+1:L_LINE/2+1) = '+' - - bulk_info % line_sep (50:50) = '+' - bulk_info % lines(2) (50:50) = '|' - bulk_info % lines(3) (50:50) = '|' - bulk_info % line_trail(50:50) = '+' - - bulk_info % line_sep (78:78) = '+' - bulk_info % lines(2) (78:78) = '|' - bulk_info % lines(3) (78:78) = '|' - bulk_info % line_trail(78:78) = '+' + Info % bulk % line_lead(L_LINE/2+1:L_LINE/2+1) = '+' + Info % bulk % line_foll(L_LINE/2+1:L_LINE/2+1) = '+' + Info % bulk % line(1) (L_LINE/2+1:L_LINE/2+1) = '|' + Info % bulk % line_sep (L_LINE/2+1:L_LINE/2+1) = '+' + + Info % bulk % line_sep (50:50) = '+' + Info % bulk % line(2) (50:50) = '|' + Info % bulk % line(3) (50:50) = '|' + Info % bulk % line_trail(50:50) = '+' + + Info % bulk % line_sep (78:78) = '+' + Info % bulk % line(2) (78:78) = '|' + Info % bulk % line(3) (78:78) = '|' + Info % bulk % line_trail(78:78) = '+' end if diff --git a/Sources/Process/Info_Mod/Iter_Fill.f90 b/Sources/Process/Info_Mod/Iter_Fill.f90 index 00a492411..0a7743e48 100644 --- a/Sources/Process/Info_Mod/Iter_Fill.f90 +++ b/Sources/Process/Info_Mod/Iter_Fill.f90 @@ -5,7 +5,7 @@ subroutine Info_Mod_Iter_Fill(n) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer :: n ! inner iteration + integer, intent(in) :: n ! inner iteration !-----------------------------------[Locals]-----------------------------------! integer :: c !==============================================================================! @@ -14,14 +14,14 @@ subroutine Info_Mod_Iter_Fill(n) ! Write basic info c = 1 ! a column - write(iter_info % line_iter((c-1)*L_BOX+58 : & - (c-1)*L_BOX+67), '(a10)') 'Iteration:' - write(iter_info % line_iter((c-1)*L_BOX+68 : & - (c-1)*L_BOX+70), '(i3)') n + write(Info % iter % line_iter((c-1)*L_BOX+58 : & + (c-1)*L_BOX+67), '(a10)') 'Iteration:' + write(Info % iter % line_iter((c-1)*L_BOX+68 : & + (c-1)*L_BOX+70), '(i3)') n c = 5 ! a column - write(iter_info % lines(1)((c-1)*L_BOX+3 : & - (c-1)*L_BOX+7), '(a5)') 'MASS:' + write(Info % iter % line(1)((c-1)*L_BOX+3 : & + (c-1)*L_BOX+7), '(a5)') 'MASS:' end if diff --git a/Sources/Process/Info_Mod/Iter_Fill_At.f90 b/Sources/Process/Info_Mod/Iter_Fill_At.f90 index 46b2364e5..f06ef6635 100644 --- a/Sources/Process/Info_Mod/Iter_Fill_At.f90 +++ b/Sources/Process/Info_Mod/Iter_Fill_At.f90 @@ -1,33 +1,33 @@ !==============================================================================! - subroutine Info_Mod_Iter_Fill_At(r, c, name_var, n_iter, res) + subroutine Info_Mod_Iter_Fill_At(r, c, name_var, res, n_iter) !------------------------------------------------------------------------------! ! Inserts infromation at specified position in the information box. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer :: r ! row - integer :: c ! column - character(len=*) :: name_var - integer :: n_iter ! number of iterations - real :: res + integer, intent(in) :: r ! row + integer, intent(in) :: c ! column + character(len=*), intent(in) :: name_var + real, intent(in) :: res + integer, optional, intent(in) :: n_iter ! number of iterations !==============================================================================! if(First_Proc()) then ! Normal variables - if(n_iter > -1) then ! if n_iter .eq. -1, iterations won't be written - ! (that's useful for mass residual) - write(iter_info % lines(r)((c-1)*L_BOX+ 3 : & - (c-1)*L_BOX+ 6), '(a4)') name_var - write(iter_info % lines(r)((c-1)*L_BOX+ 7 : & - (c-1)*L_BOX+ 7), '(a1)') ':' - write(iter_info % lines(r)((c-1)*L_BOX+ 8 : & - (c-1)*L_BOX+10), '(i3)') n_iter + if(present(n_iter)) then ! if n_iter not present, iterations won't be + ! written (that's useful for mass residual) + write(Info % iter % line(r)((c-1)*L_BOX+ 3 : & + (c-1)*L_BOX+ 6), '(a4)') name_var + write(Info % iter % line(r)((c-1)*L_BOX+ 7 : & + (c-1)*L_BOX+ 7), '(a1)') ':' + write(Info % iter % line(r)((c-1)*L_BOX+ 8 : & + (c-1)*L_BOX+10), '(i3)') n_iter endif - ! Residual - write(iter_info % lines(r)((c-1)*L_BOX+12 : & - (c-1)*L_BOX+20), '(1pe9.3)') res + ! Residual + write(Info % iter % line(r)((c-1)*L_BOX+12 : & + (c-1)*L_BOX+20), '(1pe9.3)') res end if diff --git a/Sources/Process/Info_Mod/Iter_Fill_Scalar_At.f90 b/Sources/Process/Info_Mod/Iter_Fill_Scalar_At.f90 new file mode 100644 index 000000000..1e743ce4e --- /dev/null +++ b/Sources/Process/Info_Mod/Iter_Fill_Scalar_At.f90 @@ -0,0 +1,33 @@ +!==============================================================================! + subroutine Info_Mod_Iter_Fill_Scalar_At(r, c, name_var, res, n_iter) +!------------------------------------------------------------------------------! +! Inserts infromation at specified position in the information box. ! +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + integer, intent(in) :: r ! row + integer, intent(in) :: c ! column + character(len=*), intent(in) :: name_var + real, intent(in) :: res + integer, intent(in) :: n_iter ! number of iterations +!==============================================================================! + + if(First_Proc()) then + + ! Update the number of lines you'll have to print in the end + Info % iter % n_user_lines = max(Info % iter % n_user_lines, r) + + ! User variables + write(Info % iter % lines_user(r)((c-1)*L_BOX+ 3 : & + (c-1)*L_BOX+ 6), '(a4)') name_var + write(Info % iter % lines_user(r)((c-1)*L_BOX+ 7 : & + (c-1)*L_BOX+ 7), '(a1)') ':' + write(Info % iter % lines_user(r)((c-1)*L_BOX+ 8 : & + (c-1)*L_BOX+10), '(i3)') n_iter + ! Residual + write(Info % iter % lines_user(r)((c-1)*L_BOX+12 : & + (c-1)*L_BOX+20), '(1pe9.3)') res + + end if + + end subroutine diff --git a/Sources/Process/Info_Mod/Iter_Fill_User_At.f90 b/Sources/Process/Info_Mod/Iter_Fill_User_At.f90 deleted file mode 100644 index e35ca51da..000000000 --- a/Sources/Process/Info_Mod/Iter_Fill_User_At.f90 +++ /dev/null @@ -1,33 +0,0 @@ -!==============================================================================! - subroutine Info_Mod_Iter_Fill_User_At(r, c, name_var, n_iter, res) -!------------------------------------------------------------------------------! -! Inserts infromation at specified position in the information box. ! -!------------------------------------------------------------------------------! - implicit none -!---------------------------------[Arguments]----------------------------------! - integer :: r ! row - integer :: c ! column - character(len=*) :: name_var - integer :: n_iter ! number of iterations - real :: res -!==============================================================================! - - if(First_Proc()) then - - ! Update the number of lines you'll have to print in the end - iter_info % n_user_lines = max(iter_info % n_user_lines, r) - - ! User variables - write(iter_info % lines_user(r)((c-1)*L_BOX+ 3 : & - (c-1)*L_BOX+ 6), '(a4)') name_var - write(iter_info % lines_user(r)((c-1)*L_BOX+ 7 : & - (c-1)*L_BOX+ 7), '(a1)') ':' - write(iter_info % lines_user(r)((c-1)*L_BOX+ 8 : & - (c-1)*L_BOX+10), '(i3)') n_iter - ! Residual - write(iter_info % lines_user(r)((c-1)*L_BOX+12 : & - (c-1)*L_BOX+20), '(1pe9.3)') res - - end if - - end subroutine diff --git a/Sources/Process/Info_Mod/Iter_Print.f90 b/Sources/Process/Info_Mod/Iter_Print.f90 index 333b643bb..18be4e5fc 100644 --- a/Sources/Process/Info_Mod/Iter_Print.f90 +++ b/Sources/Process/Info_Mod/Iter_Print.f90 @@ -5,7 +5,7 @@ subroutine Info_Mod_Iter_Print(d) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer :: d ! domain + integer, intent(in) :: d ! domain !-----------------------------------[Locals]-----------------------------------! integer :: i character(len=L_LINE) :: tmp @@ -14,26 +14,26 @@ subroutine Info_Mod_Iter_Print(d) if(First_Proc()) then if(d .eq. 1) then - print '(a129)', iter_info % line_lead - print '(a129)', iter_info % line_iter - print '(a129)', iter_info % line_sep + print '(a129)', Info % iter % line_lead + print '(a129)', Info % iter % line_iter + print '(a129)', Info % iter % line_sep end if ! Print only lines which have colon in the first column :-) - print '(a129)', iter_info % lines(1) + print '(a129)', Info % iter % line(1) ! First print normal lines do i = 2, 4 - tmp = iter_info % lines(i) - if( tmp(7:7) .eq. ':') print '(a129)', iter_info % lines(i) - iter_info % lines(i)(7:7) = ' ' ! remove the column for other domains + tmp = Info % iter % line(i) + if( tmp(7:7) .eq. ':') print '(a129)', Info % iter % line(i) + Info % iter % line(i)(7:7) = ' ' ! remove column for other domains end do ! Then print user lines - do i = 1, iter_info % n_user_lines - tmp = iter_info % lines_user(i) - if( tmp(7:7) .eq. ':') print '(a129)', iter_info % lines_user(i) - iter_info % lines_user(i)(7:7) = ' ' ! remove the column for other domains + do i = 1, Info % iter % n_user_lines + tmp = Info % iter % lines_user(i) + if( tmp(7:7) .eq. ':') print '(a129)', Info % iter % lines_user(i) + Info % iter % lines_user(i)(7:7) = ' ' ! remove column for other domains end do call Info_Mod_Iter_Start() diff --git a/Sources/Process/Info_Mod/Iter_Start.f90 b/Sources/Process/Info_Mod/Iter_Start.f90 index 83bf189d6..2310d23e1 100644 --- a/Sources/Process/Info_Mod/Iter_Start.f90 +++ b/Sources/Process/Info_Mod/Iter_Start.f90 @@ -12,29 +12,29 @@ subroutine Info_Mod_Iter_Start() ! Create frame do i = 1, L_LINE, L_LINE-1 - iter_info % line_lead (i:i) = '#' - iter_info % line_iter (i:i) = '#' - iter_info % line_sep (i:i) = '#' + Info % iter % line_lead (i:i) = '#' + Info % iter % line_iter (i:i) = '#' + Info % iter % line_sep (i:i) = '#' end do ! For normal lines do l = 1, 4 - iter_info % lines(l)( 1:L_LINE) = ' ' - iter_info % lines(l)( 1: 1) = '#' - iter_info % lines(l)(L_LINE:L_LINE) = '#' + Info % iter % line(l)( 1:L_LINE) = ' ' + Info % iter % line(l)( 1: 1) = '#' + Info % iter % line(l)(L_LINE:L_LINE) = '#' end do ! For user lines do l = 1, MAX_USER_LINES - iter_info % lines_user(l)( 1:L_LINE) = ' ' - iter_info % lines_user(l)( 1: 1) = '#' - iter_info % lines_user(l)(L_LINE:L_LINE) = '#' + Info % iter % lines_user(l)( 1:L_LINE) = ' ' + Info % iter % lines_user(l)( 1: 1) = '#' + Info % iter % lines_user(l)(L_LINE:L_LINE) = '#' end do ! Lead and separating lines do i = 2, L_LINE-1 - iter_info % line_lead(i:i) = '=' - iter_info % line_sep (i:i) = '-' + Info % iter % line_lead(i:i) = '=' + Info % iter % line_sep (i:i) = '-' end do ! Create separators (character must be length of L_BOX) @@ -42,15 +42,15 @@ subroutine Info_Mod_Iter_Start() ! For normal lines do l = 1, 4 - write(iter_info % lines(l) (i:i+L_BOX-1), '(a21)') '|' + write(Info % iter % line(l) (i:i+L_BOX-1), '(a21)') '|' end do ! For user lines do l = 1, MAX_USER_LINES - write(iter_info % lines_user(l) (i:i+L_BOX-1), '(a21)') '|' + write(Info % iter % lines_user(l) (i:i+L_BOX-1), '(a21)') '|' end do - write(iter_info % line_sep(i+L_BOX-1 : & - i+L_BOX-1), '(a1)') '+' + write(Info % iter % line_sep(i+L_BOX-1 : & + i+L_BOX-1), '(a1)') '+' end do end if diff --git a/Sources/Process/Info_Mod/Start.f90 b/Sources/Process/Info_Mod/Start.f90 index 78bf1f720..86ae0e3c0 100644 --- a/Sources/Process/Info_Mod/Start.f90 +++ b/Sources/Process/Info_Mod/Start.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Info_Mod_Start() + subroutine Info_Mod_Start_Info() !------------------------------------------------------------------------------! ! Start Info_Mod by taking system count rate and initial count rate ! !------------------------------------------------------------------------------! @@ -7,14 +7,14 @@ subroutine Info_Mod_Start() !==============================================================================! ! Get system clock clock rate and initial clock count - call system_clock(count_rate = sys_clock % cnt) - call system_clock(sys_clock % ini) + call system_clock(count_rate = Info % clock % cnt) + call system_clock(Info % clock % ini) ! Read maximum wall clock hours - call Control_Mod_Wall_Time_Max_Hours(sys_clock % wall_time_max, & + call Control_Mod_Wall_Time_Max_Hours(Info % clock % wall_time_max, & verbose=.true.) ! Make it in seconds - sys_clock % wall_time_max = sys_clock % wall_time_max * 3600 + Info % clock % wall_time_max = Info % clock % wall_time_max * 3600 end subroutine diff --git a/Sources/Process/Info_Mod/Time_Fill.f90 b/Sources/Process/Info_Mod/Time_Fill.f90 index 7fb2a0f1f..f5dfedaaf 100644 --- a/Sources/Process/Info_Mod/Time_Fill.f90 +++ b/Sources/Process/Info_Mod/Time_Fill.f90 @@ -5,39 +5,40 @@ subroutine Info_Mod_Time_Fill(n, sim_time) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer :: n ! time step - real :: sim_time ! simulation time + integer, intent(in) :: n ! time step + real, intent(in) :: sim_time ! simulation time !-----------------------------------[Locals]-----------------------------------! integer :: hours, minutes, seconds real(DP) :: wall_time ! number of seconds of wall-clock time !==============================================================================! ! Update current system clock and wall time - call system_clock(sys_clock % cur) - wall_time = real(sys_clock % cur - sys_clock % ini) / real(sys_clock % cnt) + call system_clock(Info % clock % cur) + wall_time = real(Info % clock % cur - Info % clock % ini) & + / real(Info % clock % cnt) if(First_Proc()) then ! Write time step number - write(time_info % lines(2)(55:65), '(a11)') 'Time step :' - write(time_info % lines(2)(67:72), '(i6)') n + write(Info % time % line(2)(55:65), '(a11)') 'Time step :' + write(Info % time % line(2)(67:72), '(i6)') n ! Write simulation time - write(time_info % lines(4)(45:61), '(a17)') 'Simulation time :' - write(time_info % lines(4)(63:71), '(1pe9.3)') sim_time - write(time_info % lines(4)(73:83), '(a3)') '[s]' + write(Info % time % line(4)(45:61), '(a17)') 'Simulation time :' + write(Info % time % line(4)(63:71), '(1pe9.3)') sim_time + write(Info % time % line(4)(73:83), '(a3)') '[s]' ! Write wall-clock time - write(time_info % lines(5)(45:61), '(a17)') 'Wall-clock time :' + write(Info % time % line(5)(45:61), '(a17)') 'Wall-clock time :' hours = floor( wall_time / 3600.0 ) minutes = floor( (wall_time - 3600.0 * hours) / 60.0) seconds = floor( wall_time - 3600.0 * hours - 60.0 * minutes ) - write(time_info % lines(5)(63:65), '(i3.3)') hours - write(time_info % lines(5)(66:66), '(a1)') ':' - write(time_info % lines(5)(67:69), '(i2.2)') minutes - write(time_info % lines(5)(69:69), '(a1)') ':' - write(time_info % lines(5)(70:71), '(i2.2)') seconds - write(time_info % lines(5)(73:83), '(a11)') '[hhh:mm:ss]' + write(Info % time % line(5)(63:65), '(i3.3)') hours + write(Info % time % line(5)(66:66), '(a1)') ':' + write(Info % time % line(5)(67:69), '(i2.2)') minutes + write(Info % time % line(5)(69:69), '(a1)') ':' + write(Info % time % line(5)(70:71), '(i2.2)') seconds + write(Info % time % line(5)(73:83), '(a11)') '[hhh:mm:ss]' end if diff --git a/Sources/Process/Info_Mod/Time_Print.f90 b/Sources/Process/Info_Mod/Time_Print.f90 index 6b82f60d0..e93ef7e95 100644 --- a/Sources/Process/Info_Mod/Time_Print.f90 +++ b/Sources/Process/Info_Mod/Time_Print.f90 @@ -12,14 +12,14 @@ subroutine Info_Mod_Time_Print() print '(a)', '' print '(a)', '' - print '(a90)', trim(time_info % line_lead) + print '(a90)', trim(Info % time % line_lead) ! Print only lines which have colon in the first column :-) - do i=1,6 - print '(a90)', trim(time_info % lines(i)) + do i = 1, 6 + print '(a90)', trim(Info % time % line(i)) end do - print '(a90)', trim(time_info % line_trail) + print '(a90)', trim(Info % time % line_trail) print '(a)', '' end if diff --git a/Sources/Process/Info_Mod/Time_Start.f90 b/Sources/Process/Info_Mod/Time_Start.f90 index a000a21dd..3ffe819d3 100644 --- a/Sources/Process/Info_Mod/Time_Start.f90 +++ b/Sources/Process/Info_Mod/Time_Start.f90 @@ -11,27 +11,27 @@ subroutine Info_Mod_Time_Start() if(First_Proc()) then ! Create a frame - time_info % line_lead (2*L_BOX-2 : 2*L_BOX-2) = '#' - time_info % lines(1) (2*L_BOX-2 : 2*L_BOX-2) = '#' - time_info % lines(2) (2*L_BOX-2 : 2*L_BOX-2) = '#' - time_info % lines(3) (2*L_BOX-2 : 2*L_BOX-2) = '#' - time_info % lines(4) (2*L_BOX-2 : 2*L_BOX-2) = '#' - time_info % lines(5) (2*L_BOX-2 : 2*L_BOX-2) = '#' - time_info % lines(6) (2*L_BOX-2 : 2*L_BOX-2) = '#' - time_info % line_trail(2*L_BOX-2 : 2*L_BOX-2) = '#' + Info % time % line_lead (2*L_BOX-2 : 2*L_BOX-2) = '#' + Info % time % line(1) (2*L_BOX-2 : 2*L_BOX-2) = '#' + Info % time % line(2) (2*L_BOX-2 : 2*L_BOX-2) = '#' + Info % time % line(3) (2*L_BOX-2 : 2*L_BOX-2) = '#' + Info % time % line(4) (2*L_BOX-2 : 2*L_BOX-2) = '#' + Info % time % line(5) (2*L_BOX-2 : 2*L_BOX-2) = '#' + Info % time % line(6) (2*L_BOX-2 : 2*L_BOX-2) = '#' + Info % time % line_trail(2*L_BOX-2 : 2*L_BOX-2) = '#' - time_info % line_lead (4*L_BOX+4 : 4*L_BOX+4) = '#' - time_info % lines(1) (4*L_BOX+4 : 4*L_BOX+4) = '#' - time_info % lines(2) (4*L_BOX+4 : 4*L_BOX+4) = '#' - time_info % lines(3) (4*L_BOX+4 : 4*L_BOX+4) = '#' - time_info % lines(4) (4*L_BOX+4 : 4*L_BOX+4) = '#' - time_info % lines(5) (4*L_BOX+4 : 4*L_BOX+4) = '#' - time_info % lines(6) (4*L_BOX+4 : 4*L_BOX+4) = '#' - time_info % line_trail(4*L_BOX+4 : 4*L_BOX+4) = '#' + Info % time % line_lead (4*L_BOX+4 : 4*L_BOX+4) = '#' + Info % time % line(1) (4*L_BOX+4 : 4*L_BOX+4) = '#' + Info % time % line(2) (4*L_BOX+4 : 4*L_BOX+4) = '#' + Info % time % line(3) (4*L_BOX+4 : 4*L_BOX+4) = '#' + Info % time % line(4) (4*L_BOX+4 : 4*L_BOX+4) = '#' + Info % time % line(5) (4*L_BOX+4 : 4*L_BOX+4) = '#' + Info % time % line(6) (4*L_BOX+4 : 4*L_BOX+4) = '#' + Info % time % line_trail(4*L_BOX+4 : 4*L_BOX+4) = '#' do i = 2*L_BOX-1, 4*L_BOX+3 - time_info % line_lead (i:i) = '=' - time_info % line_trail(i:i) = '-' + Info % time % line_lead (i:i) = '=' + Info % time % line_trail(i:i) = '-' end do end if diff --git a/Sources/Process/Info_Mod/Time_To_Exit.f90 b/Sources/Process/Info_Mod/Time_To_Exit.f90 index d8b3cf9ed..be8fd3c14 100644 --- a/Sources/Process/Info_Mod/Time_To_Exit.f90 +++ b/Sources/Process/Info_Mod/Time_To_Exit.f90 @@ -7,8 +7,8 @@ logical function Info_Mod_Time_To_Exit() implicit none !==============================================================================! - Info_Mod_Time_To_Exit = real(sys_clock % cur - sys_clock % ini) & - / real(sys_clock % cnt) & - > sys_clock % wall_time_max + Info_Mod_Time_To_Exit = real(Info % clock % cur - Info % clock % ini) & + / real(Info % clock % cnt) & + > Info % clock % wall_time_max end function diff --git a/Sources/Process/Main_Pro.f90 b/Sources/Process/Main_Pro.f90 index 40ad4c411..916d2291f 100644 --- a/Sources/Process/Main_Pro.f90 +++ b/Sources/Process/Main_Pro.f90 @@ -73,7 +73,7 @@ program Process_Prog !-------------------------! ! Initialize Info_Mod ! !-------------------------! - call Info_Mod_Start() + call Info_Mod_Start_Info() !--------------------! ! Read all grids ! diff --git a/Sources/Process/Process_Mod/Compute_Energy.f90 b/Sources/Process/Process_Mod/Compute_Energy.f90 index fbad51eb7..9a7067271 100644 --- a/Sources/Process/Process_Mod/Compute_Energy.f90 +++ b/Sources/Process/Process_Mod/Compute_Energy.f90 @@ -290,7 +290,7 @@ subroutine Compute_Energy(Process, Flow, Turb, Vof, Sol, curr_dt, ini) ' (solver for energy)') ! Print some info on the screen - call Info_Mod_Iter_Fill_At(1, 6, t % name, t % eniter, t % res) + call Info_Mod_Iter_Fill_At(1, 6, t % name, t % res, t % eniter) ! Gradients if(.not. Flow % mass_transfer) then diff --git a/Sources/Process/Process_Mod/Compute_Momentum.f90 b/Sources/Process/Process_Mod/Compute_Momentum.f90 index f5ec60daa..fefc1736e 100644 --- a/Sources/Process/Process_Mod/Compute_Momentum.f90 +++ b/Sources/Process/Process_Mod/Compute_Momentum.f90 @@ -381,7 +381,7 @@ subroutine Compute_Momentum(Process, Flow, Turb, Vof, Por, Sol, curr_dt, ini) ! Fill the info screen up if (Flow % p_m_coupling == SIMPLE) then - call Info_Mod_Iter_Fill_At(1, i, ui % name, ui % eniter, ui % res) + call Info_Mod_Iter_Fill_At(1, i, ui % name, ui % res, ui % eniter) end if end if diff --git a/Sources/Process/Process_Mod/Compute_Pressure.f90 b/Sources/Process/Process_Mod/Compute_Pressure.f90 index ce18624b2..3fd44406a 100644 --- a/Sources/Process/Process_Mod/Compute_Pressure.f90 +++ b/Sources/Process/Process_Mod/Compute_Pressure.f90 @@ -215,10 +215,10 @@ subroutine Compute_Pressure(Process, Flow, Vof, Sol, curr_dt, ini) ' (solver for pressure)') if (Flow % p_m_coupling == SIMPLE) then - call Info_Mod_Iter_Fill_At(1, 4, pp % name, pp % eniter, pp % res) + call Info_Mod_Iter_Fill_At(1, 4, pp % name, pp % res, pp % eniter) else if (Flow % i_corr == Flow % n_piso_corrections) then - call Info_Mod_Iter_Fill_At(1, 4, pp % name, pp % eniter, pp % res) + call Info_Mod_Iter_Fill_At(1, 4, pp % name, pp % res, pp % eniter) end if end if diff --git a/Sources/Process/Process_Mod/Compute_Scalar.f90 b/Sources/Process/Process_Mod/Compute_Scalar.f90 index 9e7fa6ecc..69c961d14 100644 --- a/Sources/Process/Process_Mod/Compute_Scalar.f90 +++ b/Sources/Process/Process_Mod/Compute_Scalar.f90 @@ -229,7 +229,7 @@ subroutine Compute_Scalar(Process, Flow, Turb, Vof, Sol, curr_dt, ini, sc) row = ceiling(ns/6) ! will be 1 (scal. 1-6), 2 (scal. 6-12), etc. col = nint(ns) - (row-1)*6 ! will be in range 1 - 6 - call Info_Mod_Iter_Fill_User_At(row, col, phi % name, phi % eniter, phi % res) + call Info_Mod_Iter_Fill_Scalar_At(row, col, phi % name, phi % res, phi % eniter) call Flow % Grad_Variable(phi) diff --git a/Sources/Process/Process_Mod/Correct_Velocity.f90 b/Sources/Process/Process_Mod/Correct_Velocity.f90 index cdd6f4f47..7273f2374 100644 --- a/Sources/Process/Process_Mod/Correct_Velocity.f90 +++ b/Sources/Process/Process_Mod/Correct_Velocity.f90 @@ -130,10 +130,10 @@ subroutine Correct_Velocity(Process, Flow, Vof, Sol, curr_dt, ini) call Global % Max_Real(Flow % pe_max) if (Flow % p_m_coupling == SIMPLE) then - call Info_Mod_Iter_Fill_At(1, 5, 'dum', -1, Flow % vol_res) + call Info_Mod_Iter_Fill_At(1, 5, 'dum', Flow % vol_res) else if (Flow % i_corr == Flow % n_piso_corrections) then - call Info_Mod_Iter_Fill_At(1, 5, 'dum', -1, Flow % vol_res) + call Info_Mod_Iter_Fill_At(1, 5, 'dum', Flow % vol_res) end if end if diff --git a/Sources/Process/Process_Mod/Piso_Algorithm.f90 b/Sources/Process/Process_Mod/Piso_Algorithm.f90 index 24b19debe..5e6941a2d 100644 --- a/Sources/Process/Process_Mod/Piso_Algorithm.f90 +++ b/Sources/Process/Process_Mod/Piso_Algorithm.f90 @@ -35,9 +35,9 @@ subroutine Piso_Algorithm(Process, Flow, Turb, Vof, Por, Sol, curr_dt, ini) end do Flow % inside_piso_loop = .false. - call Info_Mod_Iter_Fill_At(1, 1, u % name, u % eniter, u % res) - call Info_Mod_Iter_Fill_At(1, 2, v % name, v % eniter, v % res) - call Info_Mod_Iter_Fill_At(1, 3, w % name, w % eniter, w % res) + call Info_Mod_Iter_Fill_At(1, 1, u % name, u % res, u % eniter) + call Info_Mod_Iter_Fill_At(1, 2, v % name, v % res, v % eniter) + call Info_Mod_Iter_Fill_At(1, 3, w % name, w % res, w % eniter) Flow % i_corr = 1 end if diff --git a/Sources/Process/Turb_Mod/Compute_F22.f90 b/Sources/Process/Turb_Mod/Compute_F22.f90 index b0b92e382..a3b15629b 100644 --- a/Sources/Process/Turb_Mod/Compute_F22.f90 +++ b/Sources/Process/Turb_Mod/Compute_F22.f90 @@ -186,9 +186,9 @@ subroutine Compute_F22(Turb, Sol, curr_dt, ini, phi) ! Print info on the screen if(Turb % model .eq. K_EPS_ZETA_F) then - call Info_Mod_Iter_Fill_At(3, 4, phi % name, phi % eniter, phi % res) + call Info_Mod_Iter_Fill_At(3, 4, phi % name, phi % res, phi % eniter) else if(Turb % model .eq. RSM_MANCEAU_HANJALIC) then - call Info_Mod_Iter_Fill_At(4, 2, phi % name, phi % eniter, phi % res) + call Info_Mod_Iter_Fill_At(4, 2, phi % name, phi % res, phi % eniter) end if call Flow % Grad_Variable(phi) diff --git a/Sources/Process/Turb_Mod/Compute_Stress.f90 b/Sources/Process/Turb_Mod/Compute_Stress.f90 index 719568b72..8a9774c0e 100644 --- a/Sources/Process/Turb_Mod/Compute_Stress.f90 +++ b/Sources/Process/Turb_Mod/Compute_Stress.f90 @@ -332,19 +332,19 @@ subroutine Compute_Stress(Turb, Sol, curr_dt, ini, phi) ! Print info on the screen if( phi % name .eq. 'UU' ) & - call Info_Mod_Iter_Fill_At(3, 1, phi % name, phi % eniter, phi % res) + call Info_Mod_Iter_Fill_At(3, 1, phi % name, phi % res, phi % eniter) if( phi % name .eq. 'VV' ) & - call Info_Mod_Iter_Fill_At(3, 2, phi % name, phi % eniter, phi % res) + call Info_Mod_Iter_Fill_At(3, 2, phi % name, phi % res, phi % eniter) if( phi % name .eq. 'WW' ) & - call Info_Mod_Iter_Fill_At(3, 3, phi % name, phi % eniter, phi % res) + call Info_Mod_Iter_Fill_At(3, 3, phi % name, phi % res, phi % eniter) if( phi % name .eq. 'UV' ) & - call Info_Mod_Iter_Fill_At(3, 4, phi % name, phi % eniter, phi % res) + call Info_Mod_Iter_Fill_At(3, 4, phi % name, phi % res, phi % eniter) if( phi % name .eq. 'UW' ) & - call Info_Mod_Iter_Fill_At(3, 5, phi % name, phi % eniter, phi % res) + call Info_Mod_Iter_Fill_At(3, 5, phi % name, phi % res, phi % eniter) if( phi % name .eq. 'VW' ) & - call Info_Mod_Iter_Fill_At(3, 6, phi % name, phi % eniter, phi % res) + call Info_Mod_Iter_Fill_At(3, 6, phi % name, phi % res, phi % eniter) if( phi % name .eq. 'EPS' ) & - call Info_Mod_Iter_Fill_At(4, 1, phi % name, phi % eniter, phi % res) + call Info_Mod_Iter_Fill_At(4, 1, phi % name, phi % res, phi % eniter) if(phi % name .eq. 'EPS') then do c= 1, Grid % n_cells diff --git a/Sources/Process/Turb_Mod/Compute_Variable.f90 b/Sources/Process/Turb_Mod/Compute_Variable.f90 index b109b2564..e2de9c97b 100644 --- a/Sources/Process/Turb_Mod/Compute_Variable.f90 +++ b/Sources/Process/Turb_Mod/Compute_Variable.f90 @@ -282,14 +282,14 @@ subroutine Compute_Variable(Turb, Sol, curr_dt, ini, phi) Turb % model .eq. K_EPS_ZETA_F .or. & Turb % model .eq. HYBRID_LES_RANS) then if(phi % name .eq. 'KIN') & - call Info_Mod_Iter_Fill_At(3, 1, phi % name, phi % eniter, phi % res) + call Info_Mod_Iter_Fill_At(3, 1, phi % name, phi % res, phi % eniter) if(phi % name .eq. 'EPS') & - call Info_Mod_Iter_Fill_At(3, 2, phi % name, phi % eniter, phi % res) + call Info_Mod_Iter_Fill_At(3, 2, phi % name, phi % res, phi % eniter) if(phi % name .eq. 'ZETA') & - call Info_Mod_Iter_Fill_At(3, 3, phi % name, phi % eniter, phi % res) + call Info_Mod_Iter_Fill_At(3, 3, phi % name, phi % res, phi % eniter) if(Flow % heat_transfer) then if(phi % name .eq. 'T2') & - call Info_Mod_Iter_Fill_At(3, 5, phi % name, phi % eniter, phi % res) + call Info_Mod_Iter_Fill_At(3, 5, phi % name, phi % res, phi % eniter) end if end if diff --git a/Sources/Process/Vof_Mod/Core/Solve_System.f90 b/Sources/Process/Vof_Mod/Core/Solve_System.f90 index 44678c1f3..5deebcde5 100644 --- a/Sources/Process/Vof_Mod/Core/Solve_System.f90 +++ b/Sources/Process/Vof_Mod/Core/Solve_System.f90 @@ -40,9 +40,9 @@ subroutine Solve_System(Vof, Sol, b) call Profiler % Stop(String % First_Upper(fun % solver)//' (solver for VOF)') if(.not. Flow % heat_transfer) then - call Info_Mod_Iter_Fill_At(1, 6, fun % name, fun % eniter, fun % res) + call Info_Mod_Iter_Fill_At(1, 6, fun % name, fun % res, fun % eniter) else - call Info_Mod_Iter_Fill_At(2, 1, fun % name, fun % eniter, fun % res) + call Info_Mod_Iter_Fill_At(2, 1, fun % name, fun % res, fun % eniter) end if end subroutine From 745dbf4be28ecebb5962eb69912515ce783e014f Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 1 Apr 2023 10:28:25 +0200 Subject: [PATCH 176/223] Further reconstruction of Info_Mod. On branch bojan_more_robust_communicator modified: Info_Mod.f90 modified: Info_Mod/Bulk_Fill.f90 modified: Info_Mod/Bulk_Print.f90 modified: Info_Mod/Bulk_Start.f90 modified: Info_Mod/Iter_Fill.f90 modified: Info_Mod/Iter_Fill_At.f90 modified: Info_Mod/Iter_Fill_Scalar_At.f90 modified: Info_Mod/Iter_Print.f90 modified: Info_Mod/Iter_Start.f90 renamed: Info_Mod/Start.f90 -> Info_Mod/Start_Info.f90 modified: Info_Mod/Time_Fill.f90 modified: Info_Mod/Time_Print.f90 modified: Info_Mod/Time_Start.f90 modified: Info_Mod/Time_To_Exit.f90 modified: Main_Pro.f90 modified: Process_Mod/Compute_Energy.f90 modified: Process_Mod/Compute_Momentum.f90 modified: Process_Mod/Compute_Pressure.f90 modified: Process_Mod/Compute_Scalar.f90 modified: Process_Mod/Correct_Velocity.f90 modified: Process_Mod/Piso_Algorithm.f90 modified: Results_Mod/Main_Results.f90 modified: Turb_Mod/Compute_F22.f90 modified: Turb_Mod/Compute_Stress.f90 modified: Turb_Mod/Compute_Variable.f90 modified: Vof_Mod/Core/Solve_System.f90 --- Sources/Process/Info_Mod.f90 | 21 ++++++++++++++++++- Sources/Process/Info_Mod/Bulk_Fill.f90 | 5 +++-- Sources/Process/Info_Mod/Bulk_Print.f90 | 9 ++++---- Sources/Process/Info_Mod/Bulk_Start.f90 | 4 +++- Sources/Process/Info_Mod/Iter_Fill.f90 | 5 +++-- Sources/Process/Info_Mod/Iter_Fill_At.f90 | 13 ++++++------ .../Process/Info_Mod/Iter_Fill_Scalar_At.f90 | 15 ++++++------- Sources/Process/Info_Mod/Iter_Print.f90 | 7 ++++--- Sources/Process/Info_Mod/Iter_Start.f90 | 4 +++- .../Info_Mod/{Start.f90 => Start_Info.f90} | 4 +++- Sources/Process/Info_Mod/Time_Fill.f90 | 7 ++++--- Sources/Process/Info_Mod/Time_Print.f90 | 4 +++- Sources/Process/Info_Mod/Time_Start.f90 | 4 +++- Sources/Process/Info_Mod/Time_To_Exit.f90 | 10 +++++---- Sources/Process/Main_Pro.f90 | 20 +++++++++--------- .../Process/Process_Mod/Compute_Energy.f90 | 2 +- .../Process/Process_Mod/Compute_Momentum.f90 | 2 +- .../Process/Process_Mod/Compute_Pressure.f90 | 4 ++-- .../Process/Process_Mod/Compute_Scalar.f90 | 2 +- .../Process/Process_Mod/Correct_Velocity.f90 | 8 +++---- .../Process/Process_Mod/Piso_Algorithm.f90 | 6 +++--- Sources/Process/Results_Mod/Main_Results.f90 | 6 +++--- Sources/Process/Turb_Mod/Compute_F22.f90 | 4 ++-- Sources/Process/Turb_Mod/Compute_Stress.f90 | 14 ++++++------- Sources/Process/Turb_Mod/Compute_Variable.f90 | 8 +++---- Sources/Process/Vof_Mod/Core/Solve_System.f90 | 4 ++-- 26 files changed, 115 insertions(+), 77 deletions(-) rename Sources/Process/Info_Mod/{Start.f90 => Start_Info.f90} (84%) diff --git a/Sources/Process/Info_Mod.f90 b/Sources/Process/Info_Mod.f90 index a74c1ac51..deedb3cda 100644 --- a/Sources/Process/Info_Mod.f90 +++ b/Sources/Process/Info_Mod.f90 @@ -59,6 +59,25 @@ module Info_Mod type(Time_Info_Type), private :: time type(Iter_Info_Type), private :: iter type(Bulk_Info_Type), private :: bulk + + contains + procedure :: Start_Info + procedure :: Time_To_Exit + + procedure :: Time_Start + procedure :: Time_Fill + procedure :: Time_Print + + procedure :: Iter_Start + procedure :: Iter_Fill + procedure :: Iter_Fill_At + procedure :: Iter_Fill_Scalar_At + procedure :: Iter_Print + + procedure :: Bulk_Start + procedure :: Bulk_Fill + procedure :: Bulk_Print + end type ! Singletone type Info object ! @@ -66,7 +85,7 @@ module Info_Mod contains -# include "Info_Mod/Start.f90" +# include "Info_Mod/Start_Info.f90" # include "Info_Mod/Time_To_Exit.f90" # include "Info_Mod/Time_Start.f90" diff --git a/Sources/Process/Info_Mod/Bulk_Fill.f90 b/Sources/Process/Info_Mod/Bulk_Fill.f90 index 18bca47da..44c709f39 100644 --- a/Sources/Process/Info_Mod/Bulk_Fill.f90 +++ b/Sources/Process/Info_Mod/Bulk_Fill.f90 @@ -1,11 +1,12 @@ !==============================================================================! - subroutine Info_Mod_Bulk_Fill(Flow) + subroutine Bulk_Fill(Info, Flow) !------------------------------------------------------------------------------! ! Fills the info box with information to be written on the screen. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type), intent(in) :: Flow + class(Info_Type), intent(out) :: Info + type(Field_Type), intent(in) :: Flow !==============================================================================! if(First_Proc()) then diff --git a/Sources/Process/Info_Mod/Bulk_Print.f90 b/Sources/Process/Info_Mod/Bulk_Print.f90 index 0fef10432..41d786398 100644 --- a/Sources/Process/Info_Mod/Bulk_Print.f90 +++ b/Sources/Process/Info_Mod/Bulk_Print.f90 @@ -1,15 +1,16 @@ !==============================================================================! - subroutine Info_Mod_Bulk_Print(Flow, dom, n_dom) + subroutine Bulk_Print(Info, Flow, dom, n_dom) !------------------------------------------------------------------------------! ! Prints information about inner iteration on the screen. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type), intent(in) :: Flow - integer, intent(in) :: dom, n_dom + class(Info_Type), intent(inout) :: Info + type(Field_Type), intent(in) :: Flow + integer, intent(in) :: dom, n_dom !==============================================================================! - call Info_Mod_Bulk_Fill(Flow) + call Info % Bulk_Fill(Flow) if(First_Proc()) then diff --git a/Sources/Process/Info_Mod/Bulk_Start.f90 b/Sources/Process/Info_Mod/Bulk_Start.f90 index 87ed6744b..4bdb7b638 100644 --- a/Sources/Process/Info_Mod/Bulk_Start.f90 +++ b/Sources/Process/Info_Mod/Bulk_Start.f90 @@ -1,9 +1,11 @@ !==============================================================================! - subroutine Info_Mod_Bulk_Start() + subroutine Bulk_Start(Info) !------------------------------------------------------------------------------! ! Essentially creates a box in which iteration residuls will be written. ! !------------------------------------------------------------------------------! implicit none +!---------------------------------[Arguments]----------------------------------! + class(Info_Type), intent(out) :: Info !-----------------------------------[Locals]-----------------------------------! integer :: i !==============================================================================! diff --git a/Sources/Process/Info_Mod/Iter_Fill.f90 b/Sources/Process/Info_Mod/Iter_Fill.f90 index 0a7743e48..70945fe31 100644 --- a/Sources/Process/Info_Mod/Iter_Fill.f90 +++ b/Sources/Process/Info_Mod/Iter_Fill.f90 @@ -1,11 +1,12 @@ !==============================================================================! - subroutine Info_Mod_Iter_Fill(n) + subroutine Iter_Fill(Info, n) !------------------------------------------------------------------------------! ! Fills the info box with information to be written on the screen. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer, intent(in) :: n ! inner iteration + class(Info_Type), intent(out) :: Info + integer, intent(in) :: n ! inner iteration !-----------------------------------[Locals]-----------------------------------! integer :: c !==============================================================================! diff --git a/Sources/Process/Info_Mod/Iter_Fill_At.f90 b/Sources/Process/Info_Mod/Iter_Fill_At.f90 index f06ef6635..81a5e8f73 100644 --- a/Sources/Process/Info_Mod/Iter_Fill_At.f90 +++ b/Sources/Process/Info_Mod/Iter_Fill_At.f90 @@ -1,15 +1,16 @@ !==============================================================================! - subroutine Info_Mod_Iter_Fill_At(r, c, name_var, res, n_iter) + subroutine Iter_Fill_At(Info, r, c, name_var, res, n_iter) !------------------------------------------------------------------------------! ! Inserts infromation at specified position in the information box. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer, intent(in) :: r ! row - integer, intent(in) :: c ! column - character(len=*), intent(in) :: name_var - real, intent(in) :: res - integer, optional, intent(in) :: n_iter ! number of iterations + class(Info_Type), intent(out) :: Info + integer, intent(in) :: r ! row + integer, intent(in) :: c ! column + character(len=*), intent(in) :: name_var + real, intent(in) :: res + integer, optional, intent(in) :: n_iter ! number of iterations !==============================================================================! if(First_Proc()) then diff --git a/Sources/Process/Info_Mod/Iter_Fill_Scalar_At.f90 b/Sources/Process/Info_Mod/Iter_Fill_Scalar_At.f90 index 1e743ce4e..63308aa7e 100644 --- a/Sources/Process/Info_Mod/Iter_Fill_Scalar_At.f90 +++ b/Sources/Process/Info_Mod/Iter_Fill_Scalar_At.f90 @@ -1,15 +1,16 @@ !==============================================================================! - subroutine Info_Mod_Iter_Fill_Scalar_At(r, c, name_var, res, n_iter) + subroutine Iter_Fill_Scalar_At(Info, r, c, name_var, res, n_iter) !------------------------------------------------------------------------------! ! Inserts infromation at specified position in the information box. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer, intent(in) :: r ! row - integer, intent(in) :: c ! column - character(len=*), intent(in) :: name_var - real, intent(in) :: res - integer, intent(in) :: n_iter ! number of iterations + class(Info_Type), intent(out) :: Info + integer, intent(in) :: r ! row + integer, intent(in) :: c ! column + character(len=*), intent(in) :: name_var + real, intent(in) :: res + integer, intent(in) :: n_iter ! number of iterations !==============================================================================! if(First_Proc()) then @@ -24,7 +25,7 @@ subroutine Info_Mod_Iter_Fill_Scalar_At(r, c, name_var, res, n_iter) (c-1)*L_BOX+ 7), '(a1)') ':' write(Info % iter % lines_user(r)((c-1)*L_BOX+ 8 : & (c-1)*L_BOX+10), '(i3)') n_iter - ! Residual + ! Residual write(Info % iter % lines_user(r)((c-1)*L_BOX+12 : & (c-1)*L_BOX+20), '(1pe9.3)') res diff --git a/Sources/Process/Info_Mod/Iter_Print.f90 b/Sources/Process/Info_Mod/Iter_Print.f90 index 18be4e5fc..50e1d1454 100644 --- a/Sources/Process/Info_Mod/Iter_Print.f90 +++ b/Sources/Process/Info_Mod/Iter_Print.f90 @@ -1,11 +1,12 @@ !==============================================================================! - subroutine Info_Mod_Iter_Print(d) + subroutine Iter_Print(Info, d) !------------------------------------------------------------------------------! ! Prints information about inner iteration on the screen. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer, intent(in) :: d ! domain + class(Info_Type), intent(out) :: Info + integer, intent(in) :: d ! domain !-----------------------------------[Locals]-----------------------------------! integer :: i character(len=L_LINE) :: tmp @@ -36,7 +37,7 @@ subroutine Info_Mod_Iter_Print(d) Info % iter % lines_user(i)(7:7) = ' ' ! remove column for other domains end do - call Info_Mod_Iter_Start() + call Info % Iter_Start() end if diff --git a/Sources/Process/Info_Mod/Iter_Start.f90 b/Sources/Process/Info_Mod/Iter_Start.f90 index 2310d23e1..2d5b81c18 100644 --- a/Sources/Process/Info_Mod/Iter_Start.f90 +++ b/Sources/Process/Info_Mod/Iter_Start.f90 @@ -1,9 +1,11 @@ !==============================================================================! - subroutine Info_Mod_Iter_Start() + subroutine Iter_Start(Info) !------------------------------------------------------------------------------! ! Essentially creates a box in which iteration residuls will be written. ! !------------------------------------------------------------------------------! implicit none +!---------------------------------[Arguments]----------------------------------! + class(Info_Type), intent(out) :: Info !-----------------------------------[Locals]-----------------------------------! integer :: i, l !==============================================================================! diff --git a/Sources/Process/Info_Mod/Start.f90 b/Sources/Process/Info_Mod/Start_Info.f90 similarity index 84% rename from Sources/Process/Info_Mod/Start.f90 rename to Sources/Process/Info_Mod/Start_Info.f90 index 86ae0e3c0..dcfe35f4d 100644 --- a/Sources/Process/Info_Mod/Start.f90 +++ b/Sources/Process/Info_Mod/Start_Info.f90 @@ -1,9 +1,11 @@ !==============================================================================! - subroutine Info_Mod_Start_Info() + subroutine Start_Info(Info) !------------------------------------------------------------------------------! ! Start Info_Mod by taking system count rate and initial count rate ! !------------------------------------------------------------------------------! implicit none +!---------------------------------[Arguments]----------------------------------! + class(Info_Type), intent(out) :: Info !==============================================================================! ! Get system clock clock rate and initial clock count diff --git a/Sources/Process/Info_Mod/Time_Fill.f90 b/Sources/Process/Info_Mod/Time_Fill.f90 index f5dfedaaf..d76089d78 100644 --- a/Sources/Process/Info_Mod/Time_Fill.f90 +++ b/Sources/Process/Info_Mod/Time_Fill.f90 @@ -1,12 +1,13 @@ !==============================================================================! - subroutine Info_Mod_Time_Fill(n, sim_time) + subroutine Time_Fill(Info, n, sim_time) !------------------------------------------------------------------------------! ! Fills the info box with information to be written on the screen. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer, intent(in) :: n ! time step - real, intent(in) :: sim_time ! simulation time + class(Info_Type), intent(out) :: Info + integer, intent(in) :: n ! time step + real, intent(in) :: sim_time ! simulation time !-----------------------------------[Locals]-----------------------------------! integer :: hours, minutes, seconds real(DP) :: wall_time ! number of seconds of wall-clock time diff --git a/Sources/Process/Info_Mod/Time_Print.f90 b/Sources/Process/Info_Mod/Time_Print.f90 index e93ef7e95..3dbdb0838 100644 --- a/Sources/Process/Info_Mod/Time_Print.f90 +++ b/Sources/Process/Info_Mod/Time_Print.f90 @@ -1,9 +1,11 @@ !==============================================================================! - subroutine Info_Mod_Time_Print() + subroutine Time_Print(Info) !------------------------------------------------------------------------------! ! Prints information about inner iteration on the screen. ! !------------------------------------------------------------------------------! implicit none +!---------------------------------[Arguments]----------------------------------! + class(Info_Type), intent(out) :: Info !-----------------------------------[Locals]-----------------------------------! integer :: i !==============================================================================! diff --git a/Sources/Process/Info_Mod/Time_Start.f90 b/Sources/Process/Info_Mod/Time_Start.f90 index 3ffe819d3..0de3b9722 100644 --- a/Sources/Process/Info_Mod/Time_Start.f90 +++ b/Sources/Process/Info_Mod/Time_Start.f90 @@ -1,9 +1,11 @@ !==============================================================================! - subroutine Info_Mod_Time_Start() + subroutine Time_Start(Info) !------------------------------------------------------------------------------! ! Essentially creates a box in which iteration residuls will be written. ! !------------------------------------------------------------------------------! implicit none +!---------------------------------[Arguments]----------------------------------! + class(Info_Type), intent(out) :: Info !-----------------------------------[Locals]-----------------------------------! integer :: i !==============================================================================! diff --git a/Sources/Process/Info_Mod/Time_To_Exit.f90 b/Sources/Process/Info_Mod/Time_To_Exit.f90 index be8fd3c14..5aee9c40b 100644 --- a/Sources/Process/Info_Mod/Time_To_Exit.f90 +++ b/Sources/Process/Info_Mod/Time_To_Exit.f90 @@ -1,14 +1,16 @@ !==============================================================================! - logical function Info_Mod_Time_To_Exit() + logical function Time_To_Exit(Info) !------------------------------------------------------------------------------! ! Returns true if it is time to exit Process because maximum wall clock time ! ! has been reached ! !------------------------------------------------------------------------------! implicit none +!---------------------------------[Arguments]----------------------------------! + class(Info_Type) :: Info !==============================================================================! - Info_Mod_Time_To_Exit = real(Info % clock % cur - Info % clock % ini) & - / real(Info % clock % cnt) & - > Info % clock % wall_time_max + Time_To_Exit = real(Info % clock % cur - Info % clock % ini) & + / real(Info % clock % cnt) & + > Info % clock % wall_time_max end function diff --git a/Sources/Process/Main_Pro.f90 b/Sources/Process/Main_Pro.f90 index 916d2291f..b39d2962a 100644 --- a/Sources/Process/Main_Pro.f90 +++ b/Sources/Process/Main_Pro.f90 @@ -73,7 +73,7 @@ program Process_Prog !-------------------------! ! Initialize Info_Mod ! !-------------------------! - call Info_Mod_Start_Info() + call Info % Start_Info() !--------------------! ! Read all grids ! @@ -268,14 +268,14 @@ program Process_Prog Swarm(d), curr_dt, time) ! Start info boxes. - call Info_Mod_Time_Start() - call Info_Mod_Iter_Start() - call Info_Mod_Bulk_Start() + call Info % Time_Start() + call Info % Iter_Start() + call Info % Bulk_Start() ! Initialize and print time info box if(d .eq. 1) then - call Info_Mod_Time_Fill(curr_dt, time) - call Info_Mod_Time_Print() + call Info % Time_Fill(curr_dt, time) + call Info % Time_Print() end if ! Turbulence models initializations @@ -317,7 +317,7 @@ program Process_Prog call User_Mod_Beginning_Of_Iteration(Flow(d), Turb(d), Vof(d), & Swarm(d), curr_dt, time) - call Info_Mod_Iter_Fill(ini) + call Info % Iter_Fill(ini) ! Future? call Process % Simple_Step(Flow(d), Turb(d), Vof(d), & ! Future? Sol(d), curr_dt, ini) @@ -357,7 +357,7 @@ program Process_Prog call Process % Update_Boundary_Values(Flow(d), Turb(d), Vof(d), 'ALL') ! End of the current iteration - call Info_Mod_Iter_Print(d) + call Info % Iter_Print(d) ! End of iteration call User_Mod_End_Of_Iteration(Flow(d), Turb(d), Vof(d), Swarm(d), & @@ -384,7 +384,7 @@ program Process_Prog end do do d = 1, n_dom - call Info_Mod_Bulk_Print(Flow(d), d, n_dom) + call Info % Bulk_Print(Flow(d), d, n_dom) end do do d = 1, n_dom @@ -421,7 +421,7 @@ program Process_Prog Flow, Turb, Vof, Swarm, exit_now) ! Ran more than a set wall clock time limit - if(Info_Mod_Time_To_Exit() .or. exit_now) then + if(Info % Time_To_Exit() .or. exit_now) then goto 2 end if diff --git a/Sources/Process/Process_Mod/Compute_Energy.f90 b/Sources/Process/Process_Mod/Compute_Energy.f90 index 9a7067271..cd64c59ee 100644 --- a/Sources/Process/Process_Mod/Compute_Energy.f90 +++ b/Sources/Process/Process_Mod/Compute_Energy.f90 @@ -290,7 +290,7 @@ subroutine Compute_Energy(Process, Flow, Turb, Vof, Sol, curr_dt, ini) ' (solver for energy)') ! Print some info on the screen - call Info_Mod_Iter_Fill_At(1, 6, t % name, t % res, t % eniter) + call Info % Iter_Fill_At(1, 6, t % name, t % res, t % eniter) ! Gradients if(.not. Flow % mass_transfer) then diff --git a/Sources/Process/Process_Mod/Compute_Momentum.f90 b/Sources/Process/Process_Mod/Compute_Momentum.f90 index fefc1736e..da1392f03 100644 --- a/Sources/Process/Process_Mod/Compute_Momentum.f90 +++ b/Sources/Process/Process_Mod/Compute_Momentum.f90 @@ -381,7 +381,7 @@ subroutine Compute_Momentum(Process, Flow, Turb, Vof, Por, Sol, curr_dt, ini) ! Fill the info screen up if (Flow % p_m_coupling == SIMPLE) then - call Info_Mod_Iter_Fill_At(1, i, ui % name, ui % res, ui % eniter) + call Info % Iter_Fill_At(1, i, ui % name, ui % res, ui % eniter) end if end if diff --git a/Sources/Process/Process_Mod/Compute_Pressure.f90 b/Sources/Process/Process_Mod/Compute_Pressure.f90 index 3fd44406a..bb20c3dfe 100644 --- a/Sources/Process/Process_Mod/Compute_Pressure.f90 +++ b/Sources/Process/Process_Mod/Compute_Pressure.f90 @@ -215,10 +215,10 @@ subroutine Compute_Pressure(Process, Flow, Vof, Sol, curr_dt, ini) ' (solver for pressure)') if (Flow % p_m_coupling == SIMPLE) then - call Info_Mod_Iter_Fill_At(1, 4, pp % name, pp % res, pp % eniter) + call Info % Iter_Fill_At(1, 4, pp % name, pp % res, pp % eniter) else if (Flow % i_corr == Flow % n_piso_corrections) then - call Info_Mod_Iter_Fill_At(1, 4, pp % name, pp % res, pp % eniter) + call Info % Iter_Fill_At(1, 4, pp % name, pp % res, pp % eniter) end if end if diff --git a/Sources/Process/Process_Mod/Compute_Scalar.f90 b/Sources/Process/Process_Mod/Compute_Scalar.f90 index 69c961d14..ace62afc6 100644 --- a/Sources/Process/Process_Mod/Compute_Scalar.f90 +++ b/Sources/Process/Process_Mod/Compute_Scalar.f90 @@ -229,7 +229,7 @@ subroutine Compute_Scalar(Process, Flow, Turb, Vof, Sol, curr_dt, ini, sc) row = ceiling(ns/6) ! will be 1 (scal. 1-6), 2 (scal. 6-12), etc. col = nint(ns) - (row-1)*6 ! will be in range 1 - 6 - call Info_Mod_Iter_Fill_Scalar_At(row, col, phi % name, phi % res, phi % eniter) + call Info % Iter_Fill_Scalar_At(row, col, phi % name, phi % res, phi % eniter) call Flow % Grad_Variable(phi) diff --git a/Sources/Process/Process_Mod/Correct_Velocity.f90 b/Sources/Process/Process_Mod/Correct_Velocity.f90 index 7273f2374..8ab025da7 100644 --- a/Sources/Process/Process_Mod/Correct_Velocity.f90 +++ b/Sources/Process/Process_Mod/Correct_Velocity.f90 @@ -129,11 +129,11 @@ subroutine Correct_Velocity(Process, Flow, Vof, Sol, curr_dt, ini) call Global % Max_Real(Flow % cfl_max) call Global % Max_Real(Flow % pe_max) - if (Flow % p_m_coupling == SIMPLE) then - call Info_Mod_Iter_Fill_At(1, 5, 'dum', Flow % vol_res) + if(Flow % p_m_coupling == SIMPLE) then + call Info % Iter_Fill_At(1, 5, 'dum', Flow % vol_res) else - if (Flow % i_corr == Flow % n_piso_corrections) then - call Info_Mod_Iter_Fill_At(1, 5, 'dum', Flow % vol_res) + if(Flow % i_corr == Flow % n_piso_corrections) then + call Info % Iter_Fill_At(1, 5, 'dum', Flow % vol_res) end if end if diff --git a/Sources/Process/Process_Mod/Piso_Algorithm.f90 b/Sources/Process/Process_Mod/Piso_Algorithm.f90 index 5e6941a2d..9d193f68c 100644 --- a/Sources/Process/Process_Mod/Piso_Algorithm.f90 +++ b/Sources/Process/Process_Mod/Piso_Algorithm.f90 @@ -35,9 +35,9 @@ subroutine Piso_Algorithm(Process, Flow, Turb, Vof, Por, Sol, curr_dt, ini) end do Flow % inside_piso_loop = .false. - call Info_Mod_Iter_Fill_At(1, 1, u % name, u % res, u % eniter) - call Info_Mod_Iter_Fill_At(1, 2, v % name, v % res, v % eniter) - call Info_Mod_Iter_Fill_At(1, 3, w % name, w % res, w % eniter) + call Info % Iter_Fill_At(1, 1, u % name, u % res, u % eniter) + call Info % Iter_Fill_At(1, 2, v % name, v % res, v % eniter) + call Info % Iter_Fill_At(1, 3, w % name, w % res, w % eniter) Flow % i_corr = 1 end if diff --git a/Sources/Process/Results_Mod/Main_Results.f90 b/Sources/Process/Results_Mod/Main_Results.f90 index 599c9a298..68d8564c7 100644 --- a/Sources/Process/Results_Mod/Main_Results.f90 +++ b/Sources/Process/Results_Mod/Main_Results.f90 @@ -30,7 +30,7 @@ subroutine Main_Results(Results, & save_now .or. & exit_now .or. & Backup % Time_To_Save_Backup(curr_dt) .or. & - Info_Mod_Time_To_Exit()) then + Info % Time_To_Exit()) then do d = 1, n_dom call Control_Mod_Switch_To_Domain(d) call Backup % Save(Flow(d), Turb(d), Vof(d), Swarm(d), & @@ -43,7 +43,7 @@ subroutine Main_Results(Results, & save_now .or. & exit_now .or. & Results % Time_To_Save_Results(curr_dt) .or. & - Info_Mod_Time_To_Exit()) then + Info % Time_To_Exit()) then do d = 1, n_dom call Control_Mod_Switch_To_Domain(d) @@ -77,7 +77,7 @@ subroutine Main_Results(Results, & save_now .or. & exit_now .or. & Results % Time_To_Save_Swarm(curr_dt) .or. & - Info_Mod_Time_To_Exit()) then + Info % Time_To_Exit()) then do d = 1, n_dom call Control_Mod_Switch_To_Domain(d) diff --git a/Sources/Process/Turb_Mod/Compute_F22.f90 b/Sources/Process/Turb_Mod/Compute_F22.f90 index a3b15629b..8b8b69567 100644 --- a/Sources/Process/Turb_Mod/Compute_F22.f90 +++ b/Sources/Process/Turb_Mod/Compute_F22.f90 @@ -186,9 +186,9 @@ subroutine Compute_F22(Turb, Sol, curr_dt, ini, phi) ! Print info on the screen if(Turb % model .eq. K_EPS_ZETA_F) then - call Info_Mod_Iter_Fill_At(3, 4, phi % name, phi % res, phi % eniter) + call Info % Iter_Fill_At(3, 4, phi % name, phi % res, phi % eniter) else if(Turb % model .eq. RSM_MANCEAU_HANJALIC) then - call Info_Mod_Iter_Fill_At(4, 2, phi % name, phi % res, phi % eniter) + call Info % Iter_Fill_At(4, 2, phi % name, phi % res, phi % eniter) end if call Flow % Grad_Variable(phi) diff --git a/Sources/Process/Turb_Mod/Compute_Stress.f90 b/Sources/Process/Turb_Mod/Compute_Stress.f90 index 8a9774c0e..5f291644d 100644 --- a/Sources/Process/Turb_Mod/Compute_Stress.f90 +++ b/Sources/Process/Turb_Mod/Compute_Stress.f90 @@ -332,19 +332,19 @@ subroutine Compute_Stress(Turb, Sol, curr_dt, ini, phi) ! Print info on the screen if( phi % name .eq. 'UU' ) & - call Info_Mod_Iter_Fill_At(3, 1, phi % name, phi % res, phi % eniter) + call Info % Iter_Fill_At(3, 1, phi % name, phi % res, phi % eniter) if( phi % name .eq. 'VV' ) & - call Info_Mod_Iter_Fill_At(3, 2, phi % name, phi % res, phi % eniter) + call Info % Iter_Fill_At(3, 2, phi % name, phi % res, phi % eniter) if( phi % name .eq. 'WW' ) & - call Info_Mod_Iter_Fill_At(3, 3, phi % name, phi % res, phi % eniter) + call Info % Iter_Fill_At(3, 3, phi % name, phi % res, phi % eniter) if( phi % name .eq. 'UV' ) & - call Info_Mod_Iter_Fill_At(3, 4, phi % name, phi % res, phi % eniter) + call Info % Iter_Fill_At(3, 4, phi % name, phi % res, phi % eniter) if( phi % name .eq. 'UW' ) & - call Info_Mod_Iter_Fill_At(3, 5, phi % name, phi % res, phi % eniter) + call Info % Iter_Fill_At(3, 5, phi % name, phi % res, phi % eniter) if( phi % name .eq. 'VW' ) & - call Info_Mod_Iter_Fill_At(3, 6, phi % name, phi % res, phi % eniter) + call Info % Iter_Fill_At(3, 6, phi % name, phi % res, phi % eniter) if( phi % name .eq. 'EPS' ) & - call Info_Mod_Iter_Fill_At(4, 1, phi % name, phi % res, phi % eniter) + call Info % Iter_Fill_At(4, 1, phi % name, phi % res, phi % eniter) if(phi % name .eq. 'EPS') then do c= 1, Grid % n_cells diff --git a/Sources/Process/Turb_Mod/Compute_Variable.f90 b/Sources/Process/Turb_Mod/Compute_Variable.f90 index e2de9c97b..aa672ca26 100644 --- a/Sources/Process/Turb_Mod/Compute_Variable.f90 +++ b/Sources/Process/Turb_Mod/Compute_Variable.f90 @@ -282,14 +282,14 @@ subroutine Compute_Variable(Turb, Sol, curr_dt, ini, phi) Turb % model .eq. K_EPS_ZETA_F .or. & Turb % model .eq. HYBRID_LES_RANS) then if(phi % name .eq. 'KIN') & - call Info_Mod_Iter_Fill_At(3, 1, phi % name, phi % res, phi % eniter) + call Info % Iter_Fill_At(3, 1, phi % name, phi % res, phi % eniter) if(phi % name .eq. 'EPS') & - call Info_Mod_Iter_Fill_At(3, 2, phi % name, phi % res, phi % eniter) + call Info % Iter_Fill_At(3, 2, phi % name, phi % res, phi % eniter) if(phi % name .eq. 'ZETA') & - call Info_Mod_Iter_Fill_At(3, 3, phi % name, phi % res, phi % eniter) + call Info % Iter_Fill_At(3, 3, phi % name, phi % res, phi % eniter) if(Flow % heat_transfer) then if(phi % name .eq. 'T2') & - call Info_Mod_Iter_Fill_At(3, 5, phi % name, phi % res, phi % eniter) + call Info % Iter_Fill_At(3, 5, phi % name, phi % res, phi % eniter) end if end if diff --git a/Sources/Process/Vof_Mod/Core/Solve_System.f90 b/Sources/Process/Vof_Mod/Core/Solve_System.f90 index 5deebcde5..554c902d6 100644 --- a/Sources/Process/Vof_Mod/Core/Solve_System.f90 +++ b/Sources/Process/Vof_Mod/Core/Solve_System.f90 @@ -40,9 +40,9 @@ subroutine Solve_System(Vof, Sol, b) call Profiler % Stop(String % First_Upper(fun % solver)//' (solver for VOF)') if(.not. Flow % heat_transfer) then - call Info_Mod_Iter_Fill_At(1, 6, fun % name, fun % res, fun % eniter) + call Info % Iter_Fill_At(1, 6, fun % name, fun % res, fun % eniter) else - call Info_Mod_Iter_Fill_At(2, 1, fun % name, fun % res, fun % eniter) + call Info % Iter_Fill_At(2, 1, fun % name, fun % res, fun % eniter) end if end subroutine From e0a630b96738cea0c239e0315a4531454b500b44 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 1 Apr 2023 10:30:14 +0200 Subject: [PATCH 177/223] Little updates On branch bojan_more_robust_communicator modified: Documentation/Syntax/.vim/syntax/fortran.vim --- Documentation/Syntax/.vim/syntax/fortran.vim | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Documentation/Syntax/.vim/syntax/fortran.vim b/Documentation/Syntax/.vim/syntax/fortran.vim index 3631867d4..1420287a7 100644 --- a/Documentation/Syntax/.vim/syntax/fortran.vim +++ b/Documentation/Syntax/.vim/syntax/fortran.vim @@ -425,6 +425,8 @@ if b:fortran_dialect == "f08" syn keyword fortranConstant MD MAX_VARS_INTERFACE " Constants related to indentation (O think they are defined in a few places - bad! syn keyword fortranConstant IN_0 IN_1 IN_2 IN_3 IN_4 IN_5 +" Constants from Info_Mod + syn keyword fortranConstant L_LINE L_BOX MAX_USER_LINES " Constants from Numerics_Mod syn keyword fortranConstant UPWIND CENTRAL LUDS QUICK SMART GAMMA syn keyword fortranConstant MINMOD BLENDED SUPERBEE AVL_SMART CICSAM STACS @@ -450,11 +452,11 @@ if b:fortran_dialect == "f08" syn keyword fortranTypeTflows Comm_Type Backup_Type Field_Type Turb_Type Vof_Type Swarm_Type syn keyword fortranObjectTflows Comm Global Backup Bac Flow Fld Turb Tur Vof Swarm Swr syn keyword fortranTypeTflows Bulk_Type Face_Type - syn keyword fortranObjectTflows bulk v_flux + syn keyword fortranObjectTflows v_flux syn keyword fortranTypeTflows Front_Type Surf_Type Elem_Type Side_Type Vert_Type Particle_Type syn keyword fortranObjectTflows Front Surf Elem side Vert Part - syn keyword fortranTypeTflows Monitor_Type Results_Type Porosity_Type Profiler_Type Message_Type - syn keyword fortranObjectTflows Monitor Results Por Profiler Prof Message + syn keyword fortranTypeTflows Monitor_Type Results_Type Porosity_Type Profiler_Type Message_Type Info_Type + syn keyword fortranObjectTflows Monitor Results Por Profiler Prof Message Info syn keyword fortranTypeTflows Matrix_Type Vector_Type Solver_Type Native_Type Petsc_Type Process_Type syn keyword fortranObjectTflows A M vector Sol Nat Pet Process syn keyword fortranTypeTflows Var_Type @@ -465,6 +467,7 @@ if b:fortran_dialect == "f08" syn keyword fortranMacroTflows Boundary_Regions Boundary_And_Inside_Regions Boundary_Inside_And_Buffer_Regions syn keyword fortranMacroTflows All_Regions Faces_In_Region Faces_In_Domain syn keyword fortranMacroTflows Cells_In_Region Cells_In_Domain Cells_In_Domain_And_Buffers Cells_In_Buffers + syn keyword fortranMacroTflows Assert Unused " Finally, a few global functions which I don't really like in the code syn keyword fortranGlobalTflows Adjust_Dim Adjust_First_Dim Swap_Int Swap_Real "---------------------------------------------------------------------[T-Flows]- From f794e6bf8dfb4435d2704ec2031065f58ec771de Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 1 Apr 2023 12:28:57 +0200 Subject: [PATCH 178/223] Interesting - Info_Mod wasn't working with intent On branch bojan_more_robust_communicator modified: Info_Mod.f90 modified: Info_Mod/Bulk_Fill.f90 modified: Info_Mod/Bulk_Print.f90 modified: Info_Mod/Bulk_Start.f90 modified: Info_Mod/Iter_Fill.f90 modified: Info_Mod/Iter_Fill_At.f90 modified: Info_Mod/Iter_Fill_Scalar_At.f90 modified: Info_Mod/Iter_Print.f90 modified: Info_Mod/Iter_Start.f90 modified: Info_Mod/Start_Info.f90 modified: Info_Mod/Time_Fill.f90 modified: Info_Mod/Time_Print.f90 modified: Info_Mod/Time_Start.f90 --- Sources/Process/Info_Mod.f90 | 11 ++++++++--- Sources/Process/Info_Mod/Bulk_Fill.f90 | 4 ++-- Sources/Process/Info_Mod/Bulk_Print.f90 | 6 +++--- Sources/Process/Info_Mod/Bulk_Start.f90 | 2 +- Sources/Process/Info_Mod/Iter_Fill.f90 | 4 ++-- Sources/Process/Info_Mod/Iter_Fill_At.f90 | 12 ++++++------ Sources/Process/Info_Mod/Iter_Fill_Scalar_At.f90 | 12 ++++++------ Sources/Process/Info_Mod/Iter_Print.f90 | 4 ++-- Sources/Process/Info_Mod/Iter_Start.f90 | 2 +- Sources/Process/Info_Mod/Start_Info.f90 | 2 +- Sources/Process/Info_Mod/Time_Fill.f90 | 6 +++--- Sources/Process/Info_Mod/Time_Print.f90 | 2 +- Sources/Process/Info_Mod/Time_Start.f90 | 2 +- 13 files changed, 37 insertions(+), 32 deletions(-) diff --git a/Sources/Process/Info_Mod.f90 b/Sources/Process/Info_Mod.f90 index deedb3cda..9a953ce21 100644 --- a/Sources/Process/Info_Mod.f90 +++ b/Sources/Process/Info_Mod.f90 @@ -23,7 +23,7 @@ module Info_Mod end type !--------------------! - ! Time_Info type ! + ! Time Info type ! !--------------------! type Time_Info_Type character(len=L_LINE) :: line_lead = '' @@ -32,7 +32,7 @@ module Info_Mod end type !--------------------! - ! Iter_Info type ! + ! Iter Info type ! !--------------------! type Iter_Info_Type integer :: n_user_lines = 0 @@ -44,7 +44,7 @@ module Info_Mod end type !--------------------! - ! Bulk_Info type ! + ! Bulk Info type ! !--------------------! type Bulk_Info_Type character(len=L_LINE) :: line_lead = '' @@ -54,6 +54,9 @@ module Info_Mod character(len=L_LINE) :: line(3) = '' end type + !---------------! + ! Info type ! + !---------------! type Info_Type type(System_Clock_Type), private :: clock type(Time_Info_Type), private :: time @@ -80,7 +83,9 @@ module Info_Mod end type + !---------------------------------! ! Singletone type Info object ! + !---------------------------------! type(Info_Type) :: Info contains diff --git a/Sources/Process/Info_Mod/Bulk_Fill.f90 b/Sources/Process/Info_Mod/Bulk_Fill.f90 index 44c709f39..ec678b017 100644 --- a/Sources/Process/Info_Mod/Bulk_Fill.f90 +++ b/Sources/Process/Info_Mod/Bulk_Fill.f90 @@ -5,8 +5,8 @@ subroutine Bulk_Fill(Info, Flow) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Info_Type), intent(out) :: Info - type(Field_Type), intent(in) :: Flow + class(Info_Type) :: Info + type(Field_Type), intent(in) :: Flow !==============================================================================! if(First_Proc()) then diff --git a/Sources/Process/Info_Mod/Bulk_Print.f90 b/Sources/Process/Info_Mod/Bulk_Print.f90 index 41d786398..58ac7b14b 100644 --- a/Sources/Process/Info_Mod/Bulk_Print.f90 +++ b/Sources/Process/Info_Mod/Bulk_Print.f90 @@ -5,9 +5,9 @@ subroutine Bulk_Print(Info, Flow, dom, n_dom) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Info_Type), intent(inout) :: Info - type(Field_Type), intent(in) :: Flow - integer, intent(in) :: dom, n_dom + class(Info_Type) :: Info + type(Field_Type), intent(in) :: Flow + integer, intent(in) :: dom, n_dom !==============================================================================! call Info % Bulk_Fill(Flow) diff --git a/Sources/Process/Info_Mod/Bulk_Start.f90 b/Sources/Process/Info_Mod/Bulk_Start.f90 index 4bdb7b638..37f4b9337 100644 --- a/Sources/Process/Info_Mod/Bulk_Start.f90 +++ b/Sources/Process/Info_Mod/Bulk_Start.f90 @@ -5,7 +5,7 @@ subroutine Bulk_Start(Info) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Info_Type), intent(out) :: Info + class(Info_Type) :: Info !-----------------------------------[Locals]-----------------------------------! integer :: i !==============================================================================! diff --git a/Sources/Process/Info_Mod/Iter_Fill.f90 b/Sources/Process/Info_Mod/Iter_Fill.f90 index 70945fe31..600f66976 100644 --- a/Sources/Process/Info_Mod/Iter_Fill.f90 +++ b/Sources/Process/Info_Mod/Iter_Fill.f90 @@ -5,8 +5,8 @@ subroutine Iter_Fill(Info, n) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Info_Type), intent(out) :: Info - integer, intent(in) :: n ! inner iteration + class(Info_Type) :: Info + integer, intent(in) :: n ! inner iteration !-----------------------------------[Locals]-----------------------------------! integer :: c !==============================================================================! diff --git a/Sources/Process/Info_Mod/Iter_Fill_At.f90 b/Sources/Process/Info_Mod/Iter_Fill_At.f90 index 81a5e8f73..4c2cefe6f 100644 --- a/Sources/Process/Info_Mod/Iter_Fill_At.f90 +++ b/Sources/Process/Info_Mod/Iter_Fill_At.f90 @@ -5,12 +5,12 @@ subroutine Iter_Fill_At(Info, r, c, name_var, res, n_iter) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Info_Type), intent(out) :: Info - integer, intent(in) :: r ! row - integer, intent(in) :: c ! column - character(len=*), intent(in) :: name_var - real, intent(in) :: res - integer, optional, intent(in) :: n_iter ! number of iterations + class(Info_Type) :: Info + integer, intent(in) :: r ! row + integer, intent(in) :: c ! column + character(len=*), intent(in) :: name_var + real, intent(in) :: res + integer, optional, intent(in) :: n_iter ! number of iterations !==============================================================================! if(First_Proc()) then diff --git a/Sources/Process/Info_Mod/Iter_Fill_Scalar_At.f90 b/Sources/Process/Info_Mod/Iter_Fill_Scalar_At.f90 index 63308aa7e..1125b9024 100644 --- a/Sources/Process/Info_Mod/Iter_Fill_Scalar_At.f90 +++ b/Sources/Process/Info_Mod/Iter_Fill_Scalar_At.f90 @@ -5,12 +5,12 @@ subroutine Iter_Fill_Scalar_At(Info, r, c, name_var, res, n_iter) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Info_Type), intent(out) :: Info - integer, intent(in) :: r ! row - integer, intent(in) :: c ! column - character(len=*), intent(in) :: name_var - real, intent(in) :: res - integer, intent(in) :: n_iter ! number of iterations + class(Info_Type) :: Info + integer, intent(in) :: r ! row + integer, intent(in) :: c ! column + character(len=*), intent(in) :: name_var + real, intent(in) :: res + integer, intent(in) :: n_iter ! number of iterations !==============================================================================! if(First_Proc()) then diff --git a/Sources/Process/Info_Mod/Iter_Print.f90 b/Sources/Process/Info_Mod/Iter_Print.f90 index 50e1d1454..c4412e25f 100644 --- a/Sources/Process/Info_Mod/Iter_Print.f90 +++ b/Sources/Process/Info_Mod/Iter_Print.f90 @@ -5,8 +5,8 @@ subroutine Iter_Print(Info, d) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Info_Type), intent(out) :: Info - integer, intent(in) :: d ! domain + class(Info_Type) :: Info + integer, intent(in) :: d ! domain !-----------------------------------[Locals]-----------------------------------! integer :: i character(len=L_LINE) :: tmp diff --git a/Sources/Process/Info_Mod/Iter_Start.f90 b/Sources/Process/Info_Mod/Iter_Start.f90 index 2d5b81c18..dc798423c 100644 --- a/Sources/Process/Info_Mod/Iter_Start.f90 +++ b/Sources/Process/Info_Mod/Iter_Start.f90 @@ -5,7 +5,7 @@ subroutine Iter_Start(Info) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Info_Type), intent(out) :: Info + class(Info_Type) :: Info !-----------------------------------[Locals]-----------------------------------! integer :: i, l !==============================================================================! diff --git a/Sources/Process/Info_Mod/Start_Info.f90 b/Sources/Process/Info_Mod/Start_Info.f90 index dcfe35f4d..b91c5ca62 100644 --- a/Sources/Process/Info_Mod/Start_Info.f90 +++ b/Sources/Process/Info_Mod/Start_Info.f90 @@ -5,7 +5,7 @@ subroutine Start_Info(Info) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Info_Type), intent(out) :: Info + class(Info_Type) :: Info !==============================================================================! ! Get system clock clock rate and initial clock count diff --git a/Sources/Process/Info_Mod/Time_Fill.f90 b/Sources/Process/Info_Mod/Time_Fill.f90 index d76089d78..1a48c112d 100644 --- a/Sources/Process/Info_Mod/Time_Fill.f90 +++ b/Sources/Process/Info_Mod/Time_Fill.f90 @@ -5,9 +5,9 @@ subroutine Time_Fill(Info, n, sim_time) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Info_Type), intent(out) :: Info - integer, intent(in) :: n ! time step - real, intent(in) :: sim_time ! simulation time + class(Info_Type) :: Info + integer, intent(in) :: n ! time step + real, intent(in) :: sim_time ! simulation time !-----------------------------------[Locals]-----------------------------------! integer :: hours, minutes, seconds real(DP) :: wall_time ! number of seconds of wall-clock time diff --git a/Sources/Process/Info_Mod/Time_Print.f90 b/Sources/Process/Info_Mod/Time_Print.f90 index 3dbdb0838..218ad4e4e 100644 --- a/Sources/Process/Info_Mod/Time_Print.f90 +++ b/Sources/Process/Info_Mod/Time_Print.f90 @@ -5,7 +5,7 @@ subroutine Time_Print(Info) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Info_Type), intent(out) :: Info + class(Info_Type) :: Info !-----------------------------------[Locals]-----------------------------------! integer :: i !==============================================================================! diff --git a/Sources/Process/Info_Mod/Time_Start.f90 b/Sources/Process/Info_Mod/Time_Start.f90 index 0de3b9722..2b1c8c929 100644 --- a/Sources/Process/Info_Mod/Time_Start.f90 +++ b/Sources/Process/Info_Mod/Time_Start.f90 @@ -5,7 +5,7 @@ subroutine Time_Start(Info) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Info_Type), intent(out) :: Info + class(Info_Type) :: Info !-----------------------------------[Locals]-----------------------------------! integer :: i !==============================================================================! From 424e04dda7969bbc734a128cc71d66b0dcfcc505 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 1 Apr 2023 12:30:01 +0200 Subject: [PATCH 179/223] Spread macros further in Turb_Mod. On branch bojan_more_robust_communicator modified: Turb_Mod/Calculate_Deltas.f90 modified: Turb_Mod/Calculate_Heat_Flux.f90 modified: Turb_Mod/Calculate_Scalar_Flux.f90 modified: Turb_Mod/Calculate_Stress.f90 modified: Turb_Mod/Compute_F22.f90 modified: Turb_Mod/Compute_Stress.f90 modified: Turb_Mod/Compute_Variable.f90 modified: Turb_Mod/Ebf_Momentum.f90 modified: Turb_Mod/Ebf_Scalar.f90 modified: Turb_Mod/Src_Rsm_Hanjalic_Jakirlic.f90 modified: Turb_Mod/Src_Rsm_Manceau_Hanjalic.f90 modified: Turb_Mod/Src_T2.f90 modified: Turb_Mod/Src_Vis_Spalart_Almaras.f90 modified: Turb_Mod/Time_And_Length_Scale.f90 modified: Turb_Mod/Vis_T_Dynamic.f90 modified: Turb_Mod/Vis_T_Hybrid_Les_Prandtl.f90 modified: Turb_Mod/Vis_T_Hybrid_Les_Rans.f90 modified: Turb_Mod/Vis_T_Spalart_Allmaras.f90 modified: Turb_Mod/Vis_T_Subgrid.f90 modified: Turb_Mod/Vis_T_Tensorial.f90 modified: Turb_Mod/Vis_T_Wale.f90 --- Sources/Process/Turb_Mod/Calculate_Deltas.f90 | 4 +- .../Process/Turb_Mod/Calculate_Heat_Flux.f90 | 29 +++++++------- .../Turb_Mod/Calculate_Scalar_Flux.f90 | 32 +++++++-------- Sources/Process/Turb_Mod/Calculate_Stress.f90 | 6 +-- Sources/Process/Turb_Mod/Compute_F22.f90 | 6 +-- Sources/Process/Turb_Mod/Compute_Stress.f90 | 12 +++--- Sources/Process/Turb_Mod/Compute_Variable.f90 | 14 +++---- Sources/Process/Turb_Mod/Ebf_Momentum.f90 | 6 +-- Sources/Process/Turb_Mod/Ebf_Scalar.f90 | 8 ++-- .../Turb_Mod/Src_Rsm_Hanjalic_Jakirlic.f90 | 2 +- .../Turb_Mod/Src_Rsm_Manceau_Hanjalic.f90 | 2 +- Sources/Process/Turb_Mod/Src_T2.f90 | 39 +++++++++---------- .../Turb_Mod/Src_Vis_Spalart_Almaras.f90 | 4 +- .../Turb_Mod/Time_And_Length_Scale.f90 | 10 ++--- Sources/Process/Turb_Mod/Vis_T_Dynamic.f90 | 26 ++++++------- .../Turb_Mod/Vis_T_Hybrid_Les_Prandtl.f90 | 2 +- .../Turb_Mod/Vis_T_Hybrid_Les_Rans.f90 | 4 +- .../Turb_Mod/Vis_T_Spalart_Allmaras.f90 | 4 +- Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 | 8 ++-- Sources/Process/Turb_Mod/Vis_T_Tensorial.f90 | 2 +- Sources/Process/Turb_Mod/Vis_T_Wale.f90 | 2 +- 21 files changed, 109 insertions(+), 113 deletions(-) diff --git a/Sources/Process/Turb_Mod/Calculate_Deltas.f90 b/Sources/Process/Turb_Mod/Calculate_Deltas.f90 index c0f9ec048..245aa8c1b 100644 --- a/Sources/Process/Turb_Mod/Calculate_Deltas.f90 +++ b/Sources/Process/Turb_Mod/Calculate_Deltas.f90 @@ -30,7 +30,7 @@ subroutine Calculate_Deltas(Turb) h_w_z(-nb:nc)) ! Normalize gradients - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() d = sqrt( h_w_x(c)**2 + h_w_y(c)**2 + h_w_z(c)**2) h_w_x(c) = h_w_x(c) / d h_w_y(c) = h_w_y(c) / d @@ -78,7 +78,7 @@ subroutine Calculate_Deltas(Turb) end do ! Correct h_max and h_min - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() Turb % h_max(c) = Turb % h_max(c) * 2.0 Turb % h_min(c) = Turb % h_min(c) * 2.0 end do diff --git a/Sources/Process/Turb_Mod/Calculate_Heat_Flux.f90 b/Sources/Process/Turb_Mod/Calculate_Heat_Flux.f90 index 96ab5776d..5ebc27ee0 100644 --- a/Sources/Process/Turb_Mod/Calculate_Heat_Flux.f90 +++ b/Sources/Process/Turb_Mod/Calculate_Heat_Flux.f90 @@ -12,7 +12,7 @@ subroutine Calculate_Heat_Flux(Turb) type(Var_Type), pointer :: uu, vv, ww, uv, uw, vw type(Var_Type), pointer :: t, ut, vt, wt, t2 type(Var_Type), pointer :: u, v, w - integer :: c, c1, c2, s + integer :: c, c1, c2, s, reg real :: ut_log_law, vt_log_law, wt_log_law real :: nx, ny, nz, qx, qy, qz, ebf !==============================================================================! @@ -40,7 +40,7 @@ subroutine Calculate_Heat_Flux(Turb) !-----------------------------------------------------------! if(Turb % heat_flux_model .eq. SGDH) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() pr_t = max(Turb % Prandtl_Turb(c), TINY) ut % n(c) = - Turb % vis_t(c) / Flow % density(c) / pr_t * t % x(c) vt % n(c) = - Turb % vis_t(c) / Flow % density(c) / pr_t * t % y(c) @@ -57,7 +57,7 @@ subroutine Calculate_Heat_Flux(Turb) end do else if(Turb % heat_flux_model .eq. GGDH) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() ut % n(c) = -c_theta * Turb % t_scale(c) * (uu % n(c) * t % x(c) + & uv % n(c) * t % y(c) + & uw % n(c) * t % z(c)) @@ -74,7 +74,7 @@ subroutine Calculate_Heat_Flux(Turb) call Flow % Grad_Variable(Flow % v) call Flow % Grad_Variable(Flow % w) - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() ut % n(c) = -c_theta * Turb % t_scale(c) & * (( uu % n(c) * t % x(c) & + uv % n(c) * t % y(c) & @@ -108,14 +108,12 @@ subroutine Calculate_Heat_Flux(Turb) Turb % model .eq. K_EPS_ZETA_F .or. & Turb % model .eq. HYBRID_LES_RANS) then - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - if(c2 < 0) then - - if(Grid % Bnd_Cond_Type(c2) .eq. WALL .or. & - Grid % Bnd_Cond_Type(c2) .eq. WALLFL) then + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. WALL .or. & + Grid % region % type(reg) .eq. WALLFL) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) nx = Grid % sx(s) / Grid % s(s) ny = Grid % sy(s) / Grid % s(s) @@ -145,9 +143,10 @@ subroutine Calculate_Heat_Flux(Turb) + vt_log_law * exp(-1.0 / ebf) wt % n(c1) = wt % n(c1) * exp(-1.0 * ebf) & + wt_log_law * exp(-1.0 / ebf) - end if - end if - end do + + end do ! faces in regions + end if ! region is WALL or WALLFL + end do ! through regions end if end subroutine diff --git a/Sources/Process/Turb_Mod/Calculate_Scalar_Flux.f90 b/Sources/Process/Turb_Mod/Calculate_Scalar_Flux.f90 index 4ad7229a9..b3fb5e867 100644 --- a/Sources/Process/Turb_Mod/Calculate_Scalar_Flux.f90 +++ b/Sources/Process/Turb_Mod/Calculate_Scalar_Flux.f90 @@ -13,7 +13,7 @@ subroutine Calculate_Scalar_Flux(Turb, sc) type(Var_Type), pointer :: uu, vv, ww, uv, uw, vw, kin, zeta, eps, f type(Var_Type), pointer :: u, v, w type(Var_Type), pointer :: phi - integer :: c, k, c1, c2, s + integer :: c, k, c1, c2, s, reg real :: uc_log_law, vc_log_law, wc_log_law real :: nx, ny, nz, ebf !==============================================================================! @@ -39,7 +39,7 @@ subroutine Calculate_Scalar_Flux(Turb, sc) ! First guess is the flux defined by SGDH ! !-----------------------------------------! if(Turb % scalar_flux_model .eq. SGDH) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() Turb % uc(c) = - Turb % vis_t(c) / Flow % density(c) / sc_t * phi % x(c) Turb % vc(c) = - Turb % vis_t(c) / Flow % density(c) / sc_t * phi % y(c) @@ -57,7 +57,7 @@ subroutine Calculate_Scalar_Flux(Turb, sc) else if(Turb % scalar_flux_model .eq. GGDH) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() Turb % uc(c) = -c_theta * Turb % t_scale(c) * (uu % n(c) * phi % x(c) + & uv % n(c) * phi % y(c) + & uw % n(c) * phi % z(c)) @@ -74,7 +74,7 @@ subroutine Calculate_Scalar_Flux(Turb, sc) call Flow % Grad_Variable(Flow % v) call Flow % Grad_Variable(Flow % w) do k = 1, 3 - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() Turb % uc(c) = -c_theta*Turb % t_scale(c) * (( uu % n(c) * phi % x(c) & + uv % n(c) * phi % y(c) & @@ -99,21 +99,19 @@ subroutine Calculate_Scalar_Flux(Turb, sc) + Turb % wc(c) * w % z(c))) end do - end do - end if + end do ! browse three times, but why? + end if ! scalar model SGDH, GGDH or AFM if(Turb % model .eq. K_EPS .or. & Turb % model .eq. K_EPS_ZETA_F .or. & Turb % model .eq. HYBRID_LES_RANS) then - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - if(c2 < 0) then - - if(Grid % Bnd_Cond_Type(c2) .eq. WALL .or. & - Grid % Bnd_Cond_Type(c2) .eq. WALLFL) then + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. WALL .or. & + Grid % region % type(reg) .eq. WALLFL) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) nx = Grid % sx(s) / Grid % s(s) ny = Grid % sy(s) / Grid % s(s) @@ -137,9 +135,9 @@ subroutine Calculate_Scalar_Flux(Turb, sc) + vc_log_law * exp(-1.0 / ebf) Turb % wc(c1) = Turb % wc(c1) * exp(-1.0 * ebf) & + wc_log_law * exp(-1.0 / ebf) - end if - end if - end do + end do ! faces in regions + end if ! region is WALL or WALLFL + end do ! through regions end if end subroutine diff --git a/Sources/Process/Turb_Mod/Calculate_Stress.f90 b/Sources/Process/Turb_Mod/Calculate_Stress.f90 index 00aff3303..644f7ddb4 100644 --- a/Sources/Process/Turb_Mod/Calculate_Stress.f90 +++ b/Sources/Process/Turb_Mod/Calculate_Stress.f90 @@ -31,7 +31,7 @@ subroutine Calculate_Stress(Turb) if( Turb % model .eq. K_EPS .or. & Turb % model .eq. K_EPS_ZETA_F) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() uu % n(c) = - 2. * Turb % vis_t(c) / Flow % density(c) & * u % x(c) + TWO_THIRDS * kin % n(c) @@ -48,7 +48,7 @@ subroutine Calculate_Stress(Turb) else if(Turb % model .eq. HYBRID_LES_RANS) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() uu % n(c) = - 2. * Turb % vis_t_eff(c) / Flow % density(c) & * u % x(c) + TWO_THIRDS * kin % n(c) @@ -65,7 +65,7 @@ subroutine Calculate_Stress(Turb) if( Turb % model .eq. K_EPS_ZETA_F .or. & Turb % model .eq. HYBRID_LES_RANS) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() uu % n(c) = zeta % n(c) * kin % n(c) vv % n(c) = zeta % n(c) * kin % n(c) diff --git a/Sources/Process/Turb_Mod/Compute_F22.f90 b/Sources/Process/Turb_Mod/Compute_F22.f90 index 8b8b69567..3cb4c94d5 100644 --- a/Sources/Process/Turb_Mod/Compute_F22.f90 +++ b/Sources/Process/Turb_Mod/Compute_F22.f90 @@ -58,14 +58,14 @@ subroutine Compute_F22(Turb, Sol, curr_dt, ini, phi) ! Old values (o) and older than old (oo) if(ini .eq. 1) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() phi % oo(c) = phi % o(c) phi % o (c) = phi % n(c) end do end if ! New values - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() cross(c) = 0.0 end do @@ -142,7 +142,7 @@ subroutine Compute_F22(Turb, Sol, curr_dt, ini, phi) end do ! through faces ! Cross diffusion terms are treated explicity - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() b(c) = b(c) + cross(c) end do diff --git a/Sources/Process/Turb_Mod/Compute_Stress.f90 b/Sources/Process/Turb_Mod/Compute_Stress.f90 index 5f291644d..1043ed1c5 100644 --- a/Sources/Process/Turb_Mod/Compute_Stress.f90 +++ b/Sources/Process/Turb_Mod/Compute_Stress.f90 @@ -70,7 +70,7 @@ subroutine Compute_Stress(Turb, Sol, curr_dt, ini, phi) ! Old values (o) and older than old (oo) if(ini .eq. 1) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() phi % oo(c) = phi % o(c) phi % o (c) = phi % n(c) end do @@ -183,7 +183,7 @@ subroutine Compute_Stress(Turb, Sol, curr_dt, ini, phi) if(Turb % model_variant .ne. STABILIZED) then if(Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() u1uj_phij(c) = Flow % density(c) * c_mu_d / phi % sigma & * kin % n(c) & / max(eps % n(c), TINY) & @@ -209,7 +209,7 @@ subroutine Compute_Stress(Turb, Sol, curr_dt, ini, phi) - Flow % viscosity(c) * phi_z(c) end do else if(Turb % model .eq. RSM_MANCEAU_HANJALIC) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() u1uj_phij(c) = Flow % density(c) * c_mu_d / phi % sigma & * Turb % t_scale(c) & * ( uu % n(c) * phi_x(c) & @@ -234,7 +234,7 @@ subroutine Compute_Stress(Turb, Sol, curr_dt, ini, phi) call Flow % Grad_Component(u2uj_phij(-nb:nc), 2, u2uj_phij_y(-nb:nc)) call Flow % Grad_Component(u3uj_phij(-nb:nc), 3, u3uj_phij_z(-nb:nc)) - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() b(c) = b(c) + ( u1uj_phij_x(c) & + u2uj_phij_y(c) & + u3uj_phij_z(c) ) * Grid % vol(c) @@ -279,7 +279,7 @@ subroutine Compute_Stress(Turb, Sol, curr_dt, ini, phi) ! Source term contains difference between ! ! explicity and implicitly treated advection ! !------------------------------------------------! - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() b(c) = b(c) + cross(c) end do @@ -358,7 +358,7 @@ subroutine Compute_Stress(Turb, Sol, curr_dt, ini, phi) if(phi % name .eq. 'UU' .or. & phi % name .eq. 'VV' .or. & phi % name .eq. 'WW') then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() phi % n(c) = phi % n(c) if(phi % n(c) < 0.) then phi % n(c) = phi % o(c) diff --git a/Sources/Process/Turb_Mod/Compute_Variable.f90 b/Sources/Process/Turb_Mod/Compute_Variable.f90 index aa672ca26..c17c9f93c 100644 --- a/Sources/Process/Turb_Mod/Compute_Variable.f90 +++ b/Sources/Process/Turb_Mod/Compute_Variable.f90 @@ -27,7 +27,7 @@ subroutine Compute_Variable(Turb, Sol, curr_dt, ini, phi) real :: dt real :: visc_f, pr_t1, pr_t2, pr_1, pr_2 real, contiguous, pointer :: cross(:) -!==============================================================================! +!------------------------------------------------------------------------------! ! ! ! The form of equations which are solved: ! ! ! @@ -37,7 +37,7 @@ subroutine Compute_Variable(Turb, Sol, curr_dt, ini, phi) ! | dt | | sigma | ! ! / / / / ! ! ! -!------------------------------------------------------------------------------! +!==============================================================================! call Profiler % Start('Compute_Variable (without solvers)') @@ -59,7 +59,7 @@ subroutine Compute_Variable(Turb, Sol, curr_dt, ini, phi) ! Old values (o) and older than old (oo) if(ini .eq. 1) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() phi % oo(c) = phi % o(c) phi % o (c) = phi % n(c) end do @@ -191,7 +191,7 @@ subroutine Compute_Variable(Turb, Sol, curr_dt, ini, phi) end do ! through faces ! Cross diffusion terms are treated explicity - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() b(c) = b(c) + cross(c) end do @@ -259,20 +259,20 @@ subroutine Compute_Variable(Turb, Sol, curr_dt, ini, phi) ' (solver for turbulence)') ! Avoid negative values for all computed turbulent quantities - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() if( phi % n(c) < 0.0 ) phi % n(c) = phi % o(c) end do ! Set the lower limit of zeta to 1.8 if(phi % name .eq. 'ZETA') then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() phi % n(c) = min(phi % n(c), 1.8) end do end if ! Set the lower limit of epsilon if(phi % name .eq. 'EPS') then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() phi % n(c) = max(phi % n(c), 1.0e-10) end do end if diff --git a/Sources/Process/Turb_Mod/Ebf_Momentum.f90 b/Sources/Process/Turb_Mod/Ebf_Momentum.f90 index 5b4e8170b..3ee0c1a20 100644 --- a/Sources/Process/Turb_Mod/Ebf_Momentum.f90 +++ b/Sources/Process/Turb_Mod/Ebf_Momentum.f90 @@ -1,12 +1,12 @@ !==============================================================================! - real function Ebf_Momentum(Turb, c) + pure real function Ebf_Momentum(Turb, c) !------------------------------------------------------------------------------! ! Calculates elliptic blending function for momentum. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Turb_Type) :: Turb - integer :: c + class(Turb_Type), intent(in) :: Turb + integer, intent(in) :: c !==============================================================================! Ebf_Momentum = max( 0.01 * Turb % y_plus(c)**4 & diff --git a/Sources/Process/Turb_Mod/Ebf_Scalar.f90 b/Sources/Process/Turb_Mod/Ebf_Scalar.f90 index 86730ebdd..af2620b67 100644 --- a/Sources/Process/Turb_Mod/Ebf_Scalar.f90 +++ b/Sources/Process/Turb_Mod/Ebf_Scalar.f90 @@ -1,13 +1,13 @@ !==============================================================================! - real function Ebf_Scalar(Turb, c, coef) + pure real function Ebf_Scalar(Turb, c, coef) !------------------------------------------------------------------------------! ! Calculates elliptic blending function for scalars. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Turb_Type) :: Turb - integer :: c - real :: coef ! Prandtl number (maybe even Shmidt number) + class(Turb_Type), intent(in) :: Turb + integer, intent(in) :: c + real, intent(in) :: coef ! Prandtl number (Shmidt number) !==============================================================================! Ebf_Scalar = 0.01 * ((coef * Turb % y_plus(c)) ** 4 & diff --git a/Sources/Process/Turb_Mod/Src_Rsm_Hanjalic_Jakirlic.f90 b/Sources/Process/Turb_Mod/Src_Rsm_Hanjalic_Jakirlic.f90 index b5971eb9f..1f76c77fb 100644 --- a/Sources/Process/Turb_Mod/Src_Rsm_Hanjalic_Jakirlic.f90 +++ b/Sources/Process/Turb_Mod/Src_Rsm_Hanjalic_Jakirlic.f90 @@ -134,7 +134,7 @@ subroutine Src_Rsm_Hanjalic_Jakirlic(Turb, Sol, name_phi) ! call Flow % Grad_Component(w % x, 3, var12y) ! d2W/dxdz ! call Flow % Grad_Component(w % y, 3, var12z) ! d2W/dydz ! -! do c = 1, Grid % n_cells +! do c = Cells_In_Domain_And_Buffers() ! uxx = var1x(c) ! uyy = var1y(c) ! uzz = var1z(c) diff --git a/Sources/Process/Turb_Mod/Src_Rsm_Manceau_Hanjalic.f90 b/Sources/Process/Turb_Mod/Src_Rsm_Manceau_Hanjalic.f90 index 15acf6ed2..c91d153f6 100644 --- a/Sources/Process/Turb_Mod/Src_Rsm_Manceau_Hanjalic.f90 +++ b/Sources/Process/Turb_Mod/Src_Rsm_Manceau_Hanjalic.f90 @@ -1,7 +1,7 @@ !==============================================================================! subroutine Src_Rsm_Manceau_Hanjalic(Turb, Sol, name_phi) !------------------------------------------------------------------------------! -! Calculate source terms for Re stresses and dissipation for +! Calculate source terms for Re stresses and dissipation for ! ! RSM_MANCEAU_HANJALIC model ! !------------------------------------------------------------------------------! implicit none diff --git a/Sources/Process/Turb_Mod/Src_T2.f90 b/Sources/Process/Turb_Mod/Src_T2.f90 index 1eea58708..b7918b8de 100644 --- a/Sources/Process/Turb_Mod/Src_T2.f90 +++ b/Sources/Process/Turb_Mod/Src_T2.f90 @@ -14,10 +14,10 @@ subroutine Src_T2(Turb, Sol) type(Var_Type), pointer :: kin, eps, ut, vt, wt, t2 type(Matrix_Type), pointer :: A real, pointer :: b(:) - integer :: c, c1, c2, s + integer :: c, c1, c2, s, reg real :: kin_vis, p_t2_wall, ebf, u_tau real :: ut_sgdh, vt_sgdh, wt_sgdh, z_o -!==============================================================================! +!------------------------------------------------------------------------------! ! Dimensions: ! ! ! ! production p_kin [m^2/s^3] | rate-of-strain shear [1/s] ! @@ -29,7 +29,7 @@ subroutine Src_T2(Turb, Sol) !------------------------------------------------------------------------------! ! p_kin = 2*vis_t / density S_ij S_ij ! ! shear = sqrt(2 S_ij S_ij) ! -!------------------------------------------------------------------------------! +!==============================================================================! ! Take aliases Flow => Turb % pnt_flow @@ -49,7 +49,7 @@ subroutine Src_T2(Turb, Sol) call Flow % Grad_Variable(t) ! Production source: - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() !-------------------------------------------------------------------! ! ut, vt and wt defined by AFM or GGDH could lead to divergence ! @@ -79,17 +79,17 @@ subroutine Src_T2(Turb, Sol) end do - ! Implementation of wall function approach for buoyancy-driven flows - - do s = 1, Grid % n_faces - c1 = Grid % faces_c(1,s) - c2 = Grid % faces_c(2,s) - - if(c2 < 0) then - if(Grid % Bnd_Cond_Type(c2) .eq. WALL .or. & - Grid % Bnd_Cond_Type(c2) .eq. WALLFL) then - - ! Set up roughness coefficient + !------------------------------------------------------------------------! + ! Implementation of wall function approach for buoyancy-driven flows ! + !------------------------------------------------------------------------! + do reg = Boundary_Regions() + if(Grid % region % type(reg) .eq. WALL .or. & + Grid % region % type(reg) .eq. WALLFL) then + do s = Faces_In_Region(reg) + c1 = Grid % faces_c(1,s) + c2 = Grid % faces_c(2,s) + + ! Set up roughness coefficient z_o = Turb % Roughness_Coefficient(c1, c2) ! Kinematic viscosities @@ -101,7 +101,6 @@ subroutine Src_T2(Turb, Sol) Grid % wall_dist(c1), & kin_vis, & z_o) - ebf = Turb % Ebf_Momentum(c1) p_t2_wall = Flow % density(c1) & @@ -115,16 +114,16 @@ subroutine Src_T2(Turb, Sol) Turb % p_t2(c1) = p_t2_wall else Turb % p_t2(c1) = ( Turb % p_t2(c1) * exp(-1.0 * ebf) & - + p_t2_wall * exp(-1.0/ebf)) + + p_t2_wall * exp(-1.0 / ebf)) end if b(c1) = b(c1) + Turb % p_t2(c1) * Grid % vol(c1) t2 % n(c2) = 0.0 - end if ! Grid % Bnd_Cond_Type(c2).eq.WALL or WALLFL - end if ! c2 < 0 - end do + end do ! faces in regions + end if ! region is WALL or WALLFL + end do ! through regions end subroutine diff --git a/Sources/Process/Turb_Mod/Src_Vis_Spalart_Almaras.f90 b/Sources/Process/Turb_Mod/Src_Vis_Spalart_Almaras.f90 index 7430206dc..7c66339cc 100644 --- a/Sources/Process/Turb_Mod/Src_Vis_Spalart_Almaras.f90 +++ b/Sources/Process/Turb_Mod/Src_Vis_Spalart_Almaras.f90 @@ -26,7 +26,7 @@ subroutine Src_Vis_Spalart_Almaras(Turb, Sol) if(Turb % model .eq. SPALART_ALLMARAS) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() !---------------------------------! ! Compute the production term ! @@ -60,7 +60,7 @@ subroutine Src_Vis_Spalart_Almaras(Turb, Sol) end do else if(Turb % model .eq. DES_SPALART) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() ! What is 0.65 here? A ghost number dist = min(Grid % wall_dist(c), 0.65 * Turb % h_max(c)) diff --git a/Sources/Process/Turb_Mod/Time_And_Length_Scale.f90 b/Sources/Process/Turb_Mod/Time_And_Length_Scale.f90 index 7fbc20ef8..38507296d 100644 --- a/Sources/Process/Turb_Mod/Time_And_Length_Scale.f90 +++ b/Sources/Process/Turb_Mod/Time_And_Length_Scale.f90 @@ -36,7 +36,7 @@ subroutine Time_And_Length_Scale(Turb, Grid) if(Turb % model .eq. K_EPS_ZETA_F) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() eps_l(c) = eps % n(c) + TINY ! limited eps % n kin_vis = Flow % viscosity(c) / Flow % density(c) @@ -55,7 +55,7 @@ subroutine Time_And_Length_Scale(Turb, Grid) end do else if(Turb % model .eq. HYBRID_LES_RANS) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() eps_l(c) = eps % n(c) + TINY ! limited eps % n kin_vis = Flow % viscosity(c) / Flow % density(c) @@ -73,7 +73,7 @@ subroutine Time_And_Length_Scale(Turb, Grid) else if(Turb % model .eq. RSM_MANCEAU_HANJALIC) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() eps_l(c) = eps % n(c) + TINY ! limited eps % n kin_vis = Flow % viscosity(c) / Flow % density(c) @@ -92,7 +92,7 @@ subroutine Time_And_Length_Scale(Turb, Grid) else if(Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() eps_l(c) = eps % n(c) + TINY ! limited eps % n t_1(c) = kin % n(c)/eps_l(c) @@ -105,7 +105,7 @@ subroutine Time_And_Length_Scale(Turb, Grid) else if(Turb % model .eq. K_EPS) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() eps_l(c) = eps % n(c) + TINY ! limited eps % n t_1(c) = kin % n(c) / eps_l(c) diff --git a/Sources/Process/Turb_Mod/Vis_T_Dynamic.f90 b/Sources/Process/Turb_Mod/Vis_T_Dynamic.f90 index 6b7a1589b..41821c2a7 100644 --- a/Sources/Process/Turb_Mod/Vis_T_Dynamic.f90 +++ b/Sources/Process/Turb_Mod/Vis_T_Dynamic.f90 @@ -72,7 +72,7 @@ subroutine Vis_T_Dynamic(Turb) call Grid % Exchange_Cells_Real(w % n) call Grid % Exchange_Cells_Real(Flow % shear) - do c =1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() u_a = 0.0 v_a = 0.0 w_a = 0.0 @@ -180,7 +180,7 @@ subroutine Vis_T_Dynamic(Turb) w % y, & ! dW/dy w % z) ! dW/dz - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() l_g = Grid % vol(c)**ONE_THIRD l_f = 2.0 * l_g @@ -191,16 +191,16 @@ subroutine Vis_T_Dynamic(Turb) 0.5*(u % z(c) + w % x(c))*(u % z(c) + w % x(c)) + & 0.5*(v % x(c) + u % y(c))*(v % x(c) + u % y(c)))) - l_11 = uu_f(c) - u_f(c) * u_f(c) - l_22 = vv_f(c) - v_f(c) * v_f(c) - l_33 = ww_f(c) - w_f(c) * w_f(c) - l_12 = uv_f(c) - u_f(c) * v_f(c) - l_13 = uw_f(c) - u_f(c) * w_f(c) - l_23 = vw_f(c) - v_f(c) * w_f(c) + l_11 = uu_f(c) - u_f(c) * u_f(c) + l_22 = vv_f(c) - v_f(c) * v_f(c) + l_33 = ww_f(c) - w_f(c) * w_f(c) + l_12 = uv_f(c) - u_f(c) * v_f(c) + l_13 = uw_f(c) - u_f(c) * w_f(c) + l_23 = vw_f(c) - v_f(c) * w_f(c) - m_11 = l_f**2 * shear_test(c) * u % x(c) - l_g**2 * m_11_f(c) - m_22 = l_f**2 * shear_test(c) * v % y(c) - l_g**2 * m_22_f(c) - m_33 = l_f**2 * shear_test(c) * w % z(c) - l_g**2 * m_33_f(c) + m_11 = l_f**2 * shear_test(c) * u % x(c) - l_g**2 * m_11_f(c) + m_22 = l_f**2 * shear_test(c) * v % y(c) - l_g**2 * m_22_f(c) + m_33 = l_f**2 * shear_test(c) * w % z(c) - l_g**2 * m_33_f(c) m_12 = l_f**2 * shear_test(c) * .5*(u % y(c)+v % x(c)) - l_g**2 * m_12_f(c) m_13 = l_f**2 * shear_test(c) * .5*(u % z(c)+w % x(c)) - l_g**2 * m_13_f(c) @@ -211,11 +211,11 @@ subroutine Vis_T_Dynamic(Turb) l_dot_m = l_11 * m_11 + l_22 * m_22 + l_33 * m_33 & + 2.0 * (l_12 * m_12 + l_13 * m_13 + l_23 * m_23) - Turb % c_dyn(c) = -0.5 * l_dot_m / (m_dot_m + TINY) + Turb % c_dyn(c) = -0.5 * l_dot_m / (m_dot_m + TINY) ! Set lower and upper limiter on c_dyn if(Turb % c_dyn(c) < 0.0) then - Turb % c_dyn(c) = 0.0 + Turb % c_dyn(c) = 0.0 else if(Turb % c_dyn(c) > 0.04) then Turb % c_dyn(c) = 0.04 end if diff --git a/Sources/Process/Turb_Mod/Vis_T_Hybrid_Les_Prandtl.f90 b/Sources/Process/Turb_Mod/Vis_T_Hybrid_Les_Prandtl.f90 index df1cb9a30..2847e32cd 100644 --- a/Sources/Process/Turb_Mod/Vis_T_Hybrid_Les_Prandtl.f90 +++ b/Sources/Process/Turb_Mod/Vis_T_Hybrid_Les_Prandtl.f90 @@ -41,7 +41,7 @@ subroutine Vis_T_Hybrid_Les_Prandtl(Turb) !----------------------------! ! Model's eddy viscosity ! !----------------------------! - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() hmax = Turb % h_max(c) hwn = Turb % h_w(c) diff --git a/Sources/Process/Turb_Mod/Vis_T_Hybrid_Les_Rans.f90 b/Sources/Process/Turb_Mod/Vis_T_Hybrid_Les_Rans.f90 index 22dc8ff96..dbc2af84c 100644 --- a/Sources/Process/Turb_Mod/Vis_T_Hybrid_Les_Rans.f90 +++ b/Sources/Process/Turb_Mod/Vis_T_Hybrid_Les_Rans.f90 @@ -29,7 +29,7 @@ subroutine Vis_T_Hybrid_Les_Rans(Turb) call Flow % Grad_Variable(t) end if - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() lf = Grid % vol(c) ** ONE_THIRD Turb % vis_t_sgs(c) = Flow % density(c) & * (lf*lf) & ! delta^2 @@ -38,7 +38,7 @@ subroutine Vis_T_Hybrid_Les_Rans(Turb) end do if(Flow % buoyancy .eq. THERMALLY_DRIVEN) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() nc2 = -Flow % beta * ( Flow % grav_x * t % x(c) & + Flow % grav_y * t % y(c) & + Flow % grav_z * t % z(c)) diff --git a/Sources/Process/Turb_Mod/Vis_T_Spalart_Allmaras.f90 b/Sources/Process/Turb_Mod/Vis_T_Spalart_Allmaras.f90 index 29ef8d145..db82a7ab1 100644 --- a/Sources/Process/Turb_Mod/Vis_T_Spalart_Allmaras.f90 +++ b/Sources/Process/Turb_Mod/Vis_T_Spalart_Allmaras.f90 @@ -22,7 +22,7 @@ subroutine Vis_T_Spalart_Allmaras(Turb) call Flow % Alias_Momentum(u, v, w) if(Turb % model .eq. DES_SPALART) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() x_rat = vis % n(c) / Flow % viscosity(c) f_v1 = x_rat**3/(x_rat**3 + c_v1**3) Turb % vis_t(c) = Flow % density(c) * f_v1 * vis % n(c) @@ -30,7 +30,7 @@ subroutine Vis_T_Spalart_Allmaras(Turb) end if if(Turb % model .eq. SPALART_ALLMARAS) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() x_rat = vis % n(c) / Flow % viscosity(c) f_v1 = x_rat**3/(x_rat**3 + c_v1**3) Turb % vis_t(c) = Flow % density(c) * f_v1 * vis % n(c) diff --git a/Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 b/Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 index d5a3777c2..c91bab564 100644 --- a/Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 +++ b/Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 @@ -39,7 +39,7 @@ subroutine Vis_T_Subgrid(Turb) end if if(Turb % model .eq. LES_SMAGORINSKY) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() lf = Grid % vol(c)**ONE_THIRD nu = Flow % viscosity(c) / Flow % density(c) @@ -62,7 +62,7 @@ subroutine Vis_T_Subgrid(Turb) end do else if(Turb % model .eq. LES_DYNAMIC) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() lf = Grid % vol(c) ** ONE_THIRD Turb % vis_t(c) = Flow % density(c) & * (lf*lf) & ! delta^2 @@ -71,7 +71,7 @@ subroutine Vis_T_Subgrid(Turb) end do else if(Turb % model .eq. LES_WALE) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() lf = Grid % vol(c)**ONE_THIRD Turb % vis_t(c) = Flow % density(c) & * (lf*lf) & ! delta^2 @@ -85,7 +85,7 @@ subroutine Vis_T_Subgrid(Turb) ! buoyancy according to Eidson, T., JFM, 1985 ! !-------------------------------------------------! if(Flow % buoyancy .eq. THERMALLY_DRIVEN) then - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() nc2 = max(- Flow % beta * ( Flow % grav_x * t % x(c) & + Flow % grav_y * t % y(c) & + Flow % grav_z * t % z(c)), 0.0) diff --git a/Sources/Process/Turb_Mod/Vis_T_Tensorial.f90 b/Sources/Process/Turb_Mod/Vis_T_Tensorial.f90 index 61be6f340..25223d901 100644 --- a/Sources/Process/Turb_Mod/Vis_T_Tensorial.f90 +++ b/Sources/Process/Turb_Mod/Vis_T_Tensorial.f90 @@ -51,7 +51,7 @@ subroutine Vis_T_Tensorial(Turb) Turb % tau_32 = 0.0 Turb % tau_33 = 0.0 - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() ixp = ( 0.5 * ( Grid % ixx (c) & - Grid % iyy (c) & - Grid % izz (c) ) ) ! I'xx (I'11) diff --git a/Sources/Process/Turb_Mod/Vis_T_Wale.f90 b/Sources/Process/Turb_Mod/Vis_T_Wale.f90 index ecbab9990..4a4187810 100644 --- a/Sources/Process/Turb_Mod/Vis_T_Wale.f90 +++ b/Sources/Process/Turb_Mod/Vis_T_Wale.f90 @@ -29,7 +29,7 @@ subroutine Vis_T_Wale(Turb) ! SGS terms ! ! ! !---------------! - do c = 1, Grid % n_cells + do c = Cells_In_Domain_And_Buffers() s11 = u % x(c) s22 = v % y(c) s33 = w % z(c) From 5d0dfcff013d1124b14e590f9e06d5ad70a4ca08 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 1 Apr 2023 14:51:12 +0200 Subject: [PATCH 180/223] Juiced couple of percent in performance ... ... by declaring some functions which are often used as pure. Also introduced the Beta_Scalar function in Turb_Mod to avoid code duplication. Surprisingly, its introduction made the code slightly faster On branch bojan_more_robust_communicator modified: Field_Mod/Utilities/Prandtl_Numb.f90 modified: Field_Mod/Utilities/Schmidt_Numb.f90 modified: Turb_Mod.f90 new file: Turb_Mod/Beta_Scalar.f90 modified: Turb_Mod/Vis_T_K_Eps.f90 modified: Turb_Mod/Vis_T_K_Eps_Zeta_F.f90 modified: Turb_Mod/Vis_T_Subgrid.f90 --- .../Field_Mod/Utilities/Prandtl_Numb.f90 | 6 +++--- .../Field_Mod/Utilities/Schmidt_Numb.f90 | 6 +++--- Sources/Process/Turb_Mod.f90 | 2 ++ Sources/Process/Turb_Mod/Beta_Scalar.f90 | 18 ++++++++++++++++++ Sources/Process/Turb_Mod/Vis_T_K_Eps.f90 | 12 +++++------- .../Process/Turb_Mod/Vis_T_K_Eps_Zeta_F.f90 | 10 +++------- Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 | 13 ++++--------- 7 files changed, 38 insertions(+), 29 deletions(-) create mode 100644 Sources/Process/Turb_Mod/Beta_Scalar.f90 diff --git a/Sources/Process/Field_Mod/Utilities/Prandtl_Numb.f90 b/Sources/Process/Field_Mod/Utilities/Prandtl_Numb.f90 index 825219be7..4b5fefa23 100644 --- a/Sources/Process/Field_Mod/Utilities/Prandtl_Numb.f90 +++ b/Sources/Process/Field_Mod/Utilities/Prandtl_Numb.f90 @@ -1,12 +1,12 @@ !==============================================================================! - real function Prandtl_Numb(Flow, c) + pure real function Prandtl_Numb(Flow, c) !------------------------------------------------------------------------------! ! Computes laminar Prandtl number for cell "c" ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Field_Type), target :: Flow - integer :: c + class(Field_Type), intent(in) :: Flow + integer, intent(in) :: c !==============================================================================! Prandtl_Numb = Flow % viscosity(c) * Flow % capacity(c) & diff --git a/Sources/Process/Field_Mod/Utilities/Schmidt_Numb.f90 b/Sources/Process/Field_Mod/Utilities/Schmidt_Numb.f90 index eb8f1e59a..df5f2604d 100644 --- a/Sources/Process/Field_Mod/Utilities/Schmidt_Numb.f90 +++ b/Sources/Process/Field_Mod/Utilities/Schmidt_Numb.f90 @@ -1,12 +1,12 @@ !==============================================================================! - real function Schmidt_Numb(Flow, c) + pure real function Schmidt_Numb(Flow, c) !------------------------------------------------------------------------------! ! Computes laminar Schmidt number for cell "c" ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Field_Type), target :: Flow - integer :: c + class(Field_Type), intent(in) :: Flow + integer, intent(in) :: c !==============================================================================! Schmidt_Numb = Flow % viscosity(c) & diff --git a/Sources/Process/Turb_Mod.f90 b/Sources/Process/Turb_Mod.f90 index 6bbdf6898..7dd034293 100644 --- a/Sources/Process/Turb_Mod.f90 +++ b/Sources/Process/Turb_Mod.f90 @@ -197,6 +197,7 @@ module Turb_Mod procedure, private :: Vis_T_Wale procedure, private :: Vis_T_Tensorial + procedure, private :: Beta_Scalar procedure, private :: Ebf_Momentum procedure, private :: Ebf_Scalar procedure :: Prandtl_Turb @@ -338,6 +339,7 @@ module Turb_Mod # include "Turb_Mod/Vis_T_Tensorial.f90" ! Other subroutines ellipitic blending, turbulent Prandtl number +# include "Turb_Mod/Beta_Scalar.f90" # include "Turb_Mod/Ebf_Momentum.f90" # include "Turb_Mod/Ebf_Scalar.f90" # include "Turb_Mod/Prandtl_Turb.f90" diff --git a/Sources/Process/Turb_Mod/Beta_Scalar.f90 b/Sources/Process/Turb_Mod/Beta_Scalar.f90 new file mode 100644 index 000000000..b2bb9e7af --- /dev/null +++ b/Sources/Process/Turb_Mod/Beta_Scalar.f90 @@ -0,0 +1,18 @@ +!==============================================================================! + pure real function Beta_Scalar(Turb, coef_l, coef_t) +!------------------------------------------------------------------------------! +! Calculates elliptic blending function for scalars. ! +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Turb_Type), intent(in) :: Turb + real, intent(in) :: coef_l ! laminar Prandtl (or Schmidt) number + real, intent(in) :: coef_t ! turbulent Prandtl (or Schmidt) number +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Turb) +!==============================================================================! + + Beta_Scalar = 9.24 * ((coef_l/coef_t)**0.75 - 1.0) & + * (1.0 + 0.28 * exp(-0.007*coef_l/coef_t)) + + end function diff --git a/Sources/Process/Turb_Mod/Vis_T_K_Eps.f90 b/Sources/Process/Turb_Mod/Vis_T_K_Eps.f90 index 86e13df4d..9cbda07d9 100644 --- a/Sources/Process/Turb_Mod/Vis_T_K_Eps.f90 +++ b/Sources/Process/Turb_Mod/Vis_T_K_Eps.f90 @@ -120,15 +120,14 @@ subroutine Vis_T_K_Eps(Turb) Turb % vis_w(c1) = Turb % y_plus(c1) * Flow % viscosity(c1) & / ( Turb % y_plus(c1) * exp(-1.0 * ebf) & - + u_plus * exp(-1.0/ebf) + TINY) + + u_plus * exp(-1.0 / ebf) + TINY) end if if(Flow % heat_transfer) then pr = Flow % Prandtl_Numb(c1) pr_t = Turb % Prandtl_Turb(c1) - beta = 9.24 * ((pr/pr_t)**0.75 - 1.0) & - * (1.0 + 0.28 * exp(-0.007*pr/pr_t)) + beta = Turb % Beta_Scalar(pr, pr_t) ! According to Toparlar et al. 2019 paper ! "CFD simulation of the near-neutral atmospheric boundary layer: ! New temperature inlet profile consistent with wall functions" @@ -145,13 +144,12 @@ subroutine Vis_T_K_Eps(Turb) if(Flow % n_scalars > 0) then sc = Flow % Schmidt_Numb(c1) ! laminar Schmidt number - beta = 9.24 * ((sc/sc_t)**0.75 - 1.0) & - * (1.0 + 0.28 * exp(-0.007*sc/sc_t)) - ebf = Turb % Ebf_Scalar(c1, pr) + beta = Turb % Beta_Scalar(sc, sc_t) + ebf = Turb % Ebf_Scalar(c1, pr) Turb % diff_w(c1) = Turb % y_plus(c1) & * (Flow % viscosity(c1)/Flow % density(c1)) & / ( Turb % y_plus(c1) * sc * exp(-1.0 * ebf) & - + (u_plus + beta) * sc_t * exp(-1.0 / ebf) + TINY) + + (u_plus + beta) * sc_t * exp(-1.0 / ebf) + TINY) end if end do ! faces in regions diff --git a/Sources/Process/Turb_Mod/Vis_T_K_Eps_Zeta_F.f90 b/Sources/Process/Turb_Mod/Vis_T_K_Eps_Zeta_F.f90 index 9331375dd..62bb4f456 100644 --- a/Sources/Process/Turb_Mod/Vis_T_K_Eps_Zeta_F.f90 +++ b/Sources/Process/Turb_Mod/Vis_T_K_Eps_Zeta_F.f90 @@ -122,9 +122,7 @@ subroutine Vis_T_K_Eps_Zeta_F(Turb) if(Flow % heat_transfer) then pr_t = Turb % Prandtl_Turb(c1) pr = Flow % Prandtl_Numb(c1) ! laminar Prandtl number - beta = 9.24 * ((pr/pr_t)**0.75 - 1.0) & - * (1.0 + 0.28 * exp(-0.007*pr/pr_t)) - + beta = Turb % Beta_Scalar(pr, pr_t) ! According to Toparlar et al. 2019 paper ! "CFD simulation of the near-neutral atmospheric boundary layer: ! New temperature inlet profile consistent with wall functions" @@ -142,9 +140,7 @@ subroutine Vis_T_K_Eps_Zeta_F(Turb) if(Flow % n_scalars > 0) then sc = Flow % Schmidt_Numb(c1) ! laminar Schmidt number - beta = 9.24 * ((sc/sc_t)**0.75 - 1.0) & - * (1.0 + 0.28 * exp(-0.007*sc/sc_t)) - + beta = Turb % Beta_Scalar(sc, sc_t) ! According to Toparlar et al. 2019 paper ! "CFD simulation of the near-neutral atmospheric boundary layer: ! New temperature inlet profile consistent with wall functions" @@ -156,7 +152,7 @@ subroutine Vis_T_K_Eps_Zeta_F(Turb) Turb % diff_w(c1) = Turb % y_plus(c1) & * (Flow % viscosity(c1)/Flow % density(c1)) & / (Turb % y_plus(c1) * sc * exp(-1.0 * ebf) & - + (u_plus + beta) * sc_t * exp(-1.0 / ebf) + TINY) + + (u_plus + beta) * sc_t * exp(-1.0 / ebf) + TINY) end if end do ! faces in regions diff --git a/Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 b/Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 index c91bab564..060ab5092 100644 --- a/Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 +++ b/Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 @@ -164,9 +164,7 @@ subroutine Vis_T_Subgrid(Turb) pr_t = Turb % Prandtl_Turb(c1) pr = Flow % Prandtl_Numb(c1) ! laminar Prandtl number - beta = 9.24 * ((pr/pr_t)**0.75 - 1.0) & - * (1.0 + 0.28 * exp(-0.007*pr/pr_t)) - + beta = Turb % Beta_Scalar(pr, pr_t) ! According to Toparlar et al. 2019 paper ! "CFD simulation of the near-neutral atmospheric boundary layer: New ! temperature inlet profile consistent with wall functions" @@ -186,9 +184,7 @@ subroutine Vis_T_Subgrid(Turb) u_plus = u_tan / u_tau sc = Flow % Schmidt_Numb(c1) ! laminar Schmidt number - beta = 9.24 * ((sc/sc_t)**0.75 - 1.0) & - * (1.0 + 0.28 * exp(-0.007*sc/sc_t)) - + beta = Turb % Beta_Scalar(sc, sc_t) ! According to Toparlar et al. 2019 paper ! "CFD simulation of the near-neutral atmospheric boundary layer: New ! temperature inlet profile consistent with wall functions" @@ -196,12 +192,11 @@ subroutine Vis_T_Subgrid(Turb) beta = 0.0 end if - ebf = 0.01 * (sc * Turb % y_plus(c1)**4 & - / ((1.0 + 5.0 * sc**3 * Turb % y_plus(c1)) + TINY)) + ebf = Turb % Ebf_Scalar(c1, sc) Turb % diff_w(c1) = Turb % y_plus(c1) & * (Flow % viscosity(c1)/Flow % density(c1)) & / (Turb % y_plus(c1) * sc * exp(-1.0 * ebf) & - + (u_plus + beta) * sc_t * exp(-1.0 / ebf) + TINY) + + (u_plus + beta) * sc_t * exp(-1.0 / ebf) + TINY) end if end if ! Grid % Bnd_Cond_Type(c2) .eq. WALL or WALLFL From 13e307454e3a1cc6e92dd9b8a38edb148550a494 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 1 Apr 2023 15:49:09 +0200 Subject: [PATCH 181/223] Calls profiling functions On branch bojan_more_robust_communicator modified: Grid_Mod/Load_Cfn.f90 modified: Grid_Mod/Load_Dim.f90 --- Sources/Shared/Grid_Mod/Load_Cfn.f90 | 4 ++++ Sources/Shared/Grid_Mod/Load_Dim.f90 | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/Sources/Shared/Grid_Mod/Load_Cfn.f90 b/Sources/Shared/Grid_Mod/Load_Cfn.f90 index 71f4fc839..58a5940cb 100644 --- a/Sources/Shared/Grid_Mod/Load_Cfn.f90 +++ b/Sources/Shared/Grid_Mod/Load_Cfn.f90 @@ -13,6 +13,8 @@ subroutine Load_Cfn(Grid, this_proc, domain) character(SL) :: name_in, str, str1, str2 !==============================================================================! + call Profiler % Start('Load_Cfn') + !-------------------------------! ! Read the file with the ! ! connections between cells ! @@ -283,4 +285,6 @@ subroutine Load_Cfn(Grid, this_proc, domain) close(fu) + call Profiler % Stop('Load_Cfn') + end subroutine diff --git a/Sources/Shared/Grid_Mod/Load_Dim.f90 b/Sources/Shared/Grid_Mod/Load_Dim.f90 index bd19025f2..72b4627ec 100644 --- a/Sources/Shared/Grid_Mod/Load_Dim.f90 +++ b/Sources/Shared/Grid_Mod/Load_Dim.f90 @@ -13,6 +13,8 @@ subroutine Load_Dim(Grid, this_proc, domain) character(SL) :: name_in !==============================================================================! + call Profiler % Start('Load_Dim') + !----------------------------! ! Read the file with ! ! geometrical dimensions ! @@ -91,4 +93,6 @@ subroutine Load_Dim(Grid, this_proc, domain) close(fu) + call Profiler % Stop('Load_Dim') + end subroutine From 0b60fefa308a1493e4b533fe07e36649456e4be3 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 2 Apr 2023 08:15:06 +0200 Subject: [PATCH 182/223] Saves and checks the version of the files On branch bojan_more_robust_communicator modified: Sources/Shared/Const_Mod.f90 modified: Documentation/Syntax/.vim/syntax/fortran.vim modified: Sources/Shared/Grid_Mod/Load_Cfn.f90 modified: Sources/Shared/Grid_Mod/Load_Dim.f90 modified: Sources/Shared/Grid_Mod/Save_Cfn.f90 modified: Sources/Shared/Grid_Mod/Save_Dim.f90 --- Documentation/Syntax/.vim/syntax/fortran.vim | 1 + Sources/Shared/Const_Mod.f90 | 6 ++++++ Sources/Shared/Grid_Mod/Load_Cfn.f90 | 18 +++++++++++++++++- Sources/Shared/Grid_Mod/Load_Dim.f90 | 20 ++++++++++++++++++-- Sources/Shared/Grid_Mod/Save_Cfn.f90 | 5 +++++ Sources/Shared/Grid_Mod/Save_Dim.f90 | 5 +++++ 6 files changed, 52 insertions(+), 3 deletions(-) diff --git a/Documentation/Syntax/.vim/syntax/fortran.vim b/Documentation/Syntax/.vim/syntax/fortran.vim index 1420287a7..e93880d5b 100644 --- a/Documentation/Syntax/.vim/syntax/fortran.vim +++ b/Documentation/Syntax/.vim/syntax/fortran.vim @@ -418,6 +418,7 @@ if b:fortran_dialect == "f08" " Start with constants from Const_Mod: syn keyword fortranConstant PROGRAM_NAME syn keyword fortranConstant VL SL DL MSI DP SP IP LP RP + syn keyword fortranConstant VERSION_CFN VERSION_DIM VERSION_BACKUP syn keyword fortranConstant YOCTO ZEPTO ATTO FEMTO PICO NANO MICRO MILI syn keyword fortranConstant YOTTA ZETTA EXA PETA TERA GIGA MEGA KILO syn keyword fortranConstant HUGE TINY HUGE_INT EULER PI diff --git a/Sources/Shared/Const_Mod.f90 b/Sources/Shared/Const_Mod.f90 index 5228f2034..8c626ea86 100644 --- a/Sources/Shared/Const_Mod.f90 +++ b/Sources/Shared/Const_Mod.f90 @@ -44,6 +44,12 @@ module Const_Mod integer, parameter :: LP = IP ! logical precision integer, parameter :: RP = sizeof(1.0) ! real number precision + ! Version of the .cfn and .dim files + ! (This number was set in April of 2023) + integer, parameter :: VERSION_CFN = 202304 + integer, parameter :: VERSION_DIM = 202304 + integer, parameter :: VERSION_BACKUP = 202304 + !----------------------------------------! ! A few handy mathematical constants ! !----------------------------------------! diff --git a/Sources/Shared/Grid_Mod/Load_Cfn.f90 b/Sources/Shared/Grid_Mod/Load_Cfn.f90 index 58a5940cb..e623d419f 100644 --- a/Sources/Shared/Grid_Mod/Load_Cfn.f90 +++ b/Sources/Shared/Grid_Mod/Load_Cfn.f90 @@ -9,7 +9,7 @@ subroutine Load_Cfn(Grid, this_proc, domain) integer, intent(in) :: this_proc ! needed if called from Processor integer, optional :: domain !-----------------------------------[Locals]-----------------------------------! - integer :: c, c1, c2, s, n, ss, sr, fu, real_prec + integer :: c, c1, c2, s, n, ss, sr, fu, real_prec, version character(SL) :: name_in, str, str1, str2 !==============================================================================! @@ -50,6 +50,22 @@ subroutine Load_Cfn(Grid, this_proc, domain) end if end if + !------------------------------! + ! Read version of the file ! + !------------------------------! + read(fu) version + + if(version .ne. VERSION_CFN) then + write(str1, '(i0.0)') version + write(str2, '(i0.0)') VERSION_CFN + call Message % Error(72, & + 'You seem to be reading wrong version of the .cfn file. '// & + 'The version you are reading is '//trim(str1)//' but the '// & + 'code expects version '//trim(str2)//'. Re-generate or '// & + 'convert again the grids (and divide them if you run in '// & + 'parallel).', one_proc = .true.) + end if + !-----------------------------------------------! ! Number of cells, boundary cells and faces ! !-----------------------------------------------! diff --git a/Sources/Shared/Grid_Mod/Load_Dim.f90 b/Sources/Shared/Grid_Mod/Load_Dim.f90 index 72b4627ec..f9eaa8786 100644 --- a/Sources/Shared/Grid_Mod/Load_Dim.f90 +++ b/Sources/Shared/Grid_Mod/Load_Dim.f90 @@ -9,8 +9,8 @@ subroutine Load_Dim(Grid, this_proc, domain) integer, intent(in) :: this_proc integer, optional :: domain !-----------------------------------[Locals]-----------------------------------! - integer :: c, n, s, fu, real_prec - character(SL) :: name_in + integer :: c, n, s, fu, real_prec, version + character(SL) :: name_in, str1, str2 !==============================================================================! call Profiler % Start('Load_Dim') @@ -48,6 +48,22 @@ subroutine Load_Dim(Grid, this_proc, domain) end if end if + !------------------------------! + ! Read version of the file ! + !------------------------------! + read(fu) version + + if(version .ne. VERSION_DIM) then + write(str1, '(i0.0)') version + write(str2, '(i0.0)') VERSION_DIM + call Message % Error(72, & + 'You seem to be reading wrong version of the .dim file. '// & + 'The version you are reading is '//trim(str1)//' but the '// & + 'code expects version '//trim(str2)//'. Re-generate or '// & + 'convert again the grids (and divide them if you run in '// & + 'parallel).', one_proc = .true.) + end if + !-------------------------! ! Read everything else ! !-------------------------! diff --git a/Sources/Shared/Grid_Mod/Save_Cfn.f90 b/Sources/Shared/Grid_Mod/Save_Cfn.f90 index 2517256d8..e6d5ecdd0 100644 --- a/Sources/Shared/Grid_Mod/Save_Cfn.f90 +++ b/Sources/Shared/Grid_Mod/Save_Cfn.f90 @@ -39,6 +39,11 @@ subroutine Save_Cfn(Grid, & !-------------------------! write(fu) RP + !------------------------------! + ! Save version of the file ! + !------------------------------! + write(fu) VERSION_CFN + !-----------------------------------------------! ! Number of cells, boundary cells and faces ! !-----------------------------------------------! diff --git a/Sources/Shared/Grid_Mod/Save_Dim.f90 b/Sources/Shared/Grid_Mod/Save_Dim.f90 index 27af429be..568c706de 100644 --- a/Sources/Shared/Grid_Mod/Save_Dim.f90 +++ b/Sources/Shared/Grid_Mod/Save_Dim.f90 @@ -25,6 +25,11 @@ subroutine Save_Dim(Grid, sub) !-------------------------! write(fu) RP + !------------------------------! + ! Save version of the file ! + !------------------------------! + write(fu) VERSION_DIM + !----------------------! ! Node coordinates ! !----------------------! From 3b3956faac7310a3693a3f0887399fa34c00711a Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 2 Apr 2023 15:37:39 +0200 Subject: [PATCH 183/223] Modernizing Control_Mod; step 1 On branch bojan_more_robust_communicator modified: Documentation/Syntax/.vim/syntax/fortran.vim modified: Sources/Convert/makefile modified: Sources/Divide/makefile modified: Sources/Generate/makefile modified: Sources/Process/Interface_Mod/Create.f90 modified: Sources/Process/Main_Pro.f90 modified: Sources/Process/Monitor_Mod/Initialize.f90 modified: Sources/Process/Porosity_Mod/Create_Porosity.f90 modified: Sources/Process/Process_Mod/Initialize_Variables.f90 modified: Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 modified: Sources/Process/Read_Controls_Mod/Physical_Models.f90 modified: Sources/Process/Results_Mod/Main_Results.f90 modified: Sources/Shared/Comm_Mod/Sequential/Sendrecv_Int_Arrays.f90 modified: Sources/Shared/Comm_Mod/Sequential/Sendrecv_Log_Arrays.f90 modified: Sources/Shared/Comm_Mod/Sequential/Sendrecv_Real_Arrays.f90 modified: Sources/Shared/Control_Mod.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Open_Domain_File.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Open_Root_File.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Position_At_One_Key.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Position_At_Three_Keys.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Position_At_Two_Keys.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item_On.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item_On.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item_On.f90 renamed: Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Array.f90 -> Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Vector.f90 renamed: Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Array_On.f90 -> Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Vector_On.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Read_Strings_On.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Similar_Warning.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Switch_To_Domain.f90 modified: Sources/Shared/Control_Mod/Basic_Functions/Switch_To_Root.f90 modified: Sources/Shared/Control_Mod/Input_Output/Backup_Save_Interval.f90 modified: Sources/Shared/Control_Mod/Input_Output/Load_Backup_Name.f90 modified: Sources/Shared/Control_Mod/Input_Output/Load_Initial_Solution_Name.f90 modified: Sources/Shared/Control_Mod/Input_Output/Problem_Name.f90 modified: Sources/Shared/Control_Mod/Input_Output/Profiler_Info.f90 modified: Sources/Shared/Control_Mod/Input_Output/Results_Save_Interval.f90 modified: Sources/Shared/Control_Mod/Input_Output/Save_Backup_Name.f90 modified: Sources/Shared/Control_Mod/Input_Output/Save_Initial_Condition.f90 modified: Sources/Shared/Control_Mod/Input_Output/Save_Initial_Solution_Name.f90 modified: Sources/Shared/Control_Mod/Input_Output/Save_Results_At_Boundaries.f90 modified: Sources/Shared/Control_Mod/Input_Output/Swarm_Save_Interval.f90 modified: Sources/Shared/Control_Mod/Input_Output/Wall_Time_Max_Hours.f90 modified: Sources/Shared/Control_Mod/Linear_Solvers.f90 modified: Sources/Shared/Control_Mod/Max_Threads.f90 modified: Sources/Shared/Control_Mod/Native/Max_Iterations_For_Energy_Solver.f90 modified: Sources/Shared/Control_Mod/Native/Max_Iterations_For_Momentum_Solver.f90 modified: Sources/Shared/Control_Mod/Native/Max_Iterations_For_Potential_Solver.f90 modified: Sources/Shared/Control_Mod/Native/Max_Iterations_For_Presssure_Solver.f90 modified: Sources/Shared/Control_Mod/Native/Max_Iterations_For_Scalars_Solver.f90 modified: Sources/Shared/Control_Mod/Native/Max_Iterations_For_Turbulence_Solver.f90 modified: Sources/Shared/Control_Mod/Native/Max_Iterations_For_Vof_Solver.f90 modified: Sources/Shared/Control_Mod/Native/Max_Iterations_For_Wall_Distance_Solver.f90 modified: Sources/Shared/Control_Mod/Native/Normalization_For_Energy_Solver.f90 modified: Sources/Shared/Control_Mod/Native/Normalization_For_Momentum_Solver.f90 modified: Sources/Shared/Control_Mod/Native/Normalization_For_Pressure_Solver.f90 modified: Sources/Shared/Control_Mod/Native/Normalization_For_Scalars_Solver.f90 modified: Sources/Shared/Control_Mod/Native/Normalization_For_Turbulence_Solver.f90 modified: Sources/Shared/Control_Mod/Native/Preconditioner_For_System_Matrix.f90 modified: Sources/Shared/Control_Mod/Native/Solver_For_Energy.f90 modified: Sources/Shared/Control_Mod/Native/Solver_For_Momentum.f90 modified: Sources/Shared/Control_Mod/Native/Solver_For_Potential.f90 modified: Sources/Shared/Control_Mod/Native/Solver_For_Pressure.f90 modified: Sources/Shared/Control_Mod/Native/Solver_For_Scalars.f90 modified: Sources/Shared/Control_Mod/Native/Solver_For_Turbulence.f90 modified: Sources/Shared/Control_Mod/Native/Solver_For_Vof.f90 modified: Sources/Shared/Control_Mod/Native/Solver_For_Wall_Distance.f90 modified: Sources/Shared/Control_Mod/Native/Tolerance_For_Energy_Solver.f90 modified: Sources/Shared/Control_Mod/Native/Tolerance_For_Momentum_Solver.f90 modified: Sources/Shared/Control_Mod/Native/Tolerance_For_Potential_Solver.f90 modified: Sources/Shared/Control_Mod/Native/Tolerance_For_Pressure_Solver.f90 modified: Sources/Shared/Control_Mod/Native/Tolerance_For_Scalars_Solver.f90 modified: Sources/Shared/Control_Mod/Native/Tolerance_For_Turbulence_Solver.f90 modified: Sources/Shared/Control_Mod/Native/Tolerance_For_Vof_Solver.f90 modified: Sources/Shared/Control_Mod/Native/Tolerance_For_Wall_Distance_Solver.f90 modified: Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Energy.f90 modified: Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Momentum.f90 modified: Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Scalars.f90 modified: Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Turbulence.f90 modified: Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Vof.f90 modified: Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Energy.f90 modified: Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Momentum.f90 modified: Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Scalars.f90 modified: Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Turbulence.f90 modified: Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Vof.f90 modified: Sources/Shared/Control_Mod/Numerics/Choi_Correction.f90 modified: Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Energy.f90 modified: Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Momentum.f90 modified: Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Pressure.f90 modified: Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Scalars.f90 modified: Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Turbulence.f90 modified: Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Vof.f90 modified: Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Wall_Distance.f90 modified: Sources/Shared/Control_Mod/Numerics/Gu_Correction.f90 modified: Sources/Shared/Control_Mod/Numerics/Max_Correction_Cycles_Beta_Vof.f90 modified: Sources/Shared/Control_Mod/Numerics/Max_Courant_Vof.f90 modified: Sources/Shared/Control_Mod/Numerics/Max_Gauss_Gradients_Iterations.f90 modified: Sources/Shared/Control_Mod/Numerics/Max_Least_Squares_Gradients_Iterations.f90 modified: Sources/Shared/Control_Mod/Numerics/Max_Simple_Iterations.f90 modified: Sources/Shared/Control_Mod/Numerics/Max_Smoothing_Cycles_Curvature_Vof.f90 modified: Sources/Shared/Control_Mod/Numerics/Max_Smoothing_Cycles_Normal_Vof.f90 modified: Sources/Shared/Control_Mod/Numerics/Max_Substep_Cycles_Vof.f90 modified: Sources/Shared/Control_Mod/Numerics/Min_Simple_Iterations.f90 modified: Sources/Shared/Control_Mod/Numerics/Number_Of_Piso_Corrections.f90 modified: Sources/Shared/Control_Mod/Numerics/Number_Of_Time_Steps.f90 modified: Sources/Shared/Control_Mod/Numerics/Pressure_Momentum_Coupling.f90 modified: Sources/Shared/Control_Mod/Numerics/Report_Volume_Balance.f90 modified: Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Energy.f90 modified: Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Momentum.f90 modified: Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Pressure.f90 modified: Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Scalars.f90 modified: Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Turbulence.f90 modified: Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Vof.f90 modified: Sources/Shared/Control_Mod/Numerics/Skewness_Correction_Vof.f90 modified: Sources/Shared/Control_Mod/Numerics/Time_Integration_Scheme.f90 modified: Sources/Shared/Control_Mod/Numerics/Time_Step.f90 modified: Sources/Shared/Control_Mod/Numerics/Tolerance_For_Gauss_Gradients.f90 modified: Sources/Shared/Control_Mod/Numerics/Tolerance_For_Simple_Algorithm.f90 modified: Sources/Shared/Control_Mod/Physics/Angular_Velocity_Vector.f90 modified: Sources/Shared/Control_Mod/Physics/Buoyancy.f90 modified: Sources/Shared/Control_Mod/Physics/Dynamic_Viscosity.f90 modified: Sources/Shared/Control_Mod/Physics/Extrapolate_Temperature_Exp.f90 modified: Sources/Shared/Control_Mod/Physics/Gravitational_Vector.f90 modified: Sources/Shared/Control_Mod/Physics/Heat_Capacity.f90 modified: Sources/Shared/Control_Mod/Physics/Heat_Transfer.f90 modified: Sources/Shared/Control_Mod/Physics/Hybrid_Les_Rans_Switch.f90 modified: Sources/Shared/Control_Mod/Physics/Interface_Tracking.f90 modified: Sources/Shared/Control_Mod/Physics/Latent_Heat.f90 modified: Sources/Shared/Control_Mod/Physics/Mass_Density.f90 modified: Sources/Shared/Control_Mod/Physics/Mass_Flow_Rates.f90 modified: Sources/Shared/Control_Mod/Physics/Mass_Transfer.f90 modified: Sources/Shared/Control_Mod/Physics/Max_Particles.f90 modified: Sources/Shared/Control_Mod/Physics/Number_Of_Domains.f90 modified: Sources/Shared/Control_Mod/Physics/Number_Of_Phases.f90 modified: Sources/Shared/Control_Mod/Physics/Number_Of_Scalars.f90 modified: Sources/Shared/Control_Mod/Physics/Number_Of_Swarm_Sub_Steps.f90 modified: Sources/Shared/Control_Mod/Physics/Particle_Tracking.f90 modified: Sources/Shared/Control_Mod/Physics/Phase_Capacities.f90 modified: Sources/Shared/Control_Mod/Physics/Phase_Conductivities.f90 modified: Sources/Shared/Control_Mod/Physics/Phase_Densities.f90 modified: Sources/Shared/Control_Mod/Physics/Phase_Viscosities.f90 modified: Sources/Shared/Control_Mod/Physics/Point_For_Monitoring_Planes.f90 modified: Sources/Shared/Control_Mod/Physics/Potential_Initialization.f90 modified: Sources/Shared/Control_Mod/Physics/Pressure_Drops.f90 modified: Sources/Shared/Control_Mod/Physics/Reference_Density.f90 modified: Sources/Shared/Control_Mod/Physics/Reference_Temperature.f90 modified: Sources/Shared/Control_Mod/Physics/Rough_Walls.f90 modified: Sources/Shared/Control_Mod/Physics/Roughness_Coefficient.f90 modified: Sources/Shared/Control_Mod/Physics/Saturation_Temperature.f90 modified: Sources/Shared/Control_Mod/Physics/Scalars_Diffusivity.f90 modified: Sources/Shared/Control_Mod/Physics/Smagorinsky_Constant.f90 modified: Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Computation.f90 modified: Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Statistics.f90 modified: Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Turb_Statistics.f90 modified: Sources/Shared/Control_Mod/Physics/Surface_Tension.f90 modified: Sources/Shared/Control_Mod/Physics/Swarm_Coefficient_Of_Restitution.f90 modified: Sources/Shared/Control_Mod/Physics/Swarm_Density.f90 modified: Sources/Shared/Control_Mod/Physics/Swarm_Diameter.f90 modified: Sources/Shared/Control_Mod/Physics/Swarm_Subgrid_Scale_Model.f90 modified: Sources/Shared/Control_Mod/Physics/Thermal_Conductivity.f90 modified: Sources/Shared/Control_Mod/Physics/Track_Front.f90 modified: Sources/Shared/Control_Mod/Physics/Track_Surface.f90 modified: Sources/Shared/Control_Mod/Physics/Turbulence_Model.f90 modified: Sources/Shared/Control_Mod/Physics/Turbulence_Model_Variant.f90 modified: Sources/Shared/Control_Mod/Physics/Turbulent_Heat_Flux_Model.f90 modified: Sources/Shared/Control_Mod/Physics/Turbulent_Prandtl_Number.f90 modified: Sources/Shared/Control_Mod/Physics/Turbulent_Scalar_Flux_Model.f90 modified: Sources/Shared/Control_Mod/Physics/Turbulent_Schmidt_Number.f90 modified: Sources/Shared/Control_Mod/Physics/Volume_Expansion_Coefficient.f90 --- Documentation/Syntax/.vim/syntax/fortran.vim | 28 ++++++------ Sources/Convert/makefile | 2 +- Sources/Divide/makefile | 2 +- Sources/Generate/makefile | 2 +- Sources/Process/Interface_Mod/Create.f90 | 14 +++--- Sources/Process/Main_Pro.f90 | 34 +++++++------- Sources/Process/Monitor_Mod/Initialize.f90 | 6 +-- .../Process/Porosity_Mod/Create_Porosity.f90 | 18 ++++---- .../Process_Mod/Initialize_Variables.f90 | 20 ++++----- .../Read_Controls_Mod/Boundary_Conditions.f90 | 44 +++++++++---------- .../Read_Controls_Mod/Physical_Models.f90 | 10 ++--- Sources/Process/Results_Mod/Main_Results.f90 | 6 +-- .../Sequential/Sendrecv_Int_Arrays.f90 | 12 ++--- .../Sequential/Sendrecv_Log_Arrays.f90 | 12 ++--- .../Sequential/Sendrecv_Real_Arrays.f90 | 12 ++--- Sources/Shared/Control_Mod.f90 | 40 +++++++++++++---- .../Basic_Functions/Open_Domain_File.f90 | 9 ++-- .../Basic_Functions/Open_Root_File.f90 | 7 ++- .../Basic_Functions/Position_At_One_Key.f90 | 16 +++---- .../Position_At_Three_Keys.f90 | 24 +++++----- .../Basic_Functions/Position_At_Two_Keys.f90 | 26 +++++------ .../Basic_Functions/Read_Char_Item.f90 | 9 ++-- .../Basic_Functions/Read_Char_Item_On.f90 | 9 ++-- .../Basic_Functions/Read_Int_Item.f90 | 10 ++--- .../Basic_Functions/Read_Int_Item_On.f90 | 9 ++-- .../Basic_Functions/Read_Real_Item.f90 | 21 +++++---- .../Basic_Functions/Read_Real_Item_On.f90 | 21 +++++---- ...ad_Real_Array.f90 => Read_Real_Vector.f90} | 23 +++++----- ...l_Array_On.f90 => Read_Real_Vector_On.f90} | 16 +++---- .../Basic_Functions/Read_Strings_On.f90 | 20 ++++----- .../Basic_Functions/Similar_Warning.f90 | 1 + .../Basic_Functions/Switch_To_Domain.f90 | 7 ++- .../Basic_Functions/Switch_To_Root.f90 | 6 ++- .../Input_Output/Backup_Save_Interval.f90 | 3 +- .../Input_Output/Load_Backup_Name.f90 | 3 +- .../Load_Initial_Solution_Name.f90 | 4 +- .../Control_Mod/Input_Output/Problem_Name.f90 | 3 +- .../Input_Output/Profiler_Info.f90 | 3 +- .../Input_Output/Results_Save_Interval.f90 | 3 +- .../Input_Output/Save_Backup_Name.f90 | 3 +- .../Input_Output/Save_Initial_Condition.f90 | 3 +- .../Save_Initial_Solution_Name.f90 | 4 +- .../Save_Results_At_Boundaries.f90 | 4 +- .../Input_Output/Swarm_Save_Interval.f90 | 3 +- .../Input_Output/Wall_Time_Max_Hours.f90 | 3 +- Sources/Shared/Control_Mod/Linear_Solvers.f90 | 4 +- Sources/Shared/Control_Mod/Max_Threads.f90 | 2 +- .../Max_Iterations_For_Energy_Solver.f90 | 4 +- .../Max_Iterations_For_Momentum_Solver.f90 | 4 +- .../Max_Iterations_For_Potential_Solver.f90 | 4 +- .../Max_Iterations_For_Presssure_Solver.f90 | 4 +- .../Max_Iterations_For_Scalars_Solver.f90 | 4 +- .../Max_Iterations_For_Turbulence_Solver.f90 | 4 +- .../Native/Max_Iterations_For_Vof_Solver.f90 | 4 +- ...ax_Iterations_For_Wall_Distance_Solver.f90 | 4 +- .../Normalization_For_Energy_Solver.f90 | 4 +- .../Normalization_For_Momentum_Solver.f90 | 4 +- .../Normalization_For_Pressure_Solver.f90 | 4 +- .../Normalization_For_Scalars_Solver.f90 | 4 +- .../Normalization_For_Turbulence_Solver.f90 | 4 +- .../Preconditioner_For_System_Matrix.f90 | 8 ++-- .../Control_Mod/Native/Solver_For_Energy.f90 | 3 +- .../Native/Solver_For_Momentum.f90 | 3 +- .../Native/Solver_For_Potential.f90 | 3 +- .../Native/Solver_For_Pressure.f90 | 3 +- .../Control_Mod/Native/Solver_For_Scalars.f90 | 3 +- .../Native/Solver_For_Turbulence.f90 | 3 +- .../Control_Mod/Native/Solver_For_Vof.f90 | 3 +- .../Native/Solver_For_Wall_Distance.f90 | 3 +- .../Native/Tolerance_For_Energy_Solver.f90 | 4 +- .../Native/Tolerance_For_Momentum_Solver.f90 | 4 +- .../Native/Tolerance_For_Potential_Solver.f90 | 4 +- .../Native/Tolerance_For_Pressure_Solver.f90 | 4 +- .../Native/Tolerance_For_Scalars_Solver.f90 | 4 +- .../Tolerance_For_Turbulence_Solver.f90 | 4 +- .../Native/Tolerance_For_Vof_Solver.f90 | 4 +- .../Tolerance_For_Wall_Distance_Solver.f90 | 4 +- .../Numerics/Advection_Scheme_For_Energy.f90 | 4 +- .../Advection_Scheme_For_Momentum.f90 | 4 +- .../Numerics/Advection_Scheme_For_Scalars.f90 | 4 +- .../Advection_Scheme_For_Turbulence.f90 | 4 +- .../Numerics/Advection_Scheme_For_Vof.f90 | 4 +- .../Blending_Coefficient_For_Energy.f90 | 4 +- .../Blending_Coefficient_For_Momentum.f90 | 4 +- .../Blending_Coefficient_For_Scalars.f90 | 4 +- .../Blending_Coefficient_For_Turbulence.f90 | 4 +- .../Numerics/Blending_Coefficient_For_Vof.f90 | 4 +- .../Control_Mod/Numerics/Choi_Correction.f90 | 2 +- .../Numerics/Gradient_Method_For_Energy.f90 | 6 +-- .../Numerics/Gradient_Method_For_Momentum.f90 | 6 +-- .../Numerics/Gradient_Method_For_Pressure.f90 | 6 +-- .../Numerics/Gradient_Method_For_Scalars.f90 | 6 +-- .../Gradient_Method_For_Turbulence.f90 | 6 +-- .../Numerics/Gradient_Method_For_Vof.f90 | 6 +-- .../Gradient_Method_For_Wall_Distance.f90 | 6 +-- .../Control_Mod/Numerics/Gu_Correction.f90 | 2 +- .../Max_Correction_Cycles_Beta_Vof.f90 | 4 +- .../Control_Mod/Numerics/Max_Courant_Vof.f90 | 4 +- .../Max_Gauss_Gradients_Iterations.f90 | 4 +- ...Max_Least_Squares_Gradients_Iterations.f90 | 4 +- .../Numerics/Max_Simple_Iterations.f90 | 4 +- .../Max_Smoothing_Cycles_Curvature_Vof.f90 | 4 +- .../Max_Smoothing_Cycles_Normal_Vof.f90 | 4 +- .../Numerics/Max_Substep_Cycles_Vof.f90 | 4 +- .../Numerics/Min_Simple_Iterations.f90 | 4 +- .../Numerics/Number_Of_Piso_Corrections.f90 | 4 +- .../Numerics/Number_Of_Time_Steps.f90 | 4 +- .../Numerics/Pressure_Momentum_Coupling.f90 | 4 +- .../Numerics/Report_Volume_Balance.f90 | 4 +- .../Simple_Underrelaxation_For_Energy.f90 | 4 +- .../Simple_Underrelaxation_For_Momentum.f90 | 4 +- .../Simple_Underrelaxation_For_Pressure.f90 | 4 +- .../Simple_Underrelaxation_For_Scalars.f90 | 4 +- .../Simple_Underrelaxation_For_Turbulence.f90 | 4 +- .../Simple_Underrelaxation_For_Vof.f90 | 4 +- .../Numerics/Skewness_Correction_Vof.f90 | 4 +- .../Numerics/Time_Integration_Scheme.f90 | 4 +- .../Shared/Control_Mod/Numerics/Time_Step.f90 | 4 +- .../Tolerance_For_Gauss_Gradients.f90 | 4 +- .../Tolerance_For_Simple_Algorithm.f90 | 4 +- .../Physics/Angular_Velocity_Vector.f90 | 4 +- .../Shared/Control_Mod/Physics/Buoyancy.f90 | 2 +- .../Control_Mod/Physics/Dynamic_Viscosity.f90 | 2 +- .../Physics/Extrapolate_Temperature_Exp.f90 | 4 +- .../Physics/Gravitational_Vector.f90 | 3 +- .../Control_Mod/Physics/Heat_Capacity.f90 | 2 +- .../Control_Mod/Physics/Heat_Transfer.f90 | 2 +- .../Physics/Hybrid_Les_Rans_Switch.f90 | 6 +-- .../Physics/Interface_Tracking.f90 | 2 +- .../Control_Mod/Physics/Latent_Heat.f90 | 2 +- .../Control_Mod/Physics/Mass_Density.f90 | 2 +- .../Control_Mod/Physics/Mass_Flow_Rates.f90 | 3 +- .../Control_Mod/Physics/Mass_Transfer.f90 | 2 +- .../Control_Mod/Physics/Max_Particles.f90 | 3 +- .../Control_Mod/Physics/Number_Of_Domains.f90 | 3 +- .../Control_Mod/Physics/Number_Of_Phases.f90 | 3 +- .../Control_Mod/Physics/Number_Of_Scalars.f90 | 2 +- .../Physics/Number_Of_Swarm_Sub_Steps.f90 | 3 +- .../Control_Mod/Physics/Particle_Tracking.f90 | 2 +- .../Control_Mod/Physics/Phase_Capacities.f90 | 2 +- .../Physics/Phase_Conductivities.f90 | 2 +- .../Control_Mod/Physics/Phase_Densities.f90 | 2 +- .../Control_Mod/Physics/Phase_Viscosities.f90 | 2 +- .../Physics/Point_For_Monitoring_Planes.f90 | 4 +- .../Physics/Potential_Initialization.f90 | 3 +- .../Control_Mod/Physics/Pressure_Drops.f90 | 4 +- .../Control_Mod/Physics/Reference_Density.f90 | 2 +- .../Physics/Reference_Temperature.f90 | 2 +- .../Control_Mod/Physics/Rough_Walls.f90 | 3 +- .../Physics/Roughness_Coefficient.f90 | 3 +- .../Physics/Saturation_Temperature.f90 | 2 +- .../Physics/Scalars_Diffusivity.f90 | 2 +- .../Physics/Smagorinsky_Constant.f90 | 3 +- ...arting_Time_Step_For_Swarm_Computation.f90 | 4 +- ...tarting_Time_Step_For_Swarm_Statistics.f90 | 4 +- ...Starting_Time_Step_For_Turb_Statistics.f90 | 4 +- .../Control_Mod/Physics/Surface_Tension.f90 | 2 +- .../Swarm_Coefficient_Of_Restitution.f90 | 4 +- .../Control_Mod/Physics/Swarm_Density.f90 | 2 +- .../Control_Mod/Physics/Swarm_Diameter.f90 | 2 +- .../Physics/Swarm_Subgrid_Scale_Model.f90 | 4 +- .../Physics/Thermal_Conductivity.f90 | 2 +- .../Control_Mod/Physics/Track_Front.f90 | 2 +- .../Control_Mod/Physics/Track_Surface.f90 | 2 +- .../Control_Mod/Physics/Turbulence_Model.f90 | 3 +- .../Physics/Turbulence_Model_Variant.f90 | 4 +- .../Physics/Turbulent_Heat_Flux_Model.f90 | 4 +- .../Physics/Turbulent_Prandtl_Number.f90 | 3 +- .../Physics/Turbulent_Scalar_Flux_Model.f90 | 4 +- .../Physics/Turbulent_Schmidt_Number.f90 | 3 +- .../Physics/Volume_Expansion_Coefficient.f90 | 4 +- 171 files changed, 492 insertions(+), 492 deletions(-) rename Sources/Shared/Control_Mod/Basic_Functions/{Read_Real_Array.f90 => Read_Real_Vector.f90} (71%) rename Sources/Shared/Control_Mod/Basic_Functions/{Read_Real_Array_On.f90 => Read_Real_Vector_On.f90} (79%) diff --git a/Documentation/Syntax/.vim/syntax/fortran.vim b/Documentation/Syntax/.vim/syntax/fortran.vim index e93880d5b..f95cecf3d 100644 --- a/Documentation/Syntax/.vim/syntax/fortran.vim +++ b/Documentation/Syntax/.vim/syntax/fortran.vim @@ -444,22 +444,22 @@ if b:fortran_dialect == "f08" syn keyword fortranConstant INFLOW WALL WALLFL OUTFLOW SYMMETRY CONVECT PRESSURE syn keyword fortranConstant INSIDE BUFFER PERIODIC_X PERIODIC_Y PERIODIC_Z UNDEFINED " After the constants, I have alternating definitions of types and objects derived from them - syn keyword fortranTypeTflows Domain_Type Point_Type Block_Type Line_Type Range_Type - syn keyword fortranObjectTflows Dom points blocks lines ranges - syn keyword fortranTypeTflows Generate_Type Convert_Type Divide_Type Grid_Type - syn keyword fortranObjectTflows Generate Convert Divide Grid Prim Dual - syn keyword fortranTypeTflows Math_Type Sort_Type File_Type String_Type Work_Type Tokenizer_Type - syn keyword fortranObjectTflows Math Sort File String Work Line Tok - syn keyword fortranTypeTflows Comm_Type Backup_Type Field_Type Turb_Type Vof_Type Swarm_Type - syn keyword fortranObjectTflows Comm Global Backup Bac Flow Fld Turb Tur Vof Swarm Swr + syn keyword fortranTypeTflows Domain_Type Point_Type Block_Type Line_Type Range_Type + syn keyword fortranObjectTflows Dom points blocks lines ranges + syn keyword fortranTypeTflows Generate_Type Convert_Type Divide_Type Grid_Type Control_Type + syn keyword fortranObjectTflows Generate Convert Divide Grid Prim Dual Control + syn keyword fortranTypeTflows Math_Type Sort_Type File_Type String_Type Work_Type Tokenizer_Type + syn keyword fortranObjectTflows Math Sort File String Work Line Tok + syn keyword fortranTypeTflows Comm_Type Backup_Type Field_Type Turb_Type Vof_Type Swarm_Type + syn keyword fortranObjectTflows Comm Global Backup Bac Flow Fld Turb Tur Vof Swarm Swr syn keyword fortranTypeTflows Bulk_Type Face_Type syn keyword fortranObjectTflows v_flux - syn keyword fortranTypeTflows Front_Type Surf_Type Elem_Type Side_Type Vert_Type Particle_Type - syn keyword fortranObjectTflows Front Surf Elem side Vert Part - syn keyword fortranTypeTflows Monitor_Type Results_Type Porosity_Type Profiler_Type Message_Type Info_Type - syn keyword fortranObjectTflows Monitor Results Por Profiler Prof Message Info - syn keyword fortranTypeTflows Matrix_Type Vector_Type Solver_Type Native_Type Petsc_Type Process_Type - syn keyword fortranObjectTflows A M vector Sol Nat Pet Process + syn keyword fortranTypeTflows Front_Type Surf_Type Elem_Type Side_Type Vert_Type Particle_Type + syn keyword fortranObjectTflows Front Surf Elem side Vert Part + syn keyword fortranTypeTflows Monitor_Type Results_Type Porosity_Type Profiler_Type Message_Type Info_Type + syn keyword fortranObjectTflows Monitor Results Por Profiler Prof Message Info + syn keyword fortranTypeTflows Matrix_Type Vector_Type Solver_Type Native_Type Petsc_Type Process_Type + syn keyword fortranObjectTflows A M vector Sol Nat Pet Process syn keyword fortranTypeTflows Var_Type syn keyword fortranObjectTflows u v w ui uj uk p t kin eps zeta f22 uu vv ww uv vw uw ut vt wt t2 vis " Items which follow are not really objects, but I don't know where else to put them diff --git a/Sources/Convert/makefile b/Sources/Convert/makefile index 55de3b7ff..d8f9c5b44 100644 --- a/Sources/Convert/makefile +++ b/Sources/Convert/makefile @@ -100,7 +100,7 @@ ifeq ($(FORTRAN), intel) ifeq ($(DEBUG), yes) OPT_F_COMP += -O0 -g -traceback else - OPT_F_COMP += -O2 + OPT_F_COMP += -O3 endif ifeq ($(PROF), yes) OPT_F_COMP += -g -O2 -shared-intel -debug inline-debug-info \ diff --git a/Sources/Divide/makefile b/Sources/Divide/makefile index f96aabc95..1c7f515f7 100644 --- a/Sources/Divide/makefile +++ b/Sources/Divide/makefile @@ -99,7 +99,7 @@ ifeq ($(FORTRAN), intel) ifeq ($(DEBUG), yes) OPT_F_COMP += -O0 -g -traceback else - OPT_F_COMP += -O2 + OPT_F_COMP += -O3 endif ifeq ($(PROF), yes) OPT_F_COMP += -g -O2 -shared-intel -debug inline-debug-info \ diff --git a/Sources/Generate/makefile b/Sources/Generate/makefile index 0f4a4b94f..61ee9335e 100644 --- a/Sources/Generate/makefile +++ b/Sources/Generate/makefile @@ -100,7 +100,7 @@ ifeq ($(FORTRAN), intel) ifeq ($(DEBUG), yes) OPT_F_COMP += -O0 -g -traceback else - OPT_F_COMP += -O2 + OPT_F_COMP += -O3 endif ifeq ($(PROF), yes) OPT_F_COMP += -g -O2 -shared-intel -debug inline-debug-info \ diff --git a/Sources/Process/Interface_Mod/Create.f90 b/Sources/Process/Interface_Mod/Create.f90 index f94ce60dd..64219cfd5 100644 --- a/Sources/Process/Interface_Mod/Create.f90 +++ b/Sources/Process/Interface_Mod/Create.f90 @@ -72,18 +72,18 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) !-----------------------------------------------------------------! ! Try to find specified interface condition between d1 and d2 ! !-----------------------------------------------------------------! - call Control_Mod_Position_At_Three_Keys('INTERFACE_CONDITION', & - trim(problem_name(d1)), & - trim(problem_name(d2)), & - found, & - verbose=.false.) + call Control % Position_At_Three_Keys('INTERFACE_CONDITION', & + trim(problem_name(d1)), & + trim(problem_name(d2)), & + found, & + verbose=.false.) !---------------------------------------------------! ! Found specification between domains d1 and d2 ! !---------------------------------------------------! if(found) then - call Control_Mod_Read_Strings_On('BOUNDARY_CONDITIONS', & - keys, nks, .false.) + call Control % Read_Strings_On('BOUNDARY_CONDITIONS', & + keys, nks, .false.) do k = 1, nks call String % To_Upper_Case(keys(k)) end do diff --git a/Sources/Process/Main_Pro.f90 b/Sources/Process/Main_Pro.f90 index b39d2962a..3ac06974c 100644 --- a/Sources/Process/Main_Pro.f90 +++ b/Sources/Process/Main_Pro.f90 @@ -61,12 +61,12 @@ program Process_Prog !-----------------------! ! Open control file ! !-----------------------! - call Control_Mod_Open_Root_File(root_control) + call Control % Open_Root_File(root_control) call Control_Mod_Number_Of_Domains(n_dom) if(n_dom > 1) then do d = 1, n_dom - call Control_Mod_Open_Domain_File(d, dom_control(d)) + call Control % Open_Domain_File(d, dom_control(d)) end do end if @@ -79,7 +79,7 @@ program Process_Prog ! Read all grids ! !--------------------! do d = 1, n_dom - call Control_Mod_Switch_To_Domain(d) ! take domain's d control file + call Control % Switch_To_Domain(d) ! take domain's d control file call Control_Mod_Problem_Name(problem_name(d)) ! Load the finite volume Grid @@ -98,7 +98,7 @@ program Process_Prog end do ! Out of domain loop - go back to root - call Control_Mod_Switch_To_Root() + call Control % Switch_To_Root() ! Allocate memory for working arrays (RSM models are memory hungry) call Work % Allocate_Work(Grid, n_r_cell=24, n_r_face=8, n_r_node=8, & @@ -117,7 +117,7 @@ program Process_Prog ! Read physical models for each domain from control file do d = 1, n_dom - call Control_Mod_Switch_To_Domain(d) ! take proper control file + call Control % Switch_To_Domain(d) ! take proper control file call Read_Control % Physical_Models(Flow(d), Turb(d), Vof(d), Swarm(d)) end do @@ -125,16 +125,16 @@ program Process_Prog ! Allocate memory for all variables (over all domains) ! !----------------------------------------------------------! do d = 1, n_dom - call Control_Mod_Switch_To_Domain(d) ! take proper control file + call Control % Switch_To_Domain(d) ! take proper control file call Flow(d) % Allocate_Field(Grid(d)) call Turb(d) % Allocate_Turb(Flow(d)) call Vof(d) % Allocate_Vof(Flow(d)) call Swarm(d) % Allocate_Swarm(Flow(d), Turb(d), Vof(d)) ! Read time step from root - call Control_Mod_Switch_To_Root() + call Control % Switch_To_Root() call Control_Mod_Time_Step(Flow(d) % dt, verbose=.true.) - call Control_Mod_Switch_To_Domain(d) ! go back to local domain's control + call Control % Switch_To_Domain(d) ! go back to local domain's control ! Read numerical models from control file (after the memory is allocated) call Read_Control % Numerical_Schemes(Flow(d), Turb(d), Vof(d)) @@ -155,12 +155,12 @@ program Process_Prog end do ! Create interfaces - call Control_Mod_Switch_To_Root() + call Control % Switch_To_Root() call Interface_Mod_Create(inter, Grid, n_dom) ! Read backup file if directed so, and set the "backup" to .true. or .false. do d = 1, n_dom - call Control_Mod_Switch_To_Domain(d) ! take proper control file + call Control % Switch_To_Domain(d) ! take proper control file call Backup % Load(Flow(d), Turb(d), Vof(d), Swarm(d), & time, first_dt, read_backup(d)) @@ -204,7 +204,7 @@ program Process_Prog ! ! !---------------! - call Control_Mod_Switch_To_Root() + call Control % Switch_To_Root() call Control_Mod_Backup_Save_Interval (backup % interval, verbose=.true.) call Control_Mod_Results_Save_Interval (Results % interval, verbose=.true.) call Control_Mod_Save_Initial_Condition(Results % initial, verbose=.true.) @@ -224,7 +224,7 @@ program Process_Prog !-------------------------------------------------------------! if(first_dt .eq. 0) then do d = 1, n_dom - call Control_Mod_Switch_To_Domain(d) ! not sure if this call is needed + call Control % Switch_To_Domain(d) ! not sure if this call is needed call Control_Mod_Potential_Initialization(pot_init, .true.) if(pot_init) call Flow(d) % Potential_Initialization(Sol(d)) end do @@ -253,7 +253,7 @@ program Process_Prog !------------------------------------! do d = 1, n_dom - call Control_Mod_Switch_To_Domain(d) ! not sure if this call is needed + call Control % Switch_To_Domain(d) ! not sure if this call is needed ! Update turbulent planes do tp = 1, turb_planes(d) % n_planes @@ -299,7 +299,7 @@ program Process_Prog !--------------------------! ! Inner-iteration loop ! !--------------------------! - call Control_Mod_Switch_To_Root() + call Control % Switch_To_Root() call Control_Mod_Max_Simple_Iterations(max_ini) call Control_Mod_Min_Simple_Iterations(min_ini) call Control_Mod_Tolerance_For_Simple_Algorithm(simple_tol) @@ -311,7 +311,7 @@ program Process_Prog do d = 1, n_dom - call Control_Mod_Switch_To_Domain(d) + call Control % Switch_To_Domain(d) ! Beginning of iteration call User_Mod_Beginning_Of_Iteration(Flow(d), Turb(d), Vof(d), & @@ -389,7 +389,7 @@ program Process_Prog do d = 1, n_dom - call Control_Mod_Switch_To_Domain(d) + call Control % Switch_To_Domain(d) ! Write the values in monitoring points call Monitor(d) % Write_Vars(Flow(d), curr_dt) @@ -428,7 +428,7 @@ program Process_Prog ! Last time step reached; call user function for end of simulation if(curr_dt .eq. last_dt) then do d = 1, n_dom - call Control_Mod_Switch_To_Domain(d) + call Control % Switch_To_Domain(d) call User_Mod_End_Of_Simulation(Flow(d), Turb(d), Vof(d), Swarm(d), & curr_dt, time) end do diff --git a/Sources/Process/Monitor_Mod/Initialize.f90 b/Sources/Process/Monitor_Mod/Initialize.f90 index 0792a67c4..b30b69bdb 100644 --- a/Sources/Process/Monitor_Mod/Initialize.f90 +++ b/Sources/Process/Monitor_Mod/Initialize.f90 @@ -24,8 +24,8 @@ subroutine Initialize(Monitor, Flow, restart, domain) Monitor % pnt_grid => Grid ! Read number of Monitoring points from control file - call Control_Mod_Read_Int_Item('NUMBER_OF_MONITORING_POINTS', 0, & - Monitor % n_points, .true.) + call Control % Read_Int_Item('NUMBER_OF_MONITORING_POINTS', 0, & + Monitor % n_points, .true.) if(Monitor % n_points .eq. 0) return @@ -46,7 +46,7 @@ subroutine Initialize(Monitor, Flow, restart, domain) write(point_name, '(a,i3.3)') 'MONITORING_POINT_', n def = 0. ! don't have a better idea what to set - call Control_Mod_Read_Real_Array(point_name, 3, def, xyz, .true.) + call Control % Read_Real_Vector(point_name, 3, def, xyz, .true.) Monitor % x(n) = xyz(1) Monitor % y(n) = xyz(2) diff --git a/Sources/Process/Porosity_Mod/Create_Porosity.f90 b/Sources/Process/Porosity_Mod/Create_Porosity.f90 index e09c1862d..9650cedbd 100644 --- a/Sources/Process/Porosity_Mod/Create_Porosity.f90 +++ b/Sources/Process/Porosity_Mod/Create_Porosity.f90 @@ -11,8 +11,8 @@ subroutine Create_Porosity(Por, Grid) !==============================================================================! ! Read number of Porous regions from control file - call Control_Mod_Read_Int_Item('NUMBER_OF_POROUS_REGIONS', 0, & - Por % n_regions, .true.) + call Control % Read_Int_Item('NUMBER_OF_POROUS_REGIONS', 0, & + Por % n_regions, .true.) if(Por % n_regions .eq. 0) return @@ -38,7 +38,7 @@ subroutine Create_Porosity(Por, Grid) write(porous_region_rank, '(a,i3.3)') 'POROUS_REGION_', reg ! Look for it - call Control_Mod_Position_At_One_Key(porous_region_rank, found, .true.) + call Control % Position_At_One_Key(porous_region_rank, found, .true.) !------------------------------------------! ! Found the section with porous region ! @@ -46,19 +46,19 @@ subroutine Create_Porosity(Por, Grid) if (found) then ! Read "on", otherwise you will always find the first mention of STL_FILE - call Control_Mod_Read_Char_Item_On('STL_FILE', 'default.stl', & - Por % region(reg) % stl_name, & - .true.) + call Control % Read_Char_Item_On('STL_FILE', 'default.stl', & + Por % region(reg) % stl_name, & + .true.) print '(a)', trim(Por % region(reg) % stl_name) - call Control_Mod_Read_Real_Array('C1X_C2X', 2, def, c1c2, .true.) + call Control % Read_Real_Vector('C1X_C2X', 2, def, c1c2, .true.) Por % region(reg) % c1_x = c1c2(1) Por % region(reg) % c2_x = c1c2(2) - call Control_Mod_Read_Real_Array('C1Y_C2Y', 2, def, c1c2, .true.) + call Control % Read_Real_Vector('C1Y_C2Y', 2, def, c1c2, .true.) Por % region(reg) % c1_y = c1c2(1) Por % region(reg) % c2_y = c1c2(2) - call Control_Mod_Read_Real_Array('C1Z_C2Z', 2, def, c1c2, .true.) + call Control % Read_Real_Vector('C1Z_C2Z', 2, def, c1c2, .true.) Por % region(reg) % c1_z = c1c2(1) Por % region(reg) % c2_z = c1c2(2) else diff --git a/Sources/Process/Process_Mod/Initialize_Variables.f90 b/Sources/Process/Process_Mod/Initialize_Variables.f90 index 88a80f578..d44316a55 100644 --- a/Sources/Process/Process_Mod/Initialize_Variables.f90 +++ b/Sources/Process/Process_Mod/Initialize_Variables.f90 @@ -78,9 +78,9 @@ subroutine Initialize_Variables(Process, Flow, Turb, Vof, Swarm, Sol) if (First_Proc()) print '(a,a)', ' # Grid name: ', trim(Grid % name) ! Found the line where boundary condition definition is defined - call Control_Mod_Position_At_One_Key('INITIAL_CONDITION', & - found, & - .true.) + call Control % Position_At_One_Key('INITIAL_CONDITION', & + found, & + .true.) !-----------------------------------------------! ! ! @@ -89,7 +89,7 @@ subroutine Initialize_Variables(Process, Flow, Turb, Vof, Swarm, Sol) !-----------------------------------------------! if (found) then - call Control_Mod_Read_Strings_On('VARIABLES', keys, nks, .true.) + call Control % Read_Strings_On('VARIABLES', keys, nks, .true.) ! Input is valid, turn keys to upper case do i = 1, nks @@ -97,7 +97,7 @@ subroutine Initialize_Variables(Process, Flow, Turb, Vof, Swarm, Sol) end do ! Check if there is file specified - call Control_Mod_Read_Strings_On('FILE', keys_file, nvs, .true.) + call Control % Read_Strings_On('FILE', keys_file, nvs, .true.) !------------------------------------------------! ! ! @@ -257,18 +257,18 @@ subroutine Initialize_Variables(Process, Flow, Turb, Vof, Swarm, Sol) else ! Go back to key and read again - call Control_Mod_Position_At_One_Key('INITIAL_CONDITION', & - found, & - .true.) + call Control % Position_At_One_Key('INITIAL_CONDITION', & + found, & + .true.) - call Control_Mod_Read_Strings_On('VARIABLES', keys, nks, .true.) + call Control % Read_Strings_On('VARIABLES', keys, nks, .true.) ! Input is valid, turn keys to upper case do i = 1, nks call String % To_Upper_Case(keys(i)) end do - call Control_Mod_Read_Strings_On('VALUES', vals(1), nvs, .true.) + call Control % Read_Strings_On('VALUES', vals(1), nvs, .true.) ! Check validity of the input if(nks .eq. 0 .or. nvs .eq. 0 .and. First_Proc()) then diff --git a/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 b/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 index 0610618b5..16aca0881 100644 --- a/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 +++ b/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 @@ -67,22 +67,22 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) c_types = 0 do bc = Boundary_Regions() - call Control_Mod_Position_At_Two_Keys('BOUNDARY_CONDITION', & - Grid % region % name(bc), & - found, & - .false.) + call Control % Position_At_Two_Keys('BOUNDARY_CONDITION', & + Grid % region % name(bc), & + found, & + .false.) if(found) then 1 continue ! Try to read next 'TYPE' in the control file - call Control_Mod_Read_Char_Item_On('TYPE', 'VOID', bc_type_name, .false.) + call Control % Read_Char_Item_On('TYPE', 'VOID', bc_type_name, .false.) ! Get out of the loop if you fail if(bc_type_name .eq. 'VOID') goto 2 ! Skip following two lines - call Control_Mod_Read_Char_Item_On('VARIABLES', 'VOID', try_str, .false.) - call Control_Mod_Read_Char_Item_On('VALUES', 'VOID', try_str, .false.) + call Control % Read_Char_Item_On('VARIABLES', 'VOID', try_str, .false.) + call Control % Read_Char_Item_On('VALUES', 'VOID', try_str, .false.) types_per_reg(bc) = types_per_reg(bc) + 1 c_types = c_types + 1 @@ -118,10 +118,10 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) do bc = Boundary_Regions() ! Position yourself well - call Control_Mod_Position_At_Two_Keys('BOUNDARY_CONDITION', & - Grid % region % name(bc), & - found, & - .false.) + call Control % Position_At_Two_Keys('BOUNDARY_CONDITION', & + Grid % region % name(bc), & + found, & + .false.) do l = 1, types_per_reg(bc) ! Update the counter @@ -132,7 +132,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) ! Read first line which is common for all ! ! ! !---------------------------------------------! - call Control_Mod_Read_Char_Item_On('TYPE', 'WALL', bc_type_name, .false.) + call Control % Read_Char_Item_On('TYPE', 'WALL', bc_type_name, .false.) call String % To_Upper_Case(bc_type_name) ! Copy boundary conditions which were given for the Grid @@ -169,7 +169,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) ! Read second line which is common for all ! ! ! !----------------------------------------------! - call Control_Mod_Read_Strings_On('VARIABLES', keys, nks, .false.) + call Control % Read_Strings_On('VARIABLES', keys, nks, .false.) do i = 1, nks call String % To_Upper_Case(keys(i)) end do @@ -180,7 +180,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) ! ! !-----------------------------------------------------------------! if( .not. types_file(c_types) ) then - call Control_Mod_Read_Real_Array_On('VALUES', vals(1), nvs, .false.) + call Control % Read_Real_Vector_On('VALUES', vals(1), nvs, .false.) !--------------------------------------------------! ! Distribute boundary values to boundary cells ! @@ -311,7 +311,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) !---------------------------------------------! else ! types_file(c_types) == .true. - call Control_Mod_Read_Strings_On('FILE', name_prof, nvs, .false.) + call Control % Read_Strings_On('FILE', name_prof, nvs, .false.) call File % Open_For_Reading_Ascii(name_prof(1), fu) call File % Read_Line(fu) @@ -758,15 +758,15 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) !-----------------------------------! turb_planes % n_planes = 0 do bc = Boundary_Regions() ! imagine there are as many eddies as bcs - call Control_Mod_Position_At_Two_Keys('SYNTHETIC_EDDIES', & - Grid % region % name(bc), & - found, & - .false.) + call Control % Position_At_Two_Keys('SYNTHETIC_EDDIES', & + Grid % region % name(bc), & + found, & + .false.) if(found) then turb_planes % n_planes = turb_planes % n_planes + 1 - call Control_Mod_Read_Int_Item_On ('NUMBER_OF_EDDIES', 24, edd_n, .false.) - call Control_Mod_Read_Real_Item_On('MAX_EDDY_RADIUS', .2, edd_r, .false.) - call Control_Mod_Read_Real_Item_On('EDDY_INTENSITY', .1, edd_i, .false.) + call Control % Read_Int_Item_On ('NUMBER_OF_EDDIES', 24, edd_n, .false.) + call Control % Read_Real_Item_On('MAX_EDDY_RADIUS', .2, edd_r, .false.) + call Control % Read_Real_Item_On('EDDY_INTENSITY', .1, edd_i, .false.) call Eddies_Mod_Allocate(turb_planes % plane(turb_planes % n_planes), & edd_n, & edd_r, & diff --git a/Sources/Process/Read_Controls_Mod/Physical_Models.f90 b/Sources/Process/Read_Controls_Mod/Physical_Models.f90 index 54ff04187..06ac1d9c7 100644 --- a/Sources/Process/Read_Controls_Mod/Physical_Models.f90 +++ b/Sources/Process/Read_Controls_Mod/Physical_Models.f90 @@ -30,7 +30,7 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) ! Number of time steps ! ! ! !--------------------------! - call Control_Mod_Read_Int_Item('NUMBER_OF_TIME_STEPS', 0, n_times, .false.) + call Control % Read_Int_Item('NUMBER_OF_TIME_STEPS', 0, n_times, .false.) !-------------------------------------------! ! ! @@ -127,8 +127,8 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) call Control_Mod_Rough_Walls(Turb % rough_walls, .true.) ! Does the user want to gather statistics? - call Control_Mod_Read_Int_Item('STARTING_TIME_STEP_FOR_TURB_STATISTICS', & - HUGE_INT, n_stat, .false.) + call Control % Read_Int_Item('STARTING_TIME_STEP_FOR_TURB_STATISTICS', & + HUGE_INT, n_stat, .false.) !-------------------------------------------------------------------! ! For scale-resolving simulations, engage turbulence statistics ! @@ -272,8 +272,8 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) call Control_Mod_Number_Of_Swarm_Sub_Steps (Swarm % n_sub_steps, & verbose = .true.) - call Control_Mod_Read_Int_Item('STARTING_TIME_STEP_FOR_SWARM_STATISTICS', & - HUGE_INT, n_stat_p, .false.) + call Control % Read_Int_Item('STARTING_TIME_STEP_FOR_SWARM_STATISTICS', & + HUGE_INT, n_stat_p, .false.) ! SGS models for particle call Control_Mod_Swarm_Subgrid_Scale_Model(name, verbose = .true.) diff --git a/Sources/Process/Results_Mod/Main_Results.f90 b/Sources/Process/Results_Mod/Main_Results.f90 index 68d8564c7..1b56c6644 100644 --- a/Sources/Process/Results_Mod/Main_Results.f90 +++ b/Sources/Process/Results_Mod/Main_Results.f90 @@ -32,7 +32,7 @@ subroutine Main_Results(Results, & Backup % Time_To_Save_Backup(curr_dt) .or. & Info % Time_To_Exit()) then do d = 1, n_dom - call Control_Mod_Switch_To_Domain(d) + call Control % Switch_To_Domain(d) call Backup % Save(Flow(d), Turb(d), Vof(d), Swarm(d), & time, curr_dt, dom=d) end do @@ -46,7 +46,7 @@ subroutine Main_Results(Results, & Info % Time_To_Exit()) then do d = 1, n_dom - call Control_Mod_Switch_To_Domain(d) + call Control % Switch_To_Domain(d) call Results % Save_Vtu_Results(Flow(d), Turb(d), Vof(d), Swarm(d), & curr_dt, plot_inside=.true., domain=d) call Results % Save_Vtu_Results(Flow(d), Turb(d), Vof(d), Swarm(d), & @@ -80,7 +80,7 @@ subroutine Main_Results(Results, & Info % Time_To_Exit()) then do d = 1, n_dom - call Control_Mod_Switch_To_Domain(d) + call Control % Switch_To_Domain(d) if(Flow(d) % with_particles) then call Results % Save_Vtu_Swarm(Swarm(d), curr_dt, domain=d) diff --git a/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Int_Arrays.f90 b/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Int_Arrays.f90 index c86481d82..c5da80619 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Int_Arrays.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Int_Arrays.f90 @@ -6,12 +6,12 @@ subroutine Sendrecv_Int_Arrays(Comm, len_s, phi_s, & !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type), intent(in) :: Comm - integer, intent(in) :: len_s ! send length - integer, intent(in) :: phi_s(len_s) ! send buffer - integer, intent(in) :: len_r ! receive length - integer, intent(out) :: phi_r(len_r) ! receive buffer - integer, intent(in) :: dest ! destination processor + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: len_s ! send length + integer, intent(in) :: phi_s(len_s) ! send buffer + integer, intent(in) :: len_r ! receive length + integer, intent(in) :: phi_r(len_r) ! receive buffer + integer, intent(in) :: dest ! destination processor !------------------------[Avoid unused parent warning]-------------------------! Unused(Comm) Unused(len_s) diff --git a/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Log_Arrays.f90 b/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Log_Arrays.f90 index f720b745f..a51af0546 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Log_Arrays.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Log_Arrays.f90 @@ -6,12 +6,12 @@ subroutine Sendrecv_Log_Arrays(Comm, len_s, phi_s, & !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type), intent(in) :: Comm - integer, intent(in) :: len_s ! send length - logical, intent(in) :: phi_s(len_s) ! send buffer - integer, intent(in) :: len_r ! receive length - logical, intent(out) :: phi_r(len_r) ! receive buffer - integer, intent(in) :: dest ! destination processor + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: len_s ! send length + logical, intent(in) :: phi_s(len_s) ! send buffer + integer, intent(in) :: len_r ! receive length + logical, intent(in) :: phi_r(len_r) ! receive buffer + integer, intent(in) :: dest ! destination processor !------------------------[Avoid unused parent warning]-------------------------! Unused(Comm) Unused(len_s) diff --git a/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Real_Arrays.f90 b/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Real_Arrays.f90 index 102ff7c6a..2905c88dc 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Real_Arrays.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Sendrecv_Real_Arrays.f90 @@ -6,12 +6,12 @@ subroutine Sendrecv_Real_Arrays(Comm, len_s, phi_s, & !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Comm_Type), intent(in) :: Comm - integer, intent(in) :: len_s ! send length - real, intent(in) :: phi_s(len_s) ! send buffer - integer, intent(in) :: len_r ! receive length - real, intent(out) :: phi_r(len_r) ! receive buffer - integer, intent(in) :: dest ! destination processor + class(Comm_Type), intent(in) :: Comm + integer, intent(in) :: len_s ! send length + real, intent(in) :: phi_s(len_s) ! send buffer + integer, intent(in) :: len_r ! receive length + real, intent(in) :: phi_r(len_r) ! receive buffer + integer, intent(in) :: dest ! destination processor !------------------------[Avoid unused parent warning]-------------------------! Unused(Comm) Unused(len_s) diff --git a/Sources/Shared/Control_Mod.f90 b/Sources/Shared/Control_Mod.f90 index 088272277..66d4764a2 100644 --- a/Sources/Shared/Control_Mod.f90 +++ b/Sources/Shared/Control_Mod.f90 @@ -15,9 +15,33 @@ module Control_Mod integer, private :: root_control_file_unit ! root control file unit integer, private :: dom_control_file_unit(MD) ! domain control file units - ! Number of presumably misstyped keywords followed by their list - integer, private :: n_similar = 0 - character(SL), private :: similar(128) + !------------------! + ! Control type ! + !------------------! + type Control_Type + + contains + procedure :: Open_Domain_File + procedure :: Open_Root_File + procedure :: Position_At_One_Key + procedure :: Position_At_Two_Keys + procedure :: Position_At_Three_Keys + procedure :: Read_Char_Item + procedure :: Read_Char_Item_On + procedure :: Read_Strings_On + procedure :: Read_Int_Item + procedure :: Read_Int_Item_On + procedure :: Read_Real_Item + procedure :: Read_Real_Item_On + procedure :: Read_Real_Vector + procedure :: Read_Real_Vector_On +! procedure :: Similar_Warning + procedure :: Switch_To_Domain + procedure :: Switch_To_Root + + end type + + type(Control_Type) :: Control contains @@ -37,9 +61,9 @@ module Control_Mod # include "Control_Mod/Basic_Functions/Read_Int_Item_On.f90" # include "Control_Mod/Basic_Functions/Read_Real_Item.f90" # include "Control_Mod/Basic_Functions/Read_Real_Item_On.f90" -# include "Control_Mod/Basic_Functions/Read_Real_Array.f90" -# include "Control_Mod/Basic_Functions/Read_Real_Array_On.f90" -# include "Control_Mod/Basic_Functions/Similar_Warning.f90" +# include "Control_Mod/Basic_Functions/Read_Real_Vector.f90" +# include "Control_Mod/Basic_Functions/Read_Real_Vector_On.f90" +! include "Control_Mod/Basic_Functions/Similar_Warning.f90" # include "Control_Mod/Basic_Functions/Switch_To_Domain.f90" # include "Control_Mod/Basic_Functions/Switch_To_Root.f90" @@ -53,8 +77,8 @@ module Control_Mod # include "Control_Mod/Input_Output/Save_Backup_Name.f90" # include "Control_Mod/Input_Output/Save_Initial_Condition.f90" # include "Control_Mod/Input_Output/Save_Results_At_Boundaries.f90" -# include "Control_Mod/Input_Output/Load_Initial_Solution_Name.f90" -# include "Control_Mod/Input_Output/Save_Initial_Solution_Name.f90" +! include "Control_Mod/Input_Output/Load_Initial_Solution_Name.f90" +! include "Control_Mod/Input_Output/Save_Initial_Solution_Name.f90" # include "Control_Mod/Input_Output/Wall_Time_Max_Hours.f90" ! Save diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Open_Domain_File.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Open_Domain_File.f90 index 2e9bbe669..cc82c52c3 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Open_Domain_File.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Open_Domain_File.f90 @@ -1,12 +1,15 @@ !==============================================================================! - subroutine Control_Mod_Open_Domain_File(dom, file_name) + subroutine Open_Domain_File(Control, dom, file_name) !------------------------------------------------------------------------------! ! Opens control file for a domain. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer :: dom - character(len=*) :: file_name + class(Control_Type) :: Control + integer :: dom + character(len=*) :: file_name +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Control) !==============================================================================! call File % Open_For_Reading_Ascii(file_name, & diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Open_Root_File.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Open_Root_File.f90 index 4d4338708..414774a3b 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Open_Root_File.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Open_Root_File.f90 @@ -1,11 +1,14 @@ !==============================================================================! - subroutine Control_Mod_Open_Root_File(file_name) + subroutine Open_Root_File(Control, file_name) !------------------------------------------------------------------------------! ! It rarely gets simpler than this - just opens a file for reading. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - character(len=*) :: file_name + class(Control_Type) :: Control + character(len=*) :: file_name +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Control) !==============================================================================! call File % Open_For_Reading_Ascii(file_name, root_control_file_unit, & diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Position_At_One_Key.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Position_At_One_Key.f90 index 21f8d2dfb..abddfe3a7 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Position_At_One_Key.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Position_At_One_Key.f90 @@ -1,16 +1,19 @@ !==============================================================================! - subroutine Control_Mod_Position_At_One_Key(keyword, found, verbose) + subroutine Position_At_One_Key(Control, keyword, found, verbose) !------------------------------------------------------------------------------! ! Position yourself within the file at the line specified with one key. ! ! It is intended to be used to find the initial condition specifications. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - character(len=*) :: keyword - logical :: found - logical, optional :: verbose + class(Control_Type) :: Control + character(len=*) :: keyword + logical :: found + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! logical :: reached_end +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Control) !==============================================================================! rewind(control_file_unit) @@ -27,11 +30,6 @@ subroutine Control_Mod_Position_At_One_Key(keyword, found, verbose) if(Line % tokens(1) .eq. trim(keyword)) then found = .true. return - - ! Keyword not found, try to see if there is similar, maybe it was a typo - else - call Control_Mod_Similar_Warning(trim(keyword), & - trim(Line % tokens(1))) end if end do diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Position_At_Three_Keys.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Position_At_Three_Keys.f90 index bdc0ba269..40b407781 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Position_At_Three_Keys.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Position_At_Three_Keys.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Position_At_Three_Keys(keyword_1, & - keyword_2, & - keyword_3, & - found, verbose) + subroutine Position_At_Three_Keys(Control, & + keyword_1, & + keyword_2, & + keyword_3, & + found, verbose) !------------------------------------------------------------------------------! ! Position yourself within the file at the line specified with three keys. ! ! It is intended to be used to find the interface condition specifications. ! @@ -11,13 +12,16 @@ subroutine Control_Mod_Position_At_Three_Keys(keyword_1, & !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - character(len=*) :: keyword_1 - character(len=*) :: keyword_2 - character(len=*) :: keyword_3 - logical :: found - logical, optional :: verbose + class(Control_Type) :: Control + character(len=*) :: keyword_1 + character(len=*) :: keyword_2 + character(len=*) :: keyword_3 + logical :: found + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! logical :: reached_end +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Control) !==============================================================================! rewind(control_file_unit) @@ -37,8 +41,8 @@ subroutine Control_Mod_Position_At_Three_Keys(keyword_1, & Line % tokens(3) .eq. trim(keyword_3)) then found = .true. return - end if + end do !--------------------------------------------! diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Position_At_Two_Keys.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Position_At_Two_Keys.f90 index 0c2d4ab94..fb20fa59a 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Position_At_Two_Keys.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Position_At_Two_Keys.f90 @@ -1,18 +1,23 @@ !==============================================================================! - subroutine Control_Mod_Position_At_Two_Keys(keyword_1, keyword_2, & - found, verbose) + subroutine Position_At_Two_Keys(Control, & + keyword_1, & + keyword_2, & + found, verbose) !------------------------------------------------------------------------------! ! Position yourself within the file at the line specified with two keys. ! ! It is intended to be used to find the boundary condition specifications. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - character(len=*) :: keyword_1 - character(len=*) :: keyword_2 - logical :: found - logical, optional :: verbose + class(Control_Type) :: Control + character(len=*) :: keyword_1 + character(len=*) :: keyword_2 + logical :: found + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! logical :: reached_end +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Control) !==============================================================================! rewind(control_file_unit) @@ -33,15 +38,8 @@ subroutine Control_Mod_Position_At_Two_Keys(keyword_1, keyword_2, & Line % tokens(2) .eq. trim(keyword_2)) then found = .true. return - - ! Keywords not found, try to see if there is similar, maybe there was a typo - else - call Control_Mod_Similar_Warning(trim(keyword_1), & - trim(Line % tokens(1))) - call Control_Mod_Similar_Warning(trim(keyword_2), & - trim(Line % tokens(2)), & - key_type='boundary condition') end if + end do !--------------------------------------------! diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item.f90 index 9b19b990f..cbe188e10 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Control_Mod_Read_Char_Item(keyword, def, val, verbose) + subroutine Read_Char_Item(Control, keyword, def, val, verbose) !------------------------------------------------------------------------------! ! Working horse function to read integer value (argument "val") behind a ! ! keyword (argument "keyword") in control file. If not found, a default ! @@ -7,12 +7,15 @@ subroutine Control_Mod_Read_Char_Item(keyword, def, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(len=*) :: keyword character(len=*), intent(in) :: def ! default value character(SL), intent(out) :: val ! spefified value, if found logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! logical :: reached_end +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Control) !==============================================================================! rewind(control_file_unit) @@ -31,10 +34,6 @@ subroutine Control_Mod_Read_Char_Item(keyword, def, val, verbose) if(Line % tokens(1) .eq. trim(keyword)) then read(Line % tokens(2), *) val return - - ! Keyword not found, try to see if there is similar, maybe it was a typo - else - call Control_Mod_Similar_Warning( keyword, trim(Line % tokens(1)) ) end if end do diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item_On.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item_On.f90 index adccce37d..37f8bf2cc 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item_On.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item_On.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Control_Mod_Read_Char_Item_On(keyword, def, val, verbose) + subroutine Read_Char_Item_On(Control, keyword, def, val, verbose) !------------------------------------------------------------------------------! ! Working horse function to read strings values (argument "val") behind a ! ! keyword (argument "keyword") in control file. If not found, a default ! @@ -7,12 +7,15 @@ subroutine Control_Mod_Read_Char_Item_On(keyword, def, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(len=*) :: keyword character(len=*), intent(in) :: def ! default value character(SL), intent(out) :: val ! spefified value, if found logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! logical :: reached_end +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Control) !==============================================================================! ! Set default value @@ -28,10 +31,6 @@ subroutine Control_Mod_Read_Char_Item_On(keyword, def, val, verbose) if(Line % tokens(1) .eq. trim(keyword)) then read(Line % tokens(2), *) val return - - ! Keyword not found, try to see if there is similar, maybe it was a typo - else - call Control_Mod_Similar_Warning( keyword, trim(Line % tokens(1)) ) end if !--------------------------------------------! diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item.f90 index 0d44238ac..e0d8dbf13 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Control_Mod_Read_Int_Item(keyword, def, val, verbose) + subroutine Read_Int_Item(Control, keyword, def, val, verbose) !------------------------------------------------------------------------------! ! Working horse function to read integer value (argument "val") behind a ! ! keyword (argument "keyword") in control file. If not found, a default ! @@ -7,12 +7,15 @@ subroutine Control_Mod_Read_Int_Item(keyword, def, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(len=*) :: keyword integer, intent(in) :: def ! default value integer, intent(out) :: val ! spefified value, if found logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! logical :: reached_end +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Control) !==============================================================================! rewind(control_file_unit) @@ -31,11 +34,8 @@ subroutine Control_Mod_Read_Int_Item(keyword, def, val, verbose) if(Line % tokens(1) .eq. trim(keyword)) then read(Line % tokens(2), *) val return - - ! Keyword not found, try to see if there is similar, maybe it was a typo - else - call Control_Mod_Similar_Warning( keyword, trim(Line % tokens(1)) ) end if + end do !--------------------------------------------! diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item_On.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item_On.f90 index 3e920c046..6d280832e 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item_On.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item_On.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Control_Mod_Read_Int_Item_On(keyword, def, val, verbose) + subroutine Read_Int_Item_On(Control, keyword, def, val, verbose) !------------------------------------------------------------------------------! ! Working horse function to read integer value (argument "val") behind a ! ! keyword (argument "keyword") in control file. If not found, a default ! @@ -7,12 +7,15 @@ subroutine Control_Mod_Read_Int_Item_On(keyword, def, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(len=*) :: keyword integer, intent(in) :: def ! default value integer, intent(out) :: val ! spefified value, if found logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! logical :: reached_end +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Control) !==============================================================================! ! Set default value @@ -28,10 +31,6 @@ subroutine Control_Mod_Read_Int_Item_On(keyword, def, val, verbose) if(Line % tokens(1) .eq. trim(keyword)) then read(Line % tokens(2), *) val return - - ! Keyword not found, try to see if there is similar, maybe it was a typo - else - call Control_Mod_Similar_Warning( keyword, trim(Line % tokens(1)) ) end if !--------------------------------------------! diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item.f90 index fcb9c10f4..f05cd532d 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Control_Mod_Read_Real_Item(keyword, def, val, verbose) + subroutine Read_Real_Item(Control, keyword, def, val, verbose) !------------------------------------------------------------------------------! ! Working horse function to read integer value (argument "val") behind a ! ! keyword (argument "keyword") in control file. If not found, a default ! @@ -7,12 +7,15 @@ subroutine Control_Mod_Read_Real_Item(keyword, def, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - character(len=*) :: keyword - real, intent(in) :: def ! default value - real, intent(out) :: val ! spefified value, if found - logical, optional :: verbose + class(Control_Type) :: Control + character(len=*) :: keyword + real, intent(in) :: def ! default value + real, intent(out) :: val ! spefified value, if found + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! logical :: reached_end +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Control) !==============================================================================! rewind(control_file_unit) @@ -31,10 +34,6 @@ subroutine Control_Mod_Read_Real_Item(keyword, def, val, verbose) if(Line % tokens(1) .eq. trim(keyword)) then read(Line % tokens(2), *) val return - - ! Keyword not found, try to see if there is similar, maybe it was a typo - else - call Control_Mod_Similar_Warning( keyword, trim(Line % tokens(1)) ) end if end do @@ -43,8 +42,8 @@ subroutine Control_Mod_Read_Real_Item(keyword, def, val, verbose) !--------------------------------------------! 1 if(present(verbose)) then if(verbose .and. First_Proc()) then - print '(3a,1pe9.3)', ' # NOTE! Could not find the keyword: ', & - trim(keyword), '. Using the default: ', def + print '(3a,1pe10.3)', ' # NOTE! Could not find the keyword: ', & + trim(keyword), '. Using the default: ', def end if end if diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item_On.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item_On.f90 index 4c72b2cd8..581716e82 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item_On.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item_On.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Control_Mod_Read_Real_Item_On(keyword, def, val, verbose) + subroutine Read_Real_Item_On(Control, keyword, def, val, verbose) !------------------------------------------------------------------------------! ! Working horse function to read real values (argument "val") behind a ! ! keyword (argument "keyword") in control file. If not found, a default ! @@ -7,12 +7,15 @@ subroutine Control_Mod_Read_Real_Item_On(keyword, def, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - character(len=*) :: keyword - real, intent(in) :: def ! default value - real, intent(out) :: val ! spefified value, if found - logical, optional :: verbose + class(Control_Type) :: Control + character(len=*) :: keyword + real, intent(in) :: def ! default value + real, intent(out) :: val ! spefified value, if found + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! logical :: reached_end +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Control) !==============================================================================! ! Set default value @@ -28,10 +31,6 @@ subroutine Control_Mod_Read_Real_Item_On(keyword, def, val, verbose) if(Line % tokens(1) .eq. trim(keyword)) then read(Line % tokens(2), *) val return - - ! Keyword not found, try to see if there is similar, maybe it was a typo - else - call Control_Mod_Similar_Warning( keyword, trim(Line % tokens(1)) ) end if !--------------------------------------------! @@ -39,8 +38,8 @@ subroutine Control_Mod_Read_Real_Item_On(keyword, def, val, verbose) !--------------------------------------------! 1 if(present(verbose)) then if(verbose .and. First_Proc()) then - print '(3a,1pe9.3)', ' # NOTE! Could not find the keyword: ', & - trim(keyword), '. Using the default: ', def + print '(3a,1pe10.3)', ' # NOTE! Could not find the keyword: ', & + trim(keyword), '. Using the default: ', def end if end if diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Array.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Vector.f90 similarity index 71% rename from Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Array.f90 rename to Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Vector.f90 index 33f45d65d..1fe607e2a 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Array.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Vector.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Control_Mod_Read_Real_Array(keyword, n, def, val, verbose) + subroutine Read_Real_Vector(Control, keyword, n, def, val, verbose) !------------------------------------------------------------------------------! ! Working horse function to read integer value (argument "val") behind a ! ! keyword (argument "keyword") in control file. If not found, a default ! @@ -7,14 +7,17 @@ subroutine Control_Mod_Read_Real_Array(keyword, n, def, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - character(len=*) :: keyword - integer :: n ! size of array (typically small) - real :: def(n) ! default value - real :: val(n) ! spefified value, if found - logical, optional :: verbose + class(Control_Type) :: Control + character(len=*) :: keyword + integer :: n ! size of array (typically small) + real :: def(n) ! default value + real :: val(n) ! spefified value, if found + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! logical :: reached_end integer :: i +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Control) !==============================================================================! rewind(control_file_unit) @@ -35,10 +38,6 @@ subroutine Control_Mod_Read_Real_Array(keyword, n, def, val, verbose) read(Line % tokens(i+1), *) val(i) end do return - - ! Keyword not found, try to see if there is similar, maybe it was a typo - else - call Control_Mod_Similar_Warning( keyword, trim(Line % tokens(1)) ) end if end do @@ -48,8 +47,8 @@ subroutine Control_Mod_Read_Real_Array(keyword, n, def, val, verbose) !--------------------------------------------! 1 if(present(verbose)) then if(verbose .and. First_Proc()) then - print '(3a,1pe9.3)', ' # NOTE! Could not find the keyword: ', & - trim(keyword), '. Using the default: ', def(1) + print '(3a,1pe10.3)', ' # NOTE! Could not find the keyword: ', & + trim(keyword), '. Using the default: ', def(1) end if end if diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Array_On.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Vector_On.f90 similarity index 79% rename from Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Array_On.f90 rename to Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Vector_On.f90 index 4b6bbff71..ae65c79bb 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Array_On.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Vector_On.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Control_Mod_Read_Real_Array_On(keyword, values, n, verbose) + subroutine Read_Real_Vector_On(Control, keyword, values, n, verbose) !------------------------------------------------------------------------------! ! Working horse function to read integer value (argument "val") behind a ! ! keyword (argument "keyword") in control file. If not found, a default ! @@ -7,13 +7,16 @@ subroutine Control_Mod_Read_Real_Array_On(keyword, values, n, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - character(len=*) :: keyword - real :: values(128) ! spefified value, if found - integer :: n ! number of items - logical, optional :: verbose + class(Control_Type) :: Control + character(len=*) :: keyword + real :: values(128) ! spefified value, if found + integer :: n ! number of items + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! integer :: i logical :: reached_end +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Control) !==============================================================================! ! Set default values @@ -34,9 +37,6 @@ subroutine Control_Mod_Read_Real_Array_On(keyword, values, n, verbose) n = Line % n_tokens - 1 return - ! Keyword not found, try to see if there is similar, maybe it was a typo - else - call Control_Mod_Similar_Warning( keyword, trim(Line % tokens(1)) ) end if !--------------------------------------------! diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Strings_On.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Strings_On.f90 index 256681596..33d91c0c6 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Strings_On.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Strings_On.f90 @@ -1,17 +1,20 @@ !==============================================================================! - subroutine Control_Mod_Read_Strings_On(keyword, values, n, verbose) + subroutine Read_Strings_On(Control, keyword, values, n, verbose) !------------------------------------------------------------------------------! ! Used to read variable names in bnd. and initial condition specificaton ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - character(len=*) :: keyword - character(SL) :: values(MSI) ! spefified value, if found - integer :: n ! number of items - logical, optional :: verbose + class(Control_Type) :: Control + character(len=*) :: keyword + character(SL) :: values(MSI) ! spefified value, if found + integer :: n ! number of items + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! integer :: i logical :: reached_end +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Control) !==============================================================================! ! Set default values @@ -30,12 +33,7 @@ subroutine Control_Mod_Read_Strings_On(keyword, values, n, verbose) read(Line % tokens(i), *) values(i-1) end do n = Line % n_tokens - 1 - return - - ! Keyword not found, try to see if there is similar, maybe it was a typo - ! (Tokens 2 and on hold variable names, they are too short to be checked) - else - call Control_Mod_Similar_Warning( keyword, trim(Line % tokens(1)) ) + return end if !--------------------------------------------! diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Similar_Warning.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Similar_Warning.f90 index b46042d13..e77d5f068 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Similar_Warning.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Similar_Warning.f90 @@ -5,6 +5,7 @@ subroutine Control_Mod_Similar_Warning(keyword, item, key_type) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(len=*) :: keyword character(len=*) :: item character(len=*), optional :: key_type diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Switch_To_Domain.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Switch_To_Domain.f90 index e1d54b86d..a3f0dc404 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Switch_To_Domain.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Switch_To_Domain.f90 @@ -1,11 +1,14 @@ !==============================================================================! - subroutine Control_Mod_Switch_To_Domain(dom) + subroutine Switch_To_Domain(Control, dom) !------------------------------------------------------------------------------! ! Switch the control file to the specified domain. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer :: dom + class(Control_Type) :: Control + integer, intent(in) :: dom +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Control) !==============================================================================! control_file_unit = dom_control_file_unit(dom) diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Switch_To_Root.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Switch_To_Root.f90 index 280a42644..82cebf88c 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Switch_To_Root.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Switch_To_Root.f90 @@ -1,9 +1,13 @@ !==============================================================================! - subroutine Control_Mod_Switch_To_Root() + subroutine Switch_To_Root(Control) !------------------------------------------------------------------------------! ! Switch the control file to root. ! !------------------------------------------------------------------------------! implicit none +!---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Control) !==============================================================================! control_file_unit = root_control_file_unit diff --git a/Sources/Shared/Control_Mod/Input_Output/Backup_Save_Interval.f90 b/Sources/Shared/Control_Mod/Input_Output/Backup_Save_Interval.f90 index 79e9f59f6..a32f18ad3 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Backup_Save_Interval.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Backup_Save_Interval.f90 @@ -7,7 +7,6 @@ subroutine Control_Mod_Backup_Save_Interval(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('BACKUP_SAVE_INTERVAL', 120, & - val, verbose) + call Control % Read_Int_Item('BACKUP_SAVE_INTERVAL', 120, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Input_Output/Load_Backup_Name.f90 b/Sources/Shared/Control_Mod/Input_Output/Load_Backup_Name.f90 index bc8d8f83f..b78147b9c 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Load_Backup_Name.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Load_Backup_Name.f90 @@ -7,7 +7,6 @@ subroutine Control_Mod_Load_Backup_Name(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('LOAD_BACKUP_NAME', 'skip', & - val, verbose) + call Control % Read_Char_Item('LOAD_BACKUP_NAME', 'skip', val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Input_Output/Load_Initial_Solution_Name.f90 b/Sources/Shared/Control_Mod/Input_Output/Load_Initial_Solution_Name.f90 index 0cfb9d9de..800d9a469 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Load_Initial_Solution_Name.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Load_Initial_Solution_Name.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Load_Initial_Solution_Name(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('LOAD_INITIAL_SOLUTION_NAME', 'skip', & - val, verbose) + call Control % Read_Char_Item('LOAD_INITIAL_SOLUTION_NAME', 'skip', & + val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Input_Output/Problem_Name.f90 b/Sources/Shared/Control_Mod/Input_Output/Problem_Name.f90 index e4038a687..6dcaa2730 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Problem_Name.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Problem_Name.f90 @@ -7,7 +7,6 @@ subroutine Control_Mod_Problem_Name(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('PROBLEM_NAME', 'unknown', & - val, verbose) + call Control % Read_Char_Item('PROBLEM_NAME', 'unknown', val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Input_Output/Profiler_Info.f90 b/Sources/Shared/Control_Mod/Input_Output/Profiler_Info.f90 index a600065db..552c6a9ee 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Profiler_Info.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Profiler_Info.f90 @@ -7,8 +7,7 @@ subroutine Control_Mod_Profiler_Info(val, verbose) logical, optional, intent(in) :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('PROFILER_INFO', 'percents', & - val, verbose) + call Control % Read_Char_Item('PROFILER_INFO', 'percents', val, verbose) call String % To_Upper_Case(val) end subroutine diff --git a/Sources/Shared/Control_Mod/Input_Output/Results_Save_Interval.f90 b/Sources/Shared/Control_Mod/Input_Output/Results_Save_Interval.f90 index 6d6e5790f..3605b835d 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Results_Save_Interval.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Results_Save_Interval.f90 @@ -7,7 +7,6 @@ subroutine Control_Mod_Results_Save_Interval(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('RESULTS_SAVE_INTERVAL', 12, & - val, verbose) + call Control % Read_Int_Item('RESULTS_SAVE_INTERVAL', 12, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Input_Output/Save_Backup_Name.f90 b/Sources/Shared/Control_Mod/Input_Output/Save_Backup_Name.f90 index 9ffb49535..6d97596d9 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Save_Backup_Name.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Save_Backup_Name.f90 @@ -7,7 +7,6 @@ subroutine Control_Mod_Save_Backup_Name(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('SAVE_BACKUP_NAME', 'skip', & - val, verbose) + call Control % Read_Char_Item('SAVE_BACKUP_NAME', 'skip', val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Input_Output/Save_Initial_Condition.f90 b/Sources/Shared/Control_Mod/Input_Output/Save_Initial_Condition.f90 index 2215b63f2..17063cd99 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Save_Initial_Condition.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Save_Initial_Condition.f90 @@ -9,8 +9,7 @@ subroutine Control_Mod_Save_Initial_Condition(save_init_cond, verbose) character(SL) :: val !==============================================================================! - call Control_Mod_Read_Char_Item('SAVE_INITIAL_CONDITION', 'yes', & - val, verbose) + call Control % Read_Char_Item('SAVE_INITIAL_CONDITION', 'yes', val, verbose) call String % To_Upper_Case(val) if( val .eq. 'YES' ) then diff --git a/Sources/Shared/Control_Mod/Input_Output/Save_Initial_Solution_Name.f90 b/Sources/Shared/Control_Mod/Input_Output/Save_Initial_Solution_Name.f90 index eef8d8758..62d8e2f1c 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Save_Initial_Solution_Name.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Save_Initial_Solution_Name.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Save_Initial_Solution_Name(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('SAVE_INITIAL_SOLUTION_NAME', 'skip', & - val, verbose) + call Control % Read_Char_Item('SAVE_INITIAL_SOLUTION_NAME', 'skip', & + val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Input_Output/Save_Results_At_Boundaries.f90 b/Sources/Shared/Control_Mod/Input_Output/Save_Results_At_Boundaries.f90 index 789b6133d..defb574f4 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Save_Results_At_Boundaries.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Save_Results_At_Boundaries.f90 @@ -9,8 +9,8 @@ subroutine Control_Mod_Save_Results_At_Boundaries(save_results_bnd, verbose) character(SL) :: val !==============================================================================! - call Control_Mod_Read_Char_Item('SAVE_RESULTS_AT_BOUNDARIES', 'yes', & - val, verbose) + call Control % Read_Char_Item('SAVE_RESULTS_AT_BOUNDARIES', 'yes', & + val, verbose) call String % To_Upper_Case(val) if( val .eq. 'YES' ) then diff --git a/Sources/Shared/Control_Mod/Input_Output/Swarm_Save_Interval.f90 b/Sources/Shared/Control_Mod/Input_Output/Swarm_Save_Interval.f90 index 29096cdbc..d56e5718c 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Swarm_Save_Interval.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Swarm_Save_Interval.f90 @@ -7,7 +7,6 @@ subroutine Control_Mod_Swarm_Save_Interval(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('SWARM_SAVE_INTERVAL', 60, & - val, verbose) + call Control % Read_Int_Item('SWARM_SAVE_INTERVAL', 60, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Input_Output/Wall_Time_Max_Hours.f90 b/Sources/Shared/Control_Mod/Input_Output/Wall_Time_Max_Hours.f90 index f61bb50e7..357967aec 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Wall_Time_Max_Hours.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Wall_Time_Max_Hours.f90 @@ -8,7 +8,6 @@ subroutine Control_Mod_Wall_Time_Max_Hours(val, verbose) !==============================================================================! ! 168 hours is one week - call Control_Mod_Read_Real_Item('WALL_TIME_MAX_HOURS', 168.0, & - val, verbose) + call Control % Read_Real_Item('WALL_TIME_MAX_HOURS', 168.0, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Linear_Solvers.f90 b/Sources/Shared/Control_Mod/Linear_Solvers.f90 index ba3c15362..6edd139f5 100644 --- a/Sources/Shared/Control_Mod/Linear_Solvers.f90 +++ b/Sources/Shared/Control_Mod/Linear_Solvers.f90 @@ -9,8 +9,8 @@ subroutine Control_Mod_Linear_Solvers(name, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('LINEAR_SOLVERS', & - 'native', name, verbose=verbose) + call Control % Read_Char_Item('LINEAR_SOLVERS', & + 'native', name, verbose=verbose) call String % To_Upper_Case(name) end subroutine diff --git a/Sources/Shared/Control_Mod/Max_Threads.f90 b/Sources/Shared/Control_Mod/Max_Threads.f90 index e82de8d8f..9c4b81218 100644 --- a/Sources/Shared/Control_Mod/Max_Threads.f90 +++ b/Sources/Shared/Control_Mod/Max_Threads.f90 @@ -8,7 +8,7 @@ subroutine Control_Mod_Max_Threads(val, verbose) !==============================================================================! # ifdef _OPENMP - call Control_Mod_Read_Int_Item('MAX_THREADS', 2, val, verbose) + call Control % Read_Int_Item('MAX_THREADS', 2, val, verbose) # else val = 1 Unused(verbose) diff --git a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Energy_Solver.f90 b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Energy_Solver.f90 index d9150a1ac..b98c0470d 100644 --- a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Energy_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Energy_Solver.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Max_Iterations_For_Energy_Solver(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('MAX_ITERATIONS_FOR_ENERGY_SOLVER', & - 5, val, verbose) + call Control % Read_Int_Item('MAX_ITERATIONS_FOR_ENERGY_SOLVER', & + 5, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Momentum_Solver.f90 b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Momentum_Solver.f90 index 2573a33cf..024421516 100644 --- a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Momentum_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Momentum_Solver.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Max_Iterations_For_Momentum_Solver(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('MAX_ITERATIONS_FOR_MOMENTUM_SOLVER', & - 5, val, verbose) + call Control % Read_Int_Item('MAX_ITERATIONS_FOR_MOMENTUM_SOLVER', & + 5, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Potential_Solver.f90 b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Potential_Solver.f90 index b362b47a8..04d4a19d0 100644 --- a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Potential_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Potential_Solver.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Max_Iterations_For_Potential_Solver(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('MAX_ITERATIONS_FOR_POTENTIAL_SOLVER', & - 120, val, verbose) + call Control % Read_Int_Item('MAX_ITERATIONS_FOR_POTENTIAL_SOLVER', & + 120, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Presssure_Solver.f90 b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Presssure_Solver.f90 index 7a2129a56..62f56469c 100644 --- a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Presssure_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Presssure_Solver.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Max_Iterations_For_Pressure_Solver(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('MAX_ITERATIONS_FOR_PRESSURE_SOLVER', & - 120, val, verbose) + call Control % Read_Int_Item('MAX_ITERATIONS_FOR_PRESSURE_SOLVER', & + 120, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Scalars_Solver.f90 b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Scalars_Solver.f90 index 59fd1aa72..b615d981d 100644 --- a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Scalars_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Scalars_Solver.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Max_Iterations_For_Scalars_Solver(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('MAX_ITERATIONS_FOR_SCALARS_SOLVER', & - 6, val, verbose) + call Control % Read_Int_Item('MAX_ITERATIONS_FOR_SCALARS_SOLVER', & + 6, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Turbulence_Solver.f90 b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Turbulence_Solver.f90 index e818d0be6..fa061c165 100644 --- a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Turbulence_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Turbulence_Solver.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Max_Iterations_For_Turbulence_Solver(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('MAX_ITERATIONS_FOR_TURBULENCE_SOLVER', & - 6, val, verbose) + call Control % Read_Int_Item('MAX_ITERATIONS_FOR_TURBULENCE_SOLVER', & + 6, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Vof_Solver.f90 b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Vof_Solver.f90 index fe7fe8ecc..eefa80a1f 100644 --- a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Vof_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Vof_Solver.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Max_Iterations_For_Vof_Solver(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('MAX_ITERATIONS_FOR_VOF_SOLVER', & - 6, val, verbose) + call Control % Read_Int_Item('MAX_ITERATIONS_FOR_VOF_SOLVER', & + 6, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Wall_Distance_Solver.f90 b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Wall_Distance_Solver.f90 index d4d12e48c..f800847a3 100644 --- a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Wall_Distance_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Wall_Distance_Solver.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Max_Iterations_For_Wall_Distance_Solver(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('MAX_ITERATIONS_FOR_WALL_DISTANCE_SOLVER', & - 120, val, verbose) + call Control % Read_Int_Item('MAX_ITERATIONS_FOR_WALL_DISTANCE_SOLVER', & + 120, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Normalization_For_Energy_Solver.f90 b/Sources/Shared/Control_Mod/Native/Normalization_For_Energy_Solver.f90 index 514e694d0..d60f6a294 100644 --- a/Sources/Shared/Control_Mod/Native/Normalization_For_Energy_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Normalization_For_Energy_Solver.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Normalization_For_Energy_Solver(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('NORMALIZATION_FOR_ENERGY_SOLVER', & - 1.0e-6, val, verbose) + call Control % Read_Real_Item('NORMALIZATION_FOR_ENERGY_SOLVER', & + 1.0e-6, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Normalization_For_Momentum_Solver.f90 b/Sources/Shared/Control_Mod/Native/Normalization_For_Momentum_Solver.f90 index 8062387aa..11c36c26f 100644 --- a/Sources/Shared/Control_Mod/Native/Normalization_For_Momentum_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Normalization_For_Momentum_Solver.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Normalization_For_Momentum_Solver(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('NORMALIZATION_FOR_MOMENTUM_SOLVER', & - 1.0e-6, val, verbose) + call Control % Read_Real_Item('NORMALIZATION_FOR_MOMENTUM_SOLVER', & + 1.0e-6, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Normalization_For_Pressure_Solver.f90 b/Sources/Shared/Control_Mod/Native/Normalization_For_Pressure_Solver.f90 index 215a639d5..f94eff852 100644 --- a/Sources/Shared/Control_Mod/Native/Normalization_For_Pressure_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Normalization_For_Pressure_Solver.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Normalization_For_Pressure_Solver(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('NORMALIZATION_FOR_PRESSURE_SOLVER', & - 1.0e-6, val, verbose) + call Control % Read_Real_Item('NORMALIZATION_FOR_PRESSURE_SOLVER', & + 1.0e-6, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Normalization_For_Scalars_Solver.f90 b/Sources/Shared/Control_Mod/Native/Normalization_For_Scalars_Solver.f90 index 6fceaa0df..bc56bca69 100644 --- a/Sources/Shared/Control_Mod/Native/Normalization_For_Scalars_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Normalization_For_Scalars_Solver.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Normalization_For_Scalars_Solver(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('NORMALIZATION_FOR_SCALARS_SOLVER', & - 1.0e-6, val, verbose) + call Control % Read_Real_Item('NORMALIZATION_FOR_SCALARS_SOLVER', & + 1.0e-6, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Normalization_For_Turbulence_Solver.f90 b/Sources/Shared/Control_Mod/Native/Normalization_For_Turbulence_Solver.f90 index 3338be206..65065870e 100644 --- a/Sources/Shared/Control_Mod/Native/Normalization_For_Turbulence_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Normalization_For_Turbulence_Solver.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Normalization_For_Turbulence_Solver(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('NORMALIZATION_FOR_TURBULENCE_SOLVER', & - 1.0e-6, val, verbose) + call Control % Read_Real_Item('NORMALIZATION_FOR_TURBULENCE_SOLVER', & + 1.0e-6, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Preconditioner_For_System_Matrix.f90 b/Sources/Shared/Control_Mod/Native/Preconditioner_For_System_Matrix.f90 index 2b96f4a0c..67a268b9b 100644 --- a/Sources/Shared/Control_Mod/Native/Preconditioner_For_System_Matrix.f90 +++ b/Sources/Shared/Control_Mod/Native/Preconditioner_For_System_Matrix.f90 @@ -18,10 +18,10 @@ subroutine Control_Mod_Preconditioner_For_System_Matrix(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('PRECONDITIONER_FOR_SYSTEM_MATRIX', & - 'incomplete_cholesky', & - val, & - verbose) + call Control % Read_Char_Item('PRECONDITIONER_FOR_SYSTEM_MATRIX', & + 'incomplete_cholesky', & + val, & + verbose) call String % To_Lower_Case(val) ! Check validity of the input diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Energy.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Energy.f90 index 5d729f30d..6d76a6595 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Energy.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Energy.f90 @@ -7,8 +7,7 @@ subroutine Control_Mod_Solver_For_Energy(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('SOLVER_FOR_ENERGY', 'cg', & - val, verbose) + call Control % Read_Char_Item('SOLVER_FOR_ENERGY', 'cg', val, verbose) call String % To_Lower_Case(val) if( val .ne. 'bicg' .and. val .ne. 'cg') then diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Momentum.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Momentum.f90 index cd52e7a64..7fed428df 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Momentum.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Momentum.f90 @@ -7,8 +7,7 @@ subroutine Control_Mod_Solver_For_Momentum(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('SOLVER_FOR_MOMENTUM', 'bicg', & - val, verbose) + call Control % Read_Char_Item('SOLVER_FOR_MOMENTUM', 'bicg', val, verbose) call String % To_Lower_Case(val) if( val .ne. 'bicg' .and. val .ne. 'cg') then diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Potential.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Potential.f90 index e49db48d7..d2aebfa01 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Potential.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Potential.f90 @@ -7,8 +7,7 @@ subroutine Control_Mod_Solver_For_Potential(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('SOLVER_FOR_POTENTIAL', 'cg', & - val, verbose) + call Control % Read_Char_Item('SOLVER_FOR_POTENTIAL', 'cg', val, verbose) call String % To_Lower_Case(val) if( val .ne. 'bicg' .and. val .ne. 'cg') then diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Pressure.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Pressure.f90 index caa325a00..24b5bc871 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Pressure.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Pressure.f90 @@ -7,8 +7,7 @@ subroutine Control_Mod_Solver_For_Pressure(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('SOLVER_FOR_PRESSURE', 'cg', & - val, verbose) + call Control % Read_Char_Item('SOLVER_FOR_PRESSURE', 'cg', val, verbose) call String % To_Lower_Case(val) if( val .ne. 'bicg' .and. val .ne. 'cg') then diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Scalars.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Scalars.f90 index c57c4386c..de3587009 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Scalars.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Scalars.f90 @@ -7,8 +7,7 @@ subroutine Control_Mod_Solver_For_Scalars(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('SOLVER_FOR_SCALARS', 'cg', & - val, verbose) + call Control % Read_Char_Item('SOLVER_FOR_SCALARS', 'cg', val, verbose) call String % To_Lower_Case(val) if( val .ne. 'bicg' .and. val .ne. 'cg') then diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Turbulence.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Turbulence.f90 index 76721bc07..c608fa32e 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Turbulence.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Turbulence.f90 @@ -7,8 +7,7 @@ subroutine Control_Mod_Solver_For_Turbulence(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('SOLVER_FOR_TURBULENCE', 'cg', & - val, verbose) + call Control % Read_Char_Item('SOLVER_FOR_TURBULENCE', 'cg', val, verbose) call String % To_Lower_Case(val) if( val .ne. 'bicg' .and. val .ne. 'cg') then diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Vof.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Vof.f90 index a2b6368a4..30078bd1b 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Vof.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Vof.f90 @@ -7,8 +7,7 @@ subroutine Control_Mod_Solver_For_Vof(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('SOLVER_FOR_VOF', 'cg', & - val, verbose) + call Control % Read_Char_Item('SOLVER_FOR_VOF', 'cg', val, verbose) call String % To_Lower_Case(val) if( val .ne. 'bicg' .and. val .ne. 'cg') then diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Wall_Distance.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Wall_Distance.f90 index 91bdc4f01..7f01abdb9 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Wall_Distance.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Wall_Distance.f90 @@ -7,8 +7,7 @@ subroutine Control_Mod_Solver_For_Wall_Distance(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('SOLVER_FOR_WALL_DISTANCE', 'cg', & - val, verbose) + call Control % Read_Char_Item('SOLVER_FOR_WALL_DISTANCE', 'cg', val, verbose) call String % To_Lower_Case(val) if( val .ne. 'bicg' .and. val .ne. 'cg') then diff --git a/Sources/Shared/Control_Mod/Native/Tolerance_For_Energy_Solver.f90 b/Sources/Shared/Control_Mod/Native/Tolerance_For_Energy_Solver.f90 index 7645b02e5..fecd7a12b 100644 --- a/Sources/Shared/Control_Mod/Native/Tolerance_For_Energy_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Tolerance_For_Energy_Solver.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Tolerance_For_Energy_Solver(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('TOLERANCE_FOR_ENERGY_SOLVER', & - 1.0e-6, val, verbose) + call Control % Read_Real_Item('TOLERANCE_FOR_ENERGY_SOLVER', & + 1.0e-6, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Tolerance_For_Momentum_Solver.f90 b/Sources/Shared/Control_Mod/Native/Tolerance_For_Momentum_Solver.f90 index 798e221fa..b655f2a2a 100644 --- a/Sources/Shared/Control_Mod/Native/Tolerance_For_Momentum_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Tolerance_For_Momentum_Solver.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Tolerance_For_Momentum_Solver(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('TOLERANCE_FOR_MOMENTUM_SOLVER', & - 1.0e-6, val, verbose) + call Control % Read_Real_Item('TOLERANCE_FOR_MOMENTUM_SOLVER', & + 1.0e-6, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Tolerance_For_Potential_Solver.f90 b/Sources/Shared/Control_Mod/Native/Tolerance_For_Potential_Solver.f90 index 4e29a4ab3..1cae221e2 100644 --- a/Sources/Shared/Control_Mod/Native/Tolerance_For_Potential_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Tolerance_For_Potential_Solver.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Tolerance_For_Potential_Solver(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('TOLERANCE_FOR_POTENTIAL_SOLVER', & - 1.0e-6, val, verbose) + call Control % Read_Real_Item('TOLERANCE_FOR_POTENTIAL_SOLVER', & + 1.0e-6, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Tolerance_For_Pressure_Solver.f90 b/Sources/Shared/Control_Mod/Native/Tolerance_For_Pressure_Solver.f90 index acbf72b74..b82e6d082 100644 --- a/Sources/Shared/Control_Mod/Native/Tolerance_For_Pressure_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Tolerance_For_Pressure_Solver.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Tolerance_For_Pressure_Solver(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('TOLERANCE_FOR_PRESSURE_SOLVER', & - 1.0e-6, val, verbose) + call Control % Read_Real_Item('TOLERANCE_FOR_PRESSURE_SOLVER', & + 1.0e-6, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Tolerance_For_Scalars_Solver.f90 b/Sources/Shared/Control_Mod/Native/Tolerance_For_Scalars_Solver.f90 index 40d83a40f..255bff813 100644 --- a/Sources/Shared/Control_Mod/Native/Tolerance_For_Scalars_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Tolerance_For_Scalars_Solver.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Tolerance_For_Scalars_Solver(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('TOLERANCE_FOR_SCALARS_SOLVER', & - 1.0e-6, val, verbose) + call Control % Read_Real_Item('TOLERANCE_FOR_SCALARS_SOLVER', & + 1.0e-6, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Tolerance_For_Turbulence_Solver.f90 b/Sources/Shared/Control_Mod/Native/Tolerance_For_Turbulence_Solver.f90 index 10250c16e..77995880d 100644 --- a/Sources/Shared/Control_Mod/Native/Tolerance_For_Turbulence_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Tolerance_For_Turbulence_Solver.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Tolerance_For_Turbulence_Solver(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('TOLERANCE_FOR_TURBULENCE_SOLVER', & - 1.0e-6, val, verbose) + call Control % Read_Real_Item('TOLERANCE_FOR_TURBULENCE_SOLVER', & + 1.0e-6, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Tolerance_For_Vof_Solver.f90 b/Sources/Shared/Control_Mod/Native/Tolerance_For_Vof_Solver.f90 index def106136..a96a4eaaa 100644 --- a/Sources/Shared/Control_Mod/Native/Tolerance_For_Vof_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Tolerance_For_Vof_Solver.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Tolerance_For_Vof_Solver(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('TOLERANCE_FOR_VOF_SOLVER', & - 1.0e-6, val, verbose) + call Control % Read_Real_Item('TOLERANCE_FOR_VOF_SOLVER', & + 1.0e-6, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Tolerance_For_Wall_Distance_Solver.f90 b/Sources/Shared/Control_Mod/Native/Tolerance_For_Wall_Distance_Solver.f90 index 6fd1e34c1..a250281b0 100644 --- a/Sources/Shared/Control_Mod/Native/Tolerance_For_Wall_Distance_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Tolerance_For_Wall_Distance_Solver.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Tolerance_For_Wall_Distance_Solver(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('TOLERANCE_FOR_WALL_DISTANCE_SOLVER', & - 1.0e-6, val, verbose) + call Control % Read_Real_Item('TOLERANCE_FOR_WALL_DISTANCE_SOLVER', & + 1.0e-6, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Energy.f90 b/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Energy.f90 index 502f89bab..71f9eba3f 100644 --- a/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Energy.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Energy.f90 @@ -9,8 +9,8 @@ subroutine Control_Mod_Advection_Scheme_For_Energy(scheme_name, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('ADVECTION_SCHEME_FOR_ENERGY', 'smart', & - scheme_name, verbose) + call Control % Read_Char_Item('ADVECTION_SCHEME_FOR_ENERGY', 'smart', & + scheme_name, verbose) call String % To_Upper_Case(scheme_name) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Momentum.f90 b/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Momentum.f90 index 0091e1af0..a26e91ff2 100644 --- a/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Momentum.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Momentum.f90 @@ -9,8 +9,8 @@ subroutine Control_Mod_Advection_Scheme_For_Momentum(scheme_name, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('ADVECTION_SCHEME_FOR_MOMENTUM', 'smart', & - scheme_name, verbose) + call Control % Read_Char_Item('ADVECTION_SCHEME_FOR_MOMENTUM', 'smart', & + scheme_name, verbose) call String % To_Upper_Case(scheme_name) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Scalars.f90 b/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Scalars.f90 index c0661d53a..5061e02c1 100644 --- a/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Scalars.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Scalars.f90 @@ -9,8 +9,8 @@ subroutine Control_Mod_Advection_Scheme_For_Scalars(scheme_name, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('ADVECTION_SCHEME_FOR_SCALARS', & - 'smart', scheme_name, verbose) + call Control % Read_Char_Item('ADVECTION_SCHEME_FOR_SCALARS', & + 'smart', scheme_name, verbose) call String % To_Upper_Case(scheme_name) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Turbulence.f90 b/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Turbulence.f90 index 8f604c57d..96502fb4f 100644 --- a/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Turbulence.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Turbulence.f90 @@ -9,8 +9,8 @@ subroutine Control_Mod_Advection_Scheme_For_Turbulence(scheme_name, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('ADVECTION_SCHEME_FOR_TURBULENCE', 'smart', & - scheme_name, verbose) + call Control % Read_Char_Item('ADVECTION_SCHEME_FOR_TURBULENCE', 'smart', & + scheme_name, verbose) call String % To_Upper_Case(scheme_name) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Vof.f90 b/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Vof.f90 index f1d1bcdd7..5f444302f 100644 --- a/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Vof.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Vof.f90 @@ -9,8 +9,8 @@ subroutine Control_Mod_Advection_Scheme_For_Vof(scheme_name, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('ADVECTION_SCHEME_FOR_VOF', & - 'upwind', scheme_name, verbose) + call Control % Read_Char_Item('ADVECTION_SCHEME_FOR_VOF', & + 'upwind', scheme_name, verbose) call String % To_Upper_Case(scheme_name) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Energy.f90 b/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Energy.f90 index 21c9c65f6..02278ca28 100644 --- a/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Energy.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Energy.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Blending_Coefficient_For_Energy(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('BLENDING_COEFFICIENT_FOR_ENERGY', 1.0, & - val, verbose) + call Control % Read_Real_Item('BLENDING_COEFFICIENT_FOR_ENERGY', 1.0, & + val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Momentum.f90 b/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Momentum.f90 index 0a3bf157f..4903ae200 100644 --- a/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Momentum.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Momentum.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Blending_Coefficient_For_Momentum(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('BLENDING_COEFFICIENT_FOR_MOMENTUM', 1.0, & - val, verbose) + call Control % Read_Real_Item('BLENDING_COEFFICIENT_FOR_MOMENTUM', 1.0, & + val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Scalars.f90 b/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Scalars.f90 index 1448f0a18..0066c9520 100644 --- a/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Scalars.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Scalars.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Blending_Coefficient_For_Scalars(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('BLENDING_COEFFICIENT_FOR_SCALARS', & - 1.0, val, verbose) + call Control % Read_Real_Item('BLENDING_COEFFICIENT_FOR_SCALARS', & + 1.0, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Turbulence.f90 b/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Turbulence.f90 index bed4fd1c9..46c7f42da 100644 --- a/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Turbulence.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Turbulence.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Blending_Coefficient_For_Turbulence(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('BLENDING_COEFFICIENT_FOR_TURBULENCE', 1.0, & - val, verbose) + call Control % Read_Real_Item('BLENDING_COEFFICIENT_FOR_TURBULENCE', 1.0, & + val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Vof.f90 b/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Vof.f90 index 1b4864e46..11acbbfba 100644 --- a/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Vof.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Vof.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Blending_Coefficient_For_Vof(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('BLENDING_COEFFICIENT_FOR_VOF', & - 1.0, val, verbose) + call Control % Read_Real_Item('BLENDING_COEFFICIENT_FOR_VOF', & + 1.0, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Choi_Correction.f90 b/Sources/Shared/Control_Mod/Numerics/Choi_Correction.f90 index 3a8e74600..20862a670 100644 --- a/Sources/Shared/Control_Mod/Numerics/Choi_Correction.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Choi_Correction.f90 @@ -9,7 +9,7 @@ subroutine Control_Mod_Choi_Correction(choi_correction, verbose) character(SL) :: val !==============================================================================! - call Control_Mod_Read_Char_Item('CHOI_CORRECTION', 'no', val, verbose) + call Control % Read_Char_Item('CHOI_CORRECTION', 'no', val, verbose) call String % To_Upper_Case(val) if( val .eq. 'YES' ) then diff --git a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Energy.f90 b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Energy.f90 index ba0e84129..9e852a313 100644 --- a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Energy.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Energy.f90 @@ -9,9 +9,9 @@ subroutine Control_Mod_Gradient_Method_For_Energy(scheme_name, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('GRADIENT_METHOD_FOR_ENERGY', & - 'least_squares', & - scheme_name, verbose) + call Control % Read_Char_Item('GRADIENT_METHOD_FOR_ENERGY', & + 'least_squares', & + scheme_name, verbose) call String % To_Upper_Case(scheme_name) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Momentum.f90 b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Momentum.f90 index 3a97bd608..b105df6d9 100644 --- a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Momentum.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Momentum.f90 @@ -9,9 +9,9 @@ subroutine Control_Mod_Gradient_Method_For_Momentum(scheme_name, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('GRADIENT_METHOD_FOR_MOMENTUM', & - 'least_squares', & - scheme_name, verbose) + call Control % Read_Char_Item('GRADIENT_METHOD_FOR_MOMENTUM', & + 'least_squares', & + scheme_name, verbose) call String % To_Upper_Case(scheme_name) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Pressure.f90 b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Pressure.f90 index 032787129..08ceb5c48 100644 --- a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Pressure.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Pressure.f90 @@ -9,9 +9,9 @@ subroutine Control_Mod_Gradient_Method_For_Pressure(scheme_name, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('GRADIENT_METHOD_FOR_PRESSURE', & - 'least_squares', & - scheme_name, verbose) + call Control % Read_Char_Item('GRADIENT_METHOD_FOR_PRESSURE', & + 'least_squares', & + scheme_name, verbose) call String % To_Upper_Case(scheme_name) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Scalars.f90 b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Scalars.f90 index e1a65e40d..252fe3d94 100644 --- a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Scalars.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Scalars.f90 @@ -9,9 +9,9 @@ subroutine Control_Mod_Gradient_Method_For_Scalars(scheme_name, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('GRADIENT_METHOD_FOR_SCALARS', & - 'least_squares', & - scheme_name, verbose) + call Control % Read_Char_Item('GRADIENT_METHOD_FOR_SCALARS', & + 'least_squares', & + scheme_name, verbose) call String % To_Upper_Case(scheme_name) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Turbulence.f90 b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Turbulence.f90 index face7c40d..718bbb8de 100644 --- a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Turbulence.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Turbulence.f90 @@ -9,9 +9,9 @@ subroutine Control_Mod_Gradient_Method_For_Turbulence(scheme_name, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('GRADIENT_METHOD_FOR_TURBULENCE', & - 'least_squares', & - scheme_name, verbose) + call Control % Read_Char_Item('GRADIENT_METHOD_FOR_TURBULENCE', & + 'least_squares', & + scheme_name, verbose) call String % To_Upper_Case(scheme_name) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Vof.f90 b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Vof.f90 index 09a81eb11..82cf35d48 100644 --- a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Vof.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Vof.f90 @@ -9,9 +9,9 @@ subroutine Control_Mod_Gradient_Method_For_Vof(scheme_name, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('GRADIENT_METHOD_FOR_VOF', & - 'least_squares', & - scheme_name, verbose) + call Control % Read_Char_Item('GRADIENT_METHOD_FOR_VOF', & + 'least_squares', & + scheme_name, verbose) call String % To_Upper_Case(scheme_name) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Wall_Distance.f90 b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Wall_Distance.f90 index 8ad5964ad..c1eb8d14c 100644 --- a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Wall_Distance.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Wall_Distance.f90 @@ -10,9 +10,9 @@ subroutine Control_Mod_Gradient_Method_For_Wall_Distance(scheme_name, & logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('GRADIENT_METHOD_FOR_WALL_DISTANCE', & - 'gauss_theorem', & - scheme_name, verbose) + call Control % Read_Char_Item('GRADIENT_METHOD_FOR_WALL_DISTANCE', & + 'gauss_theorem', & + scheme_name, verbose) call String % To_Upper_Case(scheme_name) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Gu_Correction.f90 b/Sources/Shared/Control_Mod/Numerics/Gu_Correction.f90 index f397d7a68..9fc676b65 100644 --- a/Sources/Shared/Control_Mod/Numerics/Gu_Correction.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Gu_Correction.f90 @@ -9,7 +9,7 @@ subroutine Control_Mod_Gu_Correction(gu_correction, verbose) character(SL) :: val !==============================================================================! - call Control_Mod_Read_Char_Item('GU_CORRECTION', 'no', val, verbose) + call Control % Read_Char_Item('GU_CORRECTION', 'no', val, verbose) call String % To_Upper_Case(val) if( val .eq. 'YES' ) then diff --git a/Sources/Shared/Control_Mod/Numerics/Max_Correction_Cycles_Beta_Vof.f90 b/Sources/Shared/Control_Mod/Numerics/Max_Correction_Cycles_Beta_Vof.f90 index 547cc0b3d..2609af5c0 100644 --- a/Sources/Shared/Control_Mod/Numerics/Max_Correction_Cycles_Beta_Vof.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Max_Correction_Cycles_Beta_Vof.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Max_Correction_Cycles_Beta_Vof(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('MAX_CORRECTION_CYCLES_BETA_VOF', & - 2, val, verbose) + call Control % Read_Int_Item('MAX_CORRECTION_CYCLES_BETA_VOF', & + 2, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Max_Courant_Vof.f90 b/Sources/Shared/Control_Mod/Numerics/Max_Courant_Vof.f90 index 99d6689cb..002c3eaad 100644 --- a/Sources/Shared/Control_Mod/Numerics/Max_Courant_Vof.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Max_Courant_Vof.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Max_Courant_Vof(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('MAX_COURANT_VOF', & - 0.25, val, verbose) + call Control % Read_Real_Item('MAX_COURANT_VOF', & + 0.25, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Max_Gauss_Gradients_Iterations.f90 b/Sources/Shared/Control_Mod/Numerics/Max_Gauss_Gradients_Iterations.f90 index 172bb4ae0..3e9bf3683 100644 --- a/Sources/Shared/Control_Mod/Numerics/Max_Gauss_Gradients_Iterations.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Max_Gauss_Gradients_Iterations.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Max_Gauss_Gradients_Iterations(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('MAX_GAUSS_GRADIENTS_ITERATIONS', 12, & - val, verbose) + call Control % Read_Int_Item('MAX_GAUSS_GRADIENTS_ITERATIONS', 12, & + val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Max_Least_Squares_Gradients_Iterations.f90 b/Sources/Shared/Control_Mod/Numerics/Max_Least_Squares_Gradients_Iterations.f90 index 8cbef9a49..88da7bbec 100644 --- a/Sources/Shared/Control_Mod/Numerics/Max_Least_Squares_Gradients_Iterations.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Max_Least_Squares_Gradients_Iterations.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Max_Least_Squares_Gradients_Iterations(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('MAX_LEAST_SQUARES_GRADIENTS_ITERATIONS', 4, & - val, verbose) + call Control % Read_Int_Item('MAX_LEAST_SQUARES_GRADIENTS_ITERATIONS', 4, & + val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Max_Simple_Iterations.f90 b/Sources/Shared/Control_Mod/Numerics/Max_Simple_Iterations.f90 index 32662b556..df3ee86b4 100644 --- a/Sources/Shared/Control_Mod/Numerics/Max_Simple_Iterations.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Max_Simple_Iterations.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Max_Simple_Iterations(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('MAX_SIMPLE_ITERATIONS', 12, & - val, verbose) + call Control % Read_Int_Item('MAX_SIMPLE_ITERATIONS', 12, & + val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Max_Smoothing_Cycles_Curvature_Vof.f90 b/Sources/Shared/Control_Mod/Numerics/Max_Smoothing_Cycles_Curvature_Vof.f90 index f8cea9b25..3661fde11 100644 --- a/Sources/Shared/Control_Mod/Numerics/Max_Smoothing_Cycles_Curvature_Vof.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Max_Smoothing_Cycles_Curvature_Vof.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Max_Smoothing_Cycles_Curvature_Vof(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('MAX_SMOOTHING_CYCLES_CURVATURE_VOF', & - 2, val, verbose) + call Control % Read_Int_Item('MAX_SMOOTHING_CYCLES_CURVATURE_VOF', & + 2, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Max_Smoothing_Cycles_Normal_Vof.f90 b/Sources/Shared/Control_Mod/Numerics/Max_Smoothing_Cycles_Normal_Vof.f90 index 62ebdca8d..7e87b1dc7 100644 --- a/Sources/Shared/Control_Mod/Numerics/Max_Smoothing_Cycles_Normal_Vof.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Max_Smoothing_Cycles_Normal_Vof.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Max_Smoothing_Cycles_Normal_Vof(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('MAX_SMOOTHING_CYCLES_NORMAL_VOF', & - 0, val, verbose) + call Control % Read_Int_Item('MAX_SMOOTHING_CYCLES_NORMAL_VOF', & + 0, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Max_Substep_Cycles_Vof.f90 b/Sources/Shared/Control_Mod/Numerics/Max_Substep_Cycles_Vof.f90 index c513739ca..f7402baf1 100644 --- a/Sources/Shared/Control_Mod/Numerics/Max_Substep_Cycles_Vof.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Max_Substep_Cycles_Vof.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Max_Substep_Cycles_Vof(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('MAX_SUBSTEP_CYCLES_VOF', & - 100, val, verbose) + call Control % Read_Int_Item('MAX_SUBSTEP_CYCLES_VOF', & + 100, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Min_Simple_Iterations.f90 b/Sources/Shared/Control_Mod/Numerics/Min_Simple_Iterations.f90 index f67cde185..de014d5eb 100644 --- a/Sources/Shared/Control_Mod/Numerics/Min_Simple_Iterations.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Min_Simple_Iterations.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Min_Simple_Iterations(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('MIN_SIMPLE_ITERATIONS', 3, & - val, verbose) + call Control % Read_Int_Item('MIN_SIMPLE_ITERATIONS', 3, & + val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Number_Of_Piso_Corrections.f90 b/Sources/Shared/Control_Mod/Numerics/Number_Of_Piso_Corrections.f90 index 74ac895b2..110ceb8b0 100644 --- a/Sources/Shared/Control_Mod/Numerics/Number_Of_Piso_Corrections.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Number_Of_Piso_Corrections.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Number_Of_Piso_Corrections(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('NUMBER_OF_PISO_CORRECTIONS', 3, & - val, verbose) + call Control % Read_Int_Item('NUMBER_OF_PISO_CORRECTIONS', 3, & + val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Number_Of_Time_Steps.f90 b/Sources/Shared/Control_Mod/Numerics/Number_Of_Time_Steps.f90 index e8d719951..559f9729e 100644 --- a/Sources/Shared/Control_Mod/Numerics/Number_Of_Time_Steps.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Number_Of_Time_Steps.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Number_Of_Time_Steps(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('NUMBER_OF_TIME_STEPS', 1200, & - val, verbose) + call Control % Read_Int_Item('NUMBER_OF_TIME_STEPS', 1200, & + val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Pressure_Momentum_Coupling.f90 b/Sources/Shared/Control_Mod/Numerics/Pressure_Momentum_Coupling.f90 index cca7eb04f..398c31380 100644 --- a/Sources/Shared/Control_Mod/Numerics/Pressure_Momentum_Coupling.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Pressure_Momentum_Coupling.f90 @@ -9,8 +9,8 @@ subroutine Control_Mod_Pressure_Momentum_Coupling(name, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('PRESSURE_MOMENTUM_COUPLING', & - 'simple', name, verbose=verbose) + call Control % Read_Char_Item('PRESSURE_MOMENTUM_COUPLING', & + 'simple', name, verbose=verbose) call String % To_Upper_Case(name) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Report_Volume_Balance.f90 b/Sources/Shared/Control_Mod/Numerics/Report_Volume_Balance.f90 index 45942af95..a087681e4 100644 --- a/Sources/Shared/Control_Mod/Numerics/Report_Volume_Balance.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Report_Volume_Balance.f90 @@ -9,8 +9,8 @@ subroutine Control_Mod_Report_Volume_Balance(vol_bal, verbose) character(SL) :: val !==============================================================================! - call Control_Mod_Read_Char_Item('REPORT_VOLUME_BALANCE', & - 'no', val, verbose) + call Control % Read_Char_Item('REPORT_VOLUME_BALANCE', & + 'no', val, verbose) call String % To_Upper_Case(val) if( val .eq. 'YES' ) then diff --git a/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Energy.f90 b/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Energy.f90 index 8bbb0e594..d6ef81010 100644 --- a/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Energy.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Energy.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Simple_Underrelaxation_For_Energy(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('SIMPLE_UNDERRELAXATION_FOR_ENERGY', 0.5, & - val, verbose) + call Control % Read_Real_Item('SIMPLE_UNDERRELAXATION_FOR_ENERGY', 0.5, & + val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Momentum.f90 b/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Momentum.f90 index f7966bf96..f1f2fbb07 100644 --- a/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Momentum.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Momentum.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Simple_Underrelaxation_For_Momentum(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('SIMPLE_UNDERRELAXATION_FOR_MOMENTUM', 0.6, & - val, verbose) + call Control % Read_Real_Item('SIMPLE_UNDERRELAXATION_FOR_MOMENTUM', 0.6, & + val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Pressure.f90 b/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Pressure.f90 index 3dbcb68f5..3a30f2e18 100644 --- a/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Pressure.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Pressure.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Simple_Underrelaxation_For_Pressure(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('SIMPLE_UNDERRELAXATION_FOR_PRESSURE', 0.4, & - val, verbose) + call Control % Read_Real_Item('SIMPLE_UNDERRELAXATION_FOR_PRESSURE', 0.4, & + val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Scalars.f90 b/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Scalars.f90 index 710a6a959..c5b6e025a 100644 --- a/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Scalars.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Scalars.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Simple_Underrelaxation_For_Scalars(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('SIMPLE_UNDERRELAXATION_FOR_SCALARS', & - 0.5, val, verbose) + call Control % Read_Real_Item('SIMPLE_UNDERRELAXATION_FOR_SCALARS', & + 0.5, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Turbulence.f90 b/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Turbulence.f90 index c7ae6e557..4a0ac03c0 100644 --- a/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Turbulence.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Turbulence.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Simple_Underrelaxation_For_Turbulence(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('SIMPLE_UNDERRELAXATION_FOR_TURBULENCE', & - 0.7, val, verbose) + call Control % Read_Real_Item('SIMPLE_UNDERRELAXATION_FOR_TURBULENCE', & + 0.7, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Vof.f90 b/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Vof.f90 index 20afa21e3..55aecca2d 100644 --- a/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Vof.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Vof.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Simple_Underrelaxation_For_Vof(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('SIMPLE_UNDERRELAXATION_FOR_VOF', & - 0.5, val, verbose) + call Control % Read_Real_Item('SIMPLE_UNDERRELAXATION_FOR_VOF', & + 0.5, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Skewness_Correction_Vof.f90 b/Sources/Shared/Control_Mod/Numerics/Skewness_Correction_Vof.f90 index 56080d543..97e430168 100644 --- a/Sources/Shared/Control_Mod/Numerics/Skewness_Correction_Vof.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Skewness_Correction_Vof.f90 @@ -9,8 +9,8 @@ subroutine Control_Mod_Skewness_Correction_Vof(skew_corr, verbose) character(SL) :: val !==============================================================================! - call Control_Mod_Read_Char_Item('SKEWNESS_CORRECTION_VOF', & - 'no', val, verbose) + call Control % Read_Char_Item('SKEWNESS_CORRECTION_VOF', & + 'no', val, verbose) call String % To_Upper_Case(val) if( val .eq. 'YES' ) then diff --git a/Sources/Shared/Control_Mod/Numerics/Time_Integration_Scheme.f90 b/Sources/Shared/Control_Mod/Numerics/Time_Integration_Scheme.f90 index a549b7d04..ccdea6fd0 100644 --- a/Sources/Shared/Control_Mod/Numerics/Time_Integration_Scheme.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Time_Integration_Scheme.f90 @@ -7,8 +7,8 @@ subroutine Control_Mod_Time_Integration_Scheme(scheme_name, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('TIME_INTEGRATION_SCHEME', 'linear', & - scheme_name, verbose) + call Control % Read_Char_Item('TIME_INTEGRATION_SCHEME', 'linear', & + scheme_name, verbose) call String % To_Upper_Case(scheme_name) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Time_Step.f90 b/Sources/Shared/Control_Mod/Numerics/Time_Step.f90 index 9a56f98e5..161d03b6d 100644 --- a/Sources/Shared/Control_Mod/Numerics/Time_Step.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Time_Step.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Time_Step(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('TIME_STEP', 1.0e-2, & - val, verbose) + call Control % Read_Real_Item('TIME_STEP', 1.0e-2, & + val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Tolerance_For_Gauss_Gradients.f90 b/Sources/Shared/Control_Mod/Numerics/Tolerance_For_Gauss_Gradients.f90 index 891e788ee..6fd045cef 100644 --- a/Sources/Shared/Control_Mod/Numerics/Tolerance_For_Gauss_Gradients.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Tolerance_For_Gauss_Gradients.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Tolerance_For_Gauss_Gradients(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('TOLERANCE_FOR_GAUSS_GRADIENTS', & - 1.0e-3, val, verbose) + call Control % Read_Real_Item('TOLERANCE_FOR_GAUSS_GRADIENTS', & + 1.0e-3, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Tolerance_For_Simple_Algorithm.f90 b/Sources/Shared/Control_Mod/Numerics/Tolerance_For_Simple_Algorithm.f90 index 6983fd22d..31f83f3a6 100644 --- a/Sources/Shared/Control_Mod/Numerics/Tolerance_For_Simple_Algorithm.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Tolerance_For_Simple_Algorithm.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Tolerance_For_Simple_Algorithm(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('TOLERANCE_FOR_SIMPLE_ALGORITHM', & - 1.0e-4, val, verbose) + call Control % Read_Real_Item('TOLERANCE_FOR_SIMPLE_ALGORITHM', & + 1.0e-4, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Angular_Velocity_Vector.f90 b/Sources/Shared/Control_Mod/Physics/Angular_Velocity_Vector.f90 index 1789fc990..43b5272c2 100644 --- a/Sources/Shared/Control_Mod/Physics/Angular_Velocity_Vector.f90 +++ b/Sources/Shared/Control_Mod/Physics/Angular_Velocity_Vector.f90 @@ -12,8 +12,8 @@ subroutine Control_Mod_Angular_Velocity_Vector(v_x, v_y, v_z, verbose) data def / 0.0, 0.0, 0.0 / - call Control_Mod_Read_Real_Array('ANGULAR_VELOCITY_VECTOR', 3, def, & - val, verbose) + call Control % Read_Real_Vector('ANGULAR_VELOCITY_VECTOR', 3, def, & + val, verbose) v_x = val(1) v_y = val(2) diff --git a/Sources/Shared/Control_Mod/Physics/Buoyancy.f90 b/Sources/Shared/Control_Mod/Physics/Buoyancy.f90 index f05f446de..9827ca7e5 100644 --- a/Sources/Shared/Control_Mod/Physics/Buoyancy.f90 +++ b/Sources/Shared/Control_Mod/Physics/Buoyancy.f90 @@ -9,7 +9,7 @@ subroutine Control_Mod_Buoyancy(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('BUOYANCY', 'none', val, verbose) + call Control % Read_Char_Item('BUOYANCY', 'none', val, verbose) call String % To_Upper_Case(val) diff --git a/Sources/Shared/Control_Mod/Physics/Dynamic_Viscosity.f90 b/Sources/Shared/Control_Mod/Physics/Dynamic_Viscosity.f90 index 6c904416f..5c346b01e 100644 --- a/Sources/Shared/Control_Mod/Physics/Dynamic_Viscosity.f90 +++ b/Sources/Shared/Control_Mod/Physics/Dynamic_Viscosity.f90 @@ -7,6 +7,6 @@ subroutine Control_Mod_Dynamic_Viscosity(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('DYNAMIC_VISCOSITY', 0.01, val, verbose) + call Control % Read_Real_Item('DYNAMIC_VISCOSITY', 0.01, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Extrapolate_Temperature_Exp.f90 b/Sources/Shared/Control_Mod/Physics/Extrapolate_Temperature_Exp.f90 index aa684b446..144009432 100644 --- a/Sources/Shared/Control_Mod/Physics/Extrapolate_Temperature_Exp.f90 +++ b/Sources/Shared/Control_Mod/Physics/Extrapolate_Temperature_Exp.f90 @@ -12,8 +12,8 @@ subroutine Control_Mod_Extrapolate_Temperature_Exp(temp_exp, & character(SL) :: val !==============================================================================! - call Control_Mod_Read_Char_Item('EXTRAPOLATE_TEMPERATURE_EXP', & - 'no', val, verbose) + call Control % Read_Char_Item('EXTRAPOLATE_TEMPERATURE_EXP', & + 'no', val, verbose) call String % To_Upper_Case(val) if( val .eq. 'YES' ) then diff --git a/Sources/Shared/Control_Mod/Physics/Gravitational_Vector.f90 b/Sources/Shared/Control_Mod/Physics/Gravitational_Vector.f90 index 638c9536a..be9a6fa9f 100644 --- a/Sources/Shared/Control_Mod/Physics/Gravitational_Vector.f90 +++ b/Sources/Shared/Control_Mod/Physics/Gravitational_Vector.f90 @@ -12,8 +12,7 @@ subroutine Control_Mod_Gravitational_Vector(grav_x, grav_y, grav_z, verbose) data def / 0.0, 0.0, 0.0 / - call Control_Mod_Read_Real_Array('GRAVITATIONAL_VECTOR', 3, def, & - val, verbose) + call Control % Read_Real_Vector('GRAVITATIONAL_VECTOR', 3, def, val, verbose) grav_x = val(1) grav_y = val(2) diff --git a/Sources/Shared/Control_Mod/Physics/Heat_Capacity.f90 b/Sources/Shared/Control_Mod/Physics/Heat_Capacity.f90 index f4a197da5..e9fad5e0e 100644 --- a/Sources/Shared/Control_Mod/Physics/Heat_Capacity.f90 +++ b/Sources/Shared/Control_Mod/Physics/Heat_Capacity.f90 @@ -7,6 +7,6 @@ subroutine Control_Mod_Heat_Capacity(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('HEAT_CAPACITY', 1.0, val, verbose) + call Control % Read_Real_Item('HEAT_CAPACITY', 1.0, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Heat_Transfer.f90 b/Sources/Shared/Control_Mod/Physics/Heat_Transfer.f90 index 109afe0a5..d82c46430 100644 --- a/Sources/Shared/Control_Mod/Physics/Heat_Transfer.f90 +++ b/Sources/Shared/Control_Mod/Physics/Heat_Transfer.f90 @@ -9,7 +9,7 @@ subroutine Control_Mod_Heat_Transfer(heat_transfer, verbose) character(SL) :: val !==============================================================================! - call Control_Mod_Read_Char_Item('HEAT_TRANSFER', 'no', val, verbose) + call Control % Read_Char_Item('HEAT_TRANSFER', 'no', val, verbose) call String % To_Upper_Case(val) if( val .eq. 'YES' ) then diff --git a/Sources/Shared/Control_Mod/Physics/Hybrid_Les_Rans_Switch.f90 b/Sources/Shared/Control_Mod/Physics/Hybrid_Les_Rans_Switch.f90 index 01189ae1b..7f8844552 100644 --- a/Sources/Shared/Control_Mod/Physics/Hybrid_Les_Rans_Switch.f90 +++ b/Sources/Shared/Control_Mod/Physics/Hybrid_Les_Rans_Switch.f90 @@ -9,9 +9,9 @@ subroutine Control_Mod_Hybrid_Les_Rans_Switch(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('HYBRID_LES_RANS_SWITCH', & - 'SWITCH_DISTANCE', & - val, verbose) + call Control % Read_Char_Item('HYBRID_LES_RANS_SWITCH', & + 'SWITCH_DISTANCE', & + val, verbose) call String % To_Upper_Case(val) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Interface_Tracking.f90 b/Sources/Shared/Control_Mod/Physics/Interface_Tracking.f90 index 829396d4b..ccaa33798 100644 --- a/Sources/Shared/Control_Mod/Physics/Interface_Tracking.f90 +++ b/Sources/Shared/Control_Mod/Physics/Interface_Tracking.f90 @@ -11,7 +11,7 @@ subroutine Control_Mod_Interface_Tracking(track_int, verbose) character(SL) :: val !==============================================================================! - call Control_Mod_Read_Char_Item('INTERFACE_TRACKING', 'no', val, verbose) + call Control % Read_Char_Item('INTERFACE_TRACKING', 'no', val, verbose) call String % To_Upper_Case(val) if( val .eq. 'YES' ) then diff --git a/Sources/Shared/Control_Mod/Physics/Latent_Heat.f90 b/Sources/Shared/Control_Mod/Physics/Latent_Heat.f90 index dd56d0f46..8843c0990 100644 --- a/Sources/Shared/Control_Mod/Physics/Latent_Heat.f90 +++ b/Sources/Shared/Control_Mod/Physics/Latent_Heat.f90 @@ -7,6 +7,6 @@ subroutine Control_Mod_Latent_Heat(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('LATENT_HEAT', 1.0, val, verbose) + call Control % Read_Real_Item('LATENT_HEAT', 1.0, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Mass_Density.f90 b/Sources/Shared/Control_Mod/Physics/Mass_Density.f90 index 24f32ef7a..d42e049a7 100644 --- a/Sources/Shared/Control_Mod/Physics/Mass_Density.f90 +++ b/Sources/Shared/Control_Mod/Physics/Mass_Density.f90 @@ -7,6 +7,6 @@ subroutine Control_Mod_Mass_Density(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('MASS_DENSITY', 1.0, val, verbose) + call Control % Read_Real_Item('MASS_DENSITY', 1.0, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Mass_Flow_Rates.f90 b/Sources/Shared/Control_Mod/Physics/Mass_Flow_Rates.f90 index c1adcde26..57b59d073 100644 --- a/Sources/Shared/Control_Mod/Physics/Mass_Flow_Rates.f90 +++ b/Sources/Shared/Control_Mod/Physics/Mass_Flow_Rates.f90 @@ -12,8 +12,7 @@ subroutine Control_Mod_Mass_Flow_Rates(b_x, b_y, b_z, verbose) def = 0.0 - call Control_Mod_Read_Real_Array('MASS_FLOW_RATES', 3, def, & - val, verbose) + call Control % Read_Real_Vector('MASS_FLOW_RATES', 3, def, val, verbose) b_x = val(1) b_y = val(2) diff --git a/Sources/Shared/Control_Mod/Physics/Mass_Transfer.f90 b/Sources/Shared/Control_Mod/Physics/Mass_Transfer.f90 index ee6090982..a8c67a46b 100644 --- a/Sources/Shared/Control_Mod/Physics/Mass_Transfer.f90 +++ b/Sources/Shared/Control_Mod/Physics/Mass_Transfer.f90 @@ -9,7 +9,7 @@ subroutine Control_Mod_Mass_Transfer(phase_change, verbose) character(SL) :: val !==============================================================================! - call Control_Mod_Read_Char_Item('MASS_TRANSFER', 'no', val, verbose) + call Control % Read_Char_Item('MASS_TRANSFER', 'no', val, verbose) call String % To_Upper_Case(val) if( val .eq. 'YES' ) then diff --git a/Sources/Shared/Control_Mod/Physics/Max_Particles.f90 b/Sources/Shared/Control_Mod/Physics/Max_Particles.f90 index 8652e456e..636e96733 100644 --- a/Sources/Shared/Control_Mod/Physics/Max_Particles.f90 +++ b/Sources/Shared/Control_Mod/Physics/Max_Particles.f90 @@ -7,7 +7,6 @@ subroutine Control_Mod_Max_Particles(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('MAX_PARTICLES', 0, & - val, verbose) + call Control % Read_Int_Item('MAX_PARTICLES', 0, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Number_Of_Domains.f90 b/Sources/Shared/Control_Mod/Physics/Number_Of_Domains.f90 index 65a08f294..c2d6d04bb 100644 --- a/Sources/Shared/Control_Mod/Physics/Number_Of_Domains.f90 +++ b/Sources/Shared/Control_Mod/Physics/Number_Of_Domains.f90 @@ -7,7 +7,6 @@ subroutine Control_Mod_Number_Of_Domains(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('NUMBER_OF_DOMAINS', 1, & - val, verbose) + call Control % Read_Int_Item('NUMBER_OF_DOMAINS', 1, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Number_Of_Phases.f90 b/Sources/Shared/Control_Mod/Physics/Number_Of_Phases.f90 index bc46a3e05..31bda8dc9 100644 --- a/Sources/Shared/Control_Mod/Physics/Number_Of_Phases.f90 +++ b/Sources/Shared/Control_Mod/Physics/Number_Of_Phases.f90 @@ -7,7 +7,6 @@ subroutine Control_Mod_Number_Of_Phases(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('NUMBER_OF_PHASES', 1, & - val, verbose) + call Control % Read_Int_Item('NUMBER_OF_PHASES', 1, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Number_Of_Scalars.f90 b/Sources/Shared/Control_Mod/Physics/Number_Of_Scalars.f90 index 7ac4744c8..f75e53579 100644 --- a/Sources/Shared/Control_Mod/Physics/Number_Of_Scalars.f90 +++ b/Sources/Shared/Control_Mod/Physics/Number_Of_Scalars.f90 @@ -9,6 +9,6 @@ subroutine Control_Mod_Number_Of_Scalars(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('NUMBER_OF_SCALARS', 0, val, verbose) + call Control % Read_Int_Item('NUMBER_OF_SCALARS', 0, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Number_Of_Swarm_Sub_Steps.f90 b/Sources/Shared/Control_Mod/Physics/Number_Of_Swarm_Sub_Steps.f90 index 64258b32b..c7bd6fb44 100644 --- a/Sources/Shared/Control_Mod/Physics/Number_Of_Swarm_Sub_Steps.f90 +++ b/Sources/Shared/Control_Mod/Physics/Number_Of_Swarm_Sub_Steps.f90 @@ -7,7 +7,6 @@ subroutine Control_Mod_Number_Of_Swarm_Sub_Steps(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('NUMBER_OF_SWARM_SUB_STEPS', 60, & - val, verbose) + call Control % Read_Int_Item('NUMBER_OF_SWARM_SUB_STEPS', 60, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Particle_Tracking.f90 b/Sources/Shared/Control_Mod/Physics/Particle_Tracking.f90 index 2b6bfc436..d1cccf722 100644 --- a/Sources/Shared/Control_Mod/Physics/Particle_Tracking.f90 +++ b/Sources/Shared/Control_Mod/Physics/Particle_Tracking.f90 @@ -11,7 +11,7 @@ subroutine Control_Mod_Particle_Tracking(track_part, verbose) character(SL) :: val !==============================================================================! - call Control_Mod_Read_Char_Item('PARTICLE_TRACKING', 'no', val, verbose) + call Control % Read_Char_Item('PARTICLE_TRACKING', 'no', val, verbose) call String % To_Upper_Case(val) if( val .eq. 'YES' ) then diff --git a/Sources/Shared/Control_Mod/Physics/Phase_Capacities.f90 b/Sources/Shared/Control_Mod/Physics/Phase_Capacities.f90 index fd5c33534..ca12733ef 100644 --- a/Sources/Shared/Control_Mod/Physics/Phase_Capacities.f90 +++ b/Sources/Shared/Control_Mod/Physics/Phase_Capacities.f90 @@ -13,6 +13,6 @@ subroutine Control_Mod_Phase_Capacities(val, verbose) def = 1.0 - call Control_Mod_Read_Real_Array('PHASE_CAPACITIES', 2, def, val, verbose) + call Control % Read_Real_Vector('PHASE_CAPACITIES', 2, def, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Phase_Conductivities.f90 b/Sources/Shared/Control_Mod/Physics/Phase_Conductivities.f90 index 071432c95..2b86040fc 100644 --- a/Sources/Shared/Control_Mod/Physics/Phase_Conductivities.f90 +++ b/Sources/Shared/Control_Mod/Physics/Phase_Conductivities.f90 @@ -13,6 +13,6 @@ subroutine Control_Mod_Phase_Conductivities(val, verbose) def = 1.0 - call Control_Mod_Read_Real_Array('PHASE_CONDUCTIVITIES', 2, def, val, verbose) + call Control % Read_Real_Vector('PHASE_CONDUCTIVITIES', 2, def, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Phase_Densities.f90 b/Sources/Shared/Control_Mod/Physics/Phase_Densities.f90 index 4707f7af8..124f7856e 100644 --- a/Sources/Shared/Control_Mod/Physics/Phase_Densities.f90 +++ b/Sources/Shared/Control_Mod/Physics/Phase_Densities.f90 @@ -13,6 +13,6 @@ subroutine Control_Mod_Phase_Densities(val, verbose) def = 1.0 - call Control_Mod_Read_Real_Array('PHASE_DENSITIES', 2, def, val, verbose) + call Control % Read_Real_Vector('PHASE_DENSITIES', 2, def, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Phase_Viscosities.f90 b/Sources/Shared/Control_Mod/Physics/Phase_Viscosities.f90 index 7bb655ee4..f55550563 100644 --- a/Sources/Shared/Control_Mod/Physics/Phase_Viscosities.f90 +++ b/Sources/Shared/Control_Mod/Physics/Phase_Viscosities.f90 @@ -13,6 +13,6 @@ subroutine Control_Mod_Phase_Viscosities(val, verbose) def = 1.0 - call Control_Mod_Read_Real_Array('PHASE_VISCOSITIES', 2, def, val, verbose) + call Control % Read_Real_Vector('PHASE_VISCOSITIES', 2, def, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Point_For_Monitoring_Planes.f90 b/Sources/Shared/Control_Mod/Physics/Point_For_Monitoring_Planes.f90 index 2e3e0265f..31e3fce1e 100644 --- a/Sources/Shared/Control_Mod/Physics/Point_For_Monitoring_Planes.f90 +++ b/Sources/Shared/Control_Mod/Physics/Point_For_Monitoring_Planes.f90 @@ -13,8 +13,8 @@ subroutine Control_Mod_Point_For_Monitoring_Planes(b_xp, b_yp, b_zp, & data def / 0.0, 0.0, 0.0 / - call Control_Mod_Read_Real_Array('POINT_FOR_MONITORING_PLANES', 3, def, & - val, verbose) + call Control % Read_Real_Vector('POINT_FOR_MONITORING_PLANES', 3, def, & + val, verbose) b_xp = val(1) b_yp = val(2) b_zp = val(3) diff --git a/Sources/Shared/Control_Mod/Physics/Potential_Initialization.f90 b/Sources/Shared/Control_Mod/Physics/Potential_Initialization.f90 index 656175e75..33eb80b39 100644 --- a/Sources/Shared/Control_Mod/Physics/Potential_Initialization.f90 +++ b/Sources/Shared/Control_Mod/Physics/Potential_Initialization.f90 @@ -11,8 +11,7 @@ subroutine Control_Mod_Potential_Initialization(pot_init, verbose) character(SL) :: val !==============================================================================! - call Control_Mod_Read_Char_Item('POTENTIAL_INITIALIZATION', 'no', & - val, verbose) + call Control % Read_Char_Item('POTENTIAL_INITIALIZATION', 'no', val, verbose) call String % To_Upper_Case(val) select case(val) diff --git a/Sources/Shared/Control_Mod/Physics/Pressure_Drops.f90 b/Sources/Shared/Control_Mod/Physics/Pressure_Drops.f90 index 1798b97e4..0488b891a 100644 --- a/Sources/Shared/Control_Mod/Physics/Pressure_Drops.f90 +++ b/Sources/Shared/Control_Mod/Physics/Pressure_Drops.f90 @@ -12,8 +12,8 @@ subroutine Control_Mod_Pressure_Drops(p_drop_x, p_drop_y, p_drop_z, verbose) data def / 0.0, 0.0, 0.0 / - call Control_Mod_Read_Real_Array('PRESSURE_DROPS', 3, def, & - val, verbose) + call Control % Read_Real_Vector('PRESSURE_DROPS', 3, def, val, verbose) + p_drop_x = val(1) p_drop_y = val(2) p_drop_z = val(3) diff --git a/Sources/Shared/Control_Mod/Physics/Reference_Density.f90 b/Sources/Shared/Control_Mod/Physics/Reference_Density.f90 index 8a642e8c5..f7fea54dc 100644 --- a/Sources/Shared/Control_Mod/Physics/Reference_Density.f90 +++ b/Sources/Shared/Control_Mod/Physics/Reference_Density.f90 @@ -11,6 +11,6 @@ subroutine Control_Mod_Reference_Density(d_ref, verbose) def = 0.0 - call Control_Mod_Read_Real_Item('REFERENCE_DENSITY', def, d_ref, verbose) + call Control % Read_Real_Item('REFERENCE_DENSITY', def, d_ref, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Reference_Temperature.f90 b/Sources/Shared/Control_Mod/Physics/Reference_Temperature.f90 index 3b89ab02d..08e6c5c94 100644 --- a/Sources/Shared/Control_Mod/Physics/Reference_Temperature.f90 +++ b/Sources/Shared/Control_Mod/Physics/Reference_Temperature.f90 @@ -11,6 +11,6 @@ subroutine Control_Mod_Reference_Temperature(t_ref, verbose) def = 0.0 - call Control_Mod_Read_Real_Item('REFERENCE_TEMPERATURE', def, t_ref, verbose) + call Control % Read_Real_Item('REFERENCE_TEMPERATURE', def, t_ref, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Rough_Walls.f90 b/Sources/Shared/Control_Mod/Physics/Rough_Walls.f90 index 177487fa0..41ed80148 100644 --- a/Sources/Shared/Control_Mod/Physics/Rough_Walls.f90 +++ b/Sources/Shared/Control_Mod/Physics/Rough_Walls.f90 @@ -11,8 +11,7 @@ subroutine Control_Mod_Rough_Walls(rough_walls, verbose) character(SL) :: val !==============================================================================! - call Control_Mod_Read_Char_Item('ROUGH_WALLS', 'no', & - val, verbose) + call Control % Read_Char_Item('ROUGH_WALLS', 'no', val, verbose) call String % To_Upper_Case(val) select case(val) diff --git a/Sources/Shared/Control_Mod/Physics/Roughness_Coefficient.f90 b/Sources/Shared/Control_Mod/Physics/Roughness_Coefficient.f90 index 20b54bd9b..2ff39dd4e 100644 --- a/Sources/Shared/Control_Mod/Physics/Roughness_Coefficient.f90 +++ b/Sources/Shared/Control_Mod/Physics/Roughness_Coefficient.f90 @@ -9,8 +9,7 @@ subroutine Control_Mod_Roughness_Coefficient(val, verbose) real :: con !==============================================================================! - call Control_Mod_Read_Real_Item('ROUGHNESS_COEFFICIENT', 0.0, & - con, verbose) + call Control % Read_Real_Item('ROUGHNESS_COEFFICIENT', 0.0, con, verbose) ! Set the same value everywhere val(:) = con diff --git a/Sources/Shared/Control_Mod/Physics/Saturation_Temperature.f90 b/Sources/Shared/Control_Mod/Physics/Saturation_Temperature.f90 index f853c024b..bf8607df9 100644 --- a/Sources/Shared/Control_Mod/Physics/Saturation_Temperature.f90 +++ b/Sources/Shared/Control_Mod/Physics/Saturation_Temperature.f90 @@ -7,6 +7,6 @@ subroutine Control_Mod_Saturation_Temperature(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('SATURATION_TEMPERATURE', 100., val, verbose) + call Control % Read_Real_Item('SATURATION_TEMPERATURE', 100., val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Scalars_Diffusivity.f90 b/Sources/Shared/Control_Mod/Physics/Scalars_Diffusivity.f90 index 0df35d0f5..eda945485 100644 --- a/Sources/Shared/Control_Mod/Physics/Scalars_Diffusivity.f90 +++ b/Sources/Shared/Control_Mod/Physics/Scalars_Diffusivity.f90 @@ -7,6 +7,6 @@ subroutine Control_Mod_Scalars_Diffusivity(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('SCALARS_DIFFUSIVITY', 1.0e-6, val, verbose) + call Control % Read_Real_Item('SCALARS_DIFFUSIVITY', 1.0e-6, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Smagorinsky_Constant.f90 b/Sources/Shared/Control_Mod/Physics/Smagorinsky_Constant.f90 index d681b3091..27e022350 100644 --- a/Sources/Shared/Control_Mod/Physics/Smagorinsky_Constant.f90 +++ b/Sources/Shared/Control_Mod/Physics/Smagorinsky_Constant.f90 @@ -7,7 +7,6 @@ subroutine Control_Mod_Smagorinsky_Constant(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('SMAGORINSKY_CONSTANT', 0.17, & - val, verbose) + call Control % Read_Real_Item('SMAGORINSKY_CONSTANT', 0.17, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Computation.f90 b/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Computation.f90 index 7d9e74a75..00eaa331a 100644 --- a/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Computation.f90 +++ b/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Computation.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Starting_Time_Step_For_Swarm_Computation(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('STARTING_TIME_STEP_FOR_SWARM_COMPUTATION', & - 1200, val, verbose) + call Control % Read_Int_Item('STARTING_TIME_STEP_FOR_SWARM_COMPUTATION', & + 1200, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Statistics.f90 b/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Statistics.f90 index 95eea64b6..1bd6c18df 100644 --- a/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Statistics.f90 +++ b/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Statistics.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Starting_Time_Step_For_Swarm_Statistics(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('STARTING_TIME_STEP_FOR_SWARM_STATISTICS', & - HUGE_INT, val, verbose) + call Control % Read_Int_Item('STARTING_TIME_STEP_FOR_SWARM_STATISTICS', & + HUGE_INT, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Turb_Statistics.f90 b/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Turb_Statistics.f90 index 0333b529b..15423ef5f 100644 --- a/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Turb_Statistics.f90 +++ b/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Turb_Statistics.f90 @@ -7,7 +7,7 @@ subroutine Control_Mod_Starting_Time_Step_For_Turb_Statistics(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Int_Item('STARTING_TIME_STEP_FOR_TURB_STATISTICS', & - HUGE_INT, val, verbose) + call Control % Read_Int_Item('STARTING_TIME_STEP_FOR_TURB_STATISTICS', & + HUGE_INT, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Surface_Tension.f90 b/Sources/Shared/Control_Mod/Physics/Surface_Tension.f90 index aebfc8022..aa801aaef 100644 --- a/Sources/Shared/Control_Mod/Physics/Surface_Tension.f90 +++ b/Sources/Shared/Control_Mod/Physics/Surface_Tension.f90 @@ -7,6 +7,6 @@ subroutine Control_Mod_Surface_Tension(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('SURFACE_TENSION', 0.0, val, verbose) + call Control % Read_Real_Item('SURFACE_TENSION', 0.0, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Swarm_Coefficient_Of_Restitution.f90 b/Sources/Shared/Control_Mod/Physics/Swarm_Coefficient_Of_Restitution.f90 index 4ec1caaeb..a55a37fee 100644 --- a/Sources/Shared/Control_Mod/Physics/Swarm_Coefficient_Of_Restitution.f90 +++ b/Sources/Shared/Control_Mod/Physics/Swarm_Coefficient_Of_Restitution.f90 @@ -11,7 +11,7 @@ subroutine Control_Mod_Swarm_Coefficient_Of_Restitution(cor, verbose) def = 1.0 - call Control_Mod_Read_Real_Item('SWARM_COEFFICIENT_OF_RESTITUTION', & - def, cor, verbose) + call Control % Read_Real_Item('SWARM_COEFFICIENT_OF_RESTITUTION', & + def, cor, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Swarm_Density.f90 b/Sources/Shared/Control_Mod/Physics/Swarm_Density.f90 index 6ec9b83d6..bb38442e4 100644 --- a/Sources/Shared/Control_Mod/Physics/Swarm_Density.f90 +++ b/Sources/Shared/Control_Mod/Physics/Swarm_Density.f90 @@ -11,6 +11,6 @@ subroutine Control_Mod_Swarm_Density(s_den, verbose) def = 1000.0 - call Control_Mod_Read_Real_Item('SWARM_DENSITY', def, s_den, verbose) + call Control % Read_Real_Item('SWARM_DENSITY', def, s_den, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Swarm_Diameter.f90 b/Sources/Shared/Control_Mod/Physics/Swarm_Diameter.f90 index d52b2ba31..999105239 100644 --- a/Sources/Shared/Control_Mod/Physics/Swarm_Diameter.f90 +++ b/Sources/Shared/Control_Mod/Physics/Swarm_Diameter.f90 @@ -11,6 +11,6 @@ subroutine Control_Mod_Swarm_Diameter(s_dia, verbose) def = 2.5e-5 - call Control_Mod_Read_Real_Item('SWARM_DIAMETER', def, s_dia, verbose) + call Control % Read_Real_Item('SWARM_DIAMETER', def, s_dia, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Swarm_Subgrid_Scale_Model.f90 b/Sources/Shared/Control_Mod/Physics/Swarm_Subgrid_Scale_Model.f90 index 225baa5d8..05b6de059 100644 --- a/Sources/Shared/Control_Mod/Physics/Swarm_Subgrid_Scale_Model.f90 +++ b/Sources/Shared/Control_Mod/Physics/Swarm_Subgrid_Scale_Model.f90 @@ -9,7 +9,7 @@ subroutine Control_Mod_Swarm_Subgrid_Scale_Model(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('SWARM_SUBGRID_SCALE_MODEL', & - 'none', val, verbose) + call Control % Read_Char_Item('SWARM_SUBGRID_SCALE_MODEL', & + 'none', val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Thermal_Conductivity.f90 b/Sources/Shared/Control_Mod/Physics/Thermal_Conductivity.f90 index bc36831c8..5c9c077d4 100644 --- a/Sources/Shared/Control_Mod/Physics/Thermal_Conductivity.f90 +++ b/Sources/Shared/Control_Mod/Physics/Thermal_Conductivity.f90 @@ -7,6 +7,6 @@ subroutine Control_Mod_Thermal_Conductivity(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('THERMAL_CONDUCTIVITY', 1.0, val, verbose) + call Control % Read_Real_Item('THERMAL_CONDUCTIVITY', 1.0, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Track_Front.f90 b/Sources/Shared/Control_Mod/Physics/Track_Front.f90 index 9f084dca5..d317a31e4 100644 --- a/Sources/Shared/Control_Mod/Physics/Track_Front.f90 +++ b/Sources/Shared/Control_Mod/Physics/Track_Front.f90 @@ -9,7 +9,7 @@ subroutine Control_Mod_Track_Front(track_front, verbose) character(SL) :: val !==============================================================================! - call Control_Mod_Read_Char_Item('TRACK_FRONT', 'no', val, verbose) + call Control % Read_Char_Item('TRACK_FRONT', 'no', val, verbose) call String % To_Upper_Case(val) if( val .eq. 'YES' ) then diff --git a/Sources/Shared/Control_Mod/Physics/Track_Surface.f90 b/Sources/Shared/Control_Mod/Physics/Track_Surface.f90 index 6abd17bc8..daf1b0e58 100644 --- a/Sources/Shared/Control_Mod/Physics/Track_Surface.f90 +++ b/Sources/Shared/Control_Mod/Physics/Track_Surface.f90 @@ -9,7 +9,7 @@ subroutine Control_Mod_Track_Surface(track_surf, verbose) character(SL) :: val !==============================================================================! - call Control_Mod_Read_Char_Item('TRACK_SURFACE', 'no', val, verbose) + call Control % Read_Char_Item('TRACK_SURFACE', 'no', val, verbose) call String % To_Upper_Case(val) if( val .eq. 'YES' ) then diff --git a/Sources/Shared/Control_Mod/Physics/Turbulence_Model.f90 b/Sources/Shared/Control_Mod/Physics/Turbulence_Model.f90 index b43853def..eeddf7217 100644 --- a/Sources/Shared/Control_Mod/Physics/Turbulence_Model.f90 +++ b/Sources/Shared/Control_Mod/Physics/Turbulence_Model.f90 @@ -9,8 +9,7 @@ subroutine Control_Mod_Turbulence_Model(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('TURBULENCE_MODEL', 'none', & - val, verbose) + call Control % Read_Char_Item('TURBULENCE_MODEL', 'none', val, verbose) call String % To_Upper_Case(val) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Turbulence_Model_Variant.f90 b/Sources/Shared/Control_Mod/Physics/Turbulence_Model_Variant.f90 index d6191f7d0..1f3a5ecbf 100644 --- a/Sources/Shared/Control_Mod/Physics/Turbulence_Model_Variant.f90 +++ b/Sources/Shared/Control_Mod/Physics/Turbulence_Model_Variant.f90 @@ -9,8 +9,8 @@ subroutine Control_Mod_Turbulence_Model_Variant(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('TURBULENCE_MODEL_VARIANT', 'stabilized', & - val, verbose) + call Control % Read_Char_Item('TURBULENCE_MODEL_VARIANT', 'stabilized', & + val, verbose) call String % To_Upper_Case(val) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Turbulent_Heat_Flux_Model.f90 b/Sources/Shared/Control_Mod/Physics/Turbulent_Heat_Flux_Model.f90 index c3f21fb2c..82c7feb58 100644 --- a/Sources/Shared/Control_Mod/Physics/Turbulent_Heat_Flux_Model.f90 +++ b/Sources/Shared/Control_Mod/Physics/Turbulent_Heat_Flux_Model.f90 @@ -9,8 +9,8 @@ subroutine Control_Mod_Turbulent_Heat_Flux_Model(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('TURBULENT_HEAT_FLUX_MODEL', 'SGDH', & - val, verbose) + call Control % Read_Char_Item('TURBULENT_HEAT_FLUX_MODEL', 'SGDH', & + val, verbose) call String % To_Upper_Case(val) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Turbulent_Prandtl_Number.f90 b/Sources/Shared/Control_Mod/Physics/Turbulent_Prandtl_Number.f90 index 98b8c8eda..719263dd0 100644 --- a/Sources/Shared/Control_Mod/Physics/Turbulent_Prandtl_Number.f90 +++ b/Sources/Shared/Control_Mod/Physics/Turbulent_Prandtl_Number.f90 @@ -7,7 +7,6 @@ subroutine Control_Mod_Turbulent_Prandtl_Number(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('TURBULENT_PRANDTL_NUMBER', 0.9, & - val, verbose) + call Control % Read_Real_Item('TURBULENT_PRANDTL_NUMBER', 0.9, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Turbulent_Scalar_Flux_Model.f90 b/Sources/Shared/Control_Mod/Physics/Turbulent_Scalar_Flux_Model.f90 index 3b19a5acb..5d2b6276e 100644 --- a/Sources/Shared/Control_Mod/Physics/Turbulent_Scalar_Flux_Model.f90 +++ b/Sources/Shared/Control_Mod/Physics/Turbulent_Scalar_Flux_Model.f90 @@ -9,8 +9,8 @@ subroutine Control_Mod_Turbulent_Scalar_Flux_Model(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Char_Item('TURBULENT_SCALAR_FLUX_MODEL', 'SGDH', & - val, verbose) + call Control % Read_Char_Item('TURBULENT_SCALAR_FLUX_MODEL', 'SGDH', & + val, verbose) call String % To_Upper_Case(val) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Turbulent_Schmidt_Number.f90 b/Sources/Shared/Control_Mod/Physics/Turbulent_Schmidt_Number.f90 index c02c2659b..e80270fd3 100644 --- a/Sources/Shared/Control_Mod/Physics/Turbulent_Schmidt_Number.f90 +++ b/Sources/Shared/Control_Mod/Physics/Turbulent_Schmidt_Number.f90 @@ -7,7 +7,6 @@ subroutine Control_Mod_Turbulent_Schmidt_Number(val, verbose) logical, optional :: verbose !==============================================================================! - call Control_Mod_Read_Real_Item('TURBULENT_SCHMIDT_NUMBER', 0.9, & - val, verbose) + call Control % Read_Real_Item('TURBULENT_SCHMIDT_NUMBER', 0.9, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Physics/Volume_Expansion_Coefficient.f90 b/Sources/Shared/Control_Mod/Physics/Volume_Expansion_Coefficient.f90 index bd9c02809..bb4a5112e 100644 --- a/Sources/Shared/Control_Mod/Physics/Volume_Expansion_Coefficient.f90 +++ b/Sources/Shared/Control_Mod/Physics/Volume_Expansion_Coefficient.f90 @@ -11,7 +11,7 @@ subroutine Control_Mod_Volume_Expansion_Coefficient(cor, verbose) def = 1.0 - call Control_Mod_Read_Real_Item('VOLUME_EXPANSION_COEFFICIENT', & - def, cor, verbose) + call Control % Read_Real_Item('VOLUME_EXPANSION_COEFFICIENT', & + def, cor, verbose) end subroutine From c5877f63900a74ec44f24d0609c0c6b48e07bd5b Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 2 Apr 2023 17:50:11 +0200 Subject: [PATCH 184/223] Modernizing Control_Mod; step 2 On branch bojan_more_robust_communicator modified: Process/Backup_Mod/Load.f90 modified: Process/Info_Mod/Start_Info.f90 modified: Process/Main_Pro.f90 modified: Process/Process_Mod/Compute_Pressure.f90 modified: Process/Read_Controls_Mod/Native_Solvers.f90 modified: Process/Vof_Mod/Core/Solve_System.f90 modified: Shared/Control_Mod.f90 modified: Shared/Control_Mod/Input_Output/Backup_Save_Interval.f90 modified: Shared/Control_Mod/Input_Output/Load_Backup_Name.f90 modified: Shared/Control_Mod/Input_Output/Load_Initial_Solution_Name.f90 modified: Shared/Control_Mod/Input_Output/Problem_Name.f90 modified: Shared/Control_Mod/Input_Output/Profiler_Info.f90 modified: Shared/Control_Mod/Input_Output/Results_Save_Interval.f90 modified: Shared/Control_Mod/Input_Output/Save_Backup_Name.f90 modified: Shared/Control_Mod/Input_Output/Save_Initial_Condition.f90 modified: Shared/Control_Mod/Input_Output/Save_Initial_Solution_Name.f90 modified: Shared/Control_Mod/Input_Output/Save_Results_At_Boundaries.f90 modified: Shared/Control_Mod/Input_Output/Swarm_Save_Interval.f90 modified: Shared/Control_Mod/Input_Output/Wall_Time_Max_Hours.f90 modified: Shared/Control_Mod/Native/Max_Iterations_For_Energy_Solver.f90 modified: Shared/Control_Mod/Native/Max_Iterations_For_Momentum_Solver.f90 modified: Shared/Control_Mod/Native/Max_Iterations_For_Potential_Solver.f90 renamed: Shared/Control_Mod/Native/Max_Iterations_For_Presssure_Solver.f90 -> Shared/Control_Mod/Native/Max_Iterations_For_Pressure_Solver.f90 modified: Shared/Control_Mod/Native/Max_Iterations_For_Scalars_Solver.f90 modified: Shared/Control_Mod/Native/Max_Iterations_For_Turbulence_Solver.f90 modified: Shared/Control_Mod/Native/Max_Iterations_For_Vof_Solver.f90 modified: Shared/Control_Mod/Native/Max_Iterations_For_Wall_Distance_Solver.f90 modified: Shared/Control_Mod/Native/Normalization_For_Energy_Solver.f90 modified: Shared/Control_Mod/Native/Normalization_For_Momentum_Solver.f90 modified: Shared/Control_Mod/Native/Normalization_For_Pressure_Solver.f90 modified: Shared/Control_Mod/Native/Normalization_For_Scalars_Solver.f90 modified: Shared/Control_Mod/Native/Normalization_For_Turbulence_Solver.f90 modified: Shared/Control_Mod/Native/Preconditioner_For_System_Matrix.f90 modified: Shared/Control_Mod/Native/Solver_For_Energy.f90 modified: Shared/Control_Mod/Native/Solver_For_Momentum.f90 modified: Shared/Control_Mod/Native/Solver_For_Potential.f90 modified: Shared/Control_Mod/Native/Solver_For_Pressure.f90 modified: Shared/Control_Mod/Native/Solver_For_Scalars.f90 modified: Shared/Control_Mod/Native/Solver_For_Turbulence.f90 modified: Shared/Control_Mod/Native/Solver_For_Vof.f90 modified: Shared/Control_Mod/Native/Solver_For_Wall_Distance.f90 modified: Shared/Control_Mod/Native/Tolerance_For_Energy_Solver.f90 modified: Shared/Control_Mod/Native/Tolerance_For_Momentum_Solver.f90 modified: Shared/Control_Mod/Native/Tolerance_For_Potential_Solver.f90 modified: Shared/Control_Mod/Native/Tolerance_For_Pressure_Solver.f90 modified: Shared/Control_Mod/Native/Tolerance_For_Scalars_Solver.f90 modified: Shared/Control_Mod/Native/Tolerance_For_Turbulence_Solver.f90 modified: Shared/Control_Mod/Native/Tolerance_For_Vof_Solver.f90 modified: Shared/Control_Mod/Native/Tolerance_For_Wall_Distance_Solver.f90 modified: Shared/Profiler_Mod/Statistics.f90 --- Sources/Process/Backup_Mod/Load.f90 | 2 +- Sources/Process/Info_Mod/Start_Info.f90 | 4 +- Sources/Process/Main_Pro.f90 | 13 ++-- .../Process/Process_Mod/Compute_Pressure.f90 | 10 +-- .../Read_Controls_Mod/Native_Solvers.f90 | 77 ++++++++----------- Sources/Process/Vof_Mod/Core/Solve_System.f90 | 4 - Sources/Shared/Control_Mod.f90 | 52 +++++++++++-- .../Input_Output/Backup_Save_Interval.f90 | 7 +- .../Input_Output/Load_Backup_Name.f90 | 7 +- .../Load_Initial_Solution_Name.f90 | 7 +- .../Control_Mod/Input_Output/Problem_Name.f90 | 7 +- .../Input_Output/Profiler_Info.f90 | 7 +- .../Input_Output/Results_Save_Interval.f90 | 7 +- .../Input_Output/Save_Backup_Name.f90 | 7 +- .../Input_Output/Save_Initial_Condition.f90 | 7 +- .../Save_Initial_Solution_Name.f90 | 7 +- .../Save_Results_At_Boundaries.f90 | 7 +- .../Input_Output/Swarm_Save_Interval.f90 | 7 +- .../Input_Output/Wall_Time_Max_Hours.f90 | 7 +- .../Max_Iterations_For_Energy_Solver.f90 | 3 +- .../Max_Iterations_For_Momentum_Solver.f90 | 3 +- .../Max_Iterations_For_Potential_Solver.f90 | 3 +- ...=> Max_Iterations_For_Pressure_Solver.f90} | 3 +- .../Max_Iterations_For_Scalars_Solver.f90 | 3 +- .../Max_Iterations_For_Turbulence_Solver.f90 | 3 +- .../Native/Max_Iterations_For_Vof_Solver.f90 | 3 +- ...ax_Iterations_For_Wall_Distance_Solver.f90 | 3 +- .../Normalization_For_Energy_Solver.f90 | 7 +- .../Normalization_For_Momentum_Solver.f90 | 7 +- .../Normalization_For_Pressure_Solver.f90 | 7 +- .../Normalization_For_Scalars_Solver.f90 | 7 +- .../Normalization_For_Turbulence_Solver.f90 | 7 +- .../Preconditioner_For_System_Matrix.f90 | 7 +- .../Control_Mod/Native/Solver_For_Energy.f90 | 3 +- .../Native/Solver_For_Momentum.f90 | 3 +- .../Native/Solver_For_Potential.f90 | 3 +- .../Native/Solver_For_Pressure.f90 | 3 +- .../Control_Mod/Native/Solver_For_Scalars.f90 | 3 +- .../Native/Solver_For_Turbulence.f90 | 3 +- .../Control_Mod/Native/Solver_For_Vof.f90 | 3 +- .../Native/Solver_For_Wall_Distance.f90 | 3 +- .../Native/Tolerance_For_Energy_Solver.f90 | 7 +- .../Native/Tolerance_For_Momentum_Solver.f90 | 7 +- .../Native/Tolerance_For_Potential_Solver.f90 | 7 +- .../Native/Tolerance_For_Pressure_Solver.f90 | 7 +- .../Native/Tolerance_For_Scalars_Solver.f90 | 7 +- .../Tolerance_For_Turbulence_Solver.f90 | 7 +- .../Native/Tolerance_For_Vof_Solver.f90 | 7 +- .../Tolerance_For_Wall_Distance_Solver.f90 | 7 +- Sources/Shared/Profiler_Mod/Statistics.f90 | 2 +- 50 files changed, 228 insertions(+), 166 deletions(-) rename Sources/Shared/Control_Mod/Native/{Max_Iterations_For_Presssure_Solver.f90 => Max_Iterations_For_Pressure_Solver.f90} (83%) diff --git a/Sources/Process/Backup_Mod/Load.f90 b/Sources/Process/Backup_Mod/Load.f90 index 421e756ed..6858fc214 100644 --- a/Sources/Process/Backup_Mod/Load.f90 +++ b/Sources/Process/Backup_Mod/Load.f90 @@ -29,7 +29,7 @@ subroutine Load(Backup, Flow, Turb, Vof, Swarm, time, time_step, bckp) Comm => Grid % Comm ! Full name is specified in control file - call Control_Mod_Load_Backup_Name(name_in) + call Control % Load_Backup_Name(name_in) answer = name_in call String % To_Upper_Case(answer) diff --git a/Sources/Process/Info_Mod/Start_Info.f90 b/Sources/Process/Info_Mod/Start_Info.f90 index b91c5ca62..6c39cfede 100644 --- a/Sources/Process/Info_Mod/Start_Info.f90 +++ b/Sources/Process/Info_Mod/Start_Info.f90 @@ -13,8 +13,8 @@ subroutine Start_Info(Info) call system_clock(Info % clock % ini) ! Read maximum wall clock hours - call Control_Mod_Wall_Time_Max_Hours(Info % clock % wall_time_max, & - verbose=.true.) + call Control % Wall_Time_Max_Hours(Info % clock % wall_time_max, & + verbose=.true.) ! Make it in seconds Info % clock % wall_time_max = Info % clock % wall_time_max * 3600 diff --git a/Sources/Process/Main_Pro.f90 b/Sources/Process/Main_Pro.f90 index 3ac06974c..5d04629dc 100644 --- a/Sources/Process/Main_Pro.f90 +++ b/Sources/Process/Main_Pro.f90 @@ -80,7 +80,7 @@ program Process_Prog !--------------------! do d = 1, n_dom call Control % Switch_To_Domain(d) ! take domain's d control file - call Control_Mod_Problem_Name(problem_name(d)) + call Control % Read_Problem_Name(problem_name(d)) ! Load the finite volume Grid call Grid(d) % Load_Cfn(This_Proc(), domain=d) @@ -203,13 +203,12 @@ program Process_Prog ! Time loop ! ! ! !---------------! - call Control % Switch_To_Root() - call Control_Mod_Backup_Save_Interval (backup % interval, verbose=.true.) - call Control_Mod_Results_Save_Interval (Results % interval, verbose=.true.) - call Control_Mod_Save_Initial_Condition(Results % initial, verbose=.true.) - call Control_Mod_Save_Results_At_Boundaries(Results % boundary) - call Control_Mod_Swarm_Save_Interval(Results % interval_swarm, verbose=.true.) + call Control % Backup_Save_Interval (backup % interval, verbose=.true.) + call Control % Results_Save_Interval (Results % interval, verbose=.true.) + call Control % Save_Initial_Condition(Results % initial, verbose=.true.) + call Control % Save_Results_At_Boundaries(Results % boundary) + call Control % Swarm_Save_Interval(Results % interval_swarm, verbose=.true.) !-------------------------------------------------------! ! Compute wall distance - it is not saved in backup ! diff --git a/Sources/Process/Process_Mod/Compute_Pressure.f90 b/Sources/Process/Process_Mod/Compute_Pressure.f90 index bb20c3dfe..69d4ad8a0 100644 --- a/Sources/Process/Process_Mod/Compute_Pressure.f90 +++ b/Sources/Process/Process_Mod/Compute_Pressure.f90 @@ -21,10 +21,9 @@ subroutine Compute_Pressure(Process, Flow, Vof, Sol, curr_dt, ini) real, contiguous, pointer :: b(:) integer :: s, c, c1, c2 real :: p_max, p_min, p_nor, p_nor_c, dt, a12 - character(SL) :: solver -!==============================================================================! +!------------------------------------------------------------------------------! ! -! The form of equations which I am solving: +! The form of equations which are being solved: ! ! / / ! | | @@ -72,7 +71,7 @@ subroutine Compute_Pressure(Process, Flow, Vof, Sol, curr_dt, ini) !--------------------------------------------------! ! From control file - call Control_Mod_Normalization_For_Pressure_Solver(p_nor_c) + call Control % Normalization_For_Pressure_Solver(p_nor_c) ! Calculate pressure magnitude for normalization of pressure solution p_max = -HUGE @@ -182,9 +181,6 @@ subroutine Compute_Pressure(Process, Flow, Vof, Sol, curr_dt, ini) !-------------------------------------------------------------------------! call Vof % Mass_Transfer_Pressure_Source(b) - ! Get solver - call Control_Mod_Solver_For_Pressure(solver) - call Profiler % Start(String % First_Upper(pp % solver) // & ' (solver for pressure)') diff --git a/Sources/Process/Read_Controls_Mod/Native_Solvers.f90 b/Sources/Process/Read_Controls_Mod/Native_Solvers.f90 index ed6c2de5a..5595cc34a 100644 --- a/Sources/Process/Read_Controls_Mod/Native_Solvers.f90 +++ b/Sources/Process/Read_Controls_Mod/Native_Solvers.f90 @@ -25,16 +25,6 @@ subroutine Native_Solvers(Rc, Flow, Turb, Vof) ! Take alias Grid => Flow % pnt_grid - !----------------------------------! - ! Gradient computation methods ! - !----------------------------------! - - ! Tolerance and max iterations for computation of gradients with Gauss method - call Control_Mod_Tolerance_For_Gauss_Gradients(Flow % gauss_tol, .false.) - call Control_Mod_Max_Gauss_Gradients_Iterations(Flow % gauss_miter, .false.) - call Control_Mod_Max_Least_Squares_Gradients_Iterations(Flow % least_miter, & - .false.) - !-------------------------! ! Related to momentum ! !-------------------------! @@ -42,58 +32,55 @@ subroutine Native_Solvers(Rc, Flow, Turb, Vof) if(i .eq. 1) ui => Flow % u if(i .eq. 2) ui => Flow % v if(i .eq. 3) ui => Flow % w - call Control_Mod_Solver_For_Momentum (ui % solver) - call Control_Mod_Preconditioner_For_System_Matrix (ui % prec) - call Control_Mod_Tolerance_For_Momentum_Solver (ui % tol) - call Control_Mod_Max_Iterations_For_Momentum_Solver(ui % mniter) + call Control % Solver_For_Momentum (ui % solver) + call Control % Preconditioner_For_System_Matrix (ui % prec) + call Control % Tolerance_For_Momentum_Solver (ui % tol) + call Control % Max_Iterations_For_Momentum_Solver(ui % mniter) end do !-------------------------! ! Related to pressure ! !-------------------------! - call Control_Mod_Solver_For_Pressure (Flow % pp % solver) - call Control_Mod_Preconditioner_For_System_Matrix (Flow % pp % prec) - call Control_Mod_Tolerance_For_Pressure_Solver (Flow % pp % tol) - call Control_Mod_Max_Iterations_For_Pressure_Solver(Flow % pp % mniter) + call Control % Solver_For_Pressure (Flow % pp % solver) + call Control % Preconditioner_For_System_Matrix (Flow % pp % prec) + call Control % Tolerance_For_Pressure_Solver (Flow % pp % tol) + call Control % Max_Iterations_For_Pressure_Solver(Flow % pp % mniter) !------------------------------! ! Related to wall distance ! !------------------------------! - call Control_Mod_Solver_For_Wall_Distance & - (Flow % wall_dist % solver) - call Control_Mod_Preconditioner_For_System_Matrix & - (Flow % wall_dist % prec) - call Control_Mod_Tolerance_For_Wall_Distance_Solver & - (Flow % wall_dist % tol) - call Control_Mod_Max_Iterations_For_Wall_Distance_Solver & + call Control % Solver_For_Wall_Distance (Flow % wall_dist % solver) + call Control % Preconditioner_For_System_Matrix (Flow % wall_dist % prec) + call Control % Tolerance_For_Wall_Distance_Solver (Flow % wall_dist % tol) + call Control % Max_Iterations_For_Wall_Distance_Solver & (Flow % wall_dist % mniter) !--------------------------! ! Related to potential ! (for flow field initialization) !--------------------------! - call Control_Mod_Solver_For_Potential (Flow % pot % solver) - call Control_Mod_Preconditioner_For_System_Matrix (Flow % pot % prec) - call Control_Mod_Tolerance_For_Potential_Solver (Flow % pot % tol) - call Control_Mod_Max_Iterations_For_Potential_Solver(Flow % pot % mniter) + call Control % Solver_For_Potential (Flow % pot % solver) + call Control % Preconditioner_For_System_Matrix (Flow % pot % prec) + call Control % Tolerance_For_Potential_Solver (Flow % pot % tol) + call Control % Max_Iterations_For_Potential_Solver(Flow % pot % mniter) !------------------------------! ! Related to heat transfer ! !------------------------------! if(Flow % heat_transfer) then - call Control_Mod_Solver_For_Energy (Flow % t % solver) - call Control_Mod_Preconditioner_For_System_Matrix (Flow % t % prec) - call Control_Mod_Tolerance_For_Energy_Solver (Flow % t % tol) - call Control_Mod_Max_Iterations_For_Energy_Solver (Flow % t % mniter) + call Control % Solver_For_Energy (Flow % t % solver) + call Control % Preconditioner_For_System_Matrix (Flow % t % prec) + call Control % Tolerance_For_Energy_Solver (Flow % t % tol) + call Control % Max_Iterations_For_Energy_Solver (Flow % t % mniter) end if !--------------------------------! ! Related to multiphase Flow ! !--------------------------------! if(Flow % with_interface) then - call Control_Mod_Solver_For_Vof (Vof % fun % solver) - call Control_Mod_Preconditioner_For_System_Matrix(Vof % fun % prec) - call Control_Mod_Tolerance_For_Vof_Solver (Vof % fun % tol) - call Control_Mod_Max_Iterations_For_Vof_Solver (Vof % fun % mniter) + call Control % Solver_For_Vof (Vof % fun % solver) + call Control % Preconditioner_For_System_Matrix(Vof % fun % prec) + call Control % Tolerance_For_Vof_Solver (Vof % fun % tol) + call Control % Max_Iterations_For_Vof_Solver (Vof % fun % mniter) end if !--------------------------------! @@ -101,10 +88,10 @@ subroutine Native_Solvers(Rc, Flow, Turb, Vof) !--------------------------------! do sc = 1, Flow % n_scalars phi => Flow % scalar(sc) - call Control_Mod_Solver_For_Scalars (phi % solver) - call Control_Mod_Preconditioner_For_System_Matrix (phi % prec) - call Control_Mod_Tolerance_For_Scalars_Solver (phi % tol) - call Control_Mod_Max_Iterations_For_Scalars_Solver(phi % mniter) + call Control % Solver_For_Scalars (phi % solver) + call Control % Preconditioner_For_System_Matrix (phi % prec) + call Control % Tolerance_For_Scalars_Solver (phi % tol) + call Control % Max_Iterations_For_Scalars_Solver(phi % mniter) end do !------------------------------! @@ -123,10 +110,10 @@ subroutine Native_Solvers(Rc, Flow, Turb, Vof) if(i .eq. 10) tq => Turb % uv if(i .eq. 11) tq => Turb % uw if(i .eq. 12) tq => Turb % vw - call Control_Mod_Solver_For_Turbulence (tq % solver) - call Control_Mod_Preconditioner_For_System_Matrix (tq % prec) - call Control_Mod_Tolerance_For_Turbulence_Solver (tq % tol) - call Control_Mod_Max_Iterations_For_Turbulence_Solver(tq % mniter) + call Control % Solver_For_Turbulence (tq % solver) + call Control % Preconditioner_For_System_Matrix (tq % prec) + call Control % Tolerance_For_Turbulence_Solver (tq % tol) + call Control % Max_Iterations_For_Turbulence_Solver(tq % mniter) end do end subroutine diff --git a/Sources/Process/Vof_Mod/Core/Solve_System.f90 b/Sources/Process/Vof_Mod/Core/Solve_System.f90 index 554c902d6..b6bf0ef31 100644 --- a/Sources/Process/Vof_Mod/Core/Solve_System.f90 +++ b/Sources/Process/Vof_Mod/Core/Solve_System.f90 @@ -12,7 +12,6 @@ subroutine Solve_System(Vof, Sol, b) type(Var_Type), pointer :: fun type(Field_Type), pointer :: Flow type(Matrix_Type), pointer :: A - character(SL) :: solver !==============================================================================! ! Take aliases @@ -20,9 +19,6 @@ subroutine Solve_System(Vof, Sol, b) Flow => Vof % pnt_flow A => Sol % Nat % A - ! Get solver - call Control_Mod_Solver_For_Vof(solver) - call Profiler % Start(String % First_Upper(fun % solver)//' (solver for VOF)') ! Call linear solver to solve the equations diff --git a/Sources/Shared/Control_Mod.f90 b/Sources/Shared/Control_Mod.f90 index 66d4764a2..c591d6aa2 100644 --- a/Sources/Shared/Control_Mod.f90 +++ b/Sources/Shared/Control_Mod.f90 @@ -21,6 +21,8 @@ module Control_Mod type Control_Type contains + + ! Basic functionality (manouvering through control file) procedure :: Open_Domain_File procedure :: Open_Root_File procedure :: Position_At_One_Key @@ -35,10 +37,53 @@ module Control_Mod procedure :: Read_Real_Item_On procedure :: Read_Real_Vector procedure :: Read_Real_Vector_On -! procedure :: Similar_Warning procedure :: Switch_To_Domain procedure :: Switch_To_Root + ! Input/output + procedure :: Read_Problem_Name + procedure :: Load_Backup_Name + procedure :: Save_Backup_Name + procedure :: Save_Initial_Condition + procedure :: Save_Results_At_Boundaries + procedure :: Wall_Time_Max_Hours + procedure :: Backup_Save_Interval + procedure :: Results_Save_Interval + procedure :: Swarm_Save_Interval + procedure :: Profiler_Info + + ! Native solvers + procedure :: Max_Iterations_For_Energy_Solver + procedure :: Max_Iterations_For_Momentum_Solver + procedure :: Max_Iterations_For_Potential_Solver + procedure :: Max_Iterations_For_Pressure_Solver + procedure :: Max_Iterations_For_Scalars_Solver + procedure :: Max_Iterations_For_Turbulence_Solver + procedure :: Max_Iterations_For_Vof_Solver + procedure :: Max_Iterations_For_Wall_Distance_Solver + procedure :: Preconditioner_For_System_Matrix + procedure :: Solver_For_Energy + procedure :: Solver_For_Momentum + procedure :: Solver_For_Potential + procedure :: Solver_For_Pressure + procedure :: Solver_For_Scalars + procedure :: Solver_For_Turbulence + procedure :: Solver_For_Vof + procedure :: Solver_For_Wall_Distance + procedure :: Normalization_For_Momentum_Solver + procedure :: Normalization_For_Pressure_Solver + procedure :: Normalization_For_Energy_Solver + procedure :: Normalization_For_Scalars_Solver + procedure :: Normalization_For_Turbulence_Solver + procedure :: Tolerance_For_Momentum_Solver + procedure :: Tolerance_For_Potential_Solver + procedure :: Tolerance_For_Pressure_Solver + procedure :: Tolerance_For_Energy_Solver + procedure :: Tolerance_For_Scalars_Solver + procedure :: Tolerance_For_Turbulence_Solver + procedure :: Tolerance_For_Vof_Solver + procedure :: Tolerance_For_Wall_Distance_Solver + end type type(Control_Type) :: Control @@ -63,7 +108,6 @@ module Control_Mod # include "Control_Mod/Basic_Functions/Read_Real_Item_On.f90" # include "Control_Mod/Basic_Functions/Read_Real_Vector.f90" # include "Control_Mod/Basic_Functions/Read_Real_Vector_On.f90" -! include "Control_Mod/Basic_Functions/Similar_Warning.f90" # include "Control_Mod/Basic_Functions/Switch_To_Domain.f90" # include "Control_Mod/Basic_Functions/Switch_To_Root.f90" @@ -77,8 +121,6 @@ module Control_Mod # include "Control_Mod/Input_Output/Save_Backup_Name.f90" # include "Control_Mod/Input_Output/Save_Initial_Condition.f90" # include "Control_Mod/Input_Output/Save_Results_At_Boundaries.f90" -! include "Control_Mod/Input_Output/Load_Initial_Solution_Name.f90" -! include "Control_Mod/Input_Output/Save_Initial_Solution_Name.f90" # include "Control_Mod/Input_Output/Wall_Time_Max_Hours.f90" ! Save @@ -109,7 +151,7 @@ module Control_Mod # include "Control_Mod/Native/Max_Iterations_For_Energy_Solver.f90" # include "Control_Mod/Native/Max_Iterations_For_Momentum_Solver.f90" # include "Control_Mod/Native/Max_Iterations_For_Potential_Solver.f90" -# include "Control_Mod/Native/Max_Iterations_For_Presssure_Solver.f90" +# include "Control_Mod/Native/Max_Iterations_For_Pressure_Solver.f90" # include "Control_Mod/Native/Max_Iterations_For_Scalars_Solver.f90" # include "Control_Mod/Native/Max_Iterations_For_Turbulence_Solver.f90" # include "Control_Mod/Native/Max_Iterations_For_Vof_Solver.f90" diff --git a/Sources/Shared/Control_Mod/Input_Output/Backup_Save_Interval.f90 b/Sources/Shared/Control_Mod/Input_Output/Backup_Save_Interval.f90 index a32f18ad3..4e66dec4e 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Backup_Save_Interval.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Backup_Save_Interval.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Backup_Save_Interval(val, verbose) + subroutine Backup_Save_Interval(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer :: val - logical, optional :: verbose + class(Control_Type) :: Control + integer :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Int_Item('BACKUP_SAVE_INTERVAL', 120, val, verbose) diff --git a/Sources/Shared/Control_Mod/Input_Output/Load_Backup_Name.f90 b/Sources/Shared/Control_Mod/Input_Output/Load_Backup_Name.f90 index b78147b9c..2907ad57c 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Load_Backup_Name.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Load_Backup_Name.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Load_Backup_Name(val, verbose) + subroutine Load_Backup_Name(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - character(SL) :: val - logical, optional :: verbose + class(Control_Type) :: Control + character(SL) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Char_Item('LOAD_BACKUP_NAME', 'skip', val, verbose) diff --git a/Sources/Shared/Control_Mod/Input_Output/Load_Initial_Solution_Name.f90 b/Sources/Shared/Control_Mod/Input_Output/Load_Initial_Solution_Name.f90 index 800d9a469..a979843b9 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Load_Initial_Solution_Name.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Load_Initial_Solution_Name.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Load_Initial_Solution_Name(val, verbose) + subroutine Load_Initial_Solution_Name(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - character(SL) :: val - logical, optional :: verbose + class(Control_Type) :: Control + character(SL) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Char_Item('LOAD_INITIAL_SOLUTION_NAME', 'skip', & diff --git a/Sources/Shared/Control_Mod/Input_Output/Problem_Name.f90 b/Sources/Shared/Control_Mod/Input_Output/Problem_Name.f90 index 6dcaa2730..3cd9490fd 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Problem_Name.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Problem_Name.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Problem_Name(val, verbose) + subroutine Read_Problem_Name(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - character(SL) :: val - logical, optional :: verbose + class(Control_Type) :: Control + character(SL) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Char_Item('PROBLEM_NAME', 'unknown', val, verbose) diff --git a/Sources/Shared/Control_Mod/Input_Output/Profiler_Info.f90 b/Sources/Shared/Control_Mod/Input_Output/Profiler_Info.f90 index 552c6a9ee..d31c57c48 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Profiler_Info.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Profiler_Info.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Profiler_Info(val, verbose) + subroutine Profiler_Info(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - character(SL), intent(out) :: val - logical, optional, intent(in) :: verbose + class(Control_Type) :: Control + character(SL), intent(out) :: val + logical, optional, intent(in) :: verbose !==============================================================================! call Control % Read_Char_Item('PROFILER_INFO', 'percents', val, verbose) diff --git a/Sources/Shared/Control_Mod/Input_Output/Results_Save_Interval.f90 b/Sources/Shared/Control_Mod/Input_Output/Results_Save_Interval.f90 index 3605b835d..a7f80ccdc 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Results_Save_Interval.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Results_Save_Interval.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Results_Save_Interval(val, verbose) + subroutine Results_Save_Interval(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer :: val - logical, optional :: verbose + class(Control_Type) :: Control + integer :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Int_Item('RESULTS_SAVE_INTERVAL', 12, val, verbose) diff --git a/Sources/Shared/Control_Mod/Input_Output/Save_Backup_Name.f90 b/Sources/Shared/Control_Mod/Input_Output/Save_Backup_Name.f90 index 6d97596d9..6b551468a 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Save_Backup_Name.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Save_Backup_Name.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Save_Backup_Name(val, verbose) + subroutine Save_Backup_Name(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - character(SL) :: val - logical, optional :: verbose + class(Control_Type) :: Control + character(SL) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Char_Item('SAVE_BACKUP_NAME', 'skip', val, verbose) diff --git a/Sources/Shared/Control_Mod/Input_Output/Save_Initial_Condition.f90 b/Sources/Shared/Control_Mod/Input_Output/Save_Initial_Condition.f90 index 17063cd99..998d0c9da 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Save_Initial_Condition.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Save_Initial_Condition.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Save_Initial_Condition(save_init_cond, verbose) + subroutine Save_Initial_Condition(Control, save_init_cond, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - logical :: save_init_cond - logical, optional :: verbose + class(Control_Type) :: Control + logical :: save_init_cond + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! character(SL) :: val !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Input_Output/Save_Initial_Solution_Name.f90 b/Sources/Shared/Control_Mod/Input_Output/Save_Initial_Solution_Name.f90 index 62d8e2f1c..dcb402e73 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Save_Initial_Solution_Name.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Save_Initial_Solution_Name.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Save_Initial_Solution_Name(val, verbose) + subroutine Save_Initial_Solution_Name(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - character(SL) :: val - logical, optional :: verbose + class(Control_Type) :: Control + character(SL) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Char_Item('SAVE_INITIAL_SOLUTION_NAME', 'skip', & diff --git a/Sources/Shared/Control_Mod/Input_Output/Save_Results_At_Boundaries.f90 b/Sources/Shared/Control_Mod/Input_Output/Save_Results_At_Boundaries.f90 index defb574f4..2338e74f5 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Save_Results_At_Boundaries.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Save_Results_At_Boundaries.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Save_Results_At_Boundaries(save_results_bnd, verbose) + subroutine Save_Results_At_Boundaries(Control, save_results_bnd, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - logical :: save_results_bnd - logical, optional :: verbose + class(Control_Type) :: Control + logical :: save_results_bnd + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! character(SL) :: val !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Input_Output/Swarm_Save_Interval.f90 b/Sources/Shared/Control_Mod/Input_Output/Swarm_Save_Interval.f90 index d56e5718c..a6635b82e 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Swarm_Save_Interval.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Swarm_Save_Interval.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Swarm_Save_Interval(val, verbose) + subroutine Swarm_Save_Interval(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - integer :: val - logical, optional :: verbose + class(Control_Type) :: Control + integer :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Int_Item('SWARM_SAVE_INTERVAL', 60, val, verbose) diff --git a/Sources/Shared/Control_Mod/Input_Output/Wall_Time_Max_Hours.f90 b/Sources/Shared/Control_Mod/Input_Output/Wall_Time_Max_Hours.f90 index 357967aec..c38c7a82a 100644 --- a/Sources/Shared/Control_Mod/Input_Output/Wall_Time_Max_Hours.f90 +++ b/Sources/Shared/Control_Mod/Input_Output/Wall_Time_Max_Hours.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Wall_Time_Max_Hours(val, verbose) + subroutine Wall_Time_Max_Hours(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real :: val - logical, optional :: verbose + class(Control_Type) :: Control + real :: val + logical, optional :: verbose !==============================================================================! ! 168 hours is one week diff --git a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Energy_Solver.f90 b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Energy_Solver.f90 index b98c0470d..b80ecedac 100644 --- a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Energy_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Energy_Solver.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Max_Iterations_For_Energy_Solver(val, verbose) + subroutine Max_Iterations_For_Energy_Solver(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Momentum_Solver.f90 b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Momentum_Solver.f90 index 024421516..806a12a4f 100644 --- a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Momentum_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Momentum_Solver.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Max_Iterations_For_Momentum_Solver(val, verbose) + subroutine Max_Iterations_For_Momentum_Solver(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Potential_Solver.f90 b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Potential_Solver.f90 index 04d4a19d0..13d07b6e7 100644 --- a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Potential_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Potential_Solver.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Max_Iterations_For_Potential_Solver(val, verbose) + subroutine Max_Iterations_For_Potential_Solver(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Presssure_Solver.f90 b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Pressure_Solver.f90 similarity index 83% rename from Sources/Shared/Control_Mod/Native/Max_Iterations_For_Presssure_Solver.f90 rename to Sources/Shared/Control_Mod/Native/Max_Iterations_For_Pressure_Solver.f90 index 62f56469c..eb13a9e19 100644 --- a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Presssure_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Pressure_Solver.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Max_Iterations_For_Pressure_Solver(val, verbose) + subroutine Max_Iterations_For_Pressure_Solver(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Scalars_Solver.f90 b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Scalars_Solver.f90 index b615d981d..d31d2b79e 100644 --- a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Scalars_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Scalars_Solver.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Max_Iterations_For_Scalars_Solver(val, verbose) + subroutine Max_Iterations_For_Scalars_Solver(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Turbulence_Solver.f90 b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Turbulence_Solver.f90 index fa061c165..7648b71e7 100644 --- a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Turbulence_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Turbulence_Solver.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Max_Iterations_For_Turbulence_Solver(val, verbose) + subroutine Max_Iterations_For_Turbulence_Solver(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Vof_Solver.f90 b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Vof_Solver.f90 index eefa80a1f..6ab4945b8 100644 --- a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Vof_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Vof_Solver.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Max_Iterations_For_Vof_Solver(val, verbose) + subroutine Max_Iterations_For_Vof_Solver(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Wall_Distance_Solver.f90 b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Wall_Distance_Solver.f90 index f800847a3..bd552ca3c 100644 --- a/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Wall_Distance_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Max_Iterations_For_Wall_Distance_Solver.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Max_Iterations_For_Wall_Distance_Solver(val, verbose) + subroutine Max_Iterations_For_Wall_Distance_Solver(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Native/Normalization_For_Energy_Solver.f90 b/Sources/Shared/Control_Mod/Native/Normalization_For_Energy_Solver.f90 index d60f6a294..f7a1839dd 100644 --- a/Sources/Shared/Control_Mod/Native/Normalization_For_Energy_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Normalization_For_Energy_Solver.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Normalization_For_Energy_Solver(val, verbose) + subroutine Normalization_For_Energy_Solver(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real :: val - logical, optional :: verbose + class(Control_Type) :: Control + real :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('NORMALIZATION_FOR_ENERGY_SOLVER', & diff --git a/Sources/Shared/Control_Mod/Native/Normalization_For_Momentum_Solver.f90 b/Sources/Shared/Control_Mod/Native/Normalization_For_Momentum_Solver.f90 index 11c36c26f..e5bca4592 100644 --- a/Sources/Shared/Control_Mod/Native/Normalization_For_Momentum_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Normalization_For_Momentum_Solver.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Normalization_For_Momentum_Solver(val, verbose) + subroutine Normalization_For_Momentum_Solver(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real :: val - logical, optional :: verbose + class(Control_Type) :: Control + real :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('NORMALIZATION_FOR_MOMENTUM_SOLVER', & diff --git a/Sources/Shared/Control_Mod/Native/Normalization_For_Pressure_Solver.f90 b/Sources/Shared/Control_Mod/Native/Normalization_For_Pressure_Solver.f90 index f94eff852..5a0cec0bc 100644 --- a/Sources/Shared/Control_Mod/Native/Normalization_For_Pressure_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Normalization_For_Pressure_Solver.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Normalization_For_Pressure_Solver(val, verbose) + subroutine Normalization_For_Pressure_Solver(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real :: val - logical, optional :: verbose + class(Control_Type) :: Control + real :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('NORMALIZATION_FOR_PRESSURE_SOLVER', & diff --git a/Sources/Shared/Control_Mod/Native/Normalization_For_Scalars_Solver.f90 b/Sources/Shared/Control_Mod/Native/Normalization_For_Scalars_Solver.f90 index bc56bca69..0f616fab3 100644 --- a/Sources/Shared/Control_Mod/Native/Normalization_For_Scalars_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Normalization_For_Scalars_Solver.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Normalization_For_Scalars_Solver(val, verbose) + subroutine Normalization_For_Scalars_Solver(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real :: val - logical, optional :: verbose + class(Control_Type) :: Control + real :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('NORMALIZATION_FOR_SCALARS_SOLVER', & diff --git a/Sources/Shared/Control_Mod/Native/Normalization_For_Turbulence_Solver.f90 b/Sources/Shared/Control_Mod/Native/Normalization_For_Turbulence_Solver.f90 index 65065870e..5e7f33199 100644 --- a/Sources/Shared/Control_Mod/Native/Normalization_For_Turbulence_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Normalization_For_Turbulence_Solver.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Normalization_For_Turbulence_Solver(val, verbose) + subroutine Normalization_For_Turbulence_Solver(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real :: val - logical, optional :: verbose + class(Control_Type) :: Control + real :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('NORMALIZATION_FOR_TURBULENCE_SOLVER', & diff --git a/Sources/Shared/Control_Mod/Native/Preconditioner_For_System_Matrix.f90 b/Sources/Shared/Control_Mod/Native/Preconditioner_For_System_Matrix.f90 index 67a268b9b..9240d4118 100644 --- a/Sources/Shared/Control_Mod/Native/Preconditioner_For_System_Matrix.f90 +++ b/Sources/Shared/Control_Mod/Native/Preconditioner_For_System_Matrix.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Control_Mod_Preconditioner_For_System_Matrix(val, verbose) + subroutine Preconditioner_For_System_Matrix(Control, val, verbose) !------------------------------------------------------------------------------! ! These are preconditioners for the T-Flows suite of solvers. PETSc has ! ! many more, of course. For compatibillity with PETSc, these keywords have ! @@ -14,8 +14,9 @@ subroutine Control_Mod_Preconditioner_For_System_Matrix(val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - character(SL) :: val - logical, optional :: verbose + class(Control_Type) :: Control + character(SL) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Char_Item('PRECONDITIONER_FOR_SYSTEM_MATRIX', & diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Energy.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Energy.f90 index 6d76a6595..9903aac23 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Energy.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Energy.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Solver_For_Energy(val, verbose) + subroutine Solver_For_Energy(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Momentum.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Momentum.f90 index 7fed428df..e439dd449 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Momentum.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Momentum.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Solver_For_Momentum(val, verbose) + subroutine Solver_For_Momentum(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Potential.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Potential.f90 index d2aebfa01..77777687a 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Potential.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Potential.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Solver_For_Potential(val, verbose) + subroutine Solver_For_Potential(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Pressure.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Pressure.f90 index 24b5bc871..07bff6b10 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Pressure.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Pressure.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Solver_For_Pressure(val, verbose) + subroutine Solver_For_Pressure(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Scalars.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Scalars.f90 index de3587009..ce9628a52 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Scalars.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Scalars.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Solver_For_Scalars(val, verbose) + subroutine Solver_For_Scalars(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Turbulence.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Turbulence.f90 index c608fa32e..f6370b23f 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Turbulence.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Turbulence.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Solver_For_Turbulence(val, verbose) + subroutine Solver_For_Turbulence(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Vof.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Vof.f90 index 30078bd1b..02f64b0de 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Vof.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Vof.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Solver_For_Vof(val, verbose) + subroutine Solver_For_Vof(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Wall_Distance.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Wall_Distance.f90 index 7f01abdb9..2a17e8d1c 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Wall_Distance.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Wall_Distance.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Solver_For_Wall_Distance(val, verbose) + subroutine Solver_For_Wall_Distance(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Native/Tolerance_For_Energy_Solver.f90 b/Sources/Shared/Control_Mod/Native/Tolerance_For_Energy_Solver.f90 index fecd7a12b..b7c6aac40 100644 --- a/Sources/Shared/Control_Mod/Native/Tolerance_For_Energy_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Tolerance_For_Energy_Solver.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Tolerance_For_Energy_Solver(val, verbose) + subroutine Tolerance_For_Energy_Solver(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('TOLERANCE_FOR_ENERGY_SOLVER', & diff --git a/Sources/Shared/Control_Mod/Native/Tolerance_For_Momentum_Solver.f90 b/Sources/Shared/Control_Mod/Native/Tolerance_For_Momentum_Solver.f90 index b655f2a2a..eb6ac96f5 100644 --- a/Sources/Shared/Control_Mod/Native/Tolerance_For_Momentum_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Tolerance_For_Momentum_Solver.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Tolerance_For_Momentum_Solver(val, verbose) + subroutine Tolerance_For_Momentum_Solver(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('TOLERANCE_FOR_MOMENTUM_SOLVER', & diff --git a/Sources/Shared/Control_Mod/Native/Tolerance_For_Potential_Solver.f90 b/Sources/Shared/Control_Mod/Native/Tolerance_For_Potential_Solver.f90 index 1cae221e2..25474f709 100644 --- a/Sources/Shared/Control_Mod/Native/Tolerance_For_Potential_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Tolerance_For_Potential_Solver.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Tolerance_For_Potential_Solver(val, verbose) + subroutine Tolerance_For_Potential_Solver(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('TOLERANCE_FOR_POTENTIAL_SOLVER', & diff --git a/Sources/Shared/Control_Mod/Native/Tolerance_For_Pressure_Solver.f90 b/Sources/Shared/Control_Mod/Native/Tolerance_For_Pressure_Solver.f90 index b82e6d082..3d39391d8 100644 --- a/Sources/Shared/Control_Mod/Native/Tolerance_For_Pressure_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Tolerance_For_Pressure_Solver.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Tolerance_For_Pressure_Solver(val, verbose) + subroutine Tolerance_For_Pressure_Solver(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('TOLERANCE_FOR_PRESSURE_SOLVER', & diff --git a/Sources/Shared/Control_Mod/Native/Tolerance_For_Scalars_Solver.f90 b/Sources/Shared/Control_Mod/Native/Tolerance_For_Scalars_Solver.f90 index 255bff813..1a6ff6d66 100644 --- a/Sources/Shared/Control_Mod/Native/Tolerance_For_Scalars_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Tolerance_For_Scalars_Solver.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Tolerance_For_Scalars_Solver(val, verbose) + subroutine Tolerance_For_Scalars_Solver(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('TOLERANCE_FOR_SCALARS_SOLVER', & diff --git a/Sources/Shared/Control_Mod/Native/Tolerance_For_Turbulence_Solver.f90 b/Sources/Shared/Control_Mod/Native/Tolerance_For_Turbulence_Solver.f90 index 77995880d..c4b34267a 100644 --- a/Sources/Shared/Control_Mod/Native/Tolerance_For_Turbulence_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Tolerance_For_Turbulence_Solver.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Tolerance_For_Turbulence_Solver(val, verbose) + subroutine Tolerance_For_Turbulence_Solver(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('TOLERANCE_FOR_TURBULENCE_SOLVER', & diff --git a/Sources/Shared/Control_Mod/Native/Tolerance_For_Vof_Solver.f90 b/Sources/Shared/Control_Mod/Native/Tolerance_For_Vof_Solver.f90 index a96a4eaaa..b3b076819 100644 --- a/Sources/Shared/Control_Mod/Native/Tolerance_For_Vof_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Tolerance_For_Vof_Solver.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Tolerance_For_Vof_Solver(val, verbose) + subroutine Tolerance_For_Vof_Solver(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('TOLERANCE_FOR_VOF_SOLVER', & diff --git a/Sources/Shared/Control_Mod/Native/Tolerance_For_Wall_Distance_Solver.f90 b/Sources/Shared/Control_Mod/Native/Tolerance_For_Wall_Distance_Solver.f90 index a250281b0..507d5e7b4 100644 --- a/Sources/Shared/Control_Mod/Native/Tolerance_For_Wall_Distance_Solver.f90 +++ b/Sources/Shared/Control_Mod/Native/Tolerance_For_Wall_Distance_Solver.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Tolerance_For_Wall_Distance_Solver(val, verbose) + subroutine Tolerance_For_Wall_Distance_Solver(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('TOLERANCE_FOR_WALL_DISTANCE_SOLVER', & diff --git a/Sources/Shared/Profiler_Mod/Statistics.f90 b/Sources/Shared/Profiler_Mod/Statistics.f90 index 5067a9c2a..417db279e 100644 --- a/Sources/Shared/Profiler_Mod/Statistics.f90 +++ b/Sources/Shared/Profiler_Mod/Statistics.f90 @@ -17,7 +17,7 @@ subroutine Statistics(Prof, indent) ! Only Process has a control file in_sec = .false. if(PROGRAM_NAME .eq. 'Process') then - call Control_Mod_Profiler_Info(pinfo, verbose=.false.) + call Control % Profiler_Info(pinfo, verbose=.false.) if(pinfo == 'SECONDS') then in_sec = .true. end if From ee7f4242eedfc935548b0a7092ee5a2c791b5f44 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 2 Apr 2023 18:32:57 +0200 Subject: [PATCH 185/223] Modernizing Control_Mod; step 3 On branch bojan_more_robust_communicator modified: Process/Field_Mod.f90 renamed: Process/Field_Mod/Utilities/Report_Volume_Balance.f90 -> Process/Field_Mod/Utilities/Report_Vol_Balance.f90 renamed: Process/Field_Mod/Utilities/Report_Volume_Balance_Start.f90 -> Process/Field_Mod/Utilities/Report_Vol_Balance_Start.f90 renamed: Process/Field_Mod/Utilities/Report_Volume_Balance_Stop.f90 -> Process/Field_Mod/Utilities/Report_Vol_Balance_Stop.f90 modified: Process/Main_Pro.f90 modified: Process/Process_Mod/Compute_Pressure.f90 modified: Process/Read_Controls_Mod/Numerical_Schemes.f90 modified: Shared/Control_Mod.f90 modified: Shared/Control_Mod/Numerics/Advection_Scheme_For_Energy.f90 modified: Shared/Control_Mod/Numerics/Advection_Scheme_For_Momentum.f90 modified: Shared/Control_Mod/Numerics/Advection_Scheme_For_Scalars.f90 modified: Shared/Control_Mod/Numerics/Advection_Scheme_For_Turbulence.f90 modified: Shared/Control_Mod/Numerics/Advection_Scheme_For_Vof.f90 modified: Shared/Control_Mod/Numerics/Blending_Coefficient_For_Energy.f90 modified: Shared/Control_Mod/Numerics/Blending_Coefficient_For_Momentum.f90 modified: Shared/Control_Mod/Numerics/Blending_Coefficient_For_Scalars.f90 modified: Shared/Control_Mod/Numerics/Blending_Coefficient_For_Turbulence.f90 modified: Shared/Control_Mod/Numerics/Blending_Coefficient_For_Vof.f90 modified: Shared/Control_Mod/Numerics/Choi_Correction.f90 modified: Shared/Control_Mod/Numerics/Gradient_Method_For_Energy.f90 modified: Shared/Control_Mod/Numerics/Gradient_Method_For_Momentum.f90 modified: Shared/Control_Mod/Numerics/Gradient_Method_For_Pressure.f90 modified: Shared/Control_Mod/Numerics/Gradient_Method_For_Scalars.f90 modified: Shared/Control_Mod/Numerics/Gradient_Method_For_Turbulence.f90 modified: Shared/Control_Mod/Numerics/Gradient_Method_For_Vof.f90 modified: Shared/Control_Mod/Numerics/Gradient_Method_For_Wall_Distance.f90 modified: Shared/Control_Mod/Numerics/Gu_Correction.f90 modified: Shared/Control_Mod/Numerics/Max_Correction_Cycles_Beta_Vof.f90 modified: Shared/Control_Mod/Numerics/Max_Courant_Vof.f90 modified: Shared/Control_Mod/Numerics/Max_Gauss_Gradients_Iterations.f90 modified: Shared/Control_Mod/Numerics/Max_Least_Squares_Gradients_Iterations.f90 modified: Shared/Control_Mod/Numerics/Max_Simple_Iterations.f90 modified: Shared/Control_Mod/Numerics/Max_Smoothing_Cycles_Curvature_Vof.f90 modified: Shared/Control_Mod/Numerics/Max_Smoothing_Cycles_Normal_Vof.f90 modified: Shared/Control_Mod/Numerics/Max_Substep_Cycles_Vof.f90 modified: Shared/Control_Mod/Numerics/Min_Simple_Iterations.f90 modified: Shared/Control_Mod/Numerics/Number_Of_Piso_Corrections.f90 modified: Shared/Control_Mod/Numerics/Number_Of_Time_Steps.f90 modified: Shared/Control_Mod/Numerics/Pressure_Momentum_Coupling.f90 modified: Shared/Control_Mod/Numerics/Report_Volume_Balance.f90 modified: Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Energy.f90 modified: Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Momentum.f90 modified: Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Pressure.f90 modified: Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Scalars.f90 modified: Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Turbulence.f90 modified: Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Vof.f90 modified: Shared/Control_Mod/Numerics/Skewness_Correction_Vof.f90 modified: Shared/Control_Mod/Numerics/Time_Integration_Scheme.f90 modified: Shared/Control_Mod/Numerics/Time_Step.f90 modified: Shared/Control_Mod/Numerics/Tolerance_For_Gauss_Gradients.f90 modified: Shared/Control_Mod/Numerics/Tolerance_For_Simple_Algorithm.f90 --- Sources/Process/Field_Mod.f90 | 14 +-- ...ume_Balance.f90 => Report_Vol_Balance.f90} | 4 +- ...Start.f90 => Report_Vol_Balance_Start.f90} | 4 +- ...e_Stop.f90 => Report_Vol_Balance_Stop.f90} | 4 +- Sources/Process/Main_Pro.f90 | 10 +-- .../Process/Process_Mod/Compute_Pressure.f90 | 6 +- .../Read_Controls_Mod/Numerical_Schemes.f90 | 88 +++++++++---------- Sources/Shared/Control_Mod.f90 | 45 ++++++++++ .../Numerics/Advection_Scheme_For_Energy.f90 | 3 +- .../Advection_Scheme_For_Momentum.f90 | 3 +- .../Numerics/Advection_Scheme_For_Scalars.f90 | 3 +- .../Advection_Scheme_For_Turbulence.f90 | 3 +- .../Numerics/Advection_Scheme_For_Vof.f90 | 3 +- .../Blending_Coefficient_For_Energy.f90 | 7 +- .../Blending_Coefficient_For_Momentum.f90 | 7 +- .../Blending_Coefficient_For_Scalars.f90 | 7 +- .../Blending_Coefficient_For_Turbulence.f90 | 7 +- .../Numerics/Blending_Coefficient_For_Vof.f90 | 7 +- .../Control_Mod/Numerics/Choi_Correction.f90 | 9 +- .../Numerics/Gradient_Method_For_Energy.f90 | 3 +- .../Numerics/Gradient_Method_For_Momentum.f90 | 3 +- .../Numerics/Gradient_Method_For_Pressure.f90 | 3 +- .../Numerics/Gradient_Method_For_Scalars.f90 | 3 +- .../Gradient_Method_For_Turbulence.f90 | 3 +- .../Numerics/Gradient_Method_For_Vof.f90 | 3 +- .../Gradient_Method_For_Wall_Distance.f90 | 4 +- .../Control_Mod/Numerics/Gu_Correction.f90 | 9 +- .../Max_Correction_Cycles_Beta_Vof.f90 | 3 +- .../Control_Mod/Numerics/Max_Courant_Vof.f90 | 10 +-- .../Max_Gauss_Gradients_Iterations.f90 | 3 +- ...Max_Least_Squares_Gradients_Iterations.f90 | 3 +- .../Numerics/Max_Simple_Iterations.f90 | 3 +- .../Max_Smoothing_Cycles_Curvature_Vof.f90 | 3 +- .../Max_Smoothing_Cycles_Normal_Vof.f90 | 3 +- .../Numerics/Max_Substep_Cycles_Vof.f90 | 3 +- .../Numerics/Min_Simple_Iterations.f90 | 3 +- .../Numerics/Number_Of_Piso_Corrections.f90 | 3 +- .../Numerics/Number_Of_Time_Steps.f90 | 6 +- .../Numerics/Pressure_Momentum_Coupling.f90 | 3 +- .../Numerics/Report_Volume_Balance.f90 | 3 +- .../Simple_Underrelaxation_For_Energy.f90 | 7 +- .../Simple_Underrelaxation_For_Momentum.f90 | 7 +- .../Simple_Underrelaxation_For_Pressure.f90 | 7 +- .../Simple_Underrelaxation_For_Scalars.f90 | 7 +- .../Simple_Underrelaxation_For_Turbulence.f90 | 7 +- .../Simple_Underrelaxation_For_Vof.f90 | 7 +- .../Numerics/Skewness_Correction_Vof.f90 | 3 +- .../Numerics/Time_Integration_Scheme.f90 | 3 +- .../Shared/Control_Mod/Numerics/Time_Step.f90 | 7 +- .../Tolerance_For_Gauss_Gradients.f90 | 7 +- .../Tolerance_For_Simple_Algorithm.f90 | 7 +- 51 files changed, 234 insertions(+), 149 deletions(-) rename Sources/Process/Field_Mod/Utilities/{Report_Volume_Balance.f90 => Report_Vol_Balance.f90} (93%) rename Sources/Process/Field_Mod/Utilities/{Report_Volume_Balance_Start.f90 => Report_Vol_Balance_Start.f90} (93%) rename Sources/Process/Field_Mod/Utilities/{Report_Volume_Balance_Stop.f90 => Report_Vol_Balance_Stop.f90} (84%) diff --git a/Sources/Process/Field_Mod.f90 b/Sources/Process/Field_Mod.f90 index 8e2b8e1d6..fbbf925db 100644 --- a/Sources/Process/Field_Mod.f90 +++ b/Sources/Process/Field_Mod.f90 @@ -142,7 +142,7 @@ module Field_Mod logical :: inside_piso_loop logical :: choi_correction logical :: gu_correction - logical :: report_vol_balance + logical :: rep_vol_balance ! Maximum CFL and Pe numbers real :: cfl_max, pe_max @@ -235,9 +235,9 @@ module Field_Mod procedure :: Prandtl_Numb procedure :: Schmidt_Numb procedure :: U_Tan - procedure :: Report_Volume_Balance - procedure :: Report_Volume_Balance_Start - procedure :: Report_Volume_Balance_Stop + procedure :: Report_Vol_Balance + procedure :: Report_Vol_Balance_Start + procedure :: Report_Vol_Balance_Stop procedure :: Volume_Average end type @@ -301,9 +301,9 @@ module Field_Mod # include "Field_Mod/Utilities/Schmidt_Numb.f90" # include "Field_Mod/Utilities/U_Tan.f90" # include "Field_Mod/Utilities/Compute_Wall_Distance.f90" -# include "Field_Mod/Utilities/Report_Volume_Balance.f90" -# include "Field_Mod/Utilities/Report_Volume_Balance_Start.f90" -# include "Field_Mod/Utilities/Report_Volume_Balance_Stop.f90" +# include "Field_Mod/Utilities/Report_Vol_Balance.f90" +# include "Field_Mod/Utilities/Report_Vol_Balance_Start.f90" +# include "Field_Mod/Utilities/Report_Vol_Balance_Stop.f90" # include "Field_Mod/Utilities/Volume_Average.f90" end module diff --git a/Sources/Process/Field_Mod/Utilities/Report_Volume_Balance.f90 b/Sources/Process/Field_Mod/Utilities/Report_Vol_Balance.f90 similarity index 93% rename from Sources/Process/Field_Mod/Utilities/Report_Volume_Balance.f90 rename to Sources/Process/Field_Mod/Utilities/Report_Vol_Balance.f90 index 78a9acf4b..1bb7b7ac3 100644 --- a/Sources/Process/Field_Mod/Utilities/Report_Volume_Balance.f90 +++ b/Sources/Process/Field_Mod/Utilities/Report_Vol_Balance.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Report_Volume_Balance(Flow, Sol, curr_dt, ini) + subroutine Report_Vol_Balance(Flow, Sol, curr_dt, ini) !------------------------------------------------------------------------------! ! Opens file for volume balance reporting. !------------------------------------------------------------------------------! @@ -14,7 +14,7 @@ subroutine Report_Volume_Balance(Flow, Sol, curr_dt, ini) real :: src !==============================================================================! - if(Flow % report_vol_balance) then + if(Flow % rep_vol_balance) then ! Take aliases Grid => Flow % pnt_grid diff --git a/Sources/Process/Field_Mod/Utilities/Report_Volume_Balance_Start.f90 b/Sources/Process/Field_Mod/Utilities/Report_Vol_Balance_Start.f90 similarity index 93% rename from Sources/Process/Field_Mod/Utilities/Report_Volume_Balance_Start.f90 rename to Sources/Process/Field_Mod/Utilities/Report_Vol_Balance_Start.f90 index c52cbc309..824236f27 100644 --- a/Sources/Process/Field_Mod/Utilities/Report_Volume_Balance_Start.f90 +++ b/Sources/Process/Field_Mod/Utilities/Report_Vol_Balance_Start.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Report_Volume_Balance_Start(Flow, curr_dt, ini) + subroutine Report_Vol_Balance_Start(Flow, curr_dt, ini) !------------------------------------------------------------------------------! ! Opens file for volume balance reporting. !------------------------------------------------------------------------------! @@ -10,7 +10,7 @@ subroutine Report_Volume_Balance_Start(Flow, curr_dt, ini) !==============================================================================! if(First_Proc()) then - if(Flow % report_vol_balance) then + if(Flow % rep_vol_balance) then call File % Append_For_Writing_Ascii('volume.bal', & Flow % fuvbr, & This_Proc()) diff --git a/Sources/Process/Field_Mod/Utilities/Report_Volume_Balance_Stop.f90 b/Sources/Process/Field_Mod/Utilities/Report_Vol_Balance_Stop.f90 similarity index 84% rename from Sources/Process/Field_Mod/Utilities/Report_Volume_Balance_Stop.f90 rename to Sources/Process/Field_Mod/Utilities/Report_Vol_Balance_Stop.f90 index 03227236e..d6d71edce 100644 --- a/Sources/Process/Field_Mod/Utilities/Report_Volume_Balance_Stop.f90 +++ b/Sources/Process/Field_Mod/Utilities/Report_Vol_Balance_Stop.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Report_Volume_Balance_Stop(Flow) + subroutine Report_Vol_Balance_Stop(Flow) !------------------------------------------------------------------------------! ! Closes file for volume balance reporting. !------------------------------------------------------------------------------! @@ -9,7 +9,7 @@ subroutine Report_Volume_Balance_Stop(Flow) !==============================================================================! if(First_Proc()) then - if(Flow % report_vol_balance) close(Flow % fuvbr) + if(Flow % rep_vol_balance) close(Flow % fuvbr) end if end subroutine diff --git a/Sources/Process/Main_Pro.f90 b/Sources/Process/Main_Pro.f90 index 5d04629dc..7d3dfc474 100644 --- a/Sources/Process/Main_Pro.f90 +++ b/Sources/Process/Main_Pro.f90 @@ -107,7 +107,7 @@ program Process_Prog ! Initialize first and current and read the last time step curr_dt = 0 first_dt = 0 - call Control_Mod_Number_Of_Time_Steps(last_dt, verbose=.true.) + call Control % Number_Of_Time_Steps(last_dt, verbose=.true.) call Control_Mod_Starting_Time_Step_For_Turb_Statistics(n_stat_t, & verbose = .true.) call Control_Mod_Starting_Time_Step_For_Swarm_Statistics(n_stat_p, & @@ -133,7 +133,7 @@ program Process_Prog ! Read time step from root call Control % Switch_To_Root() - call Control_Mod_Time_Step(Flow(d) % dt, verbose=.true.) + call Control % Time_Step(Flow(d) % dt, verbose=.true.) call Control % Switch_To_Domain(d) ! go back to local domain's control ! Read numerical models from control file (after the memory is allocated) @@ -299,9 +299,9 @@ program Process_Prog ! Inner-iteration loop ! !--------------------------! call Control % Switch_To_Root() - call Control_Mod_Max_Simple_Iterations(max_ini) - call Control_Mod_Min_Simple_Iterations(min_ini) - call Control_Mod_Tolerance_For_Simple_Algorithm(simple_tol) + call Control % Max_Simple_Iterations(max_ini) + call Control % Min_Simple_Iterations(min_ini) + call Control % Tolerance_For_Simple_Algorithm(simple_tol) do ini = 1, max_ini diff --git a/Sources/Process/Process_Mod/Compute_Pressure.f90 b/Sources/Process/Process_Mod/Compute_Pressure.f90 index 69d4ad8a0..c840c7329 100644 --- a/Sources/Process/Process_Mod/Compute_Pressure.f90 +++ b/Sources/Process/Process_Mod/Compute_Pressure.f90 @@ -61,7 +61,7 @@ subroutine Compute_Pressure(Process, Flow, Vof, Sol, curr_dt, ini) call Flow % Alias_Momentum(u, v, w) ! Volume balance reporting - call Flow % Report_Volume_Balance_Start(curr_dt, ini) + call Flow % Report_Vol_Balance_Start(curr_dt, ini) ! User function call User_Mod_Beginning_Of_Compute_Pressure(Flow, Vof, Sol, curr_dt, ini) @@ -137,7 +137,7 @@ subroutine Compute_Pressure(Process, Flow, Vof, Sol, curr_dt, ini) end do ! Volume balance reporting - call Flow % Report_Volume_Balance(Sol, curr_dt, ini) + call Flow % Report_Vol_Balance(Sol, curr_dt, ini) !------------------------------------------! ! Cross diffusion fluxes for pressure ! @@ -244,7 +244,7 @@ subroutine Compute_Pressure(Process, Flow, Vof, Sol, curr_dt, ini) call User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol, curr_dt, ini) ! Volume balance reporting - call Flow % Report_Volume_Balance_Stop() + call Flow % Report_Vol_Balance_Stop() call Profiler % Stop('Compute_Pressure (without solvers)') diff --git a/Sources/Process/Read_Controls_Mod/Numerical_Schemes.f90 b/Sources/Process/Read_Controls_Mod/Numerical_Schemes.f90 index 388a33913..d979294c3 100644 --- a/Sources/Process/Read_Controls_Mod/Numerical_Schemes.f90 +++ b/Sources/Process/Read_Controls_Mod/Numerical_Schemes.f90 @@ -30,29 +30,29 @@ subroutine Numerical_Schemes(Rc, Flow, Turb, Vof) !------------------------------------------! ! Basic algorithm for pressure-velocity coupling (SIMPLE, PISO) - call Control_Mod_Pressure_Momentum_Coupling(name, .true.) + call Control % Pressure_Momentum_Coupling(name, .true.) Flow % p_m_coupling = Numerics_Mod_Pressure_Momentum_Coupling_Code(name) if( Flow % p_m_coupling .eq. PISO) then - call Control_Mod_Number_Of_Piso_Corrections(Flow % n_piso_corrections) + call Control % Number_Of_Piso_Corrections(Flow % n_piso_corrections) Flow % inside_piso_loop = .false. end if ! Improvements to Rhie and Chow method (Choi, Gu) - call Control_Mod_Choi_Correction(Flow % choi_correction, .false.) - call Control_Mod_Gu_Correction (Flow % gu_correction, .false.) + call Control % Choi_Correction(Flow % choi_correction, .false.) + call Control % Gu_Correction (Flow % gu_correction, .false.) ! Report volume balance (in a separate file) - call Control_Mod_Report_Volume_Balance(Flow % report_vol_balance, .false.) + call Control % Report_Volume_Balance(Flow % rep_vol_balance, .false.) !----------------------------------! ! Gradient computation methods ! !----------------------------------! ! Tolerance and max iterations for computation of gradients with Gauss method - call Control_Mod_Tolerance_For_Gauss_Gradients (Flow % gauss_tol, .false.) - call Control_Mod_Max_Gauss_Gradients_Iterations(Flow % gauss_miter, .false.) - call Control_Mod_Max_Least_Squares_Gradients_Iterations(Flow % least_miter, & + call Control % Tolerance_For_Gauss_Gradients (Flow % gauss_tol, .false.) + call Control % Max_Gauss_Gradients_Iterations(Flow % gauss_miter, .false.) + call Control % Max_Least_Squares_Gradients_Iterations(Flow % least_miter, & .false.) !-------------------------! ! Related to momentum ! @@ -61,28 +61,28 @@ subroutine Numerical_Schemes(Rc, Flow, Turb, Vof) if(i .eq. 1) ui => Flow % u if(i .eq. 2) ui => Flow % v if(i .eq. 3) ui => Flow % w - call Control_Mod_Advection_Scheme_For_Momentum (name) + call Control % Advection_Scheme_For_Momentum (name) ui % adv_scheme = Numerics_Mod_Advection_Scheme_Code (name) - call Control_Mod_Time_Integration_Scheme (name) + call Control % Time_Integration_Scheme (name) ui % td_scheme = Numerics_Mod_Time_Integration_Scheme_Code(name) - call Control_Mod_Blending_Coefficient_For_Momentum (ui % blend) - call Control_Mod_Simple_Underrelaxation_For_Momentum(ui % urf) - call Control_Mod_Gradient_Method_For_Momentum (name) + call Control % Blending_Coefficient_For_Momentum (ui % blend) + call Control % Simple_Underrelaxation_For_Momentum (ui % urf) + call Control % Gradient_Method_For_Momentum (name) ui % grad_method = Numerics_Mod_Gradient_Method_Code(name) end do !-------------------------! ! Related to pressure ! !-------------------------! - call Control_Mod_Simple_Underrelaxation_For_Pressure(Flow % pp % urf) - call Control_Mod_Gradient_Method_For_Pressure (name) + call Control % Simple_Underrelaxation_For_Pressure(Flow % pp % urf) + call Control % Gradient_Method_For_Pressure (name) Flow % p % grad_method = Numerics_Mod_Gradient_Method_Code(name) Flow % pp % grad_method = Numerics_Mod_Gradient_Method_Code(name) !------------------------------! ! Related to wall distance ! !------------------------------! - call Control_Mod_Gradient_Method_For_Wall_Distance (name) + call Control % Gradient_Method_For_Wall_Distance (name) Flow % wall_dist % grad_method = Numerics_Mod_Gradient_Method_Code(name) !--------------------------! @@ -94,13 +94,13 @@ subroutine Numerical_Schemes(Rc, Flow, Turb, Vof) ! Related to heat transfer ! !------------------------------! if(Flow % heat_transfer) then - call Control_Mod_Advection_Scheme_For_Energy (name) + call Control % Advection_Scheme_For_Energy (name) Flow % t % adv_scheme = Numerics_Mod_Advection_Scheme_Code (name) - call Control_Mod_Time_Integration_Scheme (name) + call Control % Time_Integration_Scheme (name) Flow % t % td_scheme = Numerics_Mod_Time_Integration_Scheme_Code(name) - call Control_Mod_Blending_Coefficient_For_Energy (Flow % t % blend) - call Control_Mod_Simple_Underrelaxation_For_Energy(Flow % t % urf) - call Control_Mod_Gradient_Method_For_Energy (name) + call Control % Blending_Coefficient_For_Energy (Flow % t % blend) + call Control % Simple_Underrelaxation_For_Energy(Flow % t % urf) + call Control % Gradient_Method_For_Energy (name) Flow % t % grad_method = Numerics_Mod_Gradient_Method_Code(name) end if @@ -108,20 +108,20 @@ subroutine Numerical_Schemes(Rc, Flow, Turb, Vof) ! Related to multiphase Flow ! !--------------------------------! if(Flow % with_interface) then - call Control_Mod_Advection_Scheme_For_Vof (name) + call Control % Advection_Scheme_For_Vof (name) Vof % fun % adv_scheme = Numerics_Mod_Advection_Scheme_Code (name) - call Control_Mod_Time_Integration_Scheme (name) + call Control % Time_Integration_Scheme (name) Vof % fun % td_scheme = Numerics_Mod_Time_Integration_Scheme_Code(name) - call Control_Mod_Blending_Coefficient_For_Vof (Vof % fun % blend) - call Control_Mod_Simple_Underrelaxation_For_Vof (Vof % fun % urf) + call Control % Blending_Coefficient_For_Vof (Vof % fun % blend) + call Control % Simple_Underrelaxation_For_Vof(Vof % fun % urf) ! Max Courant number and Max substep cycles - call Control_Mod_Max_Courant_Vof (Vof % courant_max_param) - call Control_Mod_Max_Substep_Cycles_Vof(Vof % n_sub_param) - call Control_Mod_Max_Correction_Cycles_Beta_Vof (Vof % corr_num_max) - call Control_Mod_Max_Smoothing_Cycles_Curvature_Vof(Vof % n_conv_curv) - call Control_Mod_Max_Smoothing_Cycles_Normal_Vof (Vof % n_conv_norm) - call Control_Mod_Skewness_Correction_Vof (Vof % skew_corr) - call Control_Mod_Gradient_Method_For_Vof (name) + call Control % Max_Courant_Vof (Vof % courant_max_param) + call Control % Max_Substep_Cycles_Vof (Vof % n_sub_param) + call Control % Max_Correction_Cycles_Beta_Vof (Vof % corr_num_max) + call Control % Max_Smoothing_Cycles_Curvature_Vof(Vof % n_conv_curv) + call Control % Max_Smoothing_Cycles_Normal_Vof (Vof % n_conv_norm) + call Control % Skewness_Correction_Vof (Vof % skew_corr) + call Control % Gradient_Method_For_Vof (name) Vof % fun % grad_method = Numerics_Mod_Gradient_Method_Code(name) end if @@ -130,14 +130,14 @@ subroutine Numerical_Schemes(Rc, Flow, Turb, Vof) !--------------------------------! do sc = 1, Flow % n_scalars phi => Flow % scalar(sc) - call Control_Mod_Advection_Scheme_For_Scalars (name) + call Control % Advection_Scheme_For_Scalars (name) phi % adv_scheme = Numerics_Mod_Advection_Scheme_Code (name) - call Control_Mod_Time_Integration_Scheme (name) + call Control % Time_Integration_Scheme (name) phi % td_scheme = Numerics_Mod_Time_Integration_Scheme_Code(name) - call Control_Mod_Blending_Coefficient_For_Scalars (phi % blend) - call Control_Mod_Simple_Underrelaxation_For_Scalars(phi % urf) - call Control_Mod_Gradient_Method_For_Scalars (name) - phi % grad_method = Numerics_Mod_Gradient_Method_Code(name) + call Control % Blending_Coefficient_For_Scalars (phi % blend) + call Control % Simple_Underrelaxation_For_Scalars (phi % urf) + call Control % Gradient_Method_For_Scalars (name) + phi % grad_method = Numerics_Mod_Gradient_Method_Code (name) end do !------------------------------! @@ -156,14 +156,14 @@ subroutine Numerical_Schemes(Rc, Flow, Turb, Vof) if(i .eq. 10) tq => Turb % uv if(i .eq. 11) tq => Turb % uw if(i .eq. 12) tq => Turb % vw - call Control_Mod_Advection_Scheme_For_Turbulence (name) + call Control % Advection_Scheme_For_Turbulence (name) tq % adv_scheme = Numerics_Mod_Advection_Scheme_Code (name) - call Control_Mod_Time_Integration_Scheme (name) + call Control % Time_Integration_Scheme (name) tq % td_scheme = Numerics_Mod_Time_Integration_Scheme_Code(name) - call Control_Mod_Blending_Coefficient_For_Turbulence (tq % blend) - call Control_Mod_Simple_Underrelaxation_For_Turbulence(tq % urf) - call Control_Mod_Gradient_Method_For_Turbulence (name) - tq % grad_method = Numerics_Mod_Gradient_Method_Code(name) + call Control % Blending_Coefficient_For_Turbulence (tq % blend) + call Control % Simple_Underrelaxation_For_Turbulence (tq % urf) + call Control % Gradient_Method_For_Turbulence (name) + tq % grad_method = Numerics_Mod_Gradient_Method_Code (name) end do end subroutine diff --git a/Sources/Shared/Control_Mod.f90 b/Sources/Shared/Control_Mod.f90 index c591d6aa2..54888ce8b 100644 --- a/Sources/Shared/Control_Mod.f90 +++ b/Sources/Shared/Control_Mod.f90 @@ -84,6 +84,51 @@ module Control_Mod procedure :: Tolerance_For_Vof_Solver procedure :: Tolerance_For_Wall_Distance_Solver + ! Numerics + procedure :: Time_Step + procedure :: Number_Of_Time_Steps + procedure :: Advection_Scheme_For_Energy + procedure :: Advection_Scheme_For_Momentum + procedure :: Advection_Scheme_For_Scalars + procedure :: Advection_Scheme_For_Turbulence + procedure :: Advection_Scheme_For_Vof + procedure :: Blending_Coefficient_For_Energy + procedure :: Blending_Coefficient_For_Momentum + procedure :: Blending_Coefficient_For_Scalars + procedure :: Blending_Coefficient_For_Turbulence + procedure :: Blending_Coefficient_For_Vof + procedure :: Choi_Correction + procedure :: Gradient_Method_For_Energy + procedure :: Gradient_Method_For_Momentum + procedure :: Gradient_Method_For_Pressure + procedure :: Gradient_Method_For_Scalars + procedure :: Gradient_Method_For_Turbulence + procedure :: Gradient_Method_For_Vof + procedure :: Gradient_Method_For_Wall_Distance + procedure :: Gu_Correction + procedure :: Max_Gauss_Gradients_Iterations + procedure :: Max_Least_Squares_Gradients_Iterations + procedure :: Max_Simple_Iterations + procedure :: Min_Simple_Iterations + procedure :: Number_Of_Piso_Corrections + procedure :: Pressure_Momentum_Coupling + procedure :: Report_Volume_Balance + procedure :: Simple_Underrelaxation_For_Momentum + procedure :: Simple_Underrelaxation_For_Pressure + procedure :: Simple_Underrelaxation_For_Energy + procedure :: Simple_Underrelaxation_For_Scalars + procedure :: Simple_Underrelaxation_For_Turbulence + procedure :: Simple_Underrelaxation_For_Vof + procedure :: Time_Integration_Scheme + procedure :: Tolerance_For_Gauss_Gradients + procedure :: Tolerance_For_Simple_Algorithm + procedure :: Max_Correction_Cycles_Beta_Vof + procedure :: Max_Smoothing_Cycles_Curvature_Vof + procedure :: Max_Smoothing_Cycles_Normal_Vof + procedure :: Max_Courant_Vof + procedure :: Max_Substep_Cycles_Vof + procedure :: Skewness_Correction_Vof + end type type(Control_Type) :: Control diff --git a/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Energy.f90 b/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Energy.f90 index 71f9eba3f..ba0f053af 100644 --- a/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Energy.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Energy.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Advection_Scheme_For_Energy(scheme_name, verbose) + subroutine Advection_Scheme_For_Energy(Control, scheme_name, verbose) !------------------------------------------------------------------------------! ! Reading turbulence model from the control file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: scheme_name logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Momentum.f90 b/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Momentum.f90 index a26e91ff2..eb7a6c48b 100644 --- a/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Momentum.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Momentum.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Advection_Scheme_For_Momentum(scheme_name, verbose) + subroutine Advection_Scheme_For_Momentum(Control, scheme_name, verbose) !------------------------------------------------------------------------------! ! Reading turbulence model from the control file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: scheme_name logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Scalars.f90 b/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Scalars.f90 index 5061e02c1..b2feec1bc 100644 --- a/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Scalars.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Scalars.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Advection_Scheme_For_Scalars(scheme_name, verbose) + subroutine Advection_Scheme_For_Scalars(Control, scheme_name, verbose) !------------------------------------------------------------------------------! ! Reading turbulence model from the control file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: scheme_name logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Turbulence.f90 b/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Turbulence.f90 index 96502fb4f..9627e3ea7 100644 --- a/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Turbulence.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Turbulence.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Advection_Scheme_For_Turbulence(scheme_name, verbose) + subroutine Advection_Scheme_For_Turbulence(Control, scheme_name, verbose) !------------------------------------------------------------------------------! ! Reading turbulence model from the control file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: scheme_name logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Vof.f90 b/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Vof.f90 index 5f444302f..582fc08a1 100644 --- a/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Vof.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Advection_Scheme_For_Vof.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Advection_Scheme_For_Vof(scheme_name, verbose) + subroutine Advection_Scheme_For_Vof(Control, scheme_name, verbose) !------------------------------------------------------------------------------! ! Reading advection shceme for vof from control file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: scheme_name logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Energy.f90 b/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Energy.f90 index 02278ca28..ea5aaa40f 100644 --- a/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Energy.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Energy.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Blending_Coefficient_For_Energy(val, verbose) + subroutine Blending_Coefficient_For_Energy(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('BLENDING_COEFFICIENT_FOR_ENERGY', 1.0, & diff --git a/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Momentum.f90 b/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Momentum.f90 index 4903ae200..d608ff21a 100644 --- a/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Momentum.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Momentum.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Blending_Coefficient_For_Momentum(val, verbose) + subroutine Blending_Coefficient_For_Momentum(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('BLENDING_COEFFICIENT_FOR_MOMENTUM', 1.0, & diff --git a/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Scalars.f90 b/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Scalars.f90 index 0066c9520..ba1395f9d 100644 --- a/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Scalars.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Scalars.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Blending_Coefficient_For_Scalars(val, verbose) + subroutine Blending_Coefficient_For_Scalars(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('BLENDING_COEFFICIENT_FOR_SCALARS', & diff --git a/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Turbulence.f90 b/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Turbulence.f90 index 46c7f42da..fd9297d5d 100644 --- a/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Turbulence.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Turbulence.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Blending_Coefficient_For_Turbulence(val, verbose) + subroutine Blending_Coefficient_For_Turbulence(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('BLENDING_COEFFICIENT_FOR_TURBULENCE', 1.0, & diff --git a/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Vof.f90 b/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Vof.f90 index 11acbbfba..f9f88b10a 100644 --- a/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Vof.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Blending_Coefficient_For_Vof.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Blending_Coefficient_For_Vof(val, verbose) + subroutine Blending_Coefficient_For_Vof(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('BLENDING_COEFFICIENT_FOR_VOF', & diff --git a/Sources/Shared/Control_Mod/Numerics/Choi_Correction.f90 b/Sources/Shared/Control_Mod/Numerics/Choi_Correction.f90 index 20862a670..7c748079f 100644 --- a/Sources/Shared/Control_Mod/Numerics/Choi_Correction.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Choi_Correction.f90 @@ -1,9 +1,10 @@ !==============================================================================! - subroutine Control_Mod_Choi_Correction(choi_correction, verbose) + subroutine Choi_Correction(Control, corr, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - logical, intent(out) :: choi_correction + class(Control_Type) :: Control + logical, intent(out) :: corr logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! character(SL) :: val @@ -13,10 +14,10 @@ subroutine Control_Mod_Choi_Correction(choi_correction, verbose) call String % To_Upper_Case(val) if( val .eq. 'YES' ) then - choi_correction = .true. + corr = .true. else if( val .eq. 'NO' ) then - choi_correction = .false. + corr = .false. else call Message % Error(60, & diff --git a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Energy.f90 b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Energy.f90 index 9e852a313..1ed5679b7 100644 --- a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Energy.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Energy.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Gradient_Method_For_Energy(scheme_name, verbose) + subroutine Gradient_Method_For_Energy(Control, scheme_name, verbose) !------------------------------------------------------------------------------! ! Reading gradient method for energy (temperature, in practice) ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: scheme_name logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Momentum.f90 b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Momentum.f90 index b105df6d9..2f5109f74 100644 --- a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Momentum.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Momentum.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Gradient_Method_For_Momentum(scheme_name, verbose) + subroutine Gradient_Method_For_Momentum(Control, scheme_name, verbose) !------------------------------------------------------------------------------! ! Reading gradient method for momentum (velocities, in practice) ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: scheme_name logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Pressure.f90 b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Pressure.f90 index 08ceb5c48..b6aea2f78 100644 --- a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Pressure.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Pressure.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Gradient_Method_For_Pressure(scheme_name, verbose) + subroutine Gradient_Method_For_Pressure(Control, scheme_name, verbose) !------------------------------------------------------------------------------! ! Reading gradient method for pressure. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: scheme_name logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Scalars.f90 b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Scalars.f90 index 252fe3d94..eea53c16c 100644 --- a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Scalars.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Scalars.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Gradient_Method_For_Scalars(scheme_name, verbose) + subroutine Gradient_Method_For_Scalars(Control, scheme_name, verbose) !------------------------------------------------------------------------------! ! Reading gradient method for scalars. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: scheme_name logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Turbulence.f90 b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Turbulence.f90 index 718bbb8de..4e9c4ad62 100644 --- a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Turbulence.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Turbulence.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Gradient_Method_For_Turbulence(scheme_name, verbose) + subroutine Gradient_Method_For_Turbulence(Control, scheme_name, verbose) !------------------------------------------------------------------------------! ! Reading gradient method for turbulent quantities. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: scheme_name logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Vof.f90 b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Vof.f90 index 82cf35d48..24583db74 100644 --- a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Vof.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Vof.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Gradient_Method_For_Vof(scheme_name, verbose) + subroutine Gradient_Method_For_Vof(Control, scheme_name, verbose) !------------------------------------------------------------------------------! ! Reading gradient method for multiphase variables. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: scheme_name logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Wall_Distance.f90 b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Wall_Distance.f90 index c1eb8d14c..ce4b5a222 100644 --- a/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Wall_Distance.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Gradient_Method_For_Wall_Distance.f90 @@ -1,11 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Gradient_Method_For_Wall_Distance(scheme_name, & - verbose) + subroutine Gradient_Method_For_Wall_Distance(Control, scheme_name, verbose) !------------------------------------------------------------------------------! ! Reading gradient method for wall distance ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: scheme_name logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Numerics/Gu_Correction.f90 b/Sources/Shared/Control_Mod/Numerics/Gu_Correction.f90 index 9fc676b65..d913b1911 100644 --- a/Sources/Shared/Control_Mod/Numerics/Gu_Correction.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Gu_Correction.f90 @@ -1,9 +1,10 @@ !==============================================================================! - subroutine Control_Mod_Gu_Correction(gu_correction, verbose) + subroutine Gu_Correction(Control, corr, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - logical, intent(out) :: gu_correction + class(Control_Type) :: Control + logical, intent(out) :: corr logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! character(SL) :: val @@ -13,10 +14,10 @@ subroutine Control_Mod_Gu_Correction(gu_correction, verbose) call String % To_Upper_Case(val) if( val .eq. 'YES' ) then - gu_correction = .true. + corr = .true. else if( val .eq. 'NO' ) then - gu_correction = .false. + corr = .false. else call Message % Error(60, & diff --git a/Sources/Shared/Control_Mod/Numerics/Max_Correction_Cycles_Beta_Vof.f90 b/Sources/Shared/Control_Mod/Numerics/Max_Correction_Cycles_Beta_Vof.f90 index 2609af5c0..fd1a181ee 100644 --- a/Sources/Shared/Control_Mod/Numerics/Max_Correction_Cycles_Beta_Vof.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Max_Correction_Cycles_Beta_Vof.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Max_Correction_Cycles_Beta_Vof(val, verbose) + subroutine Max_Correction_Cycles_Beta_Vof(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Numerics/Max_Courant_Vof.f90 b/Sources/Shared/Control_Mod/Numerics/Max_Courant_Vof.f90 index 002c3eaad..51d3d42a1 100644 --- a/Sources/Shared/Control_Mod/Numerics/Max_Courant_Vof.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Max_Courant_Vof.f90 @@ -1,13 +1,13 @@ !==============================================================================! - subroutine Control_Mod_Max_Courant_Vof(val, verbose) + subroutine Max_Courant_Vof(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! - call Control % Read_Real_Item('MAX_COURANT_VOF', & - 0.25, val, verbose) + call Control % Read_Real_Item('MAX_COURANT_VOF', 0.25, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Max_Gauss_Gradients_Iterations.f90 b/Sources/Shared/Control_Mod/Numerics/Max_Gauss_Gradients_Iterations.f90 index 3e9bf3683..489d5b4a7 100644 --- a/Sources/Shared/Control_Mod/Numerics/Max_Gauss_Gradients_Iterations.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Max_Gauss_Gradients_Iterations.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Max_Gauss_Gradients_Iterations(val, verbose) + subroutine Max_Gauss_Gradients_Iterations(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Numerics/Max_Least_Squares_Gradients_Iterations.f90 b/Sources/Shared/Control_Mod/Numerics/Max_Least_Squares_Gradients_Iterations.f90 index 88da7bbec..4d12f10dc 100644 --- a/Sources/Shared/Control_Mod/Numerics/Max_Least_Squares_Gradients_Iterations.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Max_Least_Squares_Gradients_Iterations.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Max_Least_Squares_Gradients_Iterations(val, verbose) + subroutine Max_Least_Squares_Gradients_Iterations(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Numerics/Max_Simple_Iterations.f90 b/Sources/Shared/Control_Mod/Numerics/Max_Simple_Iterations.f90 index df3ee86b4..6882cb7ea 100644 --- a/Sources/Shared/Control_Mod/Numerics/Max_Simple_Iterations.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Max_Simple_Iterations.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Max_Simple_Iterations(val, verbose) + subroutine Max_Simple_Iterations(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Numerics/Max_Smoothing_Cycles_Curvature_Vof.f90 b/Sources/Shared/Control_Mod/Numerics/Max_Smoothing_Cycles_Curvature_Vof.f90 index 3661fde11..87753bda1 100644 --- a/Sources/Shared/Control_Mod/Numerics/Max_Smoothing_Cycles_Curvature_Vof.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Max_Smoothing_Cycles_Curvature_Vof.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Max_Smoothing_Cycles_Curvature_Vof(val, verbose) + subroutine Max_Smoothing_Cycles_Curvature_Vof(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Numerics/Max_Smoothing_Cycles_Normal_Vof.f90 b/Sources/Shared/Control_Mod/Numerics/Max_Smoothing_Cycles_Normal_Vof.f90 index 7e87b1dc7..23dd022bb 100644 --- a/Sources/Shared/Control_Mod/Numerics/Max_Smoothing_Cycles_Normal_Vof.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Max_Smoothing_Cycles_Normal_Vof.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Max_Smoothing_Cycles_Normal_Vof(val, verbose) + subroutine Max_Smoothing_Cycles_Normal_Vof(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Numerics/Max_Substep_Cycles_Vof.f90 b/Sources/Shared/Control_Mod/Numerics/Max_Substep_Cycles_Vof.f90 index f7402baf1..725aafdb5 100644 --- a/Sources/Shared/Control_Mod/Numerics/Max_Substep_Cycles_Vof.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Max_Substep_Cycles_Vof.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Max_Substep_Cycles_Vof(val, verbose) + subroutine Max_Substep_Cycles_Vof(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Numerics/Min_Simple_Iterations.f90 b/Sources/Shared/Control_Mod/Numerics/Min_Simple_Iterations.f90 index de014d5eb..5499ea988 100644 --- a/Sources/Shared/Control_Mod/Numerics/Min_Simple_Iterations.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Min_Simple_Iterations.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Min_Simple_Iterations(val, verbose) + subroutine Min_Simple_Iterations(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Numerics/Number_Of_Piso_Corrections.f90 b/Sources/Shared/Control_Mod/Numerics/Number_Of_Piso_Corrections.f90 index 110ceb8b0..6411dae9c 100644 --- a/Sources/Shared/Control_Mod/Numerics/Number_Of_Piso_Corrections.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Number_Of_Piso_Corrections.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Number_Of_Piso_Corrections(val, verbose) + subroutine Number_Of_Piso_Corrections(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Numerics/Number_Of_Time_Steps.f90 b/Sources/Shared/Control_Mod/Numerics/Number_Of_Time_Steps.f90 index 559f9729e..b4b9e5d45 100644 --- a/Sources/Shared/Control_Mod/Numerics/Number_Of_Time_Steps.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Number_Of_Time_Steps.f90 @@ -1,13 +1,13 @@ !==============================================================================! - subroutine Control_Mod_Number_Of_Time_Steps(val, verbose) + subroutine Number_Of_Time_Steps(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! - call Control % Read_Int_Item('NUMBER_OF_TIME_STEPS', 1200, & - val, verbose) + call Control % Read_Int_Item('NUMBER_OF_TIME_STEPS', 1200, val, verbose) end subroutine diff --git a/Sources/Shared/Control_Mod/Numerics/Pressure_Momentum_Coupling.f90 b/Sources/Shared/Control_Mod/Numerics/Pressure_Momentum_Coupling.f90 index 398c31380..23491cc89 100644 --- a/Sources/Shared/Control_Mod/Numerics/Pressure_Momentum_Coupling.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Pressure_Momentum_Coupling.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Pressure_Momentum_Coupling(name, verbose) + subroutine Pressure_Momentum_Coupling(Control, name, verbose) !------------------------------------------------------------------------------! ! Reading pressure-momentum model from the control file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: name ! simple or piso logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Numerics/Report_Volume_Balance.f90 b/Sources/Shared/Control_Mod/Numerics/Report_Volume_Balance.f90 index a087681e4..30f8890f9 100644 --- a/Sources/Shared/Control_Mod/Numerics/Report_Volume_Balance.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Report_Volume_Balance.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Report_Volume_Balance(vol_bal, verbose) + subroutine Report_Volume_Balance(Control, vol_bal, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control logical, intent(out) :: vol_bal logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! diff --git a/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Energy.f90 b/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Energy.f90 index d6ef81010..2c5dadad1 100644 --- a/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Energy.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Energy.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Simple_Underrelaxation_For_Energy(val, verbose) + subroutine Simple_Underrelaxation_For_Energy(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('SIMPLE_UNDERRELAXATION_FOR_ENERGY', 0.5, & diff --git a/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Momentum.f90 b/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Momentum.f90 index f1f2fbb07..4e05568c9 100644 --- a/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Momentum.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Momentum.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Simple_Underrelaxation_For_Momentum(val, verbose) + subroutine Simple_Underrelaxation_For_Momentum(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('SIMPLE_UNDERRELAXATION_FOR_MOMENTUM', 0.6, & diff --git a/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Pressure.f90 b/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Pressure.f90 index 3a30f2e18..57edde997 100644 --- a/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Pressure.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Pressure.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Simple_Underrelaxation_For_Pressure(val, verbose) + subroutine Simple_Underrelaxation_For_Pressure(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('SIMPLE_UNDERRELAXATION_FOR_PRESSURE', 0.4, & diff --git a/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Scalars.f90 b/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Scalars.f90 index c5b6e025a..324388190 100644 --- a/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Scalars.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Scalars.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Simple_Underrelaxation_For_Scalars(val, verbose) + subroutine Simple_Underrelaxation_For_Scalars(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('SIMPLE_UNDERRELAXATION_FOR_SCALARS', & diff --git a/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Turbulence.f90 b/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Turbulence.f90 index 4a0ac03c0..3eb2ef745 100644 --- a/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Turbulence.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Turbulence.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Simple_Underrelaxation_For_Turbulence(val, verbose) + subroutine Simple_Underrelaxation_For_Turbulence(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('SIMPLE_UNDERRELAXATION_FOR_TURBULENCE', & diff --git a/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Vof.f90 b/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Vof.f90 index 55aecca2d..c561f179b 100644 --- a/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Vof.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Simple_Underrelaxation_For_Vof.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Simple_Underrelaxation_For_Vof(val, verbose) + subroutine Simple_Underrelaxation_For_Vof(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('SIMPLE_UNDERRELAXATION_FOR_VOF', & diff --git a/Sources/Shared/Control_Mod/Numerics/Skewness_Correction_Vof.f90 b/Sources/Shared/Control_Mod/Numerics/Skewness_Correction_Vof.f90 index 97e430168..712af7e38 100644 --- a/Sources/Shared/Control_Mod/Numerics/Skewness_Correction_Vof.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Skewness_Correction_Vof.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Skewness_Correction_Vof(skew_corr, verbose) + subroutine Skewness_Correction_Vof(Control, skew_corr, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control logical, intent(out) :: skew_corr logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! diff --git a/Sources/Shared/Control_Mod/Numerics/Time_Integration_Scheme.f90 b/Sources/Shared/Control_Mod/Numerics/Time_Integration_Scheme.f90 index ccdea6fd0..9766665c5 100644 --- a/Sources/Shared/Control_Mod/Numerics/Time_Integration_Scheme.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Time_Integration_Scheme.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Time_Integration_Scheme(scheme_name, verbose) + subroutine Time_Integration_Scheme(Control, scheme_name, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: scheme_name logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Numerics/Time_Step.f90 b/Sources/Shared/Control_Mod/Numerics/Time_Step.f90 index 161d03b6d..821194af5 100644 --- a/Sources/Shared/Control_Mod/Numerics/Time_Step.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Time_Step.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Time_Step(val, verbose) + subroutine Time_Step(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('TIME_STEP', 1.0e-2, & diff --git a/Sources/Shared/Control_Mod/Numerics/Tolerance_For_Gauss_Gradients.f90 b/Sources/Shared/Control_Mod/Numerics/Tolerance_For_Gauss_Gradients.f90 index 6fd045cef..00166c161 100644 --- a/Sources/Shared/Control_Mod/Numerics/Tolerance_For_Gauss_Gradients.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Tolerance_For_Gauss_Gradients.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Tolerance_For_Gauss_Gradients(val, verbose) + subroutine Tolerance_For_Gauss_Gradients(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('TOLERANCE_FOR_GAUSS_GRADIENTS', & diff --git a/Sources/Shared/Control_Mod/Numerics/Tolerance_For_Simple_Algorithm.f90 b/Sources/Shared/Control_Mod/Numerics/Tolerance_For_Simple_Algorithm.f90 index 31f83f3a6..f45c1ae6c 100644 --- a/Sources/Shared/Control_Mod/Numerics/Tolerance_For_Simple_Algorithm.f90 +++ b/Sources/Shared/Control_Mod/Numerics/Tolerance_For_Simple_Algorithm.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Tolerance_For_Simple_Algorithm(val, verbose) + subroutine Tolerance_For_Simple_Algorithm(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('TOLERANCE_FOR_SIMPLE_ALGORITHM', & From e1c16f8faf16d73e3e26ba140f0c5a9fdd765ec4 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 2 Apr 2023 19:33:49 +0200 Subject: [PATCH 186/223] Modernizing Control_Mod; step 4 This was the last, but it also proved to be the most sensitive step. If something goes wrong, go back to the previouse check-in. On branch bojan_more_robust_communicator modified: Process/Field_Mod.f90 modified: Process/Field_Mod/Utilities/Potential_Initialization.f90 modified: Process/Main_Pro.f90 modified: Process/Process_Mod/Compute_Scalar.f90 modified: Process/Read_Controls_Mod/Boundary_Conditions.f90 modified: Process/Read_Controls_Mod/Physical_Models.f90 modified: Process/Read_Controls_Mod/Physical_Properties.f90 modified: Process/Turb_Mod.f90 modified: Process/Turb_Mod/Calculate_Heat_Flux.f90 modified: Process/Turb_Mod/Calculate_Scalar_Flux.f90 renamed: Process/Turb_Mod/Roughness_Coefficient.f90 -> Process/Turb_Mod/Roughness_Coeff.f90 modified: Process/Turb_Mod/Src_Eps_K_Eps.f90 modified: Process/Turb_Mod/Src_Eps_K_Eps_Zeta_F.f90 modified: Process/Turb_Mod/Src_Kin_K_Eps.f90 modified: Process/Turb_Mod/Src_Kin_K_Eps_Zeta_F.f90 modified: Process/Turb_Mod/Src_T2.f90 modified: Process/Turb_Mod/Vis_T_K_Eps.f90 modified: Process/Turb_Mod/Vis_T_K_Eps_Zeta_F.f90 modified: Process/Turb_Mod/Vis_T_Subgrid.f90 modified: Shared/Control_Mod.f90 modified: Shared/Control_Mod/Max_Threads.f90 modified: Shared/Control_Mod/Physics/Angular_Velocity_Vector.f90 modified: Shared/Control_Mod/Physics/Buoyancy.f90 modified: Shared/Control_Mod/Physics/Dynamic_Viscosity.f90 modified: Shared/Control_Mod/Physics/Extrapolate_Temperature_Exp.f90 modified: Shared/Control_Mod/Physics/Gravitational_Vector.f90 modified: Shared/Control_Mod/Physics/Heat_Capacity.f90 modified: Shared/Control_Mod/Physics/Heat_Transfer.f90 modified: Shared/Control_Mod/Physics/Hybrid_Les_Rans_Switch.f90 modified: Shared/Control_Mod/Physics/Interface_Tracking.f90 modified: Shared/Control_Mod/Physics/Latent_Heat.f90 modified: Shared/Control_Mod/Physics/Mass_Density.f90 modified: Shared/Control_Mod/Physics/Mass_Flow_Rates.f90 modified: Shared/Control_Mod/Physics/Mass_Transfer.f90 modified: Shared/Control_Mod/Physics/Max_Particles.f90 modified: Shared/Control_Mod/Physics/Number_Of_Domains.f90 modified: Shared/Control_Mod/Physics/Number_Of_Phases.f90 modified: Shared/Control_Mod/Physics/Number_Of_Scalars.f90 modified: Shared/Control_Mod/Physics/Number_Of_Swarm_Sub_Steps.f90 modified: Shared/Control_Mod/Physics/Particle_Tracking.f90 modified: Shared/Control_Mod/Physics/Phase_Capacities.f90 modified: Shared/Control_Mod/Physics/Phase_Conductivities.f90 modified: Shared/Control_Mod/Physics/Phase_Densities.f90 modified: Shared/Control_Mod/Physics/Phase_Viscosities.f90 modified: Shared/Control_Mod/Physics/Point_For_Monitoring_Planes.f90 modified: Shared/Control_Mod/Physics/Potential_Initialization.f90 modified: Shared/Control_Mod/Physics/Pressure_Drops.f90 modified: Shared/Control_Mod/Physics/Reference_Density.f90 modified: Shared/Control_Mod/Physics/Reference_Temperature.f90 modified: Shared/Control_Mod/Physics/Rough_Walls.f90 modified: Shared/Control_Mod/Physics/Roughness_Coefficient.f90 modified: Shared/Control_Mod/Physics/Saturation_Temperature.f90 modified: Shared/Control_Mod/Physics/Scalars_Diffusivity.f90 modified: Shared/Control_Mod/Physics/Smagorinsky_Constant.f90 modified: Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Computation.f90 modified: Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Statistics.f90 modified: Shared/Control_Mod/Physics/Starting_Time_Step_For_Turb_Statistics.f90 modified: Shared/Control_Mod/Physics/Surface_Tension.f90 modified: Shared/Control_Mod/Physics/Swarm_Coefficient_Of_Restitution.f90 modified: Shared/Control_Mod/Physics/Swarm_Density.f90 modified: Shared/Control_Mod/Physics/Swarm_Diameter.f90 modified: Shared/Control_Mod/Physics/Swarm_Subgrid_Scale_Model.f90 modified: Shared/Control_Mod/Physics/Thermal_Conductivity.f90 modified: Shared/Control_Mod/Physics/Track_Front.f90 modified: Shared/Control_Mod/Physics/Track_Surface.f90 modified: Shared/Control_Mod/Physics/Turbulence_Model.f90 modified: Shared/Control_Mod/Physics/Turbulence_Model_Variant.f90 modified: Shared/Control_Mod/Physics/Turbulent_Heat_Flux_Model.f90 modified: Shared/Control_Mod/Physics/Turbulent_Prandtl_Number.f90 modified: Shared/Control_Mod/Physics/Turbulent_Scalar_Flux_Model.f90 modified: Shared/Control_Mod/Physics/Turbulent_Schmidt_Number.f90 modified: Shared/Control_Mod/Physics/Volume_Expansion_Coefficient.f90 --- Sources/Process/Field_Mod.f90 | 2 +- .../Utilities/Potential_Initialization.f90 | 2 +- Sources/Process/Main_Pro.f90 | 24 +++--- .../Process/Process_Mod/Compute_Scalar.f90 | 4 +- .../Read_Controls_Mod/Boundary_Conditions.f90 | 2 +- .../Read_Controls_Mod/Physical_Models.f90 | 73 ++++++++--------- .../Read_Controls_Mod/Physical_Properties.f90 | 24 +++--- Sources/Process/Turb_Mod.f90 | 4 +- .../Process/Turb_Mod/Calculate_Heat_Flux.f90 | 44 ++++++----- .../Turb_Mod/Calculate_Scalar_Flux.f90 | 78 ++++++++++--------- ...ss_Coefficient.f90 => Roughness_Coeff.f90} | 4 +- Sources/Process/Turb_Mod/Src_Eps_K_Eps.f90 | 2 +- .../Process/Turb_Mod/Src_Eps_K_Eps_Zeta_F.f90 | 2 +- Sources/Process/Turb_Mod/Src_Kin_K_Eps.f90 | 2 +- .../Process/Turb_Mod/Src_Kin_K_Eps_Zeta_F.f90 | 2 +- Sources/Process/Turb_Mod/Src_T2.f90 | 2 +- Sources/Process/Turb_Mod/Vis_T_K_Eps.f90 | 2 +- .../Process/Turb_Mod/Vis_T_K_Eps_Zeta_F.f90 | 2 +- Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 | 2 +- Sources/Shared/Control_Mod.f90 | 55 +++++++++++++ Sources/Shared/Control_Mod/Max_Threads.f90 | 3 +- .../Physics/Angular_Velocity_Vector.f90 | 7 +- .../Shared/Control_Mod/Physics/Buoyancy.f90 | 3 +- .../Control_Mod/Physics/Dynamic_Viscosity.f90 | 7 +- .../Physics/Extrapolate_Temperature_Exp.f90 | 4 +- .../Physics/Gravitational_Vector.f90 | 7 +- .../Control_Mod/Physics/Heat_Capacity.f90 | 7 +- .../Control_Mod/Physics/Heat_Transfer.f90 | 9 ++- .../Physics/Hybrid_Les_Rans_Switch.f90 | 3 +- .../Physics/Interface_Tracking.f90 | 3 +- .../Control_Mod/Physics/Latent_Heat.f90 | 7 +- .../Control_Mod/Physics/Mass_Density.f90 | 7 +- .../Control_Mod/Physics/Mass_Flow_Rates.f90 | 7 +- .../Control_Mod/Physics/Mass_Transfer.f90 | 3 +- .../Control_Mod/Physics/Max_Particles.f90 | 3 +- .../Control_Mod/Physics/Number_Of_Domains.f90 | 3 +- .../Control_Mod/Physics/Number_Of_Phases.f90 | 3 +- .../Control_Mod/Physics/Number_Of_Scalars.f90 | 3 +- .../Physics/Number_Of_Swarm_Sub_Steps.f90 | 3 +- .../Control_Mod/Physics/Particle_Tracking.f90 | 3 +- .../Control_Mod/Physics/Phase_Capacities.f90 | 7 +- .../Physics/Phase_Conductivities.f90 | 7 +- .../Control_Mod/Physics/Phase_Densities.f90 | 7 +- .../Control_Mod/Physics/Phase_Viscosities.f90 | 7 +- .../Physics/Point_For_Monitoring_Planes.f90 | 8 +- .../Physics/Potential_Initialization.f90 | 3 +- .../Control_Mod/Physics/Pressure_Drops.f90 | 7 +- .../Control_Mod/Physics/Reference_Density.f90 | 7 +- .../Physics/Reference_Temperature.f90 | 7 +- .../Control_Mod/Physics/Rough_Walls.f90 | 9 ++- .../Physics/Roughness_Coefficient.f90 | 7 +- .../Physics/Saturation_Temperature.f90 | 7 +- .../Physics/Scalars_Diffusivity.f90 | 7 +- .../Physics/Smagorinsky_Constant.f90 | 7 +- ...arting_Time_Step_For_Swarm_Computation.f90 | 3 +- ...tarting_Time_Step_For_Swarm_Statistics.f90 | 3 +- ...Starting_Time_Step_For_Turb_Statistics.f90 | 3 +- .../Control_Mod/Physics/Surface_Tension.f90 | 7 +- .../Swarm_Coefficient_Of_Restitution.f90 | 7 +- .../Control_Mod/Physics/Swarm_Density.f90 | 7 +- .../Control_Mod/Physics/Swarm_Diameter.f90 | 7 +- .../Physics/Swarm_Subgrid_Scale_Model.f90 | 3 +- .../Physics/Thermal_Conductivity.f90 | 7 +- .../Control_Mod/Physics/Track_Front.f90 | 9 ++- .../Control_Mod/Physics/Track_Surface.f90 | 3 +- .../Control_Mod/Physics/Turbulence_Model.f90 | 3 +- .../Physics/Turbulence_Model_Variant.f90 | 3 +- .../Physics/Turbulent_Heat_Flux_Model.f90 | 3 +- .../Physics/Turbulent_Prandtl_Number.f90 | 7 +- .../Physics/Turbulent_Scalar_Flux_Model.f90 | 3 +- .../Physics/Turbulent_Schmidt_Number.f90 | 7 +- .../Physics/Volume_Expansion_Coefficient.f90 | 7 +- 72 files changed, 369 insertions(+), 247 deletions(-) rename Sources/Process/Turb_Mod/{Roughness_Coefficient.f90 => Roughness_Coeff.f90} (92%) diff --git a/Sources/Process/Field_Mod.f90 b/Sources/Process/Field_Mod.f90 index fbbf925db..a06c21b93 100644 --- a/Sources/Process/Field_Mod.f90 +++ b/Sources/Process/Field_Mod.f90 @@ -231,7 +231,7 @@ module Field_Mod procedure :: Calculate_Courant_In_Cells ! for post-processing procedure :: Calculate_Bulk_Fluxes procedure :: Compute_Wall_Distance ! see: Potential_Initialization - procedure :: Potential_Initialization ! see: Compute_Wall_Distance + procedure :: Potential_Initialisation ! see: Compute_Wall_Distance procedure :: Prandtl_Numb procedure :: Schmidt_Numb procedure :: U_Tan diff --git a/Sources/Process/Field_Mod/Utilities/Potential_Initialization.f90 b/Sources/Process/Field_Mod/Utilities/Potential_Initialization.f90 index 33c1cf0bb..2a45995d9 100644 --- a/Sources/Process/Field_Mod/Utilities/Potential_Initialization.f90 +++ b/Sources/Process/Field_Mod/Utilities/Potential_Initialization.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Potential_Initialization(Flow, Sol) + subroutine Potential_Initialisation(Flow, Sol) !------------------------------------------------------------------------------! ! Initializes velocity from potential (pressure-like) equation ! !------------------------------------------------------------------------------! diff --git a/Sources/Process/Main_Pro.f90 b/Sources/Process/Main_Pro.f90 index 7d3dfc474..b873279e4 100644 --- a/Sources/Process/Main_Pro.f90 +++ b/Sources/Process/Main_Pro.f90 @@ -63,7 +63,7 @@ program Process_Prog !-----------------------! call Control % Open_Root_File(root_control) - call Control_Mod_Number_Of_Domains(n_dom) + call Control % Number_Of_Domains(n_dom) if(n_dom > 1) then do d = 1, n_dom call Control % Open_Domain_File(d, dom_control(d)) @@ -87,7 +87,7 @@ program Process_Prog call Grid(d) % Load_Dim(This_Proc(), domain=d) ! Determine threads for OpenMP runs - call Control_Mod_Max_Threads(Grid(d) % Vect % d_threads, .true.) + call Control % Max_Threads(Grid(d) % Vect % d_threads, .true.) call Grid(d) % Determine_Threads() call Grid(d) % Calculate_Face_Geometry() @@ -108,12 +108,12 @@ program Process_Prog curr_dt = 0 first_dt = 0 call Control % Number_Of_Time_Steps(last_dt, verbose=.true.) - call Control_Mod_Starting_Time_Step_For_Turb_Statistics(n_stat_t, & + call Control % Starting_Time_Step_For_Turb_Statistics(n_stat_t, & + verbose = .true.) + call Control % Starting_Time_Step_For_Swarm_Statistics(n_stat_p, & + verbose = .true.) + call Control % Starting_Time_Step_For_Swarm_Computation(first_dt_p, & verbose = .true.) - call Control_Mod_Starting_Time_Step_For_Swarm_Statistics(n_stat_p, & - verbose = .true.) - call Control_Mod_Starting_Time_Step_For_Swarm_Computation(first_dt_p, & - verbose = .true.) ! Read physical models for each domain from control file do d = 1, n_dom @@ -183,9 +183,9 @@ program Process_Prog call Por(d) % Create_Porosity(Grid(d)) ! Plane for calcution of overall mass fluxes - call Control_Mod_Point_For_Monitoring_Planes(Flow(d) % bulk % xp, & - Flow(d) % bulk % yp, & - Flow(d) % bulk % zp) + call Control % Point_For_Monitoring_Planes(Flow(d) % bulk % xp, & + Flow(d) % bulk % yp, & + Flow(d) % bulk % zp) ! Prepare ... call Bulk_Mod_Monitoring_Planes_Areas(Flow(d) % bulk, Grid(d)) @@ -224,8 +224,8 @@ program Process_Prog if(first_dt .eq. 0) then do d = 1, n_dom call Control % Switch_To_Domain(d) ! not sure if this call is needed - call Control_Mod_Potential_Initialization(pot_init, .true.) - if(pot_init) call Flow(d) % Potential_Initialization(Sol(d)) + call Control % Potential_Initialization(pot_init, .true.) + if(pot_init) call Flow(d) % Potential_Initialisation(Sol(d)) end do end if diff --git a/Sources/Process/Process_Mod/Compute_Scalar.f90 b/Sources/Process/Process_Mod/Compute_Scalar.f90 index ace62afc6..fe270155f 100644 --- a/Sources/Process/Process_Mod/Compute_Scalar.f90 +++ b/Sources/Process/Process_Mod/Compute_Scalar.f90 @@ -97,7 +97,9 @@ subroutine Compute_Scalar(Process, Flow, Turb, Vof, Sol, curr_dt, ini, sc) !----------------------------! ! Spatial discretization ! !----------------------------! - call Control_Mod_Turbulent_Schmidt_Number(sc_t) ! get default sc_t (0.9) + + ! It used to read sc_t from here which is an overkill, so check + Assert(sc_t > 0.0) do s = 1, Grid % n_faces diff --git a/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 b/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 index 16aca0881..a1b8ec718 100644 --- a/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 +++ b/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 @@ -56,7 +56,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) ! Read wall roughness, if specified as a constant for all walls ! ! (If it is not specified in the control file, it will be zero) ! !-------------------------------------------------------------------! - call Control_Mod_Roughness_Coefficient(Turb % z_o) + call Control % Roughness_Coefficient(Turb % z_o) !----------------------------------------------------------------! ! Count number of types per boundary condition, total number ! diff --git a/Sources/Process/Read_Controls_Mod/Physical_Models.f90 b/Sources/Process/Read_Controls_Mod/Physical_Models.f90 index 06ac1d9c7..275e123f8 100644 --- a/Sources/Process/Read_Controls_Mod/Physical_Models.f90 +++ b/Sources/Process/Read_Controls_Mod/Physical_Models.f90 @@ -37,11 +37,11 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) ! Related to heat transfer and bouyancy ! ! ! !-------------------------------------------! - call Control_Mod_Heat_Transfer(Flow % heat_transfer, verbose = .true.) - call Control_Mod_Gravitational_Vector(Flow % grav_x, & - Flow % grav_y, & - Flow % grav_z, .true.) - call Control_Mod_Buoyancy(name, .true.) + call Control % Heat_Transfer(Flow % heat_transfer, verbose = .true.) + call Control % Gravitational_Vector(Flow % grav_x, & + Flow % grav_y, & + Flow % grav_z, .true.) + call Control % Buoyancy(name, .true.) select case(name) case('NONE') Flow % buoyancy = NO_BUOYANCY @@ -55,18 +55,19 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) '. \n Exiting!') end select - call Control_Mod_Reference_Density (Flow % dens_ref, .true.) - call Control_Mod_Reference_Temperature (Flow % t_ref, .true.) - call Control_Mod_Volume_Expansion_Coefficient(Flow % beta, .true.) - call Control_Mod_Turbulent_Prandtl_Number (pr_t) ! default is (0.9) - call Control_Mod_Extrapolate_Temperature_Exp (Flow % exp_temp_wall, .true.) + call Control % Reference_Density (Flow % dens_ref, .true.) + call Control % Reference_Temperature (Flow % t_ref, .true.) + call Control % Volume_Expansion_Coefficient(Flow % beta, .true.) + call Control % Turbulent_Prandtl_Number (pr_t) ! default is (0.9) + call Control % Turbulent_Schmidt_Number (sc_t) ! default is (0.9) + call Control % Extrapolate_Temperature_Exp (Flow % exp_temp_wall, .true.) !---------------------------! ! ! ! Related to turbulence ! ! ! !---------------------------! - call Control_Mod_Turbulence_Model(name, .true.) + call Control % Turbulence_Model(name, .true.) select case(name) case('NONE') @@ -109,7 +110,7 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) !---------------------------------------------------------! if(Turb % model .eq. RSM_HANJALIC_JAKIRLIC .or. & Turb % model .eq. RSM_MANCEAU_HANJALIC) then - call Control_Mod_Turbulence_Model_Variant(name, .true.) + call Control % Turbulence_Model_Variant(name, .true.) if (name .eq. 'NONE') then Turb % model_variant = NO_TURBULENCE_MODEL else if(name .eq. 'STABILIZED') then @@ -124,7 +125,7 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) !----------------------------! ! Rough or smooth walls? ! !----------------------------! - call Control_Mod_Rough_Walls(Turb % rough_walls, .true.) + call Control % Rough_Walls(Turb % rough_walls, .true.) ! Does the user want to gather statistics? call Control % Read_Int_Item('STARTING_TIME_STEP_FOR_TURB_STATISTICS', & @@ -156,7 +157,7 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) !-------------------------------! ! Turbulent heat flux model ! !-------------------------------! - call Control_Mod_Turbulent_Heat_Flux_Model(name, .true.) + call Control % Turbulent_Heat_Flux_Model(name, .true.) select case(name) case('SGDH') Turb % heat_flux_model = SGDH @@ -174,7 +175,7 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) ! Type of switching for hybrid LES/RANS ! !-------------------------------------------! if(Turb % model .eq. HYBRID_LES_RANS) then - call Control_Mod_Hybrid_Les_Rans_Switch(name, .true.) + call Control % Hybrid_Les_Rans_Switch(name, .true.) select case(name) case('SWITCH_DISTANCE') Turb % hybrid_les_rans_switch = SWITCH_DISTANCE @@ -192,7 +193,7 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) !-------------------------------------------------------------------------! if(Turb % model .eq. LES_SMAGORINSKY .or. & Turb % model .eq. HYBRID_LES_PRANDTL) then - call Control_Mod_Smagorinsky_Constant(c_smag, .true.) + call Control % Smagorinsky_Constant(c_smag, .true.) end if if(Turb % model .eq. K_EPS) then @@ -227,31 +228,31 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) ! Pressure drops and mass fluxes ! ! ! !------------------------------------! - call Control_Mod_Pressure_Drops(bulk % p_drop_x, & - bulk % p_drop_y, & - bulk % p_drop_z) - call Control_Mod_Mass_Flow_Rates(bulk % flux_x_o, & - bulk % flux_y_o, & - bulk % flux_z_o) + call Control % Pressure_Drops(bulk % p_drop_x, & + bulk % p_drop_y, & + bulk % p_drop_z) + call Control % Mass_Flow_Rates(bulk % flux_x_o, & + bulk % flux_y_o, & + bulk % flux_z_o) !-----------------------! ! ! ! Number of scalars ! ! ! !-----------------------! - call Control_Mod_Number_Of_Scalars(Flow % n_scalars, verbose = .true.) + call Control % Number_Of_Scalars(Flow % n_scalars, verbose = .true.) !-----------------------------------! ! ! ! Related to interface tracking ! ! ! !-----------------------------------! - call Control_Mod_Interface_Tracking(Flow % with_interface, .true.) + call Control % Interface_Tracking(Flow % with_interface, .true.) if(Flow % with_interface) then - call Control_Mod_Track_Front (Vof % track_front, .true.) - call Control_Mod_Track_Surface(Vof % track_surface, .true.) - call Control_Mod_Mass_Transfer(Flow % mass_transfer) + call Control % Track_Front (Vof % track_front, .true.) + call Control % Track_Surface(Vof % track_surface, .true.) + call Control % Mass_Transfer(Flow % mass_transfer) end if !-----------------------! @@ -259,24 +260,24 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) ! Particle tracking ! ! ! !-----------------------! - call Control_Mod_Particle_Tracking(Flow % with_particles, .true.) + call Control % Particle_Tracking(Flow % with_particles, .true.) if(Flow % with_particles) then - call Control_Mod_Max_Particles (Swarm % max_particles, verbose = .true.) - call Control_Mod_Swarm_Density (Swarm % density, verbose = .true.) - call Control_Mod_Swarm_Diameter(Swarm % diameter, verbose = .true.) + call Control % Max_Particles (Swarm % max_particles, verbose = .true.) + call Control % Swarm_Density (Swarm % density, verbose = .true.) + call Control % Swarm_Diameter(Swarm % diameter, verbose = .true.) - call Control_Mod_Swarm_Coefficient_Of_Restitution(Swarm % rst, & - verbose = .true.) - call Control_Mod_Number_Of_Swarm_Sub_Steps (Swarm % n_sub_steps, & - verbose = .true.) + call Control % Swarm_Coefficient_Of_Restitution(Swarm % rst, & + verbose = .true.) + call Control % Number_Of_Swarm_Sub_Steps (Swarm % n_sub_steps, & + verbose = .true.) call Control % Read_Int_Item('STARTING_TIME_STEP_FOR_SWARM_STATISTICS', & HUGE_INT, n_stat_p, .false.) ! SGS models for particle - call Control_Mod_Swarm_Subgrid_Scale_Model(name, verbose = .true.) + call Control % Swarm_Subgrid_Scale_Model(name, verbose = .true.) select case(name) case('BROWNIAN_FUKAGATA') Swarm % subgrid_scale_model = BROWNIAN_FUKAGATA diff --git a/Sources/Process/Read_Controls_Mod/Physical_Properties.f90 b/Sources/Process/Read_Controls_Mod/Physical_Properties.f90 index 0eb76a417..86930db37 100644 --- a/Sources/Process/Read_Controls_Mod/Physical_Properties.f90 +++ b/Sources/Process/Read_Controls_Mod/Physical_Properties.f90 @@ -21,20 +21,20 @@ subroutine Physical_Properties(Rc, Flow, Vof, Swarm) Grid => Flow % pnt_grid ! Read constant (defualt) values - call Control_Mod_Dynamic_Viscosity (visc_const) - call Control_Mod_Mass_Density (dens_const) - call Control_Mod_Heat_Capacity (capa_const) - call Control_Mod_Thermal_Conductivity(cond_const) - call Control_Mod_Scalars_Diffusivity (Flow % diffusivity) + call Control % Dynamic_Viscosity (visc_const) + call Control % Mass_Density (dens_const) + call Control % Heat_Capacity (capa_const) + call Control % Thermal_Conductivity(cond_const) + call Control % Scalars_Diffusivity (Flow % diffusivity) if(Flow % with_interface) then - call Control_Mod_Phase_Densities (Vof % phase_dens) - call Control_Mod_Phase_Viscosities (Vof % phase_visc) - call Control_Mod_Phase_Capacities (Vof % phase_capa) - call Control_Mod_Phase_Conductivities (Vof % phase_cond) - call Control_Mod_Surface_Tension (Vof % surface_tension) - call Control_Mod_Latent_Heat (Vof % latent_heat) - call Control_Mod_Saturation_Temperature(Vof % t_sat) + call Control % Phase_Densities (Vof % phase_dens) + call Control % Phase_Viscosities (Vof % phase_visc) + call Control % Phase_Capacities (Vof % phase_capa) + call Control % Phase_Conductivities (Vof % phase_cond) + call Control % Surface_Tension (Vof % surface_tension) + call Control % Latent_Heat (Vof % latent_heat) + call Control % Saturation_Temperature(Vof % t_sat) else Flow % density (:) = dens_const Flow % viscosity (:) = visc_const diff --git a/Sources/Process/Turb_Mod.f90 b/Sources/Process/Turb_Mod.f90 index 7dd034293..714495dc2 100644 --- a/Sources/Process/Turb_Mod.f90 +++ b/Sources/Process/Turb_Mod.f90 @@ -206,7 +206,7 @@ module Turb_Mod procedure :: Tau_Wall_Log_Law procedure :: U_Plus_Log_Law procedure :: Time_And_Length_Scale - procedure :: Roughness_Coefficient + procedure :: Roughness_Coeff procedure :: Les @@ -348,7 +348,7 @@ module Turb_Mod # include "Turb_Mod/Tau_Wall_Log_Law.f90" # include "Turb_Mod/U_Plus_Log_Law.f90" # include "Turb_Mod/Time_And_Length_Scale.f90" -# include "Turb_Mod/Roughness_Coefficient.f90" +# include "Turb_Mod/Roughness_Coeff.f90" # include "Turb_Mod/Les.f90" diff --git a/Sources/Process/Turb_Mod/Calculate_Heat_Flux.f90 b/Sources/Process/Turb_Mod/Calculate_Heat_Flux.f90 index 5ebc27ee0..05a2b246f 100644 --- a/Sources/Process/Turb_Mod/Calculate_Heat_Flux.f90 +++ b/Sources/Process/Turb_Mod/Calculate_Heat_Flux.f90 @@ -30,10 +30,14 @@ subroutine Calculate_Heat_Flux(Turb) ! ... maybe this call is not needed call Flow % Grad_Variable(t) + ! It used to read pr_t from here, so check it just in case + Assert(pr_t > 0.0) + !-----------------------------------------! + ! ! ! Compute the sources in the interior ! + ! ! !-----------------------------------------! - call Control_Mod_Turbulent_Prandtl_Number(pr_t) !-----------------------------------------------------------! ! By default turbulent heat flux is caalculated by SGDH ! @@ -42,31 +46,28 @@ subroutine Calculate_Heat_Flux(Turb) if(Turb % heat_flux_model .eq. SGDH) then do c = Cells_In_Domain_And_Buffers() pr_t = max(Turb % Prandtl_Turb(c), TINY) - ut % n(c) = - Turb % vis_t(c) / Flow % density(c) / pr_t * t % x(c) - vt % n(c) = - Turb % vis_t(c) / Flow % density(c) / pr_t * t % y(c) - wt % n(c) = - Turb % vis_t(c) / Flow % density(c) / pr_t * t % z(c) + ut % n(c) = -Turb % vis_t(c) / Flow % density(c) / pr_t * t % x(c) + vt % n(c) = -Turb % vis_t(c) / Flow % density(c) / pr_t * t % y(c) + wt % n(c) = -Turb % vis_t(c) / Flow % density(c) / pr_t * t % z(c) if(Turb % model .eq. HYBRID_LES_RANS) then - ut % n(c) = - Turb % vis_t_eff(c) / Flow % density(c) & - / pr_t * t % x(c) - vt % n(c) = - Turb % vis_t_eff(c) / Flow % density(c) & - / pr_t * t % y(c) - wt % n(c) = - Turb % vis_t_eff(c) / Flow % density(c) & - / pr_t * t % z(c) + ut % n(c) = -Turb % vis_t_eff(c) / Flow % density(c) / pr_t * t % x(c) + vt % n(c) = -Turb % vis_t_eff(c) / Flow % density(c) / pr_t * t % y(c) + wt % n(c) = -Turb % vis_t_eff(c) / Flow % density(c) / pr_t * t % z(c) end if end do else if(Turb % heat_flux_model .eq. GGDH) then do c = Cells_In_Domain_And_Buffers() - ut % n(c) = -c_theta * Turb % t_scale(c) * (uu % n(c) * t % x(c) + & - uv % n(c) * t % y(c) + & - uw % n(c) * t % z(c)) - vt % n(c) = -c_theta * Turb % t_scale(c) * (uv % n(c) * t % x(c) + & - vv % n(c) * t % y(c) + & - vw % n(c) * t % z(c)) - wt % n(c) = -c_theta * Turb % t_scale(c) * (uw % n(c) * t % x(c) + & - vw % n(c) * t % y(c) + & - ww % n(c) * t % z(c)) + ut % n(c) = -c_theta * Turb % t_scale(c) * ( uu % n(c) * t % x(c) & + + uv % n(c) * t % y(c) & + + uw % n(c) * t % z(c)) + vt % n(c) = -c_theta * Turb % t_scale(c) * ( uv % n(c) * t % x(c) & + + vv % n(c) * t % y(c) & + + vw % n(c) * t % z(c)) + wt % n(c) = -c_theta * Turb % t_scale(c) * ( uw % n(c) * t % x(c) & + + vw % n(c) * t % y(c) & + + ww % n(c) * t % z(c)) end do else if(Turb % heat_flux_model .eq. AFM) then @@ -104,6 +105,11 @@ subroutine Calculate_Heat_Flux(Turb) end do end if + !--------------------------------------! + ! ! + ! Compute the sources at the walls ! + ! ! + !--------------------------------------! if(Turb % model .eq. K_EPS .or. & Turb % model .eq. K_EPS_ZETA_F .or. & Turb % model .eq. HYBRID_LES_RANS) then diff --git a/Sources/Process/Turb_Mod/Calculate_Scalar_Flux.f90 b/Sources/Process/Turb_Mod/Calculate_Scalar_Flux.f90 index b3fb5e867..d5ff49dac 100644 --- a/Sources/Process/Turb_Mod/Calculate_Scalar_Flux.f90 +++ b/Sources/Process/Turb_Mod/Calculate_Scalar_Flux.f90 @@ -30,10 +30,14 @@ subroutine Calculate_Scalar_Flux(Turb, sc) ! ... maybe this call is not needed call Flow % Grad_Variable(phi) + ! It used to read sc_t from here which is an overkill, so check + Assert(sc_t > 0.0) + !-----------------------------------------! + ! ! ! Compute the sources in the interior ! + ! ! !-----------------------------------------! - call Control_Mod_Turbulent_Schmidt_Number(sc_t) !-----------------------------------------! ! First guess is the flux defined by SGDH ! @@ -41,32 +45,32 @@ subroutine Calculate_Scalar_Flux(Turb, sc) if(Turb % scalar_flux_model .eq. SGDH) then do c = Cells_In_Domain_And_Buffers() - Turb % uc(c) = - Turb % vis_t(c) / Flow % density(c) / sc_t * phi % x(c) - Turb % vc(c) = - Turb % vis_t(c) / Flow % density(c) / sc_t * phi % y(c) - Turb % wc(c) = - Turb % vis_t(c) / Flow % density(c) / sc_t * phi % z(c) + Turb % uc(c) = -Turb % vis_t(c) / Flow % density(c) / sc_t * phi % x(c) + Turb % vc(c) = -Turb % vis_t(c) / Flow % density(c) / sc_t * phi % y(c) + Turb % wc(c) = -Turb % vis_t(c) / Flow % density(c) / sc_t * phi % z(c) if(Turb % model .eq. HYBRID_LES_RANS) then - Turb % uc(c) = - Turb % vis_t_eff(c) / Flow % density(c) & - / sc_t * phi % x(c) - Turb % vc(c) = - Turb % vis_t_eff(c) / Flow % density(c) & - / sc_t * phi % y(c) - Turb % wc(c) = - Turb % vis_t_eff(c) / Flow % density(c) & - / sc_t * phi % z(c) + Turb % uc(c) = -Turb % vis_t_eff(c) / Flow % density(c) & + / sc_t * phi % x(c) + Turb % vc(c) = -Turb % vis_t_eff(c) / Flow % density(c) & + / sc_t * phi % y(c) + Turb % wc(c) = -Turb % vis_t_eff(c) / Flow % density(c) & + / sc_t * phi % z(c) end if end do else if(Turb % scalar_flux_model .eq. GGDH) then do c = Cells_In_Domain_And_Buffers() - Turb % uc(c) = -c_theta * Turb % t_scale(c) * (uu % n(c) * phi % x(c) + & - uv % n(c) * phi % y(c) + & - uw % n(c) * phi % z(c)) - Turb % vc(c) = -c_theta * Turb % t_scale(c) * (uv % n(c) * phi % x(c) + & - vv % n(c) * phi % y(c) + & - vw % n(c) * phi % z(c)) - Turb % wc(c) = -c_theta * Turb % t_scale(c) * (uw % n(c) * phi % x(c) + & - vw % n(c) * phi % y(c) + & - ww % n(c) * phi % z(c)) + Turb % uc(c) = -c_theta * Turb % t_scale(c) * ( uu % n(c) * phi % x(c) & + + uv % n(c) * phi % y(c) & + + uw % n(c) * phi % z(c)) + Turb % vc(c) = -c_theta * Turb % t_scale(c) * ( uv % n(c) * phi % x(c) & + + vv % n(c) * phi % y(c) & + + vw % n(c) * phi % z(c)) + Turb % wc(c) = -c_theta * Turb % t_scale(c) * ( uw % n(c) * phi % x(c) & + + vw % n(c) * phi % y(c) & + + ww % n(c) * phi % z(c)) end do else if(Turb % scalar_flux_model .eq. AFM) then @@ -76,32 +80,36 @@ subroutine Calculate_Scalar_Flux(Turb, sc) do k = 1, 3 do c = Cells_In_Domain_And_Buffers() - Turb % uc(c) = -c_theta*Turb % t_scale(c) * (( uu % n(c) * phi % x(c) & - + uv % n(c) * phi % y(c) & - + uw % n(c) * phi % z(c)) & - + afm_eta * ( Turb % uc(c) * u % x(c) & - + Turb % vc(c) * u % y(c) & + Turb % uc(c) = -c_theta*Turb % t_scale(c) * (( uu % n(c) * phi % x(c) & + + uv % n(c) * phi % y(c) & + + uw % n(c) * phi % z(c)) & + + afm_eta * ( Turb % uc(c) * u % x(c) & + + Turb % vc(c) * u % y(c) & + Turb % wc(c) * u % z(c))) - - Turb % vc(c) = -c_theta*Turb % t_scale(c) * (( uv % n(c) * phi % x(c) & - + vv % n(c) * phi % y(c) & - + vw % n(c) * phi % z(c)) & - + afm_eta * ( Turb % uc(c) * v % x(c) & - + Turb % vc(c) * v % y(c) & + Turb % vc(c) = -c_theta*Turb % t_scale(c) * (( uv % n(c) * phi % x(c) & + + vv % n(c) * phi % y(c) & + + vw % n(c) * phi % z(c)) & + + afm_eta * ( Turb % uc(c) * v % x(c) & + + Turb % vc(c) * v % y(c) & + Turb % wc(c) * v % z(c))) - Turb % wc(c) = -c_theta*Turb % t_scale(c) * (( uw % n(c) * phi % x(c) & - + vw % n(c) * phi % y(c) & - + ww % n(c) * phi % z(c)) & - + afm_eta * ( Turb % uc(c) * w % x(c) & - + Turb % vc(c) * w % y(c) & + Turb % wc(c) = -c_theta*Turb % t_scale(c) * (( uw % n(c) * phi % x(c) & + + vw % n(c) * phi % y(c) & + + ww % n(c) * phi % z(c)) & + + afm_eta * ( Turb % uc(c) * w % x(c) & + + Turb % vc(c) * w % y(c) & + Turb % wc(c) * w % z(c))) end do end do ! browse three times, but why? end if ! scalar model SGDH, GGDH or AFM + !--------------------------------------! + ! ! + ! Compute the sources at the walls ! + ! ! + !--------------------------------------! if(Turb % model .eq. K_EPS .or. & Turb % model .eq. K_EPS_ZETA_F .or. & Turb % model .eq. HYBRID_LES_RANS) then diff --git a/Sources/Process/Turb_Mod/Roughness_Coefficient.f90 b/Sources/Process/Turb_Mod/Roughness_Coeff.f90 similarity index 92% rename from Sources/Process/Turb_Mod/Roughness_Coefficient.f90 rename to Sources/Process/Turb_Mod/Roughness_Coeff.f90 index f99acf5e2..64df00239 100644 --- a/Sources/Process/Turb_Mod/Roughness_Coefficient.f90 +++ b/Sources/Process/Turb_Mod/Roughness_Coeff.f90 @@ -1,5 +1,5 @@ !==============================================================================! - real function Roughness_Coefficient(Turb, c1, c2) + real function Roughness_Coeff(Turb, c1, c2) !------------------------------------------------------------------------------! ! Set up roughness coefficient ! !------------------------------------------------------------------------------! @@ -21,6 +21,6 @@ real function Roughness_Coefficient(Turb, c1, c2) end if ! Specify the return value - Roughness_Coefficient = z_o + Roughness_Coeff = z_o end function diff --git a/Sources/Process/Turb_Mod/Src_Eps_K_Eps.f90 b/Sources/Process/Turb_Mod/Src_Eps_K_Eps.f90 index 52f699f94..993abbb1a 100644 --- a/Sources/Process/Turb_Mod/Src_Eps_K_Eps.f90 +++ b/Sources/Process/Turb_Mod/Src_Eps_K_Eps.f90 @@ -101,7 +101,7 @@ subroutine Src_Eps_K_Eps(Turb, Sol) kin_vis = Flow % viscosity(c1) / Flow % density(c1) ! Set up roughness coefficient - z_o = Turb % Roughness_Coefficient(c1, c2) + z_o = Turb % Roughness_Coeff(c1, c2) ! Compute tangential velocity component u_tan = Flow % U_Tan(s) diff --git a/Sources/Process/Turb_Mod/Src_Eps_K_Eps_Zeta_F.f90 b/Sources/Process/Turb_Mod/Src_Eps_K_Eps_Zeta_F.f90 index 54882a00d..9a95b87ec 100644 --- a/Sources/Process/Turb_Mod/Src_Eps_K_Eps_Zeta_F.f90 +++ b/Sources/Process/Turb_Mod/Src_Eps_K_Eps_Zeta_F.f90 @@ -91,7 +91,7 @@ subroutine Src_Eps_K_Eps_Zeta_F(Turb, Sol) kin_vis = Flow % viscosity(c1) / Flow % density(c1) ! Set up roughness coefficient - z_o = Turb % Roughness_Coefficient(c1, c2) + z_o = Turb % Roughness_Coeff(c1, c2) ! Compute tangential velocity component u_tan = Flow % U_Tan(s) diff --git a/Sources/Process/Turb_Mod/Src_Kin_K_Eps.f90 b/Sources/Process/Turb_Mod/Src_Kin_K_Eps.f90 index 17d9c3139..90e009d28 100644 --- a/Sources/Process/Turb_Mod/Src_Kin_K_Eps.f90 +++ b/Sources/Process/Turb_Mod/Src_Kin_K_Eps.f90 @@ -87,7 +87,7 @@ subroutine Src_Kin_K_Eps(Turb, Sol) kin_vis = Flow % viscosity(c1) / Flow % density(c1) ! Set up roughness coefficient - z_o = Turb % Roughness_Coefficient(c1, c2) + z_o = Turb % Roughness_Coeff(c1, c2) ! Compute tangential velocity component u_tan = Flow % U_Tan(s) diff --git a/Sources/Process/Turb_Mod/Src_Kin_K_Eps_Zeta_F.f90 b/Sources/Process/Turb_Mod/Src_Kin_K_Eps_Zeta_F.f90 index 72b9b9107..ba4653523 100644 --- a/Sources/Process/Turb_Mod/Src_Kin_K_Eps_Zeta_F.f90 +++ b/Sources/Process/Turb_Mod/Src_Kin_K_Eps_Zeta_F.f90 @@ -136,7 +136,7 @@ subroutine Src_Kin_K_Eps_Zeta_F(Turb, Sol) kin_vis = Flow % viscosity(c1) / Flow % density(c1) ! Set up roughness coefficient - z_o = Turb % Roughness_Coefficient(c1, c2) + z_o = Turb % Roughness_Coeff(c1, c2) ! Compute tangential velocity component u_tan = Flow % U_Tan(s) diff --git a/Sources/Process/Turb_Mod/Src_T2.f90 b/Sources/Process/Turb_Mod/Src_T2.f90 index b7918b8de..045cfda68 100644 --- a/Sources/Process/Turb_Mod/Src_T2.f90 +++ b/Sources/Process/Turb_Mod/Src_T2.f90 @@ -90,7 +90,7 @@ subroutine Src_T2(Turb, Sol) c2 = Grid % faces_c(2,s) ! Set up roughness coefficient - z_o = Turb % Roughness_Coefficient(c1, c2) + z_o = Turb % Roughness_Coeff(c1, c2) ! Kinematic viscosities kin_vis = Flow % viscosity(c1) / Flow % density(c1) diff --git a/Sources/Process/Turb_Mod/Vis_T_K_Eps.f90 b/Sources/Process/Turb_Mod/Vis_T_K_Eps.f90 index 9cbda07d9..367ced717 100644 --- a/Sources/Process/Turb_Mod/Vis_T_K_Eps.f90 +++ b/Sources/Process/Turb_Mod/Vis_T_K_Eps.f90 @@ -82,7 +82,7 @@ subroutine Vis_T_K_Eps(Turb) kin_vis = Flow % viscosity(c1) / Flow % density(c1) ! Set up roughness coefficient - z_o = Turb % Roughness_Coefficient(c1, c2) + z_o = Turb % Roughness_Coeff(c1, c2) ! Compute tangential velocity component u_tan = Flow % U_Tan(s) diff --git a/Sources/Process/Turb_Mod/Vis_T_K_Eps_Zeta_F.f90 b/Sources/Process/Turb_Mod/Vis_T_K_Eps_Zeta_F.f90 index 62bb4f456..25d809326 100644 --- a/Sources/Process/Turb_Mod/Vis_T_K_Eps_Zeta_F.f90 +++ b/Sources/Process/Turb_Mod/Vis_T_K_Eps_Zeta_F.f90 @@ -77,7 +77,7 @@ subroutine Vis_T_K_Eps_Zeta_F(Turb) kin_vis = Flow % viscosity(c1) / Flow % density(c1) ! Set up roughness coefficient - z_o = Turb % Roughness_Coefficient(c1, c2) + z_o = Turb % Roughness_Coeff(c1, c2) ! Compute tangential velocity component u_tan = Flow % U_Tan(s) diff --git a/Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 b/Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 index 060ab5092..1121e040f 100644 --- a/Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 +++ b/Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 @@ -127,7 +127,7 @@ subroutine Vis_T_Subgrid(Turb) kin_vis = Flow % viscosity(c1) / Flow % density(c1) ! Set up roughness coefficient - z_o = Turb % Roughness_Coefficient(c1, c2) + z_o = Turb % Roughness_Coeff(c1, c2) u_tan = Flow % U_Tan(s) diff --git a/Sources/Shared/Control_Mod.f90 b/Sources/Shared/Control_Mod.f90 index 54888ce8b..03952e617 100644 --- a/Sources/Shared/Control_Mod.f90 +++ b/Sources/Shared/Control_Mod.f90 @@ -52,6 +52,8 @@ module Control_Mod procedure :: Swarm_Save_Interval procedure :: Profiler_Info + procedure :: Max_Threads + ! Native solvers procedure :: Max_Iterations_For_Energy_Solver procedure :: Max_Iterations_For_Momentum_Solver @@ -129,6 +131,59 @@ module Control_Mod procedure :: Max_Substep_Cycles_Vof procedure :: Skewness_Correction_Vof + ! Physics + procedure :: Number_Of_Domains + procedure :: Dynamic_Viscosity + procedure :: Heat_Capacity + procedure :: Latent_Heat + procedure :: Mass_Density + procedure :: Thermal_Conductivity + procedure :: Scalars_Diffusivity + procedure :: Interface_Tracking + procedure :: Particle_Tracking + procedure :: Mass_Transfer + procedure :: Heat_Transfer + procedure :: Buoyancy + procedure :: Reference_Temperature + procedure :: Saturation_Temperature + procedure :: Volume_Expansion_Coefficient + procedure :: Hybrid_Les_Rans_Switch + procedure :: Roughness_Coefficient + procedure :: Rough_Walls + procedure :: Smagorinsky_Constant + procedure :: Turbulence_Model + procedure :: Turbulence_Model_Variant + procedure :: Turbulent_Prandtl_Number + procedure :: Turbulent_Schmidt_Number + procedure :: Turbulent_Heat_Flux_Model + procedure :: Turbulent_Scalar_Flux_Model + procedure :: Angular_Velocity_Vector + procedure :: Gravitational_Vector + procedure :: Mass_Flow_Rates + procedure :: Pressure_Drops + procedure :: Point_For_Monitoring_Planes + procedure :: Potential_Initialization + procedure :: Max_Particles + procedure :: Number_Of_Phases + procedure :: Number_Of_Swarm_Sub_Steps + procedure :: Swarm_Coefficient_Of_Restitution + procedure :: Swarm_Density + procedure :: Swarm_Diameter + procedure :: Swarm_Subgrid_Scale_Model + procedure :: Phase_Capacities + procedure :: Phase_Conductivities + procedure :: Phase_Densities + procedure :: Phase_Viscosities + procedure :: Reference_Density + procedure :: Surface_Tension + procedure :: Track_Front + procedure :: Track_Surface + procedure :: Number_Of_Scalars + procedure :: Starting_Time_Step_For_Turb_Statistics + procedure :: Starting_Time_Step_For_Swarm_Computation + procedure :: Starting_Time_Step_For_Swarm_Statistics + procedure :: Extrapolate_Temperature_Exp + end type type(Control_Type) :: Control diff --git a/Sources/Shared/Control_Mod/Max_Threads.f90 b/Sources/Shared/Control_Mod/Max_Threads.f90 index 9c4b81218..af52e3b0a 100644 --- a/Sources/Shared/Control_Mod/Max_Threads.f90 +++ b/Sources/Shared/Control_Mod/Max_Threads.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Max_Threads(val, verbose) + subroutine Max_Threads(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Angular_Velocity_Vector.f90 b/Sources/Shared/Control_Mod/Physics/Angular_Velocity_Vector.f90 index 43b5272c2..7a1d59599 100644 --- a/Sources/Shared/Control_Mod/Physics/Angular_Velocity_Vector.f90 +++ b/Sources/Shared/Control_Mod/Physics/Angular_Velocity_Vector.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Angular_Velocity_Vector(v_x, v_y, v_z, verbose) + subroutine Angular_Velocity_Vector(Control, v_x, v_y, v_z, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: v_x, v_y, v_z - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: v_x, v_y, v_z + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def(3) real :: val(3) diff --git a/Sources/Shared/Control_Mod/Physics/Buoyancy.f90 b/Sources/Shared/Control_Mod/Physics/Buoyancy.f90 index 9827ca7e5..c47e7a5e4 100644 --- a/Sources/Shared/Control_Mod/Physics/Buoyancy.f90 +++ b/Sources/Shared/Control_Mod/Physics/Buoyancy.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Buoyancy(val, verbose) + subroutine Buoyancy(Control, val, verbose) !------------------------------------------------------------------------------! ! Reading buoyancy model from the control file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Dynamic_Viscosity.f90 b/Sources/Shared/Control_Mod/Physics/Dynamic_Viscosity.f90 index 5c346b01e..3a5502fc2 100644 --- a/Sources/Shared/Control_Mod/Physics/Dynamic_Viscosity.f90 +++ b/Sources/Shared/Control_Mod/Physics/Dynamic_Viscosity.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Dynamic_Viscosity(val, verbose) + subroutine Dynamic_Viscosity(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('DYNAMIC_VISCOSITY', 0.01, val, verbose) diff --git a/Sources/Shared/Control_Mod/Physics/Extrapolate_Temperature_Exp.f90 b/Sources/Shared/Control_Mod/Physics/Extrapolate_Temperature_Exp.f90 index 144009432..1f7810bd6 100644 --- a/Sources/Shared/Control_Mod/Physics/Extrapolate_Temperature_Exp.f90 +++ b/Sources/Shared/Control_Mod/Physics/Extrapolate_Temperature_Exp.f90 @@ -1,11 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Extrapolate_Temperature_Exp(temp_exp, & - verbose) + subroutine Extrapolate_Temperature_Exp(Control, temp_exp, verbose) !------------------------------------------------------------------------------! ! Reading if temprature will be extrapolated to walls exponentially ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control logical, intent(out) :: temp_exp logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! diff --git a/Sources/Shared/Control_Mod/Physics/Gravitational_Vector.f90 b/Sources/Shared/Control_Mod/Physics/Gravitational_Vector.f90 index be9a6fa9f..2c74d0e69 100644 --- a/Sources/Shared/Control_Mod/Physics/Gravitational_Vector.f90 +++ b/Sources/Shared/Control_Mod/Physics/Gravitational_Vector.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Gravitational_Vector(grav_x, grav_y, grav_z, verbose) + subroutine Gravitational_Vector(Control, grav_x, grav_y, grav_z, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: grav_x, grav_y, grav_z - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: grav_x, grav_y, grav_z + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def(3) real :: val(3) diff --git a/Sources/Shared/Control_Mod/Physics/Heat_Capacity.f90 b/Sources/Shared/Control_Mod/Physics/Heat_Capacity.f90 index e9fad5e0e..41ca65f5b 100644 --- a/Sources/Shared/Control_Mod/Physics/Heat_Capacity.f90 +++ b/Sources/Shared/Control_Mod/Physics/Heat_Capacity.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Heat_Capacity(val, verbose) + subroutine Heat_Capacity(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('HEAT_CAPACITY', 1.0, val, verbose) diff --git a/Sources/Shared/Control_Mod/Physics/Heat_Transfer.f90 b/Sources/Shared/Control_Mod/Physics/Heat_Transfer.f90 index d82c46430..e5392b5c8 100644 --- a/Sources/Shared/Control_Mod/Physics/Heat_Transfer.f90 +++ b/Sources/Shared/Control_Mod/Physics/Heat_Transfer.f90 @@ -1,9 +1,10 @@ !==============================================================================! - subroutine Control_Mod_Heat_Transfer(heat_transfer, verbose) + subroutine Heat_Transfer(Control, heat, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - logical, intent(out) :: heat_transfer + class(Control_Type) :: Control + logical, intent(out) :: heat logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! character(SL) :: val @@ -13,10 +14,10 @@ subroutine Control_Mod_Heat_Transfer(heat_transfer, verbose) call String % To_Upper_Case(val) if( val .eq. 'YES' ) then - heat_transfer = .true. + heat = .true. else if( val .eq. 'NO' ) then - heat_transfer = .false. + heat = .false. else call Message % Error(60, & diff --git a/Sources/Shared/Control_Mod/Physics/Hybrid_Les_Rans_Switch.f90 b/Sources/Shared/Control_Mod/Physics/Hybrid_Les_Rans_Switch.f90 index 7f8844552..316fffdc4 100644 --- a/Sources/Shared/Control_Mod/Physics/Hybrid_Les_Rans_Switch.f90 +++ b/Sources/Shared/Control_Mod/Physics/Hybrid_Les_Rans_Switch.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Hybrid_Les_Rans_Switch(val, verbose) + subroutine Hybrid_Les_Rans_Switch(Control, val, verbose) !------------------------------------------------------------------------------! ! Reading switch for hybrid LES/RANS model. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Interface_Tracking.f90 b/Sources/Shared/Control_Mod/Physics/Interface_Tracking.f90 index ccaa33798..03a623b73 100644 --- a/Sources/Shared/Control_Mod/Physics/Interface_Tracking.f90 +++ b/Sources/Shared/Control_Mod/Physics/Interface_Tracking.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Interface_Tracking(track_int, verbose) + subroutine Interface_Tracking(Control, track_int, verbose) !------------------------------------------------------------------------------! ! Reading if vof will be used to model multiphase situation ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control logical, intent(out) :: track_int logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! diff --git a/Sources/Shared/Control_Mod/Physics/Latent_Heat.f90 b/Sources/Shared/Control_Mod/Physics/Latent_Heat.f90 index 8843c0990..6fa2f5544 100644 --- a/Sources/Shared/Control_Mod/Physics/Latent_Heat.f90 +++ b/Sources/Shared/Control_Mod/Physics/Latent_Heat.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Latent_Heat(val, verbose) + subroutine Latent_Heat(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('LATENT_HEAT', 1.0, val, verbose) diff --git a/Sources/Shared/Control_Mod/Physics/Mass_Density.f90 b/Sources/Shared/Control_Mod/Physics/Mass_Density.f90 index d42e049a7..5a886d762 100644 --- a/Sources/Shared/Control_Mod/Physics/Mass_Density.f90 +++ b/Sources/Shared/Control_Mod/Physics/Mass_Density.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Mass_Density(val, verbose) + subroutine Mass_Density(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('MASS_DENSITY', 1.0, val, verbose) diff --git a/Sources/Shared/Control_Mod/Physics/Mass_Flow_Rates.f90 b/Sources/Shared/Control_Mod/Physics/Mass_Flow_Rates.f90 index 57b59d073..ae847d841 100644 --- a/Sources/Shared/Control_Mod/Physics/Mass_Flow_Rates.f90 +++ b/Sources/Shared/Control_Mod/Physics/Mass_Flow_Rates.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Mass_Flow_Rates(b_x, b_y, b_z, verbose) + subroutine Mass_Flow_Rates(Control, b_x, b_y, b_z, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: b_x, b_y, b_z - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: b_x, b_y, b_z + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def(3) real :: val(3) diff --git a/Sources/Shared/Control_Mod/Physics/Mass_Transfer.f90 b/Sources/Shared/Control_Mod/Physics/Mass_Transfer.f90 index a8c67a46b..555cf08a5 100644 --- a/Sources/Shared/Control_Mod/Physics/Mass_Transfer.f90 +++ b/Sources/Shared/Control_Mod/Physics/Mass_Transfer.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Mass_Transfer(phase_change, verbose) + subroutine Mass_Transfer(Control, phase_change, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control logical, intent(out) :: phase_change logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! diff --git a/Sources/Shared/Control_Mod/Physics/Max_Particles.f90 b/Sources/Shared/Control_Mod/Physics/Max_Particles.f90 index 636e96733..eccc48773 100644 --- a/Sources/Shared/Control_Mod/Physics/Max_Particles.f90 +++ b/Sources/Shared/Control_Mod/Physics/Max_Particles.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Max_Particles(val, verbose) + subroutine Max_Particles(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Number_Of_Domains.f90 b/Sources/Shared/Control_Mod/Physics/Number_Of_Domains.f90 index c2d6d04bb..9ed7123ae 100644 --- a/Sources/Shared/Control_Mod/Physics/Number_Of_Domains.f90 +++ b/Sources/Shared/Control_Mod/Physics/Number_Of_Domains.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Number_Of_Domains(val, verbose) + subroutine Number_Of_Domains(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Number_Of_Phases.f90 b/Sources/Shared/Control_Mod/Physics/Number_Of_Phases.f90 index 31bda8dc9..ee26cfeb3 100644 --- a/Sources/Shared/Control_Mod/Physics/Number_Of_Phases.f90 +++ b/Sources/Shared/Control_Mod/Physics/Number_Of_Phases.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Number_Of_Phases(val, verbose) + subroutine Number_Of_Phases(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Number_Of_Scalars.f90 b/Sources/Shared/Control_Mod/Physics/Number_Of_Scalars.f90 index f75e53579..7ed78d985 100644 --- a/Sources/Shared/Control_Mod/Physics/Number_Of_Scalars.f90 +++ b/Sources/Shared/Control_Mod/Physics/Number_Of_Scalars.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Number_Of_Scalars(val, verbose) + subroutine Number_Of_Scalars(Control, val, verbose) !------------------------------------------------------------------------------! ! Reading stuff related to passive scalars ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Number_Of_Swarm_Sub_Steps.f90 b/Sources/Shared/Control_Mod/Physics/Number_Of_Swarm_Sub_Steps.f90 index c7bd6fb44..bd20821c2 100644 --- a/Sources/Shared/Control_Mod/Physics/Number_Of_Swarm_Sub_Steps.f90 +++ b/Sources/Shared/Control_Mod/Physics/Number_Of_Swarm_Sub_Steps.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Number_Of_Swarm_Sub_Steps(val, verbose) + subroutine Number_Of_Swarm_Sub_Steps(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Particle_Tracking.f90 b/Sources/Shared/Control_Mod/Physics/Particle_Tracking.f90 index d1cccf722..187ff1302 100644 --- a/Sources/Shared/Control_Mod/Physics/Particle_Tracking.f90 +++ b/Sources/Shared/Control_Mod/Physics/Particle_Tracking.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Particle_Tracking(track_part, verbose) + subroutine Particle_Tracking(Control, track_part, verbose) !------------------------------------------------------------------------------! ! Reading if Lagrangian particle tracking will be used in simulations ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control logical, intent(out) :: track_part logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! diff --git a/Sources/Shared/Control_Mod/Physics/Phase_Capacities.f90 b/Sources/Shared/Control_Mod/Physics/Phase_Capacities.f90 index ca12733ef..9cb96a72b 100644 --- a/Sources/Shared/Control_Mod/Physics/Phase_Capacities.f90 +++ b/Sources/Shared/Control_Mod/Physics/Phase_Capacities.f90 @@ -1,12 +1,13 @@ !==============================================================================! - subroutine Control_Mod_Phase_Capacities(val, verbose) + subroutine Phase_Capacities(Control, val, verbose) !------------------------------------------------------------------------------! ! Reads as many capacities as there are phases. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real :: val(0:1) - logical, optional :: verbose + class(Control_Type) :: Control + real :: val(0:1) + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def(2) !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Phase_Conductivities.f90 b/Sources/Shared/Control_Mod/Physics/Phase_Conductivities.f90 index 2b86040fc..af5a1a53e 100644 --- a/Sources/Shared/Control_Mod/Physics/Phase_Conductivities.f90 +++ b/Sources/Shared/Control_Mod/Physics/Phase_Conductivities.f90 @@ -1,12 +1,13 @@ !==============================================================================! - subroutine Control_Mod_Phase_Conductivities(val, verbose) + subroutine Phase_Conductivities(Control, val, verbose) !------------------------------------------------------------------------------! ! Reads as many densities as there are phases. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real :: val(0:1) - logical, optional :: verbose + class(Control_Type) :: Control + real :: val(0:1) + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def(2) !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Phase_Densities.f90 b/Sources/Shared/Control_Mod/Physics/Phase_Densities.f90 index 124f7856e..e86fd7de9 100644 --- a/Sources/Shared/Control_Mod/Physics/Phase_Densities.f90 +++ b/Sources/Shared/Control_Mod/Physics/Phase_Densities.f90 @@ -1,12 +1,13 @@ !==============================================================================! - subroutine Control_Mod_Phase_Densities(val, verbose) + subroutine Phase_Densities(Control, val, verbose) !------------------------------------------------------------------------------! ! Reads as many densities as there are phases. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real :: val(0:1) - logical, optional :: verbose + class(Control_Type) :: Control + real :: val(0:1) + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def(2) !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Phase_Viscosities.f90 b/Sources/Shared/Control_Mod/Physics/Phase_Viscosities.f90 index f55550563..9a71d3bef 100644 --- a/Sources/Shared/Control_Mod/Physics/Phase_Viscosities.f90 +++ b/Sources/Shared/Control_Mod/Physics/Phase_Viscosities.f90 @@ -1,12 +1,13 @@ !==============================================================================! - subroutine Control_Mod_Phase_Viscosities(val, verbose) + subroutine Phase_Viscosities(Control, val, verbose) !------------------------------------------------------------------------------! ! Reads as many viscosities as there are phases. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real :: val(0:1) - logical, optional :: verbose + class(Control_Type) :: Control + real :: val(0:1) + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def(2) !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Point_For_Monitoring_Planes.f90 b/Sources/Shared/Control_Mod/Physics/Point_For_Monitoring_Planes.f90 index 31e3fce1e..eb760d0c6 100644 --- a/Sources/Shared/Control_Mod/Physics/Point_For_Monitoring_Planes.f90 +++ b/Sources/Shared/Control_Mod/Physics/Point_For_Monitoring_Planes.f90 @@ -1,11 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Point_For_Monitoring_Planes(b_xp, b_yp, b_zp, & - verbose) + subroutine Point_For_Monitoring_Planes(Control, b_xp, b_yp, b_zp, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: b_xp, b_yp, b_zp - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: b_xp, b_yp, b_zp + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def(3) real :: val(3) diff --git a/Sources/Shared/Control_Mod/Physics/Potential_Initialization.f90 b/Sources/Shared/Control_Mod/Physics/Potential_Initialization.f90 index 33eb80b39..2965c3942 100644 --- a/Sources/Shared/Control_Mod/Physics/Potential_Initialization.f90 +++ b/Sources/Shared/Control_Mod/Physics/Potential_Initialization.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Potential_Initialization(pot_init, verbose) + subroutine Potential_Initialization(Control, pot_init, verbose) !------------------------------------------------------------------------------! ! Reading potential initialization from the control file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control logical, intent(out) :: pot_init logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! diff --git a/Sources/Shared/Control_Mod/Physics/Pressure_Drops.f90 b/Sources/Shared/Control_Mod/Physics/Pressure_Drops.f90 index 0488b891a..c9762deec 100644 --- a/Sources/Shared/Control_Mod/Physics/Pressure_Drops.f90 +++ b/Sources/Shared/Control_Mod/Physics/Pressure_Drops.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Pressure_Drops(p_drop_x, p_drop_y, p_drop_z, verbose) + subroutine Pressure_Drops(Control, p_drop_x, p_drop_y, p_drop_z, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: p_drop_x, p_drop_y, p_drop_z - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: p_drop_x, p_drop_y, p_drop_z + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def(3) real :: val(3) diff --git a/Sources/Shared/Control_Mod/Physics/Reference_Density.f90 b/Sources/Shared/Control_Mod/Physics/Reference_Density.f90 index f7fea54dc..75d5daaf9 100644 --- a/Sources/Shared/Control_Mod/Physics/Reference_Density.f90 +++ b/Sources/Shared/Control_Mod/Physics/Reference_Density.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Reference_Density(d_ref, verbose) + subroutine Reference_Density(Control, d_ref, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: d_ref - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: d_ref + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Reference_Temperature.f90 b/Sources/Shared/Control_Mod/Physics/Reference_Temperature.f90 index 08e6c5c94..b535e2326 100644 --- a/Sources/Shared/Control_Mod/Physics/Reference_Temperature.f90 +++ b/Sources/Shared/Control_Mod/Physics/Reference_Temperature.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Reference_Temperature(t_ref, verbose) + subroutine Reference_Temperature(Control, t_ref, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: t_ref - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: t_ref + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Rough_Walls.f90 b/Sources/Shared/Control_Mod/Physics/Rough_Walls.f90 index 41ed80148..045530d0d 100644 --- a/Sources/Shared/Control_Mod/Physics/Rough_Walls.f90 +++ b/Sources/Shared/Control_Mod/Physics/Rough_Walls.f90 @@ -1,11 +1,12 @@ !==============================================================================! - subroutine Control_Mod_Rough_Walls(rough_walls, verbose) + subroutine Rough_Walls(Control, rough, verbose) !------------------------------------------------------------------------------! ! Reading wall roughness from the control file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - logical, intent(out) :: rough_walls + class(Control_Type) :: Control + logical, intent(out) :: rough logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! character(SL) :: val @@ -17,10 +18,10 @@ subroutine Control_Mod_Rough_Walls(rough_walls, verbose) select case(val) case('YES') - rough_walls = .true. + rough = .true. case('NO') - rough_walls = .false. + rough = .false. case default call Message % Error(60, & diff --git a/Sources/Shared/Control_Mod/Physics/Roughness_Coefficient.f90 b/Sources/Shared/Control_Mod/Physics/Roughness_Coefficient.f90 index 2ff39dd4e..0ce1670cb 100644 --- a/Sources/Shared/Control_Mod/Physics/Roughness_Coefficient.f90 +++ b/Sources/Shared/Control_Mod/Physics/Roughness_Coefficient.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Roughness_Coefficient(val, verbose) + subroutine Roughness_Coefficient(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val(:) - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val(:) + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: con !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Saturation_Temperature.f90 b/Sources/Shared/Control_Mod/Physics/Saturation_Temperature.f90 index bf8607df9..076fd3eac 100644 --- a/Sources/Shared/Control_Mod/Physics/Saturation_Temperature.f90 +++ b/Sources/Shared/Control_Mod/Physics/Saturation_Temperature.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Saturation_Temperature(val, verbose) + subroutine Saturation_Temperature(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('SATURATION_TEMPERATURE', 100., val, verbose) diff --git a/Sources/Shared/Control_Mod/Physics/Scalars_Diffusivity.f90 b/Sources/Shared/Control_Mod/Physics/Scalars_Diffusivity.f90 index eda945485..ce0886f90 100644 --- a/Sources/Shared/Control_Mod/Physics/Scalars_Diffusivity.f90 +++ b/Sources/Shared/Control_Mod/Physics/Scalars_Diffusivity.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Scalars_Diffusivity(val, verbose) + subroutine Scalars_Diffusivity(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('SCALARS_DIFFUSIVITY', 1.0e-6, val, verbose) diff --git a/Sources/Shared/Control_Mod/Physics/Smagorinsky_Constant.f90 b/Sources/Shared/Control_Mod/Physics/Smagorinsky_Constant.f90 index 27e022350..8b4e602a5 100644 --- a/Sources/Shared/Control_Mod/Physics/Smagorinsky_Constant.f90 +++ b/Sources/Shared/Control_Mod/Physics/Smagorinsky_Constant.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Smagorinsky_Constant(val, verbose) + subroutine Smagorinsky_Constant(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('SMAGORINSKY_CONSTANT', 0.17, val, verbose) diff --git a/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Computation.f90 b/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Computation.f90 index 00eaa331a..36be57d3a 100644 --- a/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Computation.f90 +++ b/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Computation.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Starting_Time_Step_For_Swarm_Computation(val, verbose) + subroutine Starting_Time_Step_For_Swarm_Computation(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Statistics.f90 b/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Statistics.f90 index 1bd6c18df..ca3ba5e14 100644 --- a/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Statistics.f90 +++ b/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Statistics.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Starting_Time_Step_For_Swarm_Statistics(val, verbose) + subroutine Starting_Time_Step_For_Swarm_Statistics(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Turb_Statistics.f90 b/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Turb_Statistics.f90 index 15423ef5f..92b4c8842 100644 --- a/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Turb_Statistics.f90 +++ b/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Turb_Statistics.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Starting_Time_Step_For_Turb_Statistics(val, verbose) + subroutine Starting_Time_Step_For_Turb_Statistics(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Surface_Tension.f90 b/Sources/Shared/Control_Mod/Physics/Surface_Tension.f90 index aa801aaef..edc467a89 100644 --- a/Sources/Shared/Control_Mod/Physics/Surface_Tension.f90 +++ b/Sources/Shared/Control_Mod/Physics/Surface_Tension.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Surface_Tension(val, verbose) + subroutine Surface_Tension(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('SURFACE_TENSION', 0.0, val, verbose) diff --git a/Sources/Shared/Control_Mod/Physics/Swarm_Coefficient_Of_Restitution.f90 b/Sources/Shared/Control_Mod/Physics/Swarm_Coefficient_Of_Restitution.f90 index a55a37fee..37e5bff09 100644 --- a/Sources/Shared/Control_Mod/Physics/Swarm_Coefficient_Of_Restitution.f90 +++ b/Sources/Shared/Control_Mod/Physics/Swarm_Coefficient_Of_Restitution.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Swarm_Coefficient_Of_Restitution(cor, verbose) + subroutine Swarm_Coefficient_Of_Restitution(Control, cor, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: cor - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: cor + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Swarm_Density.f90 b/Sources/Shared/Control_Mod/Physics/Swarm_Density.f90 index bb38442e4..d052a6373 100644 --- a/Sources/Shared/Control_Mod/Physics/Swarm_Density.f90 +++ b/Sources/Shared/Control_Mod/Physics/Swarm_Density.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Swarm_Density(s_den, verbose) + subroutine Swarm_Density(Control, s_den, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: s_den - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: s_den + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Swarm_Diameter.f90 b/Sources/Shared/Control_Mod/Physics/Swarm_Diameter.f90 index 999105239..6ceeedd33 100644 --- a/Sources/Shared/Control_Mod/Physics/Swarm_Diameter.f90 +++ b/Sources/Shared/Control_Mod/Physics/Swarm_Diameter.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Swarm_Diameter(s_dia, verbose) + subroutine Swarm_Diameter(Control, s_dia, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: s_dia - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: s_dia + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Swarm_Subgrid_Scale_Model.f90 b/Sources/Shared/Control_Mod/Physics/Swarm_Subgrid_Scale_Model.f90 index 05b6de059..10669a713 100644 --- a/Sources/Shared/Control_Mod/Physics/Swarm_Subgrid_Scale_Model.f90 +++ b/Sources/Shared/Control_Mod/Physics/Swarm_Subgrid_Scale_Model.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Swarm_Subgrid_Scale_Model(val, verbose) + subroutine Swarm_Subgrid_Scale_Model(Control, val, verbose) !------------------------------------------------------------------------------! ! Reading swarm SGS model from the control file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Thermal_Conductivity.f90 b/Sources/Shared/Control_Mod/Physics/Thermal_Conductivity.f90 index 5c9c077d4..bc22e6e94 100644 --- a/Sources/Shared/Control_Mod/Physics/Thermal_Conductivity.f90 +++ b/Sources/Shared/Control_Mod/Physics/Thermal_Conductivity.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Thermal_Conductivity(val, verbose) + subroutine Thermal_Conductivity(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('THERMAL_CONDUCTIVITY', 1.0, val, verbose) diff --git a/Sources/Shared/Control_Mod/Physics/Track_Front.f90 b/Sources/Shared/Control_Mod/Physics/Track_Front.f90 index d317a31e4..f08b4318d 100644 --- a/Sources/Shared/Control_Mod/Physics/Track_Front.f90 +++ b/Sources/Shared/Control_Mod/Physics/Track_Front.f90 @@ -1,9 +1,10 @@ !==============================================================================! - subroutine Control_Mod_Track_Front(track_front, verbose) + subroutine Track_Front(Control, track, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - logical, intent(out) :: track_front + class(Control_Type) :: Control + logical, intent(out) :: track logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! character(SL) :: val @@ -13,10 +14,10 @@ subroutine Control_Mod_Track_Front(track_front, verbose) call String % To_Upper_Case(val) if( val .eq. 'YES' ) then - track_front = .true. + track = .true. else if( val .eq. 'NO' ) then - track_front = .false. + track = .false. else call Message % Error(60, & diff --git a/Sources/Shared/Control_Mod/Physics/Track_Surface.f90 b/Sources/Shared/Control_Mod/Physics/Track_Surface.f90 index daf1b0e58..f9389bd05 100644 --- a/Sources/Shared/Control_Mod/Physics/Track_Surface.f90 +++ b/Sources/Shared/Control_Mod/Physics/Track_Surface.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Track_Surface(track_surf, verbose) + subroutine Track_Surface(Control, track_surf, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control logical, intent(out) :: track_surf logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! diff --git a/Sources/Shared/Control_Mod/Physics/Turbulence_Model.f90 b/Sources/Shared/Control_Mod/Physics/Turbulence_Model.f90 index eeddf7217..3bef6637b 100644 --- a/Sources/Shared/Control_Mod/Physics/Turbulence_Model.f90 +++ b/Sources/Shared/Control_Mod/Physics/Turbulence_Model.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Turbulence_Model(val, verbose) + subroutine Turbulence_Model(Control, val, verbose) !------------------------------------------------------------------------------! ! Reading turbulence model from the control file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Turbulence_Model_Variant.f90 b/Sources/Shared/Control_Mod/Physics/Turbulence_Model_Variant.f90 index 1f3a5ecbf..da516a4f0 100644 --- a/Sources/Shared/Control_Mod/Physics/Turbulence_Model_Variant.f90 +++ b/Sources/Shared/Control_Mod/Physics/Turbulence_Model_Variant.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Turbulence_Model_Variant(val, verbose) + subroutine Turbulence_Model_Variant(Control, val, verbose) !------------------------------------------------------------------------------! ! Reading turbulence model variant from the control file ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Turbulent_Heat_Flux_Model.f90 b/Sources/Shared/Control_Mod/Physics/Turbulent_Heat_Flux_Model.f90 index 82c7feb58..cd2498f8b 100644 --- a/Sources/Shared/Control_Mod/Physics/Turbulent_Heat_Flux_Model.f90 +++ b/Sources/Shared/Control_Mod/Physics/Turbulent_Heat_Flux_Model.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Turbulent_Heat_Flux_Model(val, verbose) + subroutine Turbulent_Heat_Flux_Model(Control, val, verbose) !------------------------------------------------------------------------------! ! Reading turbulent heat flux model from the control file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Turbulent_Prandtl_Number.f90 b/Sources/Shared/Control_Mod/Physics/Turbulent_Prandtl_Number.f90 index 719263dd0..5ad5cd108 100644 --- a/Sources/Shared/Control_Mod/Physics/Turbulent_Prandtl_Number.f90 +++ b/Sources/Shared/Control_Mod/Physics/Turbulent_Prandtl_Number.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Turbulent_Prandtl_Number(val, verbose) + subroutine Turbulent_Prandtl_Number(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('TURBULENT_PRANDTL_NUMBER', 0.9, val, verbose) diff --git a/Sources/Shared/Control_Mod/Physics/Turbulent_Scalar_Flux_Model.f90 b/Sources/Shared/Control_Mod/Physics/Turbulent_Scalar_Flux_Model.f90 index 5d2b6276e..18e5eef78 100644 --- a/Sources/Shared/Control_Mod/Physics/Turbulent_Scalar_Flux_Model.f90 +++ b/Sources/Shared/Control_Mod/Physics/Turbulent_Scalar_Flux_Model.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Turbulent_Scalar_Flux_Model(val, verbose) + subroutine Turbulent_Scalar_Flux_Model(Control, val, verbose) !------------------------------------------------------------------------------! ! Reading turbulent heat flux model from the control file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Turbulent_Schmidt_Number.f90 b/Sources/Shared/Control_Mod/Physics/Turbulent_Schmidt_Number.f90 index e80270fd3..54576bc28 100644 --- a/Sources/Shared/Control_Mod/Physics/Turbulent_Schmidt_Number.f90 +++ b/Sources/Shared/Control_Mod/Physics/Turbulent_Schmidt_Number.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Turbulent_Schmidt_Number(val, verbose) + subroutine Turbulent_Schmidt_Number(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('TURBULENT_SCHMIDT_NUMBER', 0.9, val, verbose) diff --git a/Sources/Shared/Control_Mod/Physics/Volume_Expansion_Coefficient.f90 b/Sources/Shared/Control_Mod/Physics/Volume_Expansion_Coefficient.f90 index bb4a5112e..7052ff6bb 100644 --- a/Sources/Shared/Control_Mod/Physics/Volume_Expansion_Coefficient.f90 +++ b/Sources/Shared/Control_Mod/Physics/Volume_Expansion_Coefficient.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Volume_Expansion_Coefficient(cor, verbose) + subroutine Volume_Expansion_Coefficient(Control, cor, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: cor - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: cor + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def !==============================================================================! From cd0c507ed24c831ebb2bb7f22bc3e84d3c802a0e Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 2 Apr 2023 19:33:49 +0200 Subject: [PATCH 187/223] Modernizing Control_Mod; step 4 This was the last, but it also proved to be the most sensitive step. If something goes wrong, go back to the previouse check-in. On branch bojan_more_robust_communicator modified: Documentation/Syntax/.vim/syntax/fortran.vim modified: Sources/Process/Field_Mod.f90 modified: Sources/Process/Field_Mod/Utilities/Potential_Initialization.f90 modified: Sources/Process/Main_Pro.f90 modified: Sources/Process/Process_Mod/Compute_Scalar.f90 modified: Sources/Process/Read_Controls_Mod.f90 modified: Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 modified: Sources/Process/Read_Controls_Mod/Physical_Models.f90 modified: Sources/Process/Read_Controls_Mod/Physical_Properties.f90 renamed: Sources/Process/Read_Controls_Mod/Linear_Solvers.f90 -> Sources/Process/Read_Controls_Mod/Solvers.f90 modified: Sources/Process/Turb_Mod.f90 modified: Sources/Process/Turb_Mod/Calculate_Heat_Flux.f90 modified: Sources/Process/Turb_Mod/Calculate_Scalar_Flux.f90 renamed: Sources/Process/Turb_Mod/Roughness_Coefficient.f90 -> Sources/Process/Turb_Mod/Roughness_Coeff.f90 modified: Sources/Process/Turb_Mod/Src_Eps_K_Eps.f90 modified: Sources/Process/Turb_Mod/Src_Eps_K_Eps_Zeta_F.f90 modified: Sources/Process/Turb_Mod/Src_Kin_K_Eps.f90 modified: Sources/Process/Turb_Mod/Src_Kin_K_Eps_Zeta_F.f90 modified: Sources/Process/Turb_Mod/Src_T2.f90 modified: Sources/Process/Turb_Mod/Vis_T_K_Eps.f90 modified: Sources/Process/Turb_Mod/Vis_T_K_Eps_Zeta_F.f90 modified: Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 modified: Sources/Shared/Control_Mod.f90 modified: Sources/Shared/Control_Mod/Linear_Solvers.f90 modified: Sources/Shared/Control_Mod/Max_Threads.f90 modified: Sources/Shared/Control_Mod/Physics/Angular_Velocity_Vector.f90 modified: Sources/Shared/Control_Mod/Physics/Buoyancy.f90 modified: Sources/Shared/Control_Mod/Physics/Dynamic_Viscosity.f90 modified: Sources/Shared/Control_Mod/Physics/Extrapolate_Temperature_Exp.f90 modified: Sources/Shared/Control_Mod/Physics/Gravitational_Vector.f90 modified: Sources/Shared/Control_Mod/Physics/Heat_Capacity.f90 modified: Sources/Shared/Control_Mod/Physics/Heat_Transfer.f90 modified: Sources/Shared/Control_Mod/Physics/Hybrid_Les_Rans_Switch.f90 modified: Sources/Shared/Control_Mod/Physics/Interface_Tracking.f90 modified: Sources/Shared/Control_Mod/Physics/Latent_Heat.f90 modified: Sources/Shared/Control_Mod/Physics/Mass_Density.f90 modified: Sources/Shared/Control_Mod/Physics/Mass_Flow_Rates.f90 modified: Sources/Shared/Control_Mod/Physics/Mass_Transfer.f90 modified: Sources/Shared/Control_Mod/Physics/Max_Particles.f90 modified: Sources/Shared/Control_Mod/Physics/Number_Of_Domains.f90 modified: Sources/Shared/Control_Mod/Physics/Number_Of_Phases.f90 modified: Sources/Shared/Control_Mod/Physics/Number_Of_Scalars.f90 modified: Sources/Shared/Control_Mod/Physics/Number_Of_Swarm_Sub_Steps.f90 modified: Sources/Shared/Control_Mod/Physics/Particle_Tracking.f90 modified: Sources/Shared/Control_Mod/Physics/Phase_Capacities.f90 modified: Sources/Shared/Control_Mod/Physics/Phase_Conductivities.f90 modified: Sources/Shared/Control_Mod/Physics/Phase_Densities.f90 modified: Sources/Shared/Control_Mod/Physics/Phase_Viscosities.f90 modified: Sources/Shared/Control_Mod/Physics/Point_For_Monitoring_Planes.f90 modified: Sources/Shared/Control_Mod/Physics/Potential_Initialization.f90 modified: Sources/Shared/Control_Mod/Physics/Pressure_Drops.f90 modified: Sources/Shared/Control_Mod/Physics/Reference_Density.f90 modified: Sources/Shared/Control_Mod/Physics/Reference_Temperature.f90 modified: Sources/Shared/Control_Mod/Physics/Rough_Walls.f90 modified: Sources/Shared/Control_Mod/Physics/Roughness_Coefficient.f90 modified: Sources/Shared/Control_Mod/Physics/Saturation_Temperature.f90 modified: Sources/Shared/Control_Mod/Physics/Scalars_Diffusivity.f90 modified: Sources/Shared/Control_Mod/Physics/Smagorinsky_Constant.f90 modified: Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Computation.f90 modified: Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Statistics.f90 modified: Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Turb_Statistics.f90 modified: Sources/Shared/Control_Mod/Physics/Surface_Tension.f90 modified: Sources/Shared/Control_Mod/Physics/Swarm_Coefficient_Of_Restitution.f90 modified: Sources/Shared/Control_Mod/Physics/Swarm_Density.f90 modified: Sources/Shared/Control_Mod/Physics/Swarm_Diameter.f90 modified: Sources/Shared/Control_Mod/Physics/Swarm_Subgrid_Scale_Model.f90 modified: Sources/Shared/Control_Mod/Physics/Thermal_Conductivity.f90 modified: Sources/Shared/Control_Mod/Physics/Track_Front.f90 modified: Sources/Shared/Control_Mod/Physics/Track_Surface.f90 modified: Sources/Shared/Control_Mod/Physics/Turbulence_Model.f90 modified: Sources/Shared/Control_Mod/Physics/Turbulence_Model_Variant.f90 modified: Sources/Shared/Control_Mod/Physics/Turbulent_Heat_Flux_Model.f90 modified: Sources/Shared/Control_Mod/Physics/Turbulent_Prandtl_Number.f90 modified: Sources/Shared/Control_Mod/Physics/Turbulent_Scalar_Flux_Model.f90 modified: Sources/Shared/Control_Mod/Physics/Turbulent_Schmidt_Number.f90 modified: Sources/Shared/Control_Mod/Physics/Volume_Expansion_Coefficient.f90 --- Documentation/Syntax/.vim/syntax/fortran.vim | 4 +- Sources/Process/Field_Mod.f90 | 2 +- .../Utilities/Potential_Initialization.f90 | 2 +- Sources/Process/Main_Pro.f90 | 26 +++---- .../Process/Process_Mod/Compute_Scalar.f90 | 4 +- Sources/Process/Read_Controls_Mod.f90 | 4 +- .../Read_Controls_Mod/Boundary_Conditions.f90 | 2 +- .../Read_Controls_Mod/Physical_Models.f90 | 73 ++++++++--------- .../Read_Controls_Mod/Physical_Properties.f90 | 24 +++--- .../{Linear_Solvers.f90 => Solvers.f90} | 4 +- Sources/Process/Turb_Mod.f90 | 4 +- .../Process/Turb_Mod/Calculate_Heat_Flux.f90 | 44 ++++++----- .../Turb_Mod/Calculate_Scalar_Flux.f90 | 78 ++++++++++--------- ...ss_Coefficient.f90 => Roughness_Coeff.f90} | 4 +- Sources/Process/Turb_Mod/Src_Eps_K_Eps.f90 | 2 +- .../Process/Turb_Mod/Src_Eps_K_Eps_Zeta_F.f90 | 2 +- Sources/Process/Turb_Mod/Src_Kin_K_Eps.f90 | 2 +- .../Process/Turb_Mod/Src_Kin_K_Eps_Zeta_F.f90 | 2 +- Sources/Process/Turb_Mod/Src_T2.f90 | 2 +- Sources/Process/Turb_Mod/Vis_T_K_Eps.f90 | 2 +- .../Process/Turb_Mod/Vis_T_K_Eps_Zeta_F.f90 | 2 +- Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 | 2 +- Sources/Shared/Control_Mod.f90 | 57 ++++++++++++++ Sources/Shared/Control_Mod/Linear_Solvers.f90 | 7 +- Sources/Shared/Control_Mod/Max_Threads.f90 | 4 +- .../Physics/Angular_Velocity_Vector.f90 | 7 +- .../Shared/Control_Mod/Physics/Buoyancy.f90 | 3 +- .../Control_Mod/Physics/Dynamic_Viscosity.f90 | 7 +- .../Physics/Extrapolate_Temperature_Exp.f90 | 4 +- .../Physics/Gravitational_Vector.f90 | 7 +- .../Control_Mod/Physics/Heat_Capacity.f90 | 7 +- .../Control_Mod/Physics/Heat_Transfer.f90 | 9 ++- .../Physics/Hybrid_Les_Rans_Switch.f90 | 3 +- .../Physics/Interface_Tracking.f90 | 3 +- .../Control_Mod/Physics/Latent_Heat.f90 | 7 +- .../Control_Mod/Physics/Mass_Density.f90 | 7 +- .../Control_Mod/Physics/Mass_Flow_Rates.f90 | 7 +- .../Control_Mod/Physics/Mass_Transfer.f90 | 3 +- .../Control_Mod/Physics/Max_Particles.f90 | 3 +- .../Control_Mod/Physics/Number_Of_Domains.f90 | 3 +- .../Control_Mod/Physics/Number_Of_Phases.f90 | 3 +- .../Control_Mod/Physics/Number_Of_Scalars.f90 | 3 +- .../Physics/Number_Of_Swarm_Sub_Steps.f90 | 3 +- .../Control_Mod/Physics/Particle_Tracking.f90 | 3 +- .../Control_Mod/Physics/Phase_Capacities.f90 | 7 +- .../Physics/Phase_Conductivities.f90 | 7 +- .../Control_Mod/Physics/Phase_Densities.f90 | 7 +- .../Control_Mod/Physics/Phase_Viscosities.f90 | 7 +- .../Physics/Point_For_Monitoring_Planes.f90 | 8 +- .../Physics/Potential_Initialization.f90 | 3 +- .../Control_Mod/Physics/Pressure_Drops.f90 | 7 +- .../Control_Mod/Physics/Reference_Density.f90 | 7 +- .../Physics/Reference_Temperature.f90 | 7 +- .../Control_Mod/Physics/Rough_Walls.f90 | 9 ++- .../Physics/Roughness_Coefficient.f90 | 7 +- .../Physics/Saturation_Temperature.f90 | 7 +- .../Physics/Scalars_Diffusivity.f90 | 7 +- .../Physics/Smagorinsky_Constant.f90 | 7 +- ...arting_Time_Step_For_Swarm_Computation.f90 | 3 +- ...tarting_Time_Step_For_Swarm_Statistics.f90 | 3 +- ...Starting_Time_Step_For_Turb_Statistics.f90 | 3 +- .../Control_Mod/Physics/Surface_Tension.f90 | 7 +- .../Swarm_Coefficient_Of_Restitution.f90 | 7 +- .../Control_Mod/Physics/Swarm_Density.f90 | 7 +- .../Control_Mod/Physics/Swarm_Diameter.f90 | 7 +- .../Physics/Swarm_Subgrid_Scale_Model.f90 | 3 +- .../Physics/Thermal_Conductivity.f90 | 7 +- .../Control_Mod/Physics/Track_Front.f90 | 9 ++- .../Control_Mod/Physics/Track_Surface.f90 | 3 +- .../Control_Mod/Physics/Turbulence_Model.f90 | 3 +- .../Physics/Turbulence_Model_Variant.f90 | 3 +- .../Physics/Turbulent_Heat_Flux_Model.f90 | 3 +- .../Physics/Turbulent_Prandtl_Number.f90 | 7 +- .../Physics/Turbulent_Scalar_Flux_Model.f90 | 3 +- .../Physics/Turbulent_Schmidt_Number.f90 | 7 +- .../Physics/Volume_Expansion_Coefficient.f90 | 7 +- 76 files changed, 383 insertions(+), 257 deletions(-) rename Sources/Process/Read_Controls_Mod/{Linear_Solvers.f90 => Solvers.f90} (91%) rename Sources/Process/Turb_Mod/{Roughness_Coefficient.f90 => Roughness_Coeff.f90} (92%) diff --git a/Documentation/Syntax/.vim/syntax/fortran.vim b/Documentation/Syntax/.vim/syntax/fortran.vim index f95cecf3d..98c1113f2 100644 --- a/Documentation/Syntax/.vim/syntax/fortran.vim +++ b/Documentation/Syntax/.vim/syntax/fortran.vim @@ -444,8 +444,8 @@ if b:fortran_dialect == "f08" syn keyword fortranConstant INFLOW WALL WALLFL OUTFLOW SYMMETRY CONVECT PRESSURE syn keyword fortranConstant INSIDE BUFFER PERIODIC_X PERIODIC_Y PERIODIC_Z UNDEFINED " After the constants, I have alternating definitions of types and objects derived from them - syn keyword fortranTypeTflows Domain_Type Point_Type Block_Type Line_Type Range_Type - syn keyword fortranObjectTflows Dom points blocks lines ranges + syn keyword fortranTypeTflows Domain_Type Point_Type Block_Type Line_Type Range_Type Read_Controls_Type + syn keyword fortranObjectTflows Dom points blocks lines ranges Read_Control Rc syn keyword fortranTypeTflows Generate_Type Convert_Type Divide_Type Grid_Type Control_Type syn keyword fortranObjectTflows Generate Convert Divide Grid Prim Dual Control syn keyword fortranTypeTflows Math_Type Sort_Type File_Type String_Type Work_Type Tokenizer_Type diff --git a/Sources/Process/Field_Mod.f90 b/Sources/Process/Field_Mod.f90 index fbbf925db..a06c21b93 100644 --- a/Sources/Process/Field_Mod.f90 +++ b/Sources/Process/Field_Mod.f90 @@ -231,7 +231,7 @@ module Field_Mod procedure :: Calculate_Courant_In_Cells ! for post-processing procedure :: Calculate_Bulk_Fluxes procedure :: Compute_Wall_Distance ! see: Potential_Initialization - procedure :: Potential_Initialization ! see: Compute_Wall_Distance + procedure :: Potential_Initialisation ! see: Compute_Wall_Distance procedure :: Prandtl_Numb procedure :: Schmidt_Numb procedure :: U_Tan diff --git a/Sources/Process/Field_Mod/Utilities/Potential_Initialization.f90 b/Sources/Process/Field_Mod/Utilities/Potential_Initialization.f90 index 33c1cf0bb..2a45995d9 100644 --- a/Sources/Process/Field_Mod/Utilities/Potential_Initialization.f90 +++ b/Sources/Process/Field_Mod/Utilities/Potential_Initialization.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Potential_Initialization(Flow, Sol) + subroutine Potential_Initialisation(Flow, Sol) !------------------------------------------------------------------------------! ! Initializes velocity from potential (pressure-like) equation ! !------------------------------------------------------------------------------! diff --git a/Sources/Process/Main_Pro.f90 b/Sources/Process/Main_Pro.f90 index 7d3dfc474..f1553aa40 100644 --- a/Sources/Process/Main_Pro.f90 +++ b/Sources/Process/Main_Pro.f90 @@ -63,7 +63,7 @@ program Process_Prog !-----------------------! call Control % Open_Root_File(root_control) - call Control_Mod_Number_Of_Domains(n_dom) + call Control % Number_Of_Domains(n_dom) if(n_dom > 1) then do d = 1, n_dom call Control % Open_Domain_File(d, dom_control(d)) @@ -87,7 +87,7 @@ program Process_Prog call Grid(d) % Load_Dim(This_Proc(), domain=d) ! Determine threads for OpenMP runs - call Control_Mod_Max_Threads(Grid(d) % Vect % d_threads, .true.) + call Control % Max_Threads(Grid(d) % Vect % d_threads, .true.) call Grid(d) % Determine_Threads() call Grid(d) % Calculate_Face_Geometry() @@ -108,12 +108,12 @@ program Process_Prog curr_dt = 0 first_dt = 0 call Control % Number_Of_Time_Steps(last_dt, verbose=.true.) - call Control_Mod_Starting_Time_Step_For_Turb_Statistics(n_stat_t, & + call Control % Starting_Time_Step_For_Turb_Statistics(n_stat_t, & + verbose = .true.) + call Control % Starting_Time_Step_For_Swarm_Statistics(n_stat_p, & + verbose = .true.) + call Control % Starting_Time_Step_For_Swarm_Computation(first_dt_p, & verbose = .true.) - call Control_Mod_Starting_Time_Step_For_Swarm_Statistics(n_stat_p, & - verbose = .true.) - call Control_Mod_Starting_Time_Step_For_Swarm_Computation(first_dt_p, & - verbose = .true.) ! Read physical models for each domain from control file do d = 1, n_dom @@ -138,7 +138,7 @@ program Process_Prog ! Read numerical models from control file (after the memory is allocated) call Read_Control % Numerical_Schemes(Flow(d), Turb(d), Vof(d)) - call Read_Control % Linear_Solvers (Flow(d), Turb(d), Vof(d), Sol(d)) + call Read_Control % Solvers(Flow(d), Turb(d), Vof(d), Sol(d)) call Grid(d) % Find_Nodes_Cells() call Grid(d) % Calculate_Weights_Cells_To_Nodes() ! needed for front @@ -183,9 +183,9 @@ program Process_Prog call Por(d) % Create_Porosity(Grid(d)) ! Plane for calcution of overall mass fluxes - call Control_Mod_Point_For_Monitoring_Planes(Flow(d) % bulk % xp, & - Flow(d) % bulk % yp, & - Flow(d) % bulk % zp) + call Control % Point_For_Monitoring_Planes(Flow(d) % bulk % xp, & + Flow(d) % bulk % yp, & + Flow(d) % bulk % zp) ! Prepare ... call Bulk_Mod_Monitoring_Planes_Areas(Flow(d) % bulk, Grid(d)) @@ -224,8 +224,8 @@ program Process_Prog if(first_dt .eq. 0) then do d = 1, n_dom call Control % Switch_To_Domain(d) ! not sure if this call is needed - call Control_Mod_Potential_Initialization(pot_init, .true.) - if(pot_init) call Flow(d) % Potential_Initialization(Sol(d)) + call Control % Potential_Initialization(pot_init, .true.) + if(pot_init) call Flow(d) % Potential_Initialisation(Sol(d)) end do end if diff --git a/Sources/Process/Process_Mod/Compute_Scalar.f90 b/Sources/Process/Process_Mod/Compute_Scalar.f90 index ace62afc6..fe270155f 100644 --- a/Sources/Process/Process_Mod/Compute_Scalar.f90 +++ b/Sources/Process/Process_Mod/Compute_Scalar.f90 @@ -97,7 +97,9 @@ subroutine Compute_Scalar(Process, Flow, Turb, Vof, Sol, curr_dt, ini, sc) !----------------------------! ! Spatial discretization ! !----------------------------! - call Control_Mod_Turbulent_Schmidt_Number(sc_t) ! get default sc_t (0.9) + + ! It used to read sc_t from here which is an overkill, so check + Assert(sc_t > 0.0) do s = 1, Grid % n_faces diff --git a/Sources/Process/Read_Controls_Mod.f90 b/Sources/Process/Read_Controls_Mod.f90 index e7bcc0f59..ce64ccf79 100644 --- a/Sources/Process/Read_Controls_Mod.f90 +++ b/Sources/Process/Read_Controls_Mod.f90 @@ -24,12 +24,12 @@ module Read_Controls_Mod contains procedure :: Boundary_Conditions - procedure :: Linear_Solvers ! on top of native & PETSc procedure, private :: Native_Solvers procedure :: Numerical_Schemes procedure, private :: Petsc_Solvers procedure :: Physical_Models procedure :: Physical_Properties + procedure :: Solvers ! on top of native & PETSc end type @@ -39,12 +39,12 @@ module Read_Controls_Mod ! Member function # include "Read_Controls_Mod/Boundary_Conditions.f90" -# include "Read_Controls_Mod/Linear_Solvers.f90" # include "Read_Controls_Mod/Native_Solvers.f90" # include "Read_Controls_Mod/Numerical_Schemes.f90" # include "Read_Controls_Mod/Petsc_Solvers.f90" # include "Read_Controls_Mod/Physical_Models.f90" # include "Read_Controls_Mod/Physical_Properties.f90" +# include "Read_Controls_Mod/Solvers.f90" # include "Key_Ind.f90" end module diff --git a/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 b/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 index 16aca0881..a1b8ec718 100644 --- a/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 +++ b/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 @@ -56,7 +56,7 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) ! Read wall roughness, if specified as a constant for all walls ! ! (If it is not specified in the control file, it will be zero) ! !-------------------------------------------------------------------! - call Control_Mod_Roughness_Coefficient(Turb % z_o) + call Control % Roughness_Coefficient(Turb % z_o) !----------------------------------------------------------------! ! Count number of types per boundary condition, total number ! diff --git a/Sources/Process/Read_Controls_Mod/Physical_Models.f90 b/Sources/Process/Read_Controls_Mod/Physical_Models.f90 index 06ac1d9c7..275e123f8 100644 --- a/Sources/Process/Read_Controls_Mod/Physical_Models.f90 +++ b/Sources/Process/Read_Controls_Mod/Physical_Models.f90 @@ -37,11 +37,11 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) ! Related to heat transfer and bouyancy ! ! ! !-------------------------------------------! - call Control_Mod_Heat_Transfer(Flow % heat_transfer, verbose = .true.) - call Control_Mod_Gravitational_Vector(Flow % grav_x, & - Flow % grav_y, & - Flow % grav_z, .true.) - call Control_Mod_Buoyancy(name, .true.) + call Control % Heat_Transfer(Flow % heat_transfer, verbose = .true.) + call Control % Gravitational_Vector(Flow % grav_x, & + Flow % grav_y, & + Flow % grav_z, .true.) + call Control % Buoyancy(name, .true.) select case(name) case('NONE') Flow % buoyancy = NO_BUOYANCY @@ -55,18 +55,19 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) '. \n Exiting!') end select - call Control_Mod_Reference_Density (Flow % dens_ref, .true.) - call Control_Mod_Reference_Temperature (Flow % t_ref, .true.) - call Control_Mod_Volume_Expansion_Coefficient(Flow % beta, .true.) - call Control_Mod_Turbulent_Prandtl_Number (pr_t) ! default is (0.9) - call Control_Mod_Extrapolate_Temperature_Exp (Flow % exp_temp_wall, .true.) + call Control % Reference_Density (Flow % dens_ref, .true.) + call Control % Reference_Temperature (Flow % t_ref, .true.) + call Control % Volume_Expansion_Coefficient(Flow % beta, .true.) + call Control % Turbulent_Prandtl_Number (pr_t) ! default is (0.9) + call Control % Turbulent_Schmidt_Number (sc_t) ! default is (0.9) + call Control % Extrapolate_Temperature_Exp (Flow % exp_temp_wall, .true.) !---------------------------! ! ! ! Related to turbulence ! ! ! !---------------------------! - call Control_Mod_Turbulence_Model(name, .true.) + call Control % Turbulence_Model(name, .true.) select case(name) case('NONE') @@ -109,7 +110,7 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) !---------------------------------------------------------! if(Turb % model .eq. RSM_HANJALIC_JAKIRLIC .or. & Turb % model .eq. RSM_MANCEAU_HANJALIC) then - call Control_Mod_Turbulence_Model_Variant(name, .true.) + call Control % Turbulence_Model_Variant(name, .true.) if (name .eq. 'NONE') then Turb % model_variant = NO_TURBULENCE_MODEL else if(name .eq. 'STABILIZED') then @@ -124,7 +125,7 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) !----------------------------! ! Rough or smooth walls? ! !----------------------------! - call Control_Mod_Rough_Walls(Turb % rough_walls, .true.) + call Control % Rough_Walls(Turb % rough_walls, .true.) ! Does the user want to gather statistics? call Control % Read_Int_Item('STARTING_TIME_STEP_FOR_TURB_STATISTICS', & @@ -156,7 +157,7 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) !-------------------------------! ! Turbulent heat flux model ! !-------------------------------! - call Control_Mod_Turbulent_Heat_Flux_Model(name, .true.) + call Control % Turbulent_Heat_Flux_Model(name, .true.) select case(name) case('SGDH') Turb % heat_flux_model = SGDH @@ -174,7 +175,7 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) ! Type of switching for hybrid LES/RANS ! !-------------------------------------------! if(Turb % model .eq. HYBRID_LES_RANS) then - call Control_Mod_Hybrid_Les_Rans_Switch(name, .true.) + call Control % Hybrid_Les_Rans_Switch(name, .true.) select case(name) case('SWITCH_DISTANCE') Turb % hybrid_les_rans_switch = SWITCH_DISTANCE @@ -192,7 +193,7 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) !-------------------------------------------------------------------------! if(Turb % model .eq. LES_SMAGORINSKY .or. & Turb % model .eq. HYBRID_LES_PRANDTL) then - call Control_Mod_Smagorinsky_Constant(c_smag, .true.) + call Control % Smagorinsky_Constant(c_smag, .true.) end if if(Turb % model .eq. K_EPS) then @@ -227,31 +228,31 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) ! Pressure drops and mass fluxes ! ! ! !------------------------------------! - call Control_Mod_Pressure_Drops(bulk % p_drop_x, & - bulk % p_drop_y, & - bulk % p_drop_z) - call Control_Mod_Mass_Flow_Rates(bulk % flux_x_o, & - bulk % flux_y_o, & - bulk % flux_z_o) + call Control % Pressure_Drops(bulk % p_drop_x, & + bulk % p_drop_y, & + bulk % p_drop_z) + call Control % Mass_Flow_Rates(bulk % flux_x_o, & + bulk % flux_y_o, & + bulk % flux_z_o) !-----------------------! ! ! ! Number of scalars ! ! ! !-----------------------! - call Control_Mod_Number_Of_Scalars(Flow % n_scalars, verbose = .true.) + call Control % Number_Of_Scalars(Flow % n_scalars, verbose = .true.) !-----------------------------------! ! ! ! Related to interface tracking ! ! ! !-----------------------------------! - call Control_Mod_Interface_Tracking(Flow % with_interface, .true.) + call Control % Interface_Tracking(Flow % with_interface, .true.) if(Flow % with_interface) then - call Control_Mod_Track_Front (Vof % track_front, .true.) - call Control_Mod_Track_Surface(Vof % track_surface, .true.) - call Control_Mod_Mass_Transfer(Flow % mass_transfer) + call Control % Track_Front (Vof % track_front, .true.) + call Control % Track_Surface(Vof % track_surface, .true.) + call Control % Mass_Transfer(Flow % mass_transfer) end if !-----------------------! @@ -259,24 +260,24 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) ! Particle tracking ! ! ! !-----------------------! - call Control_Mod_Particle_Tracking(Flow % with_particles, .true.) + call Control % Particle_Tracking(Flow % with_particles, .true.) if(Flow % with_particles) then - call Control_Mod_Max_Particles (Swarm % max_particles, verbose = .true.) - call Control_Mod_Swarm_Density (Swarm % density, verbose = .true.) - call Control_Mod_Swarm_Diameter(Swarm % diameter, verbose = .true.) + call Control % Max_Particles (Swarm % max_particles, verbose = .true.) + call Control % Swarm_Density (Swarm % density, verbose = .true.) + call Control % Swarm_Diameter(Swarm % diameter, verbose = .true.) - call Control_Mod_Swarm_Coefficient_Of_Restitution(Swarm % rst, & - verbose = .true.) - call Control_Mod_Number_Of_Swarm_Sub_Steps (Swarm % n_sub_steps, & - verbose = .true.) + call Control % Swarm_Coefficient_Of_Restitution(Swarm % rst, & + verbose = .true.) + call Control % Number_Of_Swarm_Sub_Steps (Swarm % n_sub_steps, & + verbose = .true.) call Control % Read_Int_Item('STARTING_TIME_STEP_FOR_SWARM_STATISTICS', & HUGE_INT, n_stat_p, .false.) ! SGS models for particle - call Control_Mod_Swarm_Subgrid_Scale_Model(name, verbose = .true.) + call Control % Swarm_Subgrid_Scale_Model(name, verbose = .true.) select case(name) case('BROWNIAN_FUKAGATA') Swarm % subgrid_scale_model = BROWNIAN_FUKAGATA diff --git a/Sources/Process/Read_Controls_Mod/Physical_Properties.f90 b/Sources/Process/Read_Controls_Mod/Physical_Properties.f90 index 0eb76a417..86930db37 100644 --- a/Sources/Process/Read_Controls_Mod/Physical_Properties.f90 +++ b/Sources/Process/Read_Controls_Mod/Physical_Properties.f90 @@ -21,20 +21,20 @@ subroutine Physical_Properties(Rc, Flow, Vof, Swarm) Grid => Flow % pnt_grid ! Read constant (defualt) values - call Control_Mod_Dynamic_Viscosity (visc_const) - call Control_Mod_Mass_Density (dens_const) - call Control_Mod_Heat_Capacity (capa_const) - call Control_Mod_Thermal_Conductivity(cond_const) - call Control_Mod_Scalars_Diffusivity (Flow % diffusivity) + call Control % Dynamic_Viscosity (visc_const) + call Control % Mass_Density (dens_const) + call Control % Heat_Capacity (capa_const) + call Control % Thermal_Conductivity(cond_const) + call Control % Scalars_Diffusivity (Flow % diffusivity) if(Flow % with_interface) then - call Control_Mod_Phase_Densities (Vof % phase_dens) - call Control_Mod_Phase_Viscosities (Vof % phase_visc) - call Control_Mod_Phase_Capacities (Vof % phase_capa) - call Control_Mod_Phase_Conductivities (Vof % phase_cond) - call Control_Mod_Surface_Tension (Vof % surface_tension) - call Control_Mod_Latent_Heat (Vof % latent_heat) - call Control_Mod_Saturation_Temperature(Vof % t_sat) + call Control % Phase_Densities (Vof % phase_dens) + call Control % Phase_Viscosities (Vof % phase_visc) + call Control % Phase_Capacities (Vof % phase_capa) + call Control % Phase_Conductivities (Vof % phase_cond) + call Control % Surface_Tension (Vof % surface_tension) + call Control % Latent_Heat (Vof % latent_heat) + call Control % Saturation_Temperature(Vof % t_sat) else Flow % density (:) = dens_const Flow % viscosity (:) = visc_const diff --git a/Sources/Process/Read_Controls_Mod/Linear_Solvers.f90 b/Sources/Process/Read_Controls_Mod/Solvers.f90 similarity index 91% rename from Sources/Process/Read_Controls_Mod/Linear_Solvers.f90 rename to Sources/Process/Read_Controls_Mod/Solvers.f90 index 0d787c1be..fa93b183c 100644 --- a/Sources/Process/Read_Controls_Mod/Linear_Solvers.f90 +++ b/Sources/Process/Read_Controls_Mod/Solvers.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Linear_Solvers(Rc, Flow, Turb, Vof, Sol) + subroutine Solvers(Rc, Flow, Turb, Vof, Sol) !------------------------------------------------------------------------------! ! Reads which linear solvers to use, and calls appropriate branches. ! !------------------------------------------------------------------------------! @@ -15,7 +15,7 @@ subroutine Linear_Solvers(Rc, Flow, Turb, Vof, Sol) !==============================================================================! ! Linear solvers you want to use; native or PETSc - call Control_Mod_Linear_Solvers(name, .true.) + call Control % Linear_Solvers(name, .true.) Sol % solvers = Solver_Mod_Linear_Solvers_Code(name) ! Read options for native solvers first ... diff --git a/Sources/Process/Turb_Mod.f90 b/Sources/Process/Turb_Mod.f90 index 7dd034293..714495dc2 100644 --- a/Sources/Process/Turb_Mod.f90 +++ b/Sources/Process/Turb_Mod.f90 @@ -206,7 +206,7 @@ module Turb_Mod procedure :: Tau_Wall_Log_Law procedure :: U_Plus_Log_Law procedure :: Time_And_Length_Scale - procedure :: Roughness_Coefficient + procedure :: Roughness_Coeff procedure :: Les @@ -348,7 +348,7 @@ module Turb_Mod # include "Turb_Mod/Tau_Wall_Log_Law.f90" # include "Turb_Mod/U_Plus_Log_Law.f90" # include "Turb_Mod/Time_And_Length_Scale.f90" -# include "Turb_Mod/Roughness_Coefficient.f90" +# include "Turb_Mod/Roughness_Coeff.f90" # include "Turb_Mod/Les.f90" diff --git a/Sources/Process/Turb_Mod/Calculate_Heat_Flux.f90 b/Sources/Process/Turb_Mod/Calculate_Heat_Flux.f90 index 5ebc27ee0..05a2b246f 100644 --- a/Sources/Process/Turb_Mod/Calculate_Heat_Flux.f90 +++ b/Sources/Process/Turb_Mod/Calculate_Heat_Flux.f90 @@ -30,10 +30,14 @@ subroutine Calculate_Heat_Flux(Turb) ! ... maybe this call is not needed call Flow % Grad_Variable(t) + ! It used to read pr_t from here, so check it just in case + Assert(pr_t > 0.0) + !-----------------------------------------! + ! ! ! Compute the sources in the interior ! + ! ! !-----------------------------------------! - call Control_Mod_Turbulent_Prandtl_Number(pr_t) !-----------------------------------------------------------! ! By default turbulent heat flux is caalculated by SGDH ! @@ -42,31 +46,28 @@ subroutine Calculate_Heat_Flux(Turb) if(Turb % heat_flux_model .eq. SGDH) then do c = Cells_In_Domain_And_Buffers() pr_t = max(Turb % Prandtl_Turb(c), TINY) - ut % n(c) = - Turb % vis_t(c) / Flow % density(c) / pr_t * t % x(c) - vt % n(c) = - Turb % vis_t(c) / Flow % density(c) / pr_t * t % y(c) - wt % n(c) = - Turb % vis_t(c) / Flow % density(c) / pr_t * t % z(c) + ut % n(c) = -Turb % vis_t(c) / Flow % density(c) / pr_t * t % x(c) + vt % n(c) = -Turb % vis_t(c) / Flow % density(c) / pr_t * t % y(c) + wt % n(c) = -Turb % vis_t(c) / Flow % density(c) / pr_t * t % z(c) if(Turb % model .eq. HYBRID_LES_RANS) then - ut % n(c) = - Turb % vis_t_eff(c) / Flow % density(c) & - / pr_t * t % x(c) - vt % n(c) = - Turb % vis_t_eff(c) / Flow % density(c) & - / pr_t * t % y(c) - wt % n(c) = - Turb % vis_t_eff(c) / Flow % density(c) & - / pr_t * t % z(c) + ut % n(c) = -Turb % vis_t_eff(c) / Flow % density(c) / pr_t * t % x(c) + vt % n(c) = -Turb % vis_t_eff(c) / Flow % density(c) / pr_t * t % y(c) + wt % n(c) = -Turb % vis_t_eff(c) / Flow % density(c) / pr_t * t % z(c) end if end do else if(Turb % heat_flux_model .eq. GGDH) then do c = Cells_In_Domain_And_Buffers() - ut % n(c) = -c_theta * Turb % t_scale(c) * (uu % n(c) * t % x(c) + & - uv % n(c) * t % y(c) + & - uw % n(c) * t % z(c)) - vt % n(c) = -c_theta * Turb % t_scale(c) * (uv % n(c) * t % x(c) + & - vv % n(c) * t % y(c) + & - vw % n(c) * t % z(c)) - wt % n(c) = -c_theta * Turb % t_scale(c) * (uw % n(c) * t % x(c) + & - vw % n(c) * t % y(c) + & - ww % n(c) * t % z(c)) + ut % n(c) = -c_theta * Turb % t_scale(c) * ( uu % n(c) * t % x(c) & + + uv % n(c) * t % y(c) & + + uw % n(c) * t % z(c)) + vt % n(c) = -c_theta * Turb % t_scale(c) * ( uv % n(c) * t % x(c) & + + vv % n(c) * t % y(c) & + + vw % n(c) * t % z(c)) + wt % n(c) = -c_theta * Turb % t_scale(c) * ( uw % n(c) * t % x(c) & + + vw % n(c) * t % y(c) & + + ww % n(c) * t % z(c)) end do else if(Turb % heat_flux_model .eq. AFM) then @@ -104,6 +105,11 @@ subroutine Calculate_Heat_Flux(Turb) end do end if + !--------------------------------------! + ! ! + ! Compute the sources at the walls ! + ! ! + !--------------------------------------! if(Turb % model .eq. K_EPS .or. & Turb % model .eq. K_EPS_ZETA_F .or. & Turb % model .eq. HYBRID_LES_RANS) then diff --git a/Sources/Process/Turb_Mod/Calculate_Scalar_Flux.f90 b/Sources/Process/Turb_Mod/Calculate_Scalar_Flux.f90 index b3fb5e867..d5ff49dac 100644 --- a/Sources/Process/Turb_Mod/Calculate_Scalar_Flux.f90 +++ b/Sources/Process/Turb_Mod/Calculate_Scalar_Flux.f90 @@ -30,10 +30,14 @@ subroutine Calculate_Scalar_Flux(Turb, sc) ! ... maybe this call is not needed call Flow % Grad_Variable(phi) + ! It used to read sc_t from here which is an overkill, so check + Assert(sc_t > 0.0) + !-----------------------------------------! + ! ! ! Compute the sources in the interior ! + ! ! !-----------------------------------------! - call Control_Mod_Turbulent_Schmidt_Number(sc_t) !-----------------------------------------! ! First guess is the flux defined by SGDH ! @@ -41,32 +45,32 @@ subroutine Calculate_Scalar_Flux(Turb, sc) if(Turb % scalar_flux_model .eq. SGDH) then do c = Cells_In_Domain_And_Buffers() - Turb % uc(c) = - Turb % vis_t(c) / Flow % density(c) / sc_t * phi % x(c) - Turb % vc(c) = - Turb % vis_t(c) / Flow % density(c) / sc_t * phi % y(c) - Turb % wc(c) = - Turb % vis_t(c) / Flow % density(c) / sc_t * phi % z(c) + Turb % uc(c) = -Turb % vis_t(c) / Flow % density(c) / sc_t * phi % x(c) + Turb % vc(c) = -Turb % vis_t(c) / Flow % density(c) / sc_t * phi % y(c) + Turb % wc(c) = -Turb % vis_t(c) / Flow % density(c) / sc_t * phi % z(c) if(Turb % model .eq. HYBRID_LES_RANS) then - Turb % uc(c) = - Turb % vis_t_eff(c) / Flow % density(c) & - / sc_t * phi % x(c) - Turb % vc(c) = - Turb % vis_t_eff(c) / Flow % density(c) & - / sc_t * phi % y(c) - Turb % wc(c) = - Turb % vis_t_eff(c) / Flow % density(c) & - / sc_t * phi % z(c) + Turb % uc(c) = -Turb % vis_t_eff(c) / Flow % density(c) & + / sc_t * phi % x(c) + Turb % vc(c) = -Turb % vis_t_eff(c) / Flow % density(c) & + / sc_t * phi % y(c) + Turb % wc(c) = -Turb % vis_t_eff(c) / Flow % density(c) & + / sc_t * phi % z(c) end if end do else if(Turb % scalar_flux_model .eq. GGDH) then do c = Cells_In_Domain_And_Buffers() - Turb % uc(c) = -c_theta * Turb % t_scale(c) * (uu % n(c) * phi % x(c) + & - uv % n(c) * phi % y(c) + & - uw % n(c) * phi % z(c)) - Turb % vc(c) = -c_theta * Turb % t_scale(c) * (uv % n(c) * phi % x(c) + & - vv % n(c) * phi % y(c) + & - vw % n(c) * phi % z(c)) - Turb % wc(c) = -c_theta * Turb % t_scale(c) * (uw % n(c) * phi % x(c) + & - vw % n(c) * phi % y(c) + & - ww % n(c) * phi % z(c)) + Turb % uc(c) = -c_theta * Turb % t_scale(c) * ( uu % n(c) * phi % x(c) & + + uv % n(c) * phi % y(c) & + + uw % n(c) * phi % z(c)) + Turb % vc(c) = -c_theta * Turb % t_scale(c) * ( uv % n(c) * phi % x(c) & + + vv % n(c) * phi % y(c) & + + vw % n(c) * phi % z(c)) + Turb % wc(c) = -c_theta * Turb % t_scale(c) * ( uw % n(c) * phi % x(c) & + + vw % n(c) * phi % y(c) & + + ww % n(c) * phi % z(c)) end do else if(Turb % scalar_flux_model .eq. AFM) then @@ -76,32 +80,36 @@ subroutine Calculate_Scalar_Flux(Turb, sc) do k = 1, 3 do c = Cells_In_Domain_And_Buffers() - Turb % uc(c) = -c_theta*Turb % t_scale(c) * (( uu % n(c) * phi % x(c) & - + uv % n(c) * phi % y(c) & - + uw % n(c) * phi % z(c)) & - + afm_eta * ( Turb % uc(c) * u % x(c) & - + Turb % vc(c) * u % y(c) & + Turb % uc(c) = -c_theta*Turb % t_scale(c) * (( uu % n(c) * phi % x(c) & + + uv % n(c) * phi % y(c) & + + uw % n(c) * phi % z(c)) & + + afm_eta * ( Turb % uc(c) * u % x(c) & + + Turb % vc(c) * u % y(c) & + Turb % wc(c) * u % z(c))) - - Turb % vc(c) = -c_theta*Turb % t_scale(c) * (( uv % n(c) * phi % x(c) & - + vv % n(c) * phi % y(c) & - + vw % n(c) * phi % z(c)) & - + afm_eta * ( Turb % uc(c) * v % x(c) & - + Turb % vc(c) * v % y(c) & + Turb % vc(c) = -c_theta*Turb % t_scale(c) * (( uv % n(c) * phi % x(c) & + + vv % n(c) * phi % y(c) & + + vw % n(c) * phi % z(c)) & + + afm_eta * ( Turb % uc(c) * v % x(c) & + + Turb % vc(c) * v % y(c) & + Turb % wc(c) * v % z(c))) - Turb % wc(c) = -c_theta*Turb % t_scale(c) * (( uw % n(c) * phi % x(c) & - + vw % n(c) * phi % y(c) & - + ww % n(c) * phi % z(c)) & - + afm_eta * ( Turb % uc(c) * w % x(c) & - + Turb % vc(c) * w % y(c) & + Turb % wc(c) = -c_theta*Turb % t_scale(c) * (( uw % n(c) * phi % x(c) & + + vw % n(c) * phi % y(c) & + + ww % n(c) * phi % z(c)) & + + afm_eta * ( Turb % uc(c) * w % x(c) & + + Turb % vc(c) * w % y(c) & + Turb % wc(c) * w % z(c))) end do end do ! browse three times, but why? end if ! scalar model SGDH, GGDH or AFM + !--------------------------------------! + ! ! + ! Compute the sources at the walls ! + ! ! + !--------------------------------------! if(Turb % model .eq. K_EPS .or. & Turb % model .eq. K_EPS_ZETA_F .or. & Turb % model .eq. HYBRID_LES_RANS) then diff --git a/Sources/Process/Turb_Mod/Roughness_Coefficient.f90 b/Sources/Process/Turb_Mod/Roughness_Coeff.f90 similarity index 92% rename from Sources/Process/Turb_Mod/Roughness_Coefficient.f90 rename to Sources/Process/Turb_Mod/Roughness_Coeff.f90 index f99acf5e2..64df00239 100644 --- a/Sources/Process/Turb_Mod/Roughness_Coefficient.f90 +++ b/Sources/Process/Turb_Mod/Roughness_Coeff.f90 @@ -1,5 +1,5 @@ !==============================================================================! - real function Roughness_Coefficient(Turb, c1, c2) + real function Roughness_Coeff(Turb, c1, c2) !------------------------------------------------------------------------------! ! Set up roughness coefficient ! !------------------------------------------------------------------------------! @@ -21,6 +21,6 @@ real function Roughness_Coefficient(Turb, c1, c2) end if ! Specify the return value - Roughness_Coefficient = z_o + Roughness_Coeff = z_o end function diff --git a/Sources/Process/Turb_Mod/Src_Eps_K_Eps.f90 b/Sources/Process/Turb_Mod/Src_Eps_K_Eps.f90 index 52f699f94..993abbb1a 100644 --- a/Sources/Process/Turb_Mod/Src_Eps_K_Eps.f90 +++ b/Sources/Process/Turb_Mod/Src_Eps_K_Eps.f90 @@ -101,7 +101,7 @@ subroutine Src_Eps_K_Eps(Turb, Sol) kin_vis = Flow % viscosity(c1) / Flow % density(c1) ! Set up roughness coefficient - z_o = Turb % Roughness_Coefficient(c1, c2) + z_o = Turb % Roughness_Coeff(c1, c2) ! Compute tangential velocity component u_tan = Flow % U_Tan(s) diff --git a/Sources/Process/Turb_Mod/Src_Eps_K_Eps_Zeta_F.f90 b/Sources/Process/Turb_Mod/Src_Eps_K_Eps_Zeta_F.f90 index 54882a00d..9a95b87ec 100644 --- a/Sources/Process/Turb_Mod/Src_Eps_K_Eps_Zeta_F.f90 +++ b/Sources/Process/Turb_Mod/Src_Eps_K_Eps_Zeta_F.f90 @@ -91,7 +91,7 @@ subroutine Src_Eps_K_Eps_Zeta_F(Turb, Sol) kin_vis = Flow % viscosity(c1) / Flow % density(c1) ! Set up roughness coefficient - z_o = Turb % Roughness_Coefficient(c1, c2) + z_o = Turb % Roughness_Coeff(c1, c2) ! Compute tangential velocity component u_tan = Flow % U_Tan(s) diff --git a/Sources/Process/Turb_Mod/Src_Kin_K_Eps.f90 b/Sources/Process/Turb_Mod/Src_Kin_K_Eps.f90 index 17d9c3139..90e009d28 100644 --- a/Sources/Process/Turb_Mod/Src_Kin_K_Eps.f90 +++ b/Sources/Process/Turb_Mod/Src_Kin_K_Eps.f90 @@ -87,7 +87,7 @@ subroutine Src_Kin_K_Eps(Turb, Sol) kin_vis = Flow % viscosity(c1) / Flow % density(c1) ! Set up roughness coefficient - z_o = Turb % Roughness_Coefficient(c1, c2) + z_o = Turb % Roughness_Coeff(c1, c2) ! Compute tangential velocity component u_tan = Flow % U_Tan(s) diff --git a/Sources/Process/Turb_Mod/Src_Kin_K_Eps_Zeta_F.f90 b/Sources/Process/Turb_Mod/Src_Kin_K_Eps_Zeta_F.f90 index 72b9b9107..ba4653523 100644 --- a/Sources/Process/Turb_Mod/Src_Kin_K_Eps_Zeta_F.f90 +++ b/Sources/Process/Turb_Mod/Src_Kin_K_Eps_Zeta_F.f90 @@ -136,7 +136,7 @@ subroutine Src_Kin_K_Eps_Zeta_F(Turb, Sol) kin_vis = Flow % viscosity(c1) / Flow % density(c1) ! Set up roughness coefficient - z_o = Turb % Roughness_Coefficient(c1, c2) + z_o = Turb % Roughness_Coeff(c1, c2) ! Compute tangential velocity component u_tan = Flow % U_Tan(s) diff --git a/Sources/Process/Turb_Mod/Src_T2.f90 b/Sources/Process/Turb_Mod/Src_T2.f90 index b7918b8de..045cfda68 100644 --- a/Sources/Process/Turb_Mod/Src_T2.f90 +++ b/Sources/Process/Turb_Mod/Src_T2.f90 @@ -90,7 +90,7 @@ subroutine Src_T2(Turb, Sol) c2 = Grid % faces_c(2,s) ! Set up roughness coefficient - z_o = Turb % Roughness_Coefficient(c1, c2) + z_o = Turb % Roughness_Coeff(c1, c2) ! Kinematic viscosities kin_vis = Flow % viscosity(c1) / Flow % density(c1) diff --git a/Sources/Process/Turb_Mod/Vis_T_K_Eps.f90 b/Sources/Process/Turb_Mod/Vis_T_K_Eps.f90 index 9cbda07d9..367ced717 100644 --- a/Sources/Process/Turb_Mod/Vis_T_K_Eps.f90 +++ b/Sources/Process/Turb_Mod/Vis_T_K_Eps.f90 @@ -82,7 +82,7 @@ subroutine Vis_T_K_Eps(Turb) kin_vis = Flow % viscosity(c1) / Flow % density(c1) ! Set up roughness coefficient - z_o = Turb % Roughness_Coefficient(c1, c2) + z_o = Turb % Roughness_Coeff(c1, c2) ! Compute tangential velocity component u_tan = Flow % U_Tan(s) diff --git a/Sources/Process/Turb_Mod/Vis_T_K_Eps_Zeta_F.f90 b/Sources/Process/Turb_Mod/Vis_T_K_Eps_Zeta_F.f90 index 62bb4f456..25d809326 100644 --- a/Sources/Process/Turb_Mod/Vis_T_K_Eps_Zeta_F.f90 +++ b/Sources/Process/Turb_Mod/Vis_T_K_Eps_Zeta_F.f90 @@ -77,7 +77,7 @@ subroutine Vis_T_K_Eps_Zeta_F(Turb) kin_vis = Flow % viscosity(c1) / Flow % density(c1) ! Set up roughness coefficient - z_o = Turb % Roughness_Coefficient(c1, c2) + z_o = Turb % Roughness_Coeff(c1, c2) ! Compute tangential velocity component u_tan = Flow % U_Tan(s) diff --git a/Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 b/Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 index 060ab5092..1121e040f 100644 --- a/Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 +++ b/Sources/Process/Turb_Mod/Vis_T_Subgrid.f90 @@ -127,7 +127,7 @@ subroutine Vis_T_Subgrid(Turb) kin_vis = Flow % viscosity(c1) / Flow % density(c1) ! Set up roughness coefficient - z_o = Turb % Roughness_Coefficient(c1, c2) + z_o = Turb % Roughness_Coeff(c1, c2) u_tan = Flow % U_Tan(s) diff --git a/Sources/Shared/Control_Mod.f90 b/Sources/Shared/Control_Mod.f90 index 54888ce8b..4f065d8e1 100644 --- a/Sources/Shared/Control_Mod.f90 +++ b/Sources/Shared/Control_Mod.f90 @@ -52,6 +52,10 @@ module Control_Mod procedure :: Swarm_Save_Interval procedure :: Profiler_Info + ! Unclassified as of yet + procedure :: Linear_Solvers + procedure :: Max_Threads + ! Native solvers procedure :: Max_Iterations_For_Energy_Solver procedure :: Max_Iterations_For_Momentum_Solver @@ -129,6 +133,59 @@ module Control_Mod procedure :: Max_Substep_Cycles_Vof procedure :: Skewness_Correction_Vof + ! Physics + procedure :: Number_Of_Domains + procedure :: Dynamic_Viscosity + procedure :: Heat_Capacity + procedure :: Latent_Heat + procedure :: Mass_Density + procedure :: Thermal_Conductivity + procedure :: Scalars_Diffusivity + procedure :: Interface_Tracking + procedure :: Particle_Tracking + procedure :: Mass_Transfer + procedure :: Heat_Transfer + procedure :: Buoyancy + procedure :: Reference_Temperature + procedure :: Saturation_Temperature + procedure :: Volume_Expansion_Coefficient + procedure :: Hybrid_Les_Rans_Switch + procedure :: Roughness_Coefficient + procedure :: Rough_Walls + procedure :: Smagorinsky_Constant + procedure :: Turbulence_Model + procedure :: Turbulence_Model_Variant + procedure :: Turbulent_Prandtl_Number + procedure :: Turbulent_Schmidt_Number + procedure :: Turbulent_Heat_Flux_Model + procedure :: Turbulent_Scalar_Flux_Model + procedure :: Angular_Velocity_Vector + procedure :: Gravitational_Vector + procedure :: Mass_Flow_Rates + procedure :: Pressure_Drops + procedure :: Point_For_Monitoring_Planes + procedure :: Potential_Initialization + procedure :: Max_Particles + procedure :: Number_Of_Phases + procedure :: Number_Of_Swarm_Sub_Steps + procedure :: Swarm_Coefficient_Of_Restitution + procedure :: Swarm_Density + procedure :: Swarm_Diameter + procedure :: Swarm_Subgrid_Scale_Model + procedure :: Phase_Capacities + procedure :: Phase_Conductivities + procedure :: Phase_Densities + procedure :: Phase_Viscosities + procedure :: Reference_Density + procedure :: Surface_Tension + procedure :: Track_Front + procedure :: Track_Surface + procedure :: Number_Of_Scalars + procedure :: Starting_Time_Step_For_Turb_Statistics + procedure :: Starting_Time_Step_For_Swarm_Computation + procedure :: Starting_Time_Step_For_Swarm_Statistics + procedure :: Extrapolate_Temperature_Exp + end type type(Control_Type) :: Control diff --git a/Sources/Shared/Control_Mod/Linear_Solvers.f90 b/Sources/Shared/Control_Mod/Linear_Solvers.f90 index 6edd139f5..2d34f369a 100644 --- a/Sources/Shared/Control_Mod/Linear_Solvers.f90 +++ b/Sources/Shared/Control_Mod/Linear_Solvers.f90 @@ -1,12 +1,13 @@ !==============================================================================! - subroutine Control_Mod_Linear_Solvers(name, verbose) + subroutine Linear_Solvers(Control, name, verbose) !------------------------------------------------------------------------------! ! Reading linear solvers (native or PETSc) from the control file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - character(SL) :: name ! name of the pressure-momentum coupling algorithm - logical, optional :: verbose + class(Control_Type) :: Control + character(SL) :: name + logical, optional :: verbose !==============================================================================! call Control % Read_Char_Item('LINEAR_SOLVERS', & diff --git a/Sources/Shared/Control_Mod/Max_Threads.f90 b/Sources/Shared/Control_Mod/Max_Threads.f90 index 9c4b81218..d00e2d4be 100644 --- a/Sources/Shared/Control_Mod/Max_Threads.f90 +++ b/Sources/Shared/Control_Mod/Max_Threads.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Max_Threads(val, verbose) + subroutine Max_Threads(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! @@ -11,6 +12,7 @@ subroutine Control_Mod_Max_Threads(val, verbose) call Control % Read_Int_Item('MAX_THREADS', 2, val, verbose) # else val = 1 + Unused(Control) Unused(verbose) # endif diff --git a/Sources/Shared/Control_Mod/Physics/Angular_Velocity_Vector.f90 b/Sources/Shared/Control_Mod/Physics/Angular_Velocity_Vector.f90 index 43b5272c2..7a1d59599 100644 --- a/Sources/Shared/Control_Mod/Physics/Angular_Velocity_Vector.f90 +++ b/Sources/Shared/Control_Mod/Physics/Angular_Velocity_Vector.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Angular_Velocity_Vector(v_x, v_y, v_z, verbose) + subroutine Angular_Velocity_Vector(Control, v_x, v_y, v_z, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: v_x, v_y, v_z - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: v_x, v_y, v_z + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def(3) real :: val(3) diff --git a/Sources/Shared/Control_Mod/Physics/Buoyancy.f90 b/Sources/Shared/Control_Mod/Physics/Buoyancy.f90 index 9827ca7e5..c47e7a5e4 100644 --- a/Sources/Shared/Control_Mod/Physics/Buoyancy.f90 +++ b/Sources/Shared/Control_Mod/Physics/Buoyancy.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Buoyancy(val, verbose) + subroutine Buoyancy(Control, val, verbose) !------------------------------------------------------------------------------! ! Reading buoyancy model from the control file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Dynamic_Viscosity.f90 b/Sources/Shared/Control_Mod/Physics/Dynamic_Viscosity.f90 index 5c346b01e..3a5502fc2 100644 --- a/Sources/Shared/Control_Mod/Physics/Dynamic_Viscosity.f90 +++ b/Sources/Shared/Control_Mod/Physics/Dynamic_Viscosity.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Dynamic_Viscosity(val, verbose) + subroutine Dynamic_Viscosity(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('DYNAMIC_VISCOSITY', 0.01, val, verbose) diff --git a/Sources/Shared/Control_Mod/Physics/Extrapolate_Temperature_Exp.f90 b/Sources/Shared/Control_Mod/Physics/Extrapolate_Temperature_Exp.f90 index 144009432..1f7810bd6 100644 --- a/Sources/Shared/Control_Mod/Physics/Extrapolate_Temperature_Exp.f90 +++ b/Sources/Shared/Control_Mod/Physics/Extrapolate_Temperature_Exp.f90 @@ -1,11 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Extrapolate_Temperature_Exp(temp_exp, & - verbose) + subroutine Extrapolate_Temperature_Exp(Control, temp_exp, verbose) !------------------------------------------------------------------------------! ! Reading if temprature will be extrapolated to walls exponentially ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control logical, intent(out) :: temp_exp logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! diff --git a/Sources/Shared/Control_Mod/Physics/Gravitational_Vector.f90 b/Sources/Shared/Control_Mod/Physics/Gravitational_Vector.f90 index be9a6fa9f..2c74d0e69 100644 --- a/Sources/Shared/Control_Mod/Physics/Gravitational_Vector.f90 +++ b/Sources/Shared/Control_Mod/Physics/Gravitational_Vector.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Gravitational_Vector(grav_x, grav_y, grav_z, verbose) + subroutine Gravitational_Vector(Control, grav_x, grav_y, grav_z, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: grav_x, grav_y, grav_z - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: grav_x, grav_y, grav_z + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def(3) real :: val(3) diff --git a/Sources/Shared/Control_Mod/Physics/Heat_Capacity.f90 b/Sources/Shared/Control_Mod/Physics/Heat_Capacity.f90 index e9fad5e0e..41ca65f5b 100644 --- a/Sources/Shared/Control_Mod/Physics/Heat_Capacity.f90 +++ b/Sources/Shared/Control_Mod/Physics/Heat_Capacity.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Heat_Capacity(val, verbose) + subroutine Heat_Capacity(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('HEAT_CAPACITY', 1.0, val, verbose) diff --git a/Sources/Shared/Control_Mod/Physics/Heat_Transfer.f90 b/Sources/Shared/Control_Mod/Physics/Heat_Transfer.f90 index d82c46430..e5392b5c8 100644 --- a/Sources/Shared/Control_Mod/Physics/Heat_Transfer.f90 +++ b/Sources/Shared/Control_Mod/Physics/Heat_Transfer.f90 @@ -1,9 +1,10 @@ !==============================================================================! - subroutine Control_Mod_Heat_Transfer(heat_transfer, verbose) + subroutine Heat_Transfer(Control, heat, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - logical, intent(out) :: heat_transfer + class(Control_Type) :: Control + logical, intent(out) :: heat logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! character(SL) :: val @@ -13,10 +14,10 @@ subroutine Control_Mod_Heat_Transfer(heat_transfer, verbose) call String % To_Upper_Case(val) if( val .eq. 'YES' ) then - heat_transfer = .true. + heat = .true. else if( val .eq. 'NO' ) then - heat_transfer = .false. + heat = .false. else call Message % Error(60, & diff --git a/Sources/Shared/Control_Mod/Physics/Hybrid_Les_Rans_Switch.f90 b/Sources/Shared/Control_Mod/Physics/Hybrid_Les_Rans_Switch.f90 index 7f8844552..316fffdc4 100644 --- a/Sources/Shared/Control_Mod/Physics/Hybrid_Les_Rans_Switch.f90 +++ b/Sources/Shared/Control_Mod/Physics/Hybrid_Les_Rans_Switch.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Hybrid_Les_Rans_Switch(val, verbose) + subroutine Hybrid_Les_Rans_Switch(Control, val, verbose) !------------------------------------------------------------------------------! ! Reading switch for hybrid LES/RANS model. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Interface_Tracking.f90 b/Sources/Shared/Control_Mod/Physics/Interface_Tracking.f90 index ccaa33798..03a623b73 100644 --- a/Sources/Shared/Control_Mod/Physics/Interface_Tracking.f90 +++ b/Sources/Shared/Control_Mod/Physics/Interface_Tracking.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Interface_Tracking(track_int, verbose) + subroutine Interface_Tracking(Control, track_int, verbose) !------------------------------------------------------------------------------! ! Reading if vof will be used to model multiphase situation ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control logical, intent(out) :: track_int logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! diff --git a/Sources/Shared/Control_Mod/Physics/Latent_Heat.f90 b/Sources/Shared/Control_Mod/Physics/Latent_Heat.f90 index 8843c0990..6fa2f5544 100644 --- a/Sources/Shared/Control_Mod/Physics/Latent_Heat.f90 +++ b/Sources/Shared/Control_Mod/Physics/Latent_Heat.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Latent_Heat(val, verbose) + subroutine Latent_Heat(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('LATENT_HEAT', 1.0, val, verbose) diff --git a/Sources/Shared/Control_Mod/Physics/Mass_Density.f90 b/Sources/Shared/Control_Mod/Physics/Mass_Density.f90 index d42e049a7..5a886d762 100644 --- a/Sources/Shared/Control_Mod/Physics/Mass_Density.f90 +++ b/Sources/Shared/Control_Mod/Physics/Mass_Density.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Mass_Density(val, verbose) + subroutine Mass_Density(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('MASS_DENSITY', 1.0, val, verbose) diff --git a/Sources/Shared/Control_Mod/Physics/Mass_Flow_Rates.f90 b/Sources/Shared/Control_Mod/Physics/Mass_Flow_Rates.f90 index 57b59d073..ae847d841 100644 --- a/Sources/Shared/Control_Mod/Physics/Mass_Flow_Rates.f90 +++ b/Sources/Shared/Control_Mod/Physics/Mass_Flow_Rates.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Mass_Flow_Rates(b_x, b_y, b_z, verbose) + subroutine Mass_Flow_Rates(Control, b_x, b_y, b_z, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: b_x, b_y, b_z - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: b_x, b_y, b_z + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def(3) real :: val(3) diff --git a/Sources/Shared/Control_Mod/Physics/Mass_Transfer.f90 b/Sources/Shared/Control_Mod/Physics/Mass_Transfer.f90 index a8c67a46b..555cf08a5 100644 --- a/Sources/Shared/Control_Mod/Physics/Mass_Transfer.f90 +++ b/Sources/Shared/Control_Mod/Physics/Mass_Transfer.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Mass_Transfer(phase_change, verbose) + subroutine Mass_Transfer(Control, phase_change, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control logical, intent(out) :: phase_change logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! diff --git a/Sources/Shared/Control_Mod/Physics/Max_Particles.f90 b/Sources/Shared/Control_Mod/Physics/Max_Particles.f90 index 636e96733..eccc48773 100644 --- a/Sources/Shared/Control_Mod/Physics/Max_Particles.f90 +++ b/Sources/Shared/Control_Mod/Physics/Max_Particles.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Max_Particles(val, verbose) + subroutine Max_Particles(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Number_Of_Domains.f90 b/Sources/Shared/Control_Mod/Physics/Number_Of_Domains.f90 index c2d6d04bb..9ed7123ae 100644 --- a/Sources/Shared/Control_Mod/Physics/Number_Of_Domains.f90 +++ b/Sources/Shared/Control_Mod/Physics/Number_Of_Domains.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Number_Of_Domains(val, verbose) + subroutine Number_Of_Domains(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Number_Of_Phases.f90 b/Sources/Shared/Control_Mod/Physics/Number_Of_Phases.f90 index 31bda8dc9..ee26cfeb3 100644 --- a/Sources/Shared/Control_Mod/Physics/Number_Of_Phases.f90 +++ b/Sources/Shared/Control_Mod/Physics/Number_Of_Phases.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Number_Of_Phases(val, verbose) + subroutine Number_Of_Phases(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Number_Of_Scalars.f90 b/Sources/Shared/Control_Mod/Physics/Number_Of_Scalars.f90 index f75e53579..7ed78d985 100644 --- a/Sources/Shared/Control_Mod/Physics/Number_Of_Scalars.f90 +++ b/Sources/Shared/Control_Mod/Physics/Number_Of_Scalars.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Number_Of_Scalars(val, verbose) + subroutine Number_Of_Scalars(Control, val, verbose) !------------------------------------------------------------------------------! ! Reading stuff related to passive scalars ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Number_Of_Swarm_Sub_Steps.f90 b/Sources/Shared/Control_Mod/Physics/Number_Of_Swarm_Sub_Steps.f90 index c7bd6fb44..bd20821c2 100644 --- a/Sources/Shared/Control_Mod/Physics/Number_Of_Swarm_Sub_Steps.f90 +++ b/Sources/Shared/Control_Mod/Physics/Number_Of_Swarm_Sub_Steps.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Number_Of_Swarm_Sub_Steps(val, verbose) + subroutine Number_Of_Swarm_Sub_Steps(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Particle_Tracking.f90 b/Sources/Shared/Control_Mod/Physics/Particle_Tracking.f90 index d1cccf722..187ff1302 100644 --- a/Sources/Shared/Control_Mod/Physics/Particle_Tracking.f90 +++ b/Sources/Shared/Control_Mod/Physics/Particle_Tracking.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Particle_Tracking(track_part, verbose) + subroutine Particle_Tracking(Control, track_part, verbose) !------------------------------------------------------------------------------! ! Reading if Lagrangian particle tracking will be used in simulations ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control logical, intent(out) :: track_part logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! diff --git a/Sources/Shared/Control_Mod/Physics/Phase_Capacities.f90 b/Sources/Shared/Control_Mod/Physics/Phase_Capacities.f90 index ca12733ef..9cb96a72b 100644 --- a/Sources/Shared/Control_Mod/Physics/Phase_Capacities.f90 +++ b/Sources/Shared/Control_Mod/Physics/Phase_Capacities.f90 @@ -1,12 +1,13 @@ !==============================================================================! - subroutine Control_Mod_Phase_Capacities(val, verbose) + subroutine Phase_Capacities(Control, val, verbose) !------------------------------------------------------------------------------! ! Reads as many capacities as there are phases. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real :: val(0:1) - logical, optional :: verbose + class(Control_Type) :: Control + real :: val(0:1) + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def(2) !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Phase_Conductivities.f90 b/Sources/Shared/Control_Mod/Physics/Phase_Conductivities.f90 index 2b86040fc..af5a1a53e 100644 --- a/Sources/Shared/Control_Mod/Physics/Phase_Conductivities.f90 +++ b/Sources/Shared/Control_Mod/Physics/Phase_Conductivities.f90 @@ -1,12 +1,13 @@ !==============================================================================! - subroutine Control_Mod_Phase_Conductivities(val, verbose) + subroutine Phase_Conductivities(Control, val, verbose) !------------------------------------------------------------------------------! ! Reads as many densities as there are phases. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real :: val(0:1) - logical, optional :: verbose + class(Control_Type) :: Control + real :: val(0:1) + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def(2) !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Phase_Densities.f90 b/Sources/Shared/Control_Mod/Physics/Phase_Densities.f90 index 124f7856e..e86fd7de9 100644 --- a/Sources/Shared/Control_Mod/Physics/Phase_Densities.f90 +++ b/Sources/Shared/Control_Mod/Physics/Phase_Densities.f90 @@ -1,12 +1,13 @@ !==============================================================================! - subroutine Control_Mod_Phase_Densities(val, verbose) + subroutine Phase_Densities(Control, val, verbose) !------------------------------------------------------------------------------! ! Reads as many densities as there are phases. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real :: val(0:1) - logical, optional :: verbose + class(Control_Type) :: Control + real :: val(0:1) + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def(2) !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Phase_Viscosities.f90 b/Sources/Shared/Control_Mod/Physics/Phase_Viscosities.f90 index f55550563..9a71d3bef 100644 --- a/Sources/Shared/Control_Mod/Physics/Phase_Viscosities.f90 +++ b/Sources/Shared/Control_Mod/Physics/Phase_Viscosities.f90 @@ -1,12 +1,13 @@ !==============================================================================! - subroutine Control_Mod_Phase_Viscosities(val, verbose) + subroutine Phase_Viscosities(Control, val, verbose) !------------------------------------------------------------------------------! ! Reads as many viscosities as there are phases. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real :: val(0:1) - logical, optional :: verbose + class(Control_Type) :: Control + real :: val(0:1) + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def(2) !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Point_For_Monitoring_Planes.f90 b/Sources/Shared/Control_Mod/Physics/Point_For_Monitoring_Planes.f90 index 31e3fce1e..eb760d0c6 100644 --- a/Sources/Shared/Control_Mod/Physics/Point_For_Monitoring_Planes.f90 +++ b/Sources/Shared/Control_Mod/Physics/Point_For_Monitoring_Planes.f90 @@ -1,11 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Point_For_Monitoring_Planes(b_xp, b_yp, b_zp, & - verbose) + subroutine Point_For_Monitoring_Planes(Control, b_xp, b_yp, b_zp, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: b_xp, b_yp, b_zp - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: b_xp, b_yp, b_zp + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def(3) real :: val(3) diff --git a/Sources/Shared/Control_Mod/Physics/Potential_Initialization.f90 b/Sources/Shared/Control_Mod/Physics/Potential_Initialization.f90 index 33eb80b39..2965c3942 100644 --- a/Sources/Shared/Control_Mod/Physics/Potential_Initialization.f90 +++ b/Sources/Shared/Control_Mod/Physics/Potential_Initialization.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Potential_Initialization(pot_init, verbose) + subroutine Potential_Initialization(Control, pot_init, verbose) !------------------------------------------------------------------------------! ! Reading potential initialization from the control file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control logical, intent(out) :: pot_init logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! diff --git a/Sources/Shared/Control_Mod/Physics/Pressure_Drops.f90 b/Sources/Shared/Control_Mod/Physics/Pressure_Drops.f90 index 0488b891a..c9762deec 100644 --- a/Sources/Shared/Control_Mod/Physics/Pressure_Drops.f90 +++ b/Sources/Shared/Control_Mod/Physics/Pressure_Drops.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Pressure_Drops(p_drop_x, p_drop_y, p_drop_z, verbose) + subroutine Pressure_Drops(Control, p_drop_x, p_drop_y, p_drop_z, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: p_drop_x, p_drop_y, p_drop_z - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: p_drop_x, p_drop_y, p_drop_z + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def(3) real :: val(3) diff --git a/Sources/Shared/Control_Mod/Physics/Reference_Density.f90 b/Sources/Shared/Control_Mod/Physics/Reference_Density.f90 index f7fea54dc..75d5daaf9 100644 --- a/Sources/Shared/Control_Mod/Physics/Reference_Density.f90 +++ b/Sources/Shared/Control_Mod/Physics/Reference_Density.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Reference_Density(d_ref, verbose) + subroutine Reference_Density(Control, d_ref, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: d_ref - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: d_ref + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Reference_Temperature.f90 b/Sources/Shared/Control_Mod/Physics/Reference_Temperature.f90 index 08e6c5c94..b535e2326 100644 --- a/Sources/Shared/Control_Mod/Physics/Reference_Temperature.f90 +++ b/Sources/Shared/Control_Mod/Physics/Reference_Temperature.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Reference_Temperature(t_ref, verbose) + subroutine Reference_Temperature(Control, t_ref, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: t_ref - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: t_ref + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Rough_Walls.f90 b/Sources/Shared/Control_Mod/Physics/Rough_Walls.f90 index 41ed80148..045530d0d 100644 --- a/Sources/Shared/Control_Mod/Physics/Rough_Walls.f90 +++ b/Sources/Shared/Control_Mod/Physics/Rough_Walls.f90 @@ -1,11 +1,12 @@ !==============================================================================! - subroutine Control_Mod_Rough_Walls(rough_walls, verbose) + subroutine Rough_Walls(Control, rough, verbose) !------------------------------------------------------------------------------! ! Reading wall roughness from the control file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - logical, intent(out) :: rough_walls + class(Control_Type) :: Control + logical, intent(out) :: rough logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! character(SL) :: val @@ -17,10 +18,10 @@ subroutine Control_Mod_Rough_Walls(rough_walls, verbose) select case(val) case('YES') - rough_walls = .true. + rough = .true. case('NO') - rough_walls = .false. + rough = .false. case default call Message % Error(60, & diff --git a/Sources/Shared/Control_Mod/Physics/Roughness_Coefficient.f90 b/Sources/Shared/Control_Mod/Physics/Roughness_Coefficient.f90 index 2ff39dd4e..0ce1670cb 100644 --- a/Sources/Shared/Control_Mod/Physics/Roughness_Coefficient.f90 +++ b/Sources/Shared/Control_Mod/Physics/Roughness_Coefficient.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Roughness_Coefficient(val, verbose) + subroutine Roughness_Coefficient(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val(:) - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val(:) + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: con !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Saturation_Temperature.f90 b/Sources/Shared/Control_Mod/Physics/Saturation_Temperature.f90 index bf8607df9..076fd3eac 100644 --- a/Sources/Shared/Control_Mod/Physics/Saturation_Temperature.f90 +++ b/Sources/Shared/Control_Mod/Physics/Saturation_Temperature.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Saturation_Temperature(val, verbose) + subroutine Saturation_Temperature(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('SATURATION_TEMPERATURE', 100., val, verbose) diff --git a/Sources/Shared/Control_Mod/Physics/Scalars_Diffusivity.f90 b/Sources/Shared/Control_Mod/Physics/Scalars_Diffusivity.f90 index eda945485..ce0886f90 100644 --- a/Sources/Shared/Control_Mod/Physics/Scalars_Diffusivity.f90 +++ b/Sources/Shared/Control_Mod/Physics/Scalars_Diffusivity.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Scalars_Diffusivity(val, verbose) + subroutine Scalars_Diffusivity(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('SCALARS_DIFFUSIVITY', 1.0e-6, val, verbose) diff --git a/Sources/Shared/Control_Mod/Physics/Smagorinsky_Constant.f90 b/Sources/Shared/Control_Mod/Physics/Smagorinsky_Constant.f90 index 27e022350..8b4e602a5 100644 --- a/Sources/Shared/Control_Mod/Physics/Smagorinsky_Constant.f90 +++ b/Sources/Shared/Control_Mod/Physics/Smagorinsky_Constant.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Smagorinsky_Constant(val, verbose) + subroutine Smagorinsky_Constant(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('SMAGORINSKY_CONSTANT', 0.17, val, verbose) diff --git a/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Computation.f90 b/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Computation.f90 index 00eaa331a..36be57d3a 100644 --- a/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Computation.f90 +++ b/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Computation.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Starting_Time_Step_For_Swarm_Computation(val, verbose) + subroutine Starting_Time_Step_For_Swarm_Computation(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Statistics.f90 b/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Statistics.f90 index 1bd6c18df..ca3ba5e14 100644 --- a/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Statistics.f90 +++ b/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Swarm_Statistics.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Starting_Time_Step_For_Swarm_Statistics(val, verbose) + subroutine Starting_Time_Step_For_Swarm_Statistics(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Turb_Statistics.f90 b/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Turb_Statistics.f90 index 15423ef5f..92b4c8842 100644 --- a/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Turb_Statistics.f90 +++ b/Sources/Shared/Control_Mod/Physics/Starting_Time_Step_For_Turb_Statistics.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Starting_Time_Step_For_Turb_Statistics(val, verbose) + subroutine Starting_Time_Step_For_Turb_Statistics(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control integer, intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Surface_Tension.f90 b/Sources/Shared/Control_Mod/Physics/Surface_Tension.f90 index aa801aaef..edc467a89 100644 --- a/Sources/Shared/Control_Mod/Physics/Surface_Tension.f90 +++ b/Sources/Shared/Control_Mod/Physics/Surface_Tension.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Surface_Tension(val, verbose) + subroutine Surface_Tension(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('SURFACE_TENSION', 0.0, val, verbose) diff --git a/Sources/Shared/Control_Mod/Physics/Swarm_Coefficient_Of_Restitution.f90 b/Sources/Shared/Control_Mod/Physics/Swarm_Coefficient_Of_Restitution.f90 index a55a37fee..37e5bff09 100644 --- a/Sources/Shared/Control_Mod/Physics/Swarm_Coefficient_Of_Restitution.f90 +++ b/Sources/Shared/Control_Mod/Physics/Swarm_Coefficient_Of_Restitution.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Swarm_Coefficient_Of_Restitution(cor, verbose) + subroutine Swarm_Coefficient_Of_Restitution(Control, cor, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: cor - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: cor + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Swarm_Density.f90 b/Sources/Shared/Control_Mod/Physics/Swarm_Density.f90 index bb38442e4..d052a6373 100644 --- a/Sources/Shared/Control_Mod/Physics/Swarm_Density.f90 +++ b/Sources/Shared/Control_Mod/Physics/Swarm_Density.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Swarm_Density(s_den, verbose) + subroutine Swarm_Density(Control, s_den, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: s_den - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: s_den + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Swarm_Diameter.f90 b/Sources/Shared/Control_Mod/Physics/Swarm_Diameter.f90 index 999105239..6ceeedd33 100644 --- a/Sources/Shared/Control_Mod/Physics/Swarm_Diameter.f90 +++ b/Sources/Shared/Control_Mod/Physics/Swarm_Diameter.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Swarm_Diameter(s_dia, verbose) + subroutine Swarm_Diameter(Control, s_dia, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: s_dia - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: s_dia + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Swarm_Subgrid_Scale_Model.f90 b/Sources/Shared/Control_Mod/Physics/Swarm_Subgrid_Scale_Model.f90 index 05b6de059..10669a713 100644 --- a/Sources/Shared/Control_Mod/Physics/Swarm_Subgrid_Scale_Model.f90 +++ b/Sources/Shared/Control_Mod/Physics/Swarm_Subgrid_Scale_Model.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Swarm_Subgrid_Scale_Model(val, verbose) + subroutine Swarm_Subgrid_Scale_Model(Control, val, verbose) !------------------------------------------------------------------------------! ! Reading swarm SGS model from the control file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Thermal_Conductivity.f90 b/Sources/Shared/Control_Mod/Physics/Thermal_Conductivity.f90 index 5c9c077d4..bc22e6e94 100644 --- a/Sources/Shared/Control_Mod/Physics/Thermal_Conductivity.f90 +++ b/Sources/Shared/Control_Mod/Physics/Thermal_Conductivity.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Thermal_Conductivity(val, verbose) + subroutine Thermal_Conductivity(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('THERMAL_CONDUCTIVITY', 1.0, val, verbose) diff --git a/Sources/Shared/Control_Mod/Physics/Track_Front.f90 b/Sources/Shared/Control_Mod/Physics/Track_Front.f90 index d317a31e4..f08b4318d 100644 --- a/Sources/Shared/Control_Mod/Physics/Track_Front.f90 +++ b/Sources/Shared/Control_Mod/Physics/Track_Front.f90 @@ -1,9 +1,10 @@ !==============================================================================! - subroutine Control_Mod_Track_Front(track_front, verbose) + subroutine Track_Front(Control, track, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - logical, intent(out) :: track_front + class(Control_Type) :: Control + logical, intent(out) :: track logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! character(SL) :: val @@ -13,10 +14,10 @@ subroutine Control_Mod_Track_Front(track_front, verbose) call String % To_Upper_Case(val) if( val .eq. 'YES' ) then - track_front = .true. + track = .true. else if( val .eq. 'NO' ) then - track_front = .false. + track = .false. else call Message % Error(60, & diff --git a/Sources/Shared/Control_Mod/Physics/Track_Surface.f90 b/Sources/Shared/Control_Mod/Physics/Track_Surface.f90 index daf1b0e58..f9389bd05 100644 --- a/Sources/Shared/Control_Mod/Physics/Track_Surface.f90 +++ b/Sources/Shared/Control_Mod/Physics/Track_Surface.f90 @@ -1,8 +1,9 @@ !==============================================================================! - subroutine Control_Mod_Track_Surface(track_surf, verbose) + subroutine Track_Surface(Control, track_surf, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control logical, intent(out) :: track_surf logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! diff --git a/Sources/Shared/Control_Mod/Physics/Turbulence_Model.f90 b/Sources/Shared/Control_Mod/Physics/Turbulence_Model.f90 index eeddf7217..3bef6637b 100644 --- a/Sources/Shared/Control_Mod/Physics/Turbulence_Model.f90 +++ b/Sources/Shared/Control_Mod/Physics/Turbulence_Model.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Turbulence_Model(val, verbose) + subroutine Turbulence_Model(Control, val, verbose) !------------------------------------------------------------------------------! ! Reading turbulence model from the control file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Turbulence_Model_Variant.f90 b/Sources/Shared/Control_Mod/Physics/Turbulence_Model_Variant.f90 index 1f3a5ecbf..da516a4f0 100644 --- a/Sources/Shared/Control_Mod/Physics/Turbulence_Model_Variant.f90 +++ b/Sources/Shared/Control_Mod/Physics/Turbulence_Model_Variant.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Turbulence_Model_Variant(val, verbose) + subroutine Turbulence_Model_Variant(Control, val, verbose) !------------------------------------------------------------------------------! ! Reading turbulence model variant from the control file ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Turbulent_Heat_Flux_Model.f90 b/Sources/Shared/Control_Mod/Physics/Turbulent_Heat_Flux_Model.f90 index 82c7feb58..cd2498f8b 100644 --- a/Sources/Shared/Control_Mod/Physics/Turbulent_Heat_Flux_Model.f90 +++ b/Sources/Shared/Control_Mod/Physics/Turbulent_Heat_Flux_Model.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Turbulent_Heat_Flux_Model(val, verbose) + subroutine Turbulent_Heat_Flux_Model(Control, val, verbose) !------------------------------------------------------------------------------! ! Reading turbulent heat flux model from the control file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Turbulent_Prandtl_Number.f90 b/Sources/Shared/Control_Mod/Physics/Turbulent_Prandtl_Number.f90 index 719263dd0..5ad5cd108 100644 --- a/Sources/Shared/Control_Mod/Physics/Turbulent_Prandtl_Number.f90 +++ b/Sources/Shared/Control_Mod/Physics/Turbulent_Prandtl_Number.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Turbulent_Prandtl_Number(val, verbose) + subroutine Turbulent_Prandtl_Number(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('TURBULENT_PRANDTL_NUMBER', 0.9, val, verbose) diff --git a/Sources/Shared/Control_Mod/Physics/Turbulent_Scalar_Flux_Model.f90 b/Sources/Shared/Control_Mod/Physics/Turbulent_Scalar_Flux_Model.f90 index 5d2b6276e..18e5eef78 100644 --- a/Sources/Shared/Control_Mod/Physics/Turbulent_Scalar_Flux_Model.f90 +++ b/Sources/Shared/Control_Mod/Physics/Turbulent_Scalar_Flux_Model.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Turbulent_Scalar_Flux_Model(val, verbose) + subroutine Turbulent_Scalar_Flux_Model(Control, val, verbose) !------------------------------------------------------------------------------! ! Reading turbulent heat flux model from the control file. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control character(SL), intent(out) :: val logical, optional :: verbose !==============================================================================! diff --git a/Sources/Shared/Control_Mod/Physics/Turbulent_Schmidt_Number.f90 b/Sources/Shared/Control_Mod/Physics/Turbulent_Schmidt_Number.f90 index e80270fd3..54576bc28 100644 --- a/Sources/Shared/Control_Mod/Physics/Turbulent_Schmidt_Number.f90 +++ b/Sources/Shared/Control_Mod/Physics/Turbulent_Schmidt_Number.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Turbulent_Schmidt_Number(val, verbose) + subroutine Turbulent_Schmidt_Number(Control, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: val - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: val + logical, optional :: verbose !==============================================================================! call Control % Read_Real_Item('TURBULENT_SCHMIDT_NUMBER', 0.9, val, verbose) diff --git a/Sources/Shared/Control_Mod/Physics/Volume_Expansion_Coefficient.f90 b/Sources/Shared/Control_Mod/Physics/Volume_Expansion_Coefficient.f90 index bb4a5112e..7052ff6bb 100644 --- a/Sources/Shared/Control_Mod/Physics/Volume_Expansion_Coefficient.f90 +++ b/Sources/Shared/Control_Mod/Physics/Volume_Expansion_Coefficient.f90 @@ -1,10 +1,11 @@ !==============================================================================! - subroutine Control_Mod_Volume_Expansion_Coefficient(cor, verbose) + subroutine Volume_Expansion_Coefficient(Control, cor, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - real, intent(out) :: cor - logical, optional :: verbose + class(Control_Type) :: Control + real, intent(out) :: cor + logical, optional :: verbose !-----------------------------------[Locals]-----------------------------------! real :: def !==============================================================================! From 1183a109e449f37331c83dae1f3996dc105295cf Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 2 Apr 2023 22:03:54 +0200 Subject: [PATCH 188/223] Added a few missing items to syntax On branch bojan_more_robust_communicator modified: Documentation/Syntax/.vim/syntax/fortran.vim --- Documentation/Syntax/.vim/syntax/fortran.vim | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Documentation/Syntax/.vim/syntax/fortran.vim b/Documentation/Syntax/.vim/syntax/fortran.vim index 98c1113f2..82dfbe582 100644 --- a/Documentation/Syntax/.vim/syntax/fortran.vim +++ b/Documentation/Syntax/.vim/syntax/fortran.vim @@ -476,12 +476,13 @@ if b:fortran_dialect == "f08" "==============================================================[MPI in T-Flows]= " Here are MPI calls from T-Flows " Note that they are not set in this file at all, only in the .vimrc - syn keyword fortranMpiTflows Mpi_Barrier Mpi_Finalize Mpi_Sendrecv_Replace - syn keyword fortranMpiTflows Mpi_Allreduce Mpi_File_Close Mpi_File Mpi_File_Set_View + syn keyword fortranMpiTflows Mpi_Init Mpi_Comm_Size Mpi_Comm_Rank Mpi_Barrier Mpi_Finalize + syn keyword fortranMpiTflows Mpi_Allreduce Mpi_File_Close Mpi_File Mpi_File_Set_View Mpi_Sendrecv_Replace syn keyword fortranMpiTflows Mpi_Send Mpi_Sendrecv Mpi_Status Mpi_Recv Mpi_Write syn keyword fortranMpiTflows Mpi_Type_Create_Indexed_Block Mpi_Type_Commit syn keyword fortranMpiTflows Mpi_File_Open Mpi_File_Read syn keyword fortranMpiTflows MPI_COMM_WORLD MPI_CHARACTER MPI_INFO_NULL MPI_STATUS_IGNORE MPI_IN_PLACE + syn keyword fortranMpiTflows MPI_INTEGER MPI_LOGICAL MPI_DOUBLE_PRECISION MPI_REAL syn keyword fortranMpiTflows MPI_LOR MPI_SUM MPI_MAX MPI_MIN MPI_MODE_WRONLY MPI_MODE_CREATE "--------------------------------------------------------------[MPI in T-Flows]- From 8ce7dede69430be266387f8993327416d6e64a39 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 2 Apr 2023 22:04:56 +0200 Subject: [PATCH 189/223] Added three former global Comm functions to member These are Comm_Mod_Start, Comm_Mod_End and Comm_Mod_Wait which became Global % Start_Parallel, Global % End_Parallel and Global % Wait. This was also a good chance to expand the usage of Message_Mod On branch bojan_more_robust_communicator modified: Sources/Process/Interface_Mod/Create.f90 modified: Sources/Process/Main_Pro.f90 modified: Sources/Process/Process_Mod/Initialize_Variables.f90 modified: Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 modified: Sources/Process/Results_Mod/Save_Vtu_Results.f90 modified: Sources/Process/Surf_Mod/Handle_4_Points.f90 modified: Sources/Process/Surf_Mod/Handle_5_Points.f90 modified: Sources/Process/Surf_Mod/Handle_6_Points.f90 modified: Sources/Process/Swarm_Mod/Allocate_Swarm.f90 modified: Sources/Shared/Assert_Mod/Handle_Assert.f90 modified: Sources/Shared/Comm_Mod.f90 renamed: Sources/Shared/Comm_Mod/Parallel/End.f90 -> Sources/Shared/Comm_Mod/Parallel/End_Parallel.f90 renamed: Sources/Shared/Comm_Mod/Parallel/Start.f90 -> Sources/Shared/Comm_Mod/Parallel/Start_Parallel.f90 modified: Sources/Shared/Comm_Mod/Parallel/Wait.f90 renamed: Sources/Shared/Comm_Mod/Sequential/End.f90 -> Sources/Shared/Comm_Mod/Sequential/End_Parallel.f90 renamed: Sources/Shared/Comm_Mod/Sequential/Start.f90 -> Sources/Shared/Comm_Mod/Sequential/Start_Parallel.f90 modified: Sources/Shared/Comm_Mod/Sequential/Wait.f90 modified: Sources/Shared/Message_Mod/Error.f90 --- Sources/Process/Interface_Mod/Create.f90 | 14 ++-- Sources/Process/Main_Pro.f90 | 4 +- .../Process_Mod/Initialize_Variables.f90 | 22 ++--- .../Read_Controls_Mod/Petsc_Solvers.f90 | 80 +++++++++---------- .../Process/Results_Mod/Save_Vtu_Results.f90 | 2 +- Sources/Process/Surf_Mod/Handle_4_Points.f90 | 8 +- Sources/Process/Surf_Mod/Handle_5_Points.f90 | 8 +- Sources/Process/Surf_Mod/Handle_6_Points.f90 | 8 +- Sources/Process/Swarm_Mod/Allocate_Swarm.f90 | 13 ++- Sources/Shared/Assert_Mod/Handle_Assert.f90 | 4 +- Sources/Shared/Comm_Mod.f90 | 13 +-- .../Parallel/{End.f90 => End_Parallel.f90} | 6 +- .../{Start.f90 => Start_Parallel.f90} | 6 +- Sources/Shared/Comm_Mod/Parallel/Wait.f90 | 6 +- .../Sequential/{End.f90 => End_Parallel.f90} | 6 +- .../{Start.f90 => Start_Parallel.f90} | 4 +- Sources/Shared/Comm_Mod/Sequential/Wait.f90 | 6 +- Sources/Shared/Message_Mod/Error.f90 | 2 +- 18 files changed, 114 insertions(+), 98 deletions(-) rename Sources/Shared/Comm_Mod/Parallel/{End.f90 => End_Parallel.f90} (71%) rename Sources/Shared/Comm_Mod/Parallel/{Start.f90 => Start_Parallel.f90} (90%) rename Sources/Shared/Comm_Mod/Sequential/{End.f90 => End_Parallel.f90} (64%) rename Sources/Shared/Comm_Mod/Sequential/{Start.f90 => Start_Parallel.f90} (83%) diff --git a/Sources/Process/Interface_Mod/Create.f90 b/Sources/Process/Interface_Mod/Create.f90 index 64219cfd5..f584caa1e 100644 --- a/Sources/Process/Interface_Mod/Create.f90 +++ b/Sources/Process/Interface_Mod/Create.f90 @@ -153,14 +153,12 @@ subroutine Interface_Mod_Create(inter, Grid, n_dom) call Global % Sum_Int(n2_tot) if(n1_tot .ne. n2_tot) then - if(First_Proc()) then - print *, '# Number of cells at the interface between ', & - trim(problem_name(d1)), ' and ', & - trim(problem_name(d2)), ' is not the same!' - print *, '# Only conformal mappings are supported. Exiting!' - end if - call Comm_Mod_End - stop + call Message % Error(72, & + 'Number of cells at the interface between '// & + trim(problem_name(d1))//' and '// & + trim(problem_name(d2))//' is not the same! '// & + 'Only conformal mappings are supported. Exiting!', & + file=__FILE__, line=__LINE__, one_proc=.true.) else n_tot = n1_tot inter(d1, d2) % n_tot = n_tot diff --git a/Sources/Process/Main_Pro.f90 b/Sources/Process/Main_Pro.f90 index f1553aa40..19c8ae7a7 100644 --- a/Sources/Process/Main_Pro.f90 +++ b/Sources/Process/Main_Pro.f90 @@ -51,7 +51,7 @@ program Process_Prog !------------------------------! ! Start parallel execution ! !------------------------------! - call Comm_Mod_Start + call Global % Start_Parallel !--------------------------------! ! Splash out the logo screen ! @@ -462,6 +462,6 @@ program Process_Prog !----------------------------! ! End parallel execution ! !----------------------------! - call Comm_Mod_End + call Global % End_Parallel end program diff --git a/Sources/Process/Process_Mod/Initialize_Variables.f90 b/Sources/Process/Process_Mod/Initialize_Variables.f90 index d44316a55..188f8a192 100644 --- a/Sources/Process/Process_Mod/Initialize_Variables.f90 +++ b/Sources/Process/Process_Mod/Initialize_Variables.f90 @@ -240,7 +240,7 @@ subroutine Initialize_Variables(Process, Flow, Turb, Vof, Swarm, Sol) end do ! c = 1, Grid % n_cells - call Comm_Mod_Wait + call Global % Wait deallocate(prof) deallocate(x) deallocate(y) @@ -271,17 +271,17 @@ subroutine Initialize_Variables(Process, Flow, Turb, Vof, Swarm, Sol) call Control % Read_Strings_On('VALUES', vals(1), nvs, .true.) ! Check validity of the input - if(nks .eq. 0 .or. nvs .eq. 0 .and. First_Proc()) then - print '(2a)', '# Critical, for initial condition: ', & - ' no values or variables have been provided' - call Comm_Mod_End - stop + if(nks .eq. 0 .or. nvs .eq. 0) then + call Message % Error(72, & + 'Critical, for initial condition: '// & + 'no values or variables have been provided ', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if - if(nks .ne. nvs .and. First_Proc()) then - print '(2a)', '# Critical for initial conditions, number of values ', & - ' is not the same as number of provided variable names' - call Comm_Mod_End - stop + if(nks .ne. nvs) then + call Message % Error(72, & + 'Critical, for initial condition: number of values '// & + 'is not the same as number of provided variable names.', & + file=__FILE__, line=__LINE__, one_proc=.true.) end if ! Input is valid, turn keys to upper case diff --git a/Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 b/Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 index e8fac14f1..e8ac2e392 100644 --- a/Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 +++ b/Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 @@ -50,14 +50,14 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) !----------------------------! ! For momentum equations ! !----------------------------! - call Control_Mod_Position_At_One_Key('PETSC_OPTIONS_FOR_MOMENTUM', & + call Control % Position_At_One_Key('PETSC_OPTIONS_FOR_MOMENTUM', & found, & .false.) if(found) then - call Control_Mod_Read_Char_Item_On('SOLVER', 'bicg', sstring, .true.) - call Control_Mod_Read_Char_Item_On('PREC', 'asm', pstring, .true.) - call Control_Mod_Read_Strings_On ('PREC_OPTS', opts, n_opts, .false.) - call Control_Mod_Read_Real_Item_On('TOLERANCE', 1.0e-3, tol, .true.) + call Control % Read_Char_Item_On('SOLVER', 'bicg', sstring, .true.) + call Control % Read_Char_Item_On('PREC', 'asm', pstring, .true.) + call Control % Read_Strings_On ('PREC_OPTS', opts, n_opts, .false.) + call Control % Read_Real_Item_On('TOLERANCE', 1.0e-3, tol, .true.) u % solver = sstring v % solver = sstring @@ -90,14 +90,14 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) !---------------------------! ! For pressure equation ! !---------------------------! - call Control_Mod_Position_At_One_Key('PETSC_OPTIONS_FOR_PRESSURE', & + call Control % Position_At_One_Key('PETSC_OPTIONS_FOR_PRESSURE', & found, & .false.) if(found) then - call Control_Mod_Read_Char_Item_On('SOLVER', 'cg', sstring, .true.) - call Control_Mod_Read_Char_Item_On('PREC', 'asm', pstring, .true.) - call Control_Mod_Read_Strings_On ('PREC_OPTS', opts, n_opts, .false.) - call Control_Mod_Read_Real_Item_On('TOLERANCE', 1.0e-5, tol, .true.) + call Control % Read_Char_Item_On('SOLVER', 'cg', sstring, .true.) + call Control % Read_Char_Item_On('PREC', 'asm', pstring, .true.) + call Control % Read_Strings_On ('PREC_OPTS', opts, n_opts, .false.) + call Control % Read_Real_Item_On('TOLERANCE', 1.0e-5, tol, .true.) Flow % pp % solver = sstring Flow % pp % prec = pstring @@ -116,14 +116,14 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) !-----------------------------------! ! For wall distance computation ! !-----------------------------------! - call Control_Mod_Position_At_One_Key('PETSC_OPTIONS_FOR_WALL_DISTANCE', & + call Control % Position_At_One_Key('PETSC_OPTIONS_FOR_WALL_DISTANCE', & found, & .false.) if(found) then - call Control_Mod_Read_Char_Item_On('SOLVER', 'bicg', sstring, .true.) - call Control_Mod_Read_Char_Item_On('PREC', 'asm', pstring, .true.) - call Control_Mod_Read_Strings_On ('PREC_OPTS', opts, n_opts, .false.) - call Control_Mod_Read_Real_Item_On('TOLERANCE', 1.0e-5, tol, .true.) + call Control % Read_Char_Item_On('SOLVER', 'bicg', sstring, .true.) + call Control % Read_Char_Item_On('PREC', 'asm', pstring, .true.) + call Control % Read_Strings_On ('PREC_OPTS', opts, n_opts, .false.) + call Control % Read_Real_Item_On('TOLERANCE', 1.0e-5, tol, .true.) Flow % wall_dist % solver = sstring Flow % wall_dist % prec = pstring @@ -142,14 +142,14 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) !----------------------------! ! For potential equation ! !----------------------------! - call Control_Mod_Position_At_One_Key('PETSC_OPTIONS_FOR_POTENTIAL', & + call Control % Position_At_One_Key('PETSC_OPTIONS_FOR_POTENTIAL', & found, & .false.) if(found) then - call Control_Mod_Read_Char_Item_On('SOLVER', 'bicg', sstring, .true.) - call Control_Mod_Read_Char_Item_On('PREC', 'asm', pstring, .true.) - call Control_Mod_Read_Strings_On ('PREC_OPTS', opts, n_opts, .false.) - call Control_Mod_Read_Real_Item_On('TOLERANCE', 1.0e-5, tol, .true.) + call Control % Read_Char_Item_On('SOLVER', 'bicg', sstring, .true.) + call Control % Read_Char_Item_On('PREC', 'asm', pstring, .true.) + call Control % Read_Strings_On ('PREC_OPTS', opts, n_opts, .false.) + call Control % Read_Real_Item_On('TOLERANCE', 1.0e-5, tol, .true.) Flow % pot % solver = sstring Flow % pot % prec = pstring @@ -168,14 +168,14 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) !----------------------! ! For VOF function ! !----------------------! - call Control_Mod_Position_At_One_Key('PETSC_OPTIONS_FOR_VOF', & + call Control % Position_At_One_Key('PETSC_OPTIONS_FOR_VOF', & found, & .false.) if(found) then - call Control_Mod_Read_Char_Item_On('SOLVER', 'bicg', sstring, .true.) - call Control_Mod_Read_Char_Item_On('PREC', 'asm', pstring, .true.) - call Control_Mod_Read_Strings_On ('PREC_OPTS', opts, n_opts, .false.) - call Control_Mod_Read_Real_Item_On('TOLERANCE', 1.0e-5, tol, .true.) + call Control % Read_Char_Item_On('SOLVER', 'bicg', sstring, .true.) + call Control % Read_Char_Item_On('PREC', 'asm', pstring, .true.) + call Control % Read_Strings_On ('PREC_OPTS', opts, n_opts, .false.) + call Control % Read_Real_Item_On('TOLERANCE', 1.0e-5, tol, .true.) Vof % fun % solver = sstring Vof % fun % prec = pstring @@ -194,14 +194,14 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) !-------------------------! ! For energy equation ! !-------------------------! - call Control_Mod_Position_At_One_Key('PETSC_OPTIONS_FOR_ENERGY', & + call Control % Position_At_One_Key('PETSC_OPTIONS_FOR_ENERGY', & found, & .false.) if(found) then - call Control_Mod_Read_Char_Item_On('SOLVER', 'bicg', sstring, .true.) - call Control_Mod_Read_Char_Item_On('PREC', 'asm', pstring, .true.) - call Control_Mod_Read_Strings_On ('PREC_OPTS', opts, n_opts, .false.) - call Control_Mod_Read_Real_Item_On('TOLERANCE', 1.0e-3, tol, .true.) + call Control % Read_Char_Item_On('SOLVER', 'bicg', sstring, .true.) + call Control % Read_Char_Item_On('PREC', 'asm', pstring, .true.) + call Control % Read_Strings_On ('PREC_OPTS', opts, n_opts, .false.) + call Control % Read_Real_Item_On('TOLERANCE', 1.0e-3, tol, .true.) t % solver = sstring t % prec = pstring @@ -220,15 +220,15 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) !--------------------------------! ! Related to passive scalars ! !--------------------------------! - call Control_Mod_Position_At_One_Key('PETSC_OPTIONS_FOR_SCALARS', & + call Control % Position_At_One_Key('PETSC_OPTIONS_FOR_SCALARS', & found, & .false.) if(found) then - call Control_Mod_Read_Char_Item_On('SOLVER', 'bicg', sstring, .true.) - call Control_Mod_Read_Char_Item_On('PREC', 'asm', pstring, .true.) - call Control_Mod_Read_Strings_On ('PREC_OPTS', opts, n_opts, .false.) - call Control_Mod_Read_Real_Item_On('TOLERANCE', 1.0e-3, tol, .true.) + call Control % Read_Char_Item_On('SOLVER', 'bicg', sstring, .true.) + call Control % Read_Char_Item_On('PREC', 'asm', pstring, .true.) + call Control % Read_Strings_On ('PREC_OPTS', opts, n_opts, .false.) + call Control % Read_Real_Item_On('TOLERANCE', 1.0e-3, tol, .true.) do sc = 1, Flow % n_scalars phi => Flow % scalar(sc) @@ -253,14 +253,14 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) !------------------------------! ! All turbuelnt quantities ! !------------------------------! - call Control_Mod_Position_At_One_Key('PETSC_OPTIONS_FOR_TURBULENCE', & + call Control % Position_At_One_Key('PETSC_OPTIONS_FOR_TURBULENCE', & found, & .false.) if(found) then - call Control_Mod_Read_Char_Item_On('SOLVER', 'bicg', sstring, .true.) - call Control_Mod_Read_Char_Item_On('PREC', 'asm', pstring, .true.) - call Control_Mod_Read_Strings_On ('PREC_OPTS', opts, n_opts, .false.) - call Control_Mod_Read_Real_Item_On('TOLERANCE', 1.0e-3, tol, .true.) + call Control % Read_Char_Item_On('SOLVER', 'bicg', sstring, .true.) + call Control % Read_Char_Item_On('PREC', 'asm', pstring, .true.) + call Control % Read_Strings_On ('PREC_OPTS', opts, n_opts, .false.) + call Control % Read_Real_Item_On('TOLERANCE', 1.0e-3, tol, .true.) do i = 1, 12 if(i .eq. 1) tq => Turb % kin diff --git a/Sources/Process/Results_Mod/Save_Vtu_Results.f90 b/Sources/Process/Results_Mod/Save_Vtu_Results.f90 index 5cc0d10c9..2dd1c33c8 100644 --- a/Sources/Process/Results_Mod/Save_Vtu_Results.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Results.f90 @@ -100,7 +100,7 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & end do end if - call Comm_Mod_Wait + call Global % Wait !--------------------------------------! ! ! diff --git a/Sources/Process/Surf_Mod/Handle_4_Points.f90 b/Sources/Process/Surf_Mod/Handle_4_Points.f90 index a4e67a2b6..893459942 100644 --- a/Sources/Process/Surf_Mod/Handle_4_Points.f90 +++ b/Sources/Process/Surf_Mod/Handle_4_Points.f90 @@ -65,10 +65,10 @@ subroutine Handle_4_Points(Surf, surf_v, enforce_triangles) end do - print *, '# ERROR: Failed to find a good permutation in Handle_4_Points!' - print *, '# This error is critical. Exiting!' - call Comm_Mod_End - stop + call Message % Error(72, & + 'Failed to find a good permutation in Handle_4_Points! '// & + 'This error is critical. Exiting!', & + file=__FILE__, line=__LINE__) !--------------------------------------------------------------------! ! You've found a permutation which works, store new elements now ! diff --git a/Sources/Process/Surf_Mod/Handle_5_Points.f90 b/Sources/Process/Surf_Mod/Handle_5_Points.f90 index a5c517eb8..eb3f0600a 100644 --- a/Sources/Process/Surf_Mod/Handle_5_Points.f90 +++ b/Sources/Process/Surf_Mod/Handle_5_Points.f90 @@ -90,10 +90,10 @@ subroutine Handle_5_Points(Surf, surf_v, enforce_triangles) end do - print *, '# ERROR: Failed to find a good permutation in Handle_5_Points!' - print *, '# This error is critical. Exiting!' - call Comm_Mod_End - stop + call Message % Error(72, & + 'Failed to find a good permutation in Handle_5_Points! '// & + 'This error is critical. Exiting!', & + file=__FILE__, line=__LINE__) !--------------------------------------------------------------------! ! You've found a permutation which works, store new elements now ! diff --git a/Sources/Process/Surf_Mod/Handle_6_Points.f90 b/Sources/Process/Surf_Mod/Handle_6_Points.f90 index c5bb2495e..10ac05019 100644 --- a/Sources/Process/Surf_Mod/Handle_6_Points.f90 +++ b/Sources/Process/Surf_Mod/Handle_6_Points.f90 @@ -194,10 +194,10 @@ subroutine Handle_6_Points(Surf, surf_v, enforce_triangles) end do - print *, '# ERROR: Failed to find a good permutation in Handle_6_Points!' - print *, '# This error is critical. Exiting!' - call Comm_Mod_End - stop + call Message % Error(72, & + 'Failed to find a good permutation in Handle_6_Points! '// & + 'This error is critical. Exiting!', & + file=__FILE__, line=__LINE__) !--------------------------------------------------------------------! ! You've found a permutation which works, store new elements now ! diff --git a/Sources/Process/Swarm_Mod/Allocate_Swarm.f90 b/Sources/Process/Swarm_Mod/Allocate_Swarm.f90 index 3ded24dc2..903c15eaa 100644 --- a/Sources/Process/Swarm_Mod/Allocate_Swarm.f90 +++ b/Sources/Process/Swarm_Mod/Allocate_Swarm.f90 @@ -26,14 +26,11 @@ subroutine Allocate_Swarm(Swarm, Flow, Turb, Vof) if(Swarm % max_particles > 0) then allocate(Swarm % Particle(Swarm % max_particles)) else - if(First_Proc()) then - print *, '# ERROR! You are attempting a simulation with' - print *, '# particles but max number of particles is zero.' - print *, '# Did you set the parameter MAX_PARTICLES in control file?' - print *, '# This error is critical. Exiting!' - call Comm_Mod_End - stop - end if + call Message % Error(72, & + 'You are attempting a simulation with particles, but max '// & + 'number of particles is zero. Did you set the parameter '// & + 'MAX_PARTICLES in control file? This error is critical. '// & + ' Exiting!', file=__FILE__, line=__LINE__, one_proc=.true.) end if ! Allocate logical array if cell holds particles diff --git a/Sources/Shared/Assert_Mod/Handle_Assert.f90 b/Sources/Shared/Assert_Mod/Handle_Assert.f90 index 1b596f069..051dd5d45 100644 --- a/Sources/Shared/Assert_Mod/Handle_Assert.f90 +++ b/Sources/Shared/Assert_Mod/Handle_Assert.f90 @@ -19,7 +19,7 @@ subroutine Handle_Assert(fail, text, file, line) ') failed in file ', file, & ' at line ', trim(adjustl(numb)), & '.' - call Comm_Mod_End + call Global % End_Parallel stop end if @@ -33,7 +33,7 @@ subroutine Handle_Assert(fail, text, file, line) ' at line ', trim(adjustl(numb)), & ' in processor ', trim(adjustl(proc)), & '.' - call Comm_Mod_End + call Global % End_Parallel stop end if diff --git a/Sources/Shared/Comm_Mod.f90 b/Sources/Shared/Comm_Mod.f90 index 7883df6bb..ae1ed0d88 100644 --- a/Sources/Shared/Comm_Mod.f90 +++ b/Sources/Shared/Comm_Mod.f90 @@ -103,16 +103,19 @@ module Comm_Mod procedure :: Sendrecv_Real_Arrays ! Global + procedure :: End_Parallel procedure :: Lor_Log procedure :: Lor_Log_Array procedure :: Max_Int procedure :: Max_Real procedure :: Min_Int procedure :: Min_Real + procedure :: Start_Parallel procedure :: Sum_Int procedure :: Sum_Int_Array procedure :: Sum_Real procedure :: Sum_Real_Array + procedure :: Wait end type !------------------------------------------------------------------------! @@ -142,10 +145,9 @@ module Comm_Mod # include "Comm_Mod/Shared/This_Proc.f90" # if T_FLOWS_MPI == 1 - ! Three basic ones are non-member -# include "Comm_Mod/Parallel/Start.f90" +# include "Comm_Mod/Parallel/Start_Parallel.f90" # include "Comm_Mod/Parallel/Wait.f90" -# include "Comm_Mod/Parallel/End.f90" +# include "Comm_Mod/Parallel/End_Parallel.f90" ! File management # include "Comm_Mod/Parallel/Close_File.f90" @@ -191,10 +193,9 @@ module Comm_Mod # include "Comm_Mod/Parallel/Sendrecv_Log_Arrays.f90" # include "Comm_Mod/Parallel/Sendrecv_Real_Arrays.f90" # else - ! Three basic ones are non-member -# include "Comm_Mod/Sequential/Start.f90" +# include "Comm_Mod/Sequential/Start_Parallel.f90" # include "Comm_Mod/Sequential/Wait.f90" -# include "Comm_Mod/Sequential/End.f90" +# include "Comm_Mod/Sequential/End_Parallel.f90" ! File management # include "Comm_Mod/Sequential/Close_File.f90" diff --git a/Sources/Shared/Comm_Mod/Parallel/End.f90 b/Sources/Shared/Comm_Mod/Parallel/End_Parallel.f90 similarity index 71% rename from Sources/Shared/Comm_Mod/Parallel/End.f90 rename to Sources/Shared/Comm_Mod/Parallel/End_Parallel.f90 index e22bfb7c9..b1f7e09e1 100644 --- a/Sources/Shared/Comm_Mod/Parallel/End.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/End_Parallel.f90 @@ -1,11 +1,15 @@ !==============================================================================! - subroutine Comm_Mod_End + subroutine End_Parallel(Global) !------------------------------------------------------------------------------! ! Ends parallel execution of the program ! !------------------------------------------------------------------------------! implicit none +!---------------------------------[Arguments]----------------------------------! + class(Comm_Type) :: Global !-----------------------------------[Locals]-----------------------------------! integer :: error +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Global) !==============================================================================! call Mpi_Barrier(MPI_COMM_WORLD, error) diff --git a/Sources/Shared/Comm_Mod/Parallel/Start.f90 b/Sources/Shared/Comm_Mod/Parallel/Start_Parallel.f90 similarity index 90% rename from Sources/Shared/Comm_Mod/Parallel/Start.f90 rename to Sources/Shared/Comm_Mod/Parallel/Start_Parallel.f90 index cdb715e81..bce6f67a0 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Start.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Start_Parallel.f90 @@ -1,9 +1,11 @@ !==============================================================================! - subroutine Comm_Mod_Start + subroutine Start_Parallel(Global) !------------------------------------------------------------------------------! ! Initializes parallel execution. ! !------------------------------------------------------------------------------! implicit none +!---------------------------------[Arguments]----------------------------------! + class(Comm_Type) :: Global !-----------------------------------[Locals]-----------------------------------! integer :: error integer :: n @@ -40,7 +42,7 @@ subroutine Comm_Mod_Start if(Global % this_processor < 2) then print *, '# Error - 64 bit integers are not supported!' print *, '# This error is critical, exiting!' - call Comm_Mod_End + call Global % End_Parallel stop end if end if diff --git a/Sources/Shared/Comm_Mod/Parallel/Wait.f90 b/Sources/Shared/Comm_Mod/Parallel/Wait.f90 index a410dc72e..4d49d95ec 100644 --- a/Sources/Shared/Comm_Mod/Parallel/Wait.f90 +++ b/Sources/Shared/Comm_Mod/Parallel/Wait.f90 @@ -1,11 +1,15 @@ !==============================================================================! - subroutine Comm_Mod_Wait + subroutine Wait(Global) !------------------------------------------------------------------------------! ! Puts barrier for parallel execution. ! !------------------------------------------------------------------------------! implicit none +!---------------------------------[Arguments]----------------------------------! + class(Comm_Type) :: Global !-----------------------------------[Locals]-----------------------------------! integer :: error +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Global) !==============================================================================! call Mpi_Barrier(MPI_COMM_WORLD, error) diff --git a/Sources/Shared/Comm_Mod/Sequential/End.f90 b/Sources/Shared/Comm_Mod/Sequential/End_Parallel.f90 similarity index 64% rename from Sources/Shared/Comm_Mod/Sequential/End.f90 rename to Sources/Shared/Comm_Mod/Sequential/End_Parallel.f90 index 3beaed718..05e785d4f 100644 --- a/Sources/Shared/Comm_Mod/Sequential/End.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/End_Parallel.f90 @@ -1,9 +1,13 @@ !==============================================================================! - subroutine Comm_Mod_End + subroutine End_Parallel(Global) !------------------------------------------------------------------------------! ! Dummy function for sequential runs. ! !------------------------------------------------------------------------------! implicit none +!---------------------------------[Arguments]----------------------------------! + class(Comm_Type) :: Global +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Global) !==============================================================================! end subroutine diff --git a/Sources/Shared/Comm_Mod/Sequential/Start.f90 b/Sources/Shared/Comm_Mod/Sequential/Start_Parallel.f90 similarity index 83% rename from Sources/Shared/Comm_Mod/Sequential/Start.f90 rename to Sources/Shared/Comm_Mod/Sequential/Start_Parallel.f90 index af1a68ece..03c65e1fa 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Start.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Start_Parallel.f90 @@ -1,9 +1,11 @@ !==============================================================================! - subroutine Comm_Mod_Start + subroutine Start_Parallel(Global) !------------------------------------------------------------------------------! ! Initializes sequential execution. ! !------------------------------------------------------------------------------! implicit none +!---------------------------------[Arguments]----------------------------------! + class(Comm_Type) :: Global !-----------------------------------[Locals]-----------------------------------! integer :: n integer, allocatable :: seeds(:) diff --git a/Sources/Shared/Comm_Mod/Sequential/Wait.f90 b/Sources/Shared/Comm_Mod/Sequential/Wait.f90 index fdfd15b11..9107d6127 100644 --- a/Sources/Shared/Comm_Mod/Sequential/Wait.f90 +++ b/Sources/Shared/Comm_Mod/Sequential/Wait.f90 @@ -1,9 +1,13 @@ !==============================================================================! - subroutine Comm_Mod_Wait + subroutine Wait(Global) !------------------------------------------------------------------------------! ! Dummy function for sequential runs. ! !------------------------------------------------------------------------------! implicit none +!---------------------------------[Arguments]----------------------------------! + class(Comm_Type) :: Global +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Global) !==============================================================================! end subroutine diff --git a/Sources/Shared/Message_Mod/Error.f90 b/Sources/Shared/Message_Mod/Error.f90 index 1941600b3..404f3af4e 100644 --- a/Sources/Shared/Message_Mod/Error.f90 +++ b/Sources/Shared/Message_Mod/Error.f90 @@ -45,7 +45,7 @@ subroutine Error(Message, width, message_text, file, line, one_proc) !----------------------------------------! ! Errors are critical by definitiion ! !----------------------------------------! - call Comm_Mod_End + call Global % End_Parallel stop end subroutine From ac1b2f9285ba463efa29ac755bf079775fe76b37 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 2 Apr 2023 22:07:13 +0200 Subject: [PATCH 190/223] Updates in Comm_Mod and (a bit less) Control_Mod On branch bojan_more_robust_communicator modified: Tests/Functionality/Communication/User_Mod/Beginning_Of_Time_Step.f90 modified: Tests/Functionality/Gradients/User_Mod/Initialize_Variables.f90 modified: Tests/Functionality/Omp/User_Mod/Beginning_Of_Simulation.f90 modified: Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/Save_Results.f90 modified: Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/Save_Results.f90 modified: Tests/Laminar/Cylinder/Vertical/User_Mod/Save_Results.f90 modified: Tests/Laminar/Flat_Plate/User_Mod/Plain_Nu.f90 modified: Tests/Les/Barc/User_Mod/Beginning_Of_Simulation.f90 modified: Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/Save_Results.f90 modified: Tests/Les/Channel_Re_Tau_180/User_Mod/Save_Results.f90 modified: Tests/Les/Forrest/User_Mod/Save_Results.f90 modified: Tests/Les/Pipe_Re_Tau_180/User_Mod/Save_Results.f90 modified: Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 modified: Tests/Manual/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 modified: Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 modified: Tests/Manual/Matrix_Of_Cubes/User_Mod/Beginning_Of_Simulation.f90 modified: Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Cf_St.f90 modified: Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Save_Results.f90 modified: Tests/Rans/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 modified: Tests/Rans/Channel_Re_Tau_590/Uniform_Mesh/User_Mod/Save_Results.f90 modified: Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 modified: Tests/Rans/Pipe_Re_Tau_550/User_Mod/Save_Results.f90 modified: Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 modified: Tests/Swarm/Bend_90_Degrees/User_Mod/Insert_Particles.f90 modified: Tests/Swarm/Channel_Re_Tau_590/User_Mod/End_Of_Time_Step.f90 modified: Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Results.f90 modified: Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Swarm.f90 modified: Tests/Swarm/Three_Phase_Flow/User_Mod/Insert_Particles.f90 --- .../User_Mod/Beginning_Of_Time_Step.f90 | 2 +- .../Gradients/User_Mod/Initialize_Variables.f90 | 2 +- .../Omp/User_Mod/Beginning_Of_Simulation.f90 | 2 +- .../Uniform_Mesh/User_Mod/Save_Results.f90 | 14 +++++++------- .../Channel_Re_2000/User_Mod/Save_Results.f90 | 2 +- .../Cylinder/Vertical/User_Mod/Save_Results.f90 | 10 +++++----- Tests/Laminar/Flat_Plate/User_Mod/Plain_Nu.f90 | 8 ++++---- .../Les/Barc/User_Mod/Beginning_Of_Simulation.f90 | 2 +- .../Periodic_Domain/User_Mod/Save_Results.f90 | 14 +++++++------- .../Channel_Re_Tau_180/User_Mod/Save_Results.f90 | 2 +- Tests/Les/Forrest/User_Mod/Save_Results.f90 | 6 +++--- .../Les/Pipe_Re_Tau_180/User_Mod/Save_Results.f90 | 14 +++++++------- .../User_Mod/Save_Results.f90 | 2 +- .../Stretched_Mesh/User_Mod/Save_Results.f90 | 8 ++++---- .../User_Mod/Save_Impinging_Jet_Nu.f90 | 2 +- .../User_Mod/Beginning_Of_Simulation.f90 | 2 +- .../Backstep_Re_28000/User_Mod/Backstep_Cf_St.f90 | 8 ++++---- .../Rsm/User_Mod/Save_Results.f90 | 14 +++++++------- .../Stretched_Mesh/User_Mod/Save_Results.f90 | 15 +++++++-------- .../Uniform_Mesh/User_Mod/Save_Results.f90 | 15 +++++++-------- .../User_Mod/Impinging_Jet_Nu.f90 | 2 +- .../Pipe_Re_Tau_550/User_Mod/Save_Results.f90 | 14 +++++++------- .../User_Mod/Save_Results.f90 | 2 +- .../Bend_90_Degrees/User_Mod/Insert_Particles.f90 | 2 +- .../User_Mod/End_Of_Time_Step.f90 | 4 ++-- .../Channel_Re_Tau_590/User_Mod/Save_Results.f90 | 8 ++++---- .../Channel_Re_Tau_590/User_Mod/Save_Swarm.f90 | 2 +- .../User_Mod/Insert_Particles.f90 | 2 +- 28 files changed, 89 insertions(+), 91 deletions(-) diff --git a/Tests/Functionality/Communication/User_Mod/Beginning_Of_Time_Step.f90 b/Tests/Functionality/Communication/User_Mod/Beginning_Of_Time_Step.f90 index 1e1346172..d8eb0ec9c 100644 --- a/Tests/Functionality/Communication/User_Mod/Beginning_Of_Time_Step.f90 +++ b/Tests/Functionality/Communication/User_Mod/Beginning_Of_Time_Step.f90 @@ -54,7 +54,7 @@ subroutine User_Mod_Beginning_Of_Time_Step(Flow, Turb, Vof, Swarm, n, time) call Work % Disconnect_Real_Cell(var) - call Comm_Mod_End + call Global % End_Parallel stop end subroutine diff --git a/Tests/Functionality/Gradients/User_Mod/Initialize_Variables.f90 b/Tests/Functionality/Gradients/User_Mod/Initialize_Variables.f90 index cef1cd4c1..ae94aa128 100644 --- a/Tests/Functionality/Gradients/User_Mod/Initialize_Variables.f90 +++ b/Tests/Functionality/Gradients/User_Mod/Initialize_Variables.f90 @@ -339,7 +339,7 @@ subroutine User_Mod_Initialize_Variables(Flow, Turb, Vof, Swarm, Sol) call Work % Disconnect_Real_Cell(phi_x, phi_y, phi_z, phi_c) call Work % Disconnect_Int_Cell (c_computed, c_visited) - call Comm_Mod_End + call Global % End_Parallel stop end subroutine diff --git a/Tests/Functionality/Omp/User_Mod/Beginning_Of_Simulation.f90 b/Tests/Functionality/Omp/User_Mod/Beginning_Of_Simulation.f90 index d9000f1ec..eda75787d 100644 --- a/Tests/Functionality/Omp/User_Mod/Beginning_Of_Simulation.f90 +++ b/Tests/Functionality/Omp/User_Mod/Beginning_Of_Simulation.f90 @@ -125,7 +125,7 @@ subroutine User_Mod_Beginning_Of_Simulation(Flow, Turb, Vof, Swarm, & call Profiler % Statistics(indent=34) - call Comm_Mod_End + call Global % End_Parallel stop end subroutine diff --git a/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/Save_Results.f90 b/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/Save_Results.f90 index 469813201..5518aa7bf 100644 --- a/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/Save_Results.f90 +++ b/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/Save_Results.f90 @@ -44,10 +44,10 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Flow % Alias_Energy (t) ! Take constant physical properties - call Control_Mod_Mass_Density (dens_const) - call Control_Mod_Dynamic_Viscosity (visc_const) - call Control_Mod_Heat_Capacity (capa_const) - call Control_Mod_Thermal_Conductivity(cond_const) + call Control % Mass_Density (dens_const) + call Control % Dynamic_Viscosity (visc_const) + call Control % Heat_Capacity (capa_const) + call Control % Thermal_Conductivity(cond_const) ! Set the name for coordinate file call File % Set_Name(coord_name, extension='.1d') @@ -202,7 +202,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if end do - call Comm_Mod_Wait + call Global % Wait do i = 1, n_prob-1 if(n_count(i) .ne. 0) then @@ -259,7 +259,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if end do - call Comm_Mod_Wait + call Global % Wait if(Flow % heat_flux > 0.0) then call Global % Min_Real(t_inf) @@ -286,7 +286,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Global % Sum_Real(nu_mean) call Global % Sum_Int(n_points) - call Comm_Mod_Wait + call Global % Wait t_wall = t_wall / n_points nu_mean = nu_mean / n_points diff --git a/Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/Save_Results.f90 b/Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/Save_Results.f90 index af348d101..0f4d8106c 100644 --- a/Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/Save_Results.f90 +++ b/Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/Save_Results.f90 @@ -97,7 +97,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Global % Sum_Real(u_p(i)) end do - call Comm_Mod_Wait + call Global % Wait do i = 1, n-1 if(n_count(i) .ne. 0) then diff --git a/Tests/Laminar/Cylinder/Vertical/User_Mod/Save_Results.f90 b/Tests/Laminar/Cylinder/Vertical/User_Mod/Save_Results.f90 index 73f6a5d60..8f56b672f 100644 --- a/Tests/Laminar/Cylinder/Vertical/User_Mod/Save_Results.f90 +++ b/Tests/Laminar/Cylinder/Vertical/User_Mod/Save_Results.f90 @@ -41,11 +41,11 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Turb % Alias_Heat_Fluxes (ut, vt, wt) ! Take constant physical properties - call Control_Mod_Mass_Density (rho_const) - call Control_Mod_Dynamic_Viscosity (mu_const) + call Control % Mass_Density (rho_const) + call Control % Dynamic_Viscosity (mu_const) nu_const = mu_const / rho_const - call Control_Mod_Heat_Capacity (capa_const) - call Control_Mod_Thermal_Conductivity(k_const) + call Control % Heat_Capacity (capa_const) + call Control % Thermal_Conductivity(k_const) d = 1.0 ! characteristic dim. t_wall = 50.0 ! temp. at the wal @@ -85,7 +85,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Global % Sum_Real(nuss_mean) call Global % Sum_Int(n_points) - call Comm_Mod_Wait + call Global % Wait nuss_mean = nuss_mean / n_points end if diff --git a/Tests/Laminar/Flat_Plate/User_Mod/Plain_Nu.f90 b/Tests/Laminar/Flat_Plate/User_Mod/Plain_Nu.f90 index ef6fd3ef8..d1743a0b1 100644 --- a/Tests/Laminar/Flat_Plate/User_Mod/Plain_Nu.f90 +++ b/Tests/Laminar/Flat_Plate/User_Mod/Plain_Nu.f90 @@ -38,10 +38,10 @@ subroutine User_Mod_Plain_Nu(Flow, Turb, ts) t => Flow % t ! Get constant physical properties - call Control_Mod_Mass_Density (dens_const) - call Control_Mod_Dynamic_Viscosity (visc_const) - call Control_Mod_Heat_Capacity (capa_const) - call Control_Mod_Thermal_Conductivity(cond_const) + call Control % Mass_Density (dens_const) + call Control % Dynamic_Viscosity (visc_const) + call Control % Heat_Capacity (capa_const) + call Control % Thermal_Conductivity(cond_const) !----------------------------------! ! Read "x_coordinate.dat" file ! diff --git a/Tests/Les/Barc/User_Mod/Beginning_Of_Simulation.f90 b/Tests/Les/Barc/User_Mod/Beginning_Of_Simulation.f90 index 9623c1330..6ee69e0b8 100644 --- a/Tests/Les/Barc/User_Mod/Beginning_Of_Simulation.f90 +++ b/Tests/Les/Barc/User_Mod/Beginning_Of_Simulation.f90 @@ -35,7 +35,7 @@ subroutine User_Mod_Beginning_Of_Simulation(Flow, Turb, Vof, Swarm, & tensor_comp = 6, & tensor_name = 'Cell Inertia') - call Comm_Mod_End + call Global % End_Parallel stop end subroutine diff --git a/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/Save_Results.f90 b/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/Save_Results.f90 index eb977c373..18946dbbd 100644 --- a/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/Save_Results.f90 +++ b/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/Save_Results.f90 @@ -41,10 +41,10 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Flow % Alias_Energy (t) ! Read constant (defualt) values of physical properties - call Control_Mod_Dynamic_Viscosity (visc_const) - call Control_Mod_Mass_Density (dens_const) - call Control_Mod_Heat_Capacity (capa_const) - call Control_Mod_Thermal_Conductivity(cond_const) + call Control % Dynamic_Viscosity (visc_const) + call Control % Mass_Density (dens_const) + call Control % Heat_Capacity (capa_const) + call Control % Thermal_Conductivity(cond_const) call File % Set_Name(coord_name, extension='.1d') @@ -182,7 +182,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if end do - call Comm_Mod_Wait + call Global % Wait do i = 1, n_prob-1 if(n_count(i) .ne. 0) then @@ -229,7 +229,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if end do - call Comm_Mod_Wait + call Global % Wait if(Flow % heat_flux > 0.0) then call Global % Min_Real(t_inf) @@ -256,7 +256,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Global % Sum_Real(nu_mean) call Global % Sum_Int(n_points) - call Comm_Mod_Wait + call Global % Wait t_wall = t_wall / n_points nu_mean = nu_mean / n_points diff --git a/Tests/Les/Channel_Re_Tau_180/User_Mod/Save_Results.f90 b/Tests/Les/Channel_Re_Tau_180/User_Mod/Save_Results.f90 index 85cf21189..3d33528ce 100644 --- a/Tests/Les/Channel_Re_Tau_180/User_Mod/Save_Results.f90 +++ b/Tests/Les/Channel_Re_Tau_180/User_Mod/Save_Results.f90 @@ -201,7 +201,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) counter2 = counter2 + n_count2(pl) end do - call Comm_Mod_Wait + call Global % Wait do i = 1, n_prob-1 ! Background Flow diff --git a/Tests/Les/Forrest/User_Mod/Save_Results.f90 b/Tests/Les/Forrest/User_Mod/Save_Results.f90 index ae6c7e814..4532d029a 100644 --- a/Tests/Les/Forrest/User_Mod/Save_Results.f90 +++ b/Tests/Les/Forrest/User_Mod/Save_Results.f90 @@ -36,7 +36,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) if(ts .eq. 0) return if(.not. Turb % statistics) return - call Control_Mod_Read_Int_Item('STARTING_TIME_STEP_FOR_TURB_STATISTICS', & + call Control % Read_Int_Item('STARTING_TIME_STEP_FOR_TURB_STATISTICS', & HUGE_INT, n_stat, .false.) if(ts < n_stat) return @@ -50,7 +50,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Flow % Alias_Energy (t) ! Take constant physical properties - call Control_Mod_Dynamic_Viscosity (visc_const) + call Control % Dynamic_Viscosity(visc_const) ! Set the name for coordinate file call File % Set_Name(coord_name, extension='.1d') @@ -210,7 +210,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if end do - call Comm_Mod_Wait + call Global % Wait do i = 1, n_prob-1 if(n_count(i) .ne. 0) then diff --git a/Tests/Les/Pipe_Re_Tau_180/User_Mod/Save_Results.f90 b/Tests/Les/Pipe_Re_Tau_180/User_Mod/Save_Results.f90 index 0e3f50139..83ca7b308 100644 --- a/Tests/Les/Pipe_Re_Tau_180/User_Mod/Save_Results.f90 +++ b/Tests/Les/Pipe_Re_Tau_180/User_Mod/Save_Results.f90 @@ -44,10 +44,10 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Flow % Alias_Energy (t) ! Get constant physical properties - call Control_Mod_Mass_Density (dens_const) - call Control_Mod_Dynamic_Viscosity (visc_const) - call Control_Mod_Heat_Capacity (capa_const) - call Control_Mod_Thermal_Conductivity(cond_const) + call Control % Mass_Density (dens_const) + call Control % Dynamic_Viscosity (visc_const) + call Control % Heat_Capacity (capa_const) + call Control % Thermal_Conductivity(cond_const) ! Set the name for coordinate file call File % Set_Name(coord_name, extension='.1r') @@ -198,7 +198,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if end do - call Comm_Mod_Wait + call Global % Wait do i = 1, n_prob-1 if(n_count(i) .ne. 0) then @@ -244,7 +244,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if end do - call Comm_Mod_Wait + call Global % Wait if(Flow % heat_flux > 0.0) then call Global % Min_Real(t_inf) @@ -271,7 +271,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Global % Sum_Real(nu_mean) call Global % Sum_Int(n_points) - call Comm_Mod_Wait + call Global % Wait t_wall = t_wall / n_points nu_mean = nu_mean / n_points diff --git a/Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 b/Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 index 690a17870..4df9aa1c5 100644 --- a/Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 +++ b/Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 @@ -245,7 +245,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if end do - call Comm_Mod_Wait + call Global % Wait do i = 1, n_prob-1 if(n_count(i) .ne. 0) then diff --git a/Tests/Manual/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 b/Tests/Manual/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 index 2f77c5c54..bc03d927e 100644 --- a/Tests/Manual/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 +++ b/Tests/Manual/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 @@ -51,10 +51,10 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Turb % Alias_K_Eps_Zeta_F(kin, eps, zeta, f22) ! Read constant physical properties from control file - call Control_Mod_Mass_Density (dens_const) - call Control_Mod_Dynamic_Viscosity (visc_const) - call Control_Mod_Heat_Capacity (capa_const) - call Control_Mod_Thermal_Conductivity(cond_const) + call Control % Mass_Density (dens_const) + call Control % Dynamic_Viscosity (visc_const) + call Control % Heat_Capacity (capa_const) + call Control % Thermal_Conductivity(cond_const) ! Set the name for coordinate file call File % Set_Name(coord_name, extension='.1d') diff --git a/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 b/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 index 746e18747..ea33494af 100644 --- a/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 +++ b/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 @@ -137,7 +137,7 @@ subroutine Save_Impinging_Jet_Nu(Turb, ts) r_s(i) = r_s(i) / n_count(i) end if end do - call Comm_Mod_Wait + call Global % Wait !-----------------------------------! ! Write from one processor only ! diff --git a/Tests/Manual/Matrix_Of_Cubes/User_Mod/Beginning_Of_Simulation.f90 b/Tests/Manual/Matrix_Of_Cubes/User_Mod/Beginning_Of_Simulation.f90 index 9b4e4bea7..66cb4f474 100644 --- a/Tests/Manual/Matrix_Of_Cubes/User_Mod/Beginning_Of_Simulation.f90 +++ b/Tests/Manual/Matrix_Of_Cubes/User_Mod/Beginning_Of_Simulation.f90 @@ -91,7 +91,7 @@ subroutine User_Mod_Beginning_Of_Simulation(Flow, Turb, Vof, Swarm, & call Work % Disconnect_Real_Node(d_probe,z_probe,u_mean_n,uu_res_n,vv_res_n) call Work % Disconnect_Int_Node (node_ind) - call Comm_Mod_End + call Global % End_Parallel stop end subroutine diff --git a/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Cf_St.f90 b/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Cf_St.f90 index 6f19d61bf..a7c26d381 100644 --- a/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Cf_St.f90 +++ b/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Cf_St.f90 @@ -36,10 +36,10 @@ subroutine User_Mod_Backstep_Cf_St(Flow, Turb, ts) t => Flow % t ! Get constant physical properties - call Control_Mod_Mass_Density (dens_const) - call Control_Mod_Dynamic_Viscosity (visc_const) - call Control_Mod_Heat_Capacity (capa_const) - call Control_Mod_Thermal_Conductivity(cond_const) + call Control % Mass_Density (dens_const) + call Control % Dynamic_Viscosity (visc_const) + call Control % Heat_Capacity (capa_const) + call Control % Thermal_Conductivity(cond_const) !----------------------------------! ! Read "x_coordinate.dat" file ! diff --git a/Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Save_Results.f90 b/Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Save_Results.f90 index a564f8e05..709729253 100644 --- a/Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Save_Results.f90 @@ -49,10 +49,10 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Turb % Alias_Heat_Fluxes (ut, vt, wt) ! Take constant physical properties - call Control_Mod_Mass_Density (dens_const) - call Control_Mod_Dynamic_Viscosity (visc_const) - call Control_Mod_Heat_Capacity (capa_const) - call Control_Mod_Thermal_Conductivity(cond_const) + call Control % Mass_Density (dens_const) + call Control % Dynamic_Viscosity (visc_const) + call Control % Heat_Capacity (capa_const) + call Control % Thermal_Conductivity(cond_const) ! Set the name for coordinate file call File % Set_Name(coord_name, extension='.1d') @@ -188,7 +188,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if end do - call Comm_Mod_Wait + call Global % Wait do i = 1, n_prob-1 if(n_count(i) .ne. 0) then @@ -236,7 +236,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if end do - call Comm_Mod_Wait + call Global % Wait if(Flow % heat_flux > 0.0) then call Global % Min_Real(t_inf) @@ -263,7 +263,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Global % Sum_Real(nu_mean) call Global % Sum_Int(n_points) - call Comm_Mod_Wait + call Global % Wait t_wall = t_wall / n_points nu_mean = nu_mean / n_points diff --git a/Tests/Rans/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 b/Tests/Rans/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 index 2360151ef..f074ac893 100644 --- a/Tests/Rans/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 @@ -48,10 +48,10 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Turb % Alias_Heat_Fluxes (ut, vt, wt) ! Take constant physical properties - call Control_Mod_Mass_Density (dens_const) - call Control_Mod_Dynamic_Viscosity (visc_const) - call Control_Mod_Heat_Capacity (capa_const) - call Control_Mod_Thermal_Conductivity(cond_const) + call Control % Mass_Density (dens_const) + call Control % Dynamic_Viscosity (visc_const) + call Control % Heat_Capacity (capa_const) + call Control % Thermal_Conductivity(cond_const) ! Set the name for coordinate file call File % Set_Name(coord_name, extension='.1d') @@ -198,8 +198,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if end do - - call Comm_Mod_Wait + call Global % Wait do i = 1, n_prob-1 if(n_count(i) .ne. 0) then @@ -255,7 +254,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if end do - call Comm_Mod_Wait + call Global % Wait if(Flow % heat_flux> 0.0) then call Global % Min_Real(t_inf) @@ -282,7 +281,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Global % Sum_Real(nu_mean) call Global % Sum_Int(n_points) - call Comm_Mod_Wait + call Global % Wait t_wall = t_wall / n_points nu_mean = nu_mean / n_points diff --git a/Tests/Rans/Channel_Re_Tau_590/Uniform_Mesh/User_Mod/Save_Results.f90 b/Tests/Rans/Channel_Re_Tau_590/Uniform_Mesh/User_Mod/Save_Results.f90 index 09cf4a7b2..eb12aca41 100644 --- a/Tests/Rans/Channel_Re_Tau_590/Uniform_Mesh/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Channel_Re_Tau_590/Uniform_Mesh/User_Mod/Save_Results.f90 @@ -48,10 +48,10 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Turb % Alias_Heat_Fluxes (ut, vt, wt) ! Take constant physical properties - call Control_Mod_Mass_Density (dens_const) - call Control_Mod_Dynamic_Viscosity (visc_const) - call Control_Mod_Heat_Capacity (capa_const) - call Control_Mod_Thermal_Conductivity(cond_const) + call Control % Mass_Density (dens_const) + call Control % Dynamic_Viscosity (visc_const) + call Control % Heat_Capacity (capa_const) + call Control % Thermal_Conductivity(cond_const) ! Set the name for coordinate file call File % Set_Name(coord_name, extension='.1d') @@ -198,8 +198,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if end do - - call Comm_Mod_Wait + call Global % Wait do i = 1, n_prob-1 if(n_count(i) .ne. 0) then @@ -255,7 +254,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if end do - call Comm_Mod_Wait + call Global % Wait if(Flow % heat_flux> 0.0) then call Global % Min_Real(t_inf) @@ -282,7 +281,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Global % Sum_Real(nu_mean) call Global % Sum_Int(n_points) - call Comm_Mod_Wait + call Global % Wait t_wall = t_wall / n_points nu_mean = nu_mean / n_points diff --git a/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 b/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 index 67d799551..742a707b7 100644 --- a/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 +++ b/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 @@ -147,7 +147,7 @@ subroutine User_Mod_Impinging_Jet_Nu(Turb, ts) r_p(i) = r_p(i) / n_count(i) end if end do - call Comm_Mod_Wait + call Global % Wait !-----------------------------------! ! Write from one processor only ! diff --git a/Tests/Rans/Pipe_Re_Tau_550/User_Mod/Save_Results.f90 b/Tests/Rans/Pipe_Re_Tau_550/User_Mod/Save_Results.f90 index c506ff8e9..28525bec1 100644 --- a/Tests/Rans/Pipe_Re_Tau_550/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Pipe_Re_Tau_550/User_Mod/Save_Results.f90 @@ -51,10 +51,10 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Turb % Alias_Heat_Fluxes (ut, vt, wt) ! Take constant physical properties - call Control_Mod_Mass_Density (dens_const) - call Control_Mod_Dynamic_Viscosity (visc_const) - call Control_Mod_Heat_Capacity (capa_const) - call Control_Mod_Thermal_Conductivity(cond_const) + call Control % Mass_Density (dens_const) + call Control % Dynamic_Viscosity (visc_const) + call Control % Heat_Capacity (capa_const) + call Control % Thermal_Conductivity(cond_const) ! Set the name for coordinate file call File % Set_Name(coord_name, extension='.1r') @@ -204,7 +204,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end do - call Comm_Mod_Wait + call Global % Wait do i = 1, n_prob-1 if(n_count(i) .ne. 0) then @@ -261,7 +261,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if end do - call Comm_Mod_Wait + call Global % Wait if(Flow % heat_flux > 0.0) then call Global % Min_Real(t_inf) @@ -287,7 +287,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call Global % Sum_Real(nu_mean) call Global % Sum_Int(n_points) - call Comm_Mod_Wait + call Global % Wait t_wall = t_wall / n_points nu_mean = nu_mean / n_points diff --git a/Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 b/Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 index b09800dbb..9d75e200d 100644 --- a/Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 @@ -215,7 +215,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) end if end do - call Comm_Mod_Wait + call Global % Wait do i = 1, n_prob-1 if(n_count(i) .ne. 0) then diff --git a/Tests/Swarm/Bend_90_Degrees/User_Mod/Insert_Particles.f90 b/Tests/Swarm/Bend_90_Degrees/User_Mod/Insert_Particles.f90 index 8e856888d..e5b3a6cc8 100644 --- a/Tests/Swarm/Bend_90_Degrees/User_Mod/Insert_Particles.f90 +++ b/Tests/Swarm/Bend_90_Degrees/User_Mod/Insert_Particles.f90 @@ -80,7 +80,7 @@ subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, curr_dt, time) else if(First_Proc()) then print *, '# @User_Mod_Insert_Particles: too many particles' - call Comm_Mod_End + call Global % End_Parallel stop end if end if diff --git a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/End_Of_Time_Step.f90 b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/End_Of_Time_Step.f90 index 032810536..278bc94b3 100644 --- a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/End_Of_Time_Step.f90 @@ -43,8 +43,8 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & t => Flow % t ! Reading starting time for Swarm statistics from control file - call Control_Mod_Starting_Time_Step_For_Swarm_Statistics & - (n_stat_p, verbose=.true.) + call Control % Starting_Time_Step_For_Swarm_Statistics & + (n_stat_p, verbose=.true.) ! Reynolds number should be passed from Save_Results and number of bins should ! be defined in control file, also same for n_bin... (it's okey for now!) diff --git a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Results.f90 b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Results.f90 index d88b9749f..92b44c01e 100644 --- a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Results.f90 +++ b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Results.f90 @@ -39,8 +39,8 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, curr_dt, domain) call Flow % Alias_Energy (t) ! Take constant physical properties - call Control_Mod_Mass_Density (dens_const) - call Control_Mod_Dynamic_Viscosity(visc_const) + call Control % Mass_Density (dens_const) + call Control % Dynamic_Viscosity(visc_const) ! Set the name for coordinate file call File % Set_Name(coord_name, extension='.1d') @@ -170,7 +170,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, curr_dt, domain) call Global % Sum_Real(vv_p(pl)) call Global % Sum_Real(ww_p(pl)) call Global % Sum_Real(uw_p(pl)) - + call Global % Sum_Real(uw_mod_p(pl)) call Global % Sum_Real(kin_p (pl)) call Global % Sum_Real(eps_p (pl)) @@ -181,7 +181,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, curr_dt, domain) call Global % Sum_Real(ww_mod_p(pl)) end do - call Comm_Mod_Wait + call Global % Wait do i = 1, n_prob-1 if(n_count(i) .ne. 0) then diff --git a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Swarm.f90 b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Swarm.f90 index 65f251485..bbde7ddc1 100644 --- a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Swarm.f90 +++ b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Swarm.f90 @@ -192,7 +192,7 @@ subroutine User_Mod_Save_Swarm(Flow, Turb, Vof, Swarm, curr_dt, domain) call Global % Sum_Real(uw_pp(pl)) end do - call Comm_Mod_Wait + call Global % Wait do i = 1, n_prob-1 diff --git a/Tests/Swarm/Three_Phase_Flow/User_Mod/Insert_Particles.f90 b/Tests/Swarm/Three_Phase_Flow/User_Mod/Insert_Particles.f90 index fe7a84a47..eb7b204cd 100644 --- a/Tests/Swarm/Three_Phase_Flow/User_Mod/Insert_Particles.f90 +++ b/Tests/Swarm/Three_Phase_Flow/User_Mod/Insert_Particles.f90 @@ -64,7 +64,7 @@ subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, n, time) ' couldn''t be located!' print *, '# Check initial placement of particles.' print *, '# This error is critical, exiting!' - call Comm_Mod_End + call Global % End_Parallel stop end if From ffbd3a2b011a8c049090e89abaffb60080f3f739 Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 3 Apr 2023 14:19:19 +0200 Subject: [PATCH 191/223] Improved internal structure of Control_Mod a bit On branch bojan_more_robust_communicator modified: Shared/Control_Mod.f90 modified: Shared/Control_Mod/Basic_Functions/Open_Domain_File.f90 modified: Shared/Control_Mod/Basic_Functions/Open_Root_File.f90 modified: Shared/Control_Mod/Basic_Functions/Position_At_One_Key.f90 modified: Shared/Control_Mod/Basic_Functions/Position_At_Three_Keys.f90 modified: Shared/Control_Mod/Basic_Functions/Position_At_Two_Keys.f90 modified: Shared/Control_Mod/Basic_Functions/Read_Char_Item.f90 modified: Shared/Control_Mod/Basic_Functions/Read_Char_Item_On.f90 modified: Shared/Control_Mod/Basic_Functions/Read_Int_Item.f90 modified: Shared/Control_Mod/Basic_Functions/Read_Int_Item_On.f90 modified: Shared/Control_Mod/Basic_Functions/Read_Real_Item.f90 modified: Shared/Control_Mod/Basic_Functions/Read_Real_Item_On.f90 modified: Shared/Control_Mod/Basic_Functions/Read_Real_Vector.f90 modified: Shared/Control_Mod/Basic_Functions/Read_Real_Vector_On.f90 modified: Shared/Control_Mod/Basic_Functions/Read_Strings_On.f90 modified: Shared/Control_Mod/Basic_Functions/Switch_To_Domain.f90 modified: Shared/Control_Mod/Basic_Functions/Switch_To_Root.f90 --- Sources/Shared/Control_Mod.f90 | 10 +++++----- .../Basic_Functions/Open_Domain_File.f90 | 12 +++++------ .../Basic_Functions/Open_Root_File.f90 | 9 +++------ .../Basic_Functions/Position_At_One_Key.f90 | 14 ++++++------- .../Position_At_Three_Keys.f90 | 20 +++++++++---------- .../Basic_Functions/Position_At_Two_Keys.f90 | 16 +++++++-------- .../Basic_Functions/Read_Char_Item.f90 | 16 +++++++-------- .../Basic_Functions/Read_Char_Item_On.f90 | 14 ++++++------- .../Basic_Functions/Read_Int_Item.f90 | 16 +++++++-------- .../Basic_Functions/Read_Int_Item_On.f90 | 14 ++++++------- .../Basic_Functions/Read_Real_Item.f90 | 16 +++++++-------- .../Basic_Functions/Read_Real_Item_On.f90 | 14 ++++++------- .../Basic_Functions/Read_Real_Vector.f90 | 18 ++++++++--------- .../Basic_Functions/Read_Real_Vector_On.f90 | 14 ++++++------- .../Basic_Functions/Read_Strings_On.f90 | 14 ++++++------- .../Basic_Functions/Switch_To_Domain.f90 | 4 +--- .../Basic_Functions/Switch_To_Root.f90 | 6 ++---- 17 files changed, 97 insertions(+), 130 deletions(-) diff --git a/Sources/Shared/Control_Mod.f90 b/Sources/Shared/Control_Mod.f90 index 4f065d8e1..24a46d777 100644 --- a/Sources/Shared/Control_Mod.f90 +++ b/Sources/Shared/Control_Mod.f90 @@ -10,16 +10,16 @@ module Control_Mod implicit none !==============================================================================! - ! Control file unit - integer, private :: control_file_unit ! current control file unit - integer, private :: root_control_file_unit ! root control file unit - integer, private :: dom_control_file_unit(MD) ! domain control file units - !------------------! ! Control type ! !------------------! type Control_Type + ! Control file unit + integer, private :: file_unit ! current control file unit + integer, private :: root_file_unit ! root control file unit + integer, private :: dom_file_unit(MD) ! domain control file units + contains ! Basic functionality (manouvering through control file) diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Open_Domain_File.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Open_Domain_File.f90 index cc82c52c3..9523cee5c 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Open_Domain_File.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Open_Domain_File.f90 @@ -5,15 +5,13 @@ subroutine Open_Domain_File(Control, dom, file_name) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Control_Type) :: Control - integer :: dom - character(len=*) :: file_name -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Control) + class(Control_Type) :: Control + integer, intent(in) :: dom + character(len=*), intent(in) :: file_name !==============================================================================! - call File % Open_For_Reading_Ascii(file_name, & - dom_control_file_unit(dom), & + call File % Open_For_Reading_Ascii(file_name, & + Control % dom_file_unit(dom), & processor = This_Proc()) end subroutine diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Open_Root_File.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Open_Root_File.f90 index 414774a3b..afb94e409 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Open_Root_File.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Open_Root_File.f90 @@ -7,18 +7,15 @@ subroutine Open_Root_File(Control, file_name) !---------------------------------[Arguments]----------------------------------! class(Control_Type) :: Control character(len=*) :: file_name -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Control) !==============================================================================! - call File % Open_For_Reading_Ascii(file_name, root_control_file_unit, & + call File % Open_For_Reading_Ascii(file_name, Control % root_file_unit, & processor=This_Proc()) ! Make root default to begin with - control_file_unit = root_control_file_unit + Control % file_unit = Control % root_file_unit ! Set default values for domain 1 - ! dom_control_file_name(1) = control_file_name - dom_control_file_unit(1) = root_control_file_unit + Control % dom_file_unit(1) = Control % root_file_unit end subroutine diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Position_At_One_Key.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Position_At_One_Key.f90 index abddfe3a7..da1bbc8e7 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Position_At_One_Key.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Position_At_One_Key.f90 @@ -6,24 +6,22 @@ subroutine Position_At_One_Key(Control, keyword, found, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Control_Type) :: Control - character(len=*) :: keyword - logical :: found - logical, optional :: verbose + class(Control_Type) :: Control + character(len=*), intent(in) :: keyword + logical, intent(out) :: found + logical, optional, intent(in) :: verbose !-----------------------------------[Locals]-----------------------------------! logical :: reached_end -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Control) !==============================================================================! - rewind(control_file_unit) + rewind(Control % file_unit) !-----------------------------------------------------! ! Browse through command file to find one keyword ! !-----------------------------------------------------! found = .false. do - call File % Read_Line(control_file_unit, reached_end) + call File % Read_Line(Control % file_unit, reached_end) if(reached_end) goto 1 ! Found the correct keyword diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Position_At_Three_Keys.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Position_At_Three_Keys.f90 index 40b407781..76e3aed23 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Position_At_Three_Keys.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Position_At_Three_Keys.f90 @@ -12,26 +12,24 @@ subroutine Position_At_Three_Keys(Control, & !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Control_Type) :: Control - character(len=*) :: keyword_1 - character(len=*) :: keyword_2 - character(len=*) :: keyword_3 - logical :: found - logical, optional :: verbose + class(Control_Type) :: Control + character(len=*), intent(in) :: keyword_1 + character(len=*), intent(in) :: keyword_2 + character(len=*), intent(in) :: keyword_3 + logical, intent(out) :: found + logical, optional, intent(in) :: verbose !-----------------------------------[Locals]-----------------------------------! logical :: reached_end -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Control) !==============================================================================! - rewind(control_file_unit) + rewind(Control % file_unit) !------------------------------------------------------------------! ! Browse through command file to find two keywords in one file ! !------------------------------------------------------------------! found = .false. do - call File % Read_Line(control_file_unit, reached_end) + call File % Read_Line(Control % file_unit, reached_end) if(reached_end) goto 1 ! First keyword is "INTERFACE_CONDITION", ... @@ -52,7 +50,7 @@ subroutine Position_At_Three_Keys(Control, & if(present(verbose)) then if(verbose .and. First_Proc()) then print '(5a)', ' # NOTE! Could not find the line with keywords: ', & - keyword_1, ', ', trim(keyword_2), ', ', trim(keyword_3), '!' + keyword_1, ', ', trim(keyword_2), ', ', trim(keyword_3), '!' end if end if end if diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Position_At_Two_Keys.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Position_At_Two_Keys.f90 index fb20fa59a..db63aba08 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Position_At_Two_Keys.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Position_At_Two_Keys.f90 @@ -9,25 +9,23 @@ subroutine Position_At_Two_Keys(Control, & !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Control_Type) :: Control - character(len=*) :: keyword_1 - character(len=*) :: keyword_2 - logical :: found - logical, optional :: verbose + class(Control_Type) :: Control + character(len=*), intent(in) :: keyword_1 + character(len=*), intent(in) :: keyword_2 + logical, intent(out) :: found + logical, optional, intent(in) :: verbose !-----------------------------------[Locals]-----------------------------------! logical :: reached_end -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Control) !==============================================================================! - rewind(control_file_unit) + rewind(Control % file_unit) !------------------------------------------------------------------! ! Browse through command file to find two keywords in one file ! !------------------------------------------------------------------! found = .false. do - call File % Read_Line(control_file_unit, reached_end) + call File % Read_Line(Control % file_unit, reached_end) if(reached_end) goto 1 call String % To_Upper_Case(Line % tokens(2)) diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item.f90 index cbe188e10..dc99ca23a 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item.f90 @@ -7,18 +7,16 @@ subroutine Read_Char_Item(Control, keyword, def, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Control_Type) :: Control - character(len=*) :: keyword - character(len=*), intent(in) :: def ! default value - character(SL), intent(out) :: val ! spefified value, if found - logical, optional :: verbose + class(Control_Type) :: Control + character(len=*), intent(in) :: keyword + character(len=*), intent(in) :: def ! default value + character(SL), intent(out) :: val ! spefified value, if found + logical, optional, intent(in) :: verbose !-----------------------------------[Locals]-----------------------------------! logical :: reached_end -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Control) !==============================================================================! - rewind(control_file_unit) + rewind(Control % file_unit) ! Set default value val = def @@ -27,7 +25,7 @@ subroutine Read_Char_Item(Control, keyword, def, val, verbose) ! Browse through command file to see if user specificed it ! !--------------------------------------------------------------! do - call File % Read_Line(control_file_unit, reached_end) + call File % Read_Line(Control % file_unit, reached_end) if(reached_end) goto 1 ! Found the correct keyword diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item_On.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item_On.f90 index 37f8bf2cc..f4ebc89b4 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item_On.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Char_Item_On.f90 @@ -7,15 +7,13 @@ subroutine Read_Char_Item_On(Control, keyword, def, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Control_Type) :: Control - character(len=*) :: keyword - character(len=*), intent(in) :: def ! default value - character(SL), intent(out) :: val ! spefified value, if found - logical, optional :: verbose + class(Control_Type) :: Control + character(len=*), intent(in) :: keyword + character(len=*), intent(in) :: def ! default value + character(SL), intent(out) :: val ! spefified value, if found + logical, optional, intent(in) :: verbose !-----------------------------------[Locals]-----------------------------------! logical :: reached_end -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Control) !==============================================================================! ! Set default value @@ -24,7 +22,7 @@ subroutine Read_Char_Item_On(Control, keyword, def, val, verbose) !---------------------------------------------------------! ! Read one line from command file to find the keyword ! !---------------------------------------------------------! - call File % Read_Line(control_file_unit, reached_end) + call File % Read_Line(Control % file_unit, reached_end) if(reached_end) goto 1 ! Found the correct keyword diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item.f90 index e0d8dbf13..49463c1dd 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item.f90 @@ -7,18 +7,16 @@ subroutine Read_Int_Item(Control, keyword, def, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Control_Type) :: Control - character(len=*) :: keyword - integer, intent(in) :: def ! default value - integer, intent(out) :: val ! spefified value, if found - logical, optional :: verbose + class(Control_Type) :: Control + character(len=*), intent(in) :: keyword + integer, intent(in) :: def ! default value + integer, intent(out) :: val ! spefified value, if found + logical, optional, intent(in) :: verbose !-----------------------------------[Locals]-----------------------------------! logical :: reached_end -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Control) !==============================================================================! - rewind(control_file_unit) + rewind(Control % file_unit) ! Set default value val = def @@ -27,7 +25,7 @@ subroutine Read_Int_Item(Control, keyword, def, val, verbose) ! Browse through command file to find the keyword ! !-----------------------------------------------------! do - call File % Read_Line(control_file_unit, reached_end) + call File % Read_Line(Control % file_unit, reached_end) if(reached_end) goto 1 ! Found the correct keyword diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item_On.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item_On.f90 index 6d280832e..fba6f9b6b 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item_On.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Int_Item_On.f90 @@ -7,15 +7,13 @@ subroutine Read_Int_Item_On(Control, keyword, def, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Control_Type) :: Control - character(len=*) :: keyword - integer, intent(in) :: def ! default value - integer, intent(out) :: val ! spefified value, if found - logical, optional :: verbose + class(Control_Type) :: Control + character(len=*), intent(in) :: keyword + integer, intent(in) :: def ! default value + integer, intent(out) :: val ! spefified value, if found + logical, optional, intent(in) :: verbose !-----------------------------------[Locals]-----------------------------------! logical :: reached_end -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Control) !==============================================================================! ! Set default value @@ -24,7 +22,7 @@ subroutine Read_Int_Item_On(Control, keyword, def, val, verbose) !-----------------------------------------------------! ! Browse through command file to find the keyword ! !-----------------------------------------------------! - call File % Read_Line(control_file_unit, reached_end) + call File % Read_Line(Control % file_unit, reached_end) if(reached_end) goto 1 ! Found the correct keyword diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item.f90 index f05cd532d..e447f47d1 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item.f90 @@ -7,18 +7,16 @@ subroutine Read_Real_Item(Control, keyword, def, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Control_Type) :: Control - character(len=*) :: keyword - real, intent(in) :: def ! default value - real, intent(out) :: val ! spefified value, if found - logical, optional :: verbose + class(Control_Type) :: Control + character(len=*), intent(in) :: keyword + real, intent(in) :: def ! default value + real, intent(out) :: val ! spefified value, if found + logical, optional, intent(in) :: verbose !-----------------------------------[Locals]-----------------------------------! logical :: reached_end -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Control) !==============================================================================! - rewind(control_file_unit) + rewind(Control % file_unit) ! Set default value val = def @@ -27,7 +25,7 @@ subroutine Read_Real_Item(Control, keyword, def, val, verbose) ! Browse through command file to find the keyword ! !-----------------------------------------------------! do - call File % Read_Line(control_file_unit, reached_end) + call File % Read_Line(Control % file_unit, reached_end) if(reached_end) goto 1 ! Found the correct keyword diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item_On.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item_On.f90 index 581716e82..0f1b9d63f 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item_On.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Item_On.f90 @@ -7,15 +7,13 @@ subroutine Read_Real_Item_On(Control, keyword, def, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Control_Type) :: Control - character(len=*) :: keyword - real, intent(in) :: def ! default value - real, intent(out) :: val ! spefified value, if found - logical, optional :: verbose + class(Control_Type) :: Control + character(len=*), intent(in) :: keyword + real, intent(in) :: def ! default value + real, intent(out) :: val ! spefified value, if found + logical, optional, intent(in) :: verbose !-----------------------------------[Locals]-----------------------------------! logical :: reached_end -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Control) !==============================================================================! ! Set default value @@ -24,7 +22,7 @@ subroutine Read_Real_Item_On(Control, keyword, def, val, verbose) !-----------------------------------------------------! ! Browse through command file to find the keyword ! !-----------------------------------------------------! - call File % Read_Line(control_file_unit, reached_end) + call File % Read_Line(Control % file_unit, reached_end) if(reached_end) goto 1 ! Found the correct keyword diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Vector.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Vector.f90 index 1fe607e2a..6a434b5ab 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Vector.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Vector.f90 @@ -7,20 +7,18 @@ subroutine Read_Real_Vector(Control, keyword, n, def, val, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Control_Type) :: Control - character(len=*) :: keyword - integer :: n ! size of array (typically small) - real :: def(n) ! default value - real :: val(n) ! spefified value, if found - logical, optional :: verbose + class(Control_Type) :: Control + character(len=*), intent(in) :: keyword + integer, intent(in) :: n ! size of array (typically small) + real, intent(in) :: def(n) ! default value + real, intent(out) :: val(n) ! spefified value, if found + logical, optional, intent(in) :: verbose !-----------------------------------[Locals]-----------------------------------! logical :: reached_end integer :: i -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Control) !==============================================================================! - rewind(control_file_unit) + rewind(Control % file_unit) ! Set default values val = def @@ -29,7 +27,7 @@ subroutine Read_Real_Vector(Control, keyword, n, def, val, verbose) ! Browse through command file to find the keyword ! !-----------------------------------------------------! do - call File % Read_Line(control_file_unit, reached_end) + call File % Read_Line(Control % file_unit, reached_end) if(reached_end) goto 1 ! Found the correct keyword diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Vector_On.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Vector_On.f90 index ae65c79bb..c052c2df4 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Vector_On.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Real_Vector_On.f90 @@ -7,16 +7,14 @@ subroutine Read_Real_Vector_On(Control, keyword, values, n, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Control_Type) :: Control - character(len=*) :: keyword - real :: values(128) ! spefified value, if found - integer :: n ! number of items - logical, optional :: verbose + class(Control_Type) :: Control + character(len=*), intent(in) :: keyword + real, intent(out) :: values(128) ! spefified value, if found + integer, intent(out) :: n ! number of items + logical, optional, intent(in) :: verbose !-----------------------------------[Locals]-----------------------------------! integer :: i logical :: reached_end -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Control) !==============================================================================! ! Set default values @@ -25,7 +23,7 @@ subroutine Read_Real_Vector_On(Control, keyword, values, n, verbose) !---------------------------------------------------------! ! Read one line from command file to find the keyword ! !---------------------------------------------------------! - call File % Read_Line(control_file_unit, reached_end) + call File % Read_Line(Control % file_unit, reached_end) if(reached_end) goto 1 ! Found the correct keyword diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Read_Strings_On.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Read_Strings_On.f90 index 33d91c0c6..7e82a5b66 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Read_Strings_On.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Read_Strings_On.f90 @@ -5,16 +5,14 @@ subroutine Read_Strings_On(Control, keyword, values, n, verbose) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Control_Type) :: Control - character(len=*) :: keyword - character(SL) :: values(MSI) ! spefified value, if found - integer :: n ! number of items - logical, optional :: verbose + class(Control_Type) :: Control + character(len=*), intent(in) :: keyword + character(SL), intent(out) :: values(MSI) ! spefified value, if found + integer, intent(out) :: n ! number of items + logical, optional, intent(in) :: verbose !-----------------------------------[Locals]-----------------------------------! integer :: i logical :: reached_end -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Control) !==============================================================================! ! Set default values @@ -23,7 +21,7 @@ subroutine Read_Strings_On(Control, keyword, values, n, verbose) !---------------------------------------------------------! ! Read one line from command file to find the keyword ! !---------------------------------------------------------! - call File % Read_Line(control_file_unit, reached_end) + call File % Read_Line(Control % file_unit, reached_end) if(reached_end) goto 1 ! Found the correct keyword diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Switch_To_Domain.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Switch_To_Domain.f90 index a3f0dc404..ceb783433 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Switch_To_Domain.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Switch_To_Domain.f90 @@ -7,10 +7,8 @@ subroutine Switch_To_Domain(Control, dom) !---------------------------------[Arguments]----------------------------------! class(Control_Type) :: Control integer, intent(in) :: dom -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Control) !==============================================================================! - control_file_unit = dom_control_file_unit(dom) + Control % file_unit = Control % dom_file_unit(dom) end subroutine diff --git a/Sources/Shared/Control_Mod/Basic_Functions/Switch_To_Root.f90 b/Sources/Shared/Control_Mod/Basic_Functions/Switch_To_Root.f90 index 82cebf88c..b14c83d94 100644 --- a/Sources/Shared/Control_Mod/Basic_Functions/Switch_To_Root.f90 +++ b/Sources/Shared/Control_Mod/Basic_Functions/Switch_To_Root.f90 @@ -5,11 +5,9 @@ subroutine Switch_To_Root(Control) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Control_Type) :: Control -!------------------------[Avoid unused parent warning]-------------------------! - Unused(Control) + class(Control_Type), intent(inout) :: Control !==============================================================================! - control_file_unit = root_control_file_unit + Control % file_unit = Control % root_file_unit end subroutine From 8d61d119459141fc40d706562d99c7f610aa916d Mon Sep 17 00:00:00 2001 From: Niceno Date: Mon, 3 Apr 2023 16:29:18 +0200 Subject: [PATCH 192/223] Reduced the size of Tokenizer to avoid warnings OK, so here is the story. Gnu compiler was complaining about the static size of Tokenizer, saying it was too big. In order to reduce it, I did three things: 1. Reduce MAX_TOKENS from 2048 to 32 (I tried 16, but it was too short) 2. Detached the size of the line from MAX_TOKENS*2, which is not the best practicle anyway because it is implicit (line one paramenter for two different things to DL (currently at 160). 3. Use an assertion inside the Tokenizer to check if the number of tokens is sufficient. As a consequence of this, makefiles also had to be up- dated. Whenever browsing through Tokenizer's strings, I use its length as the boundary, not any longer MAX_TOKENS*2. One more detai: MAX_TOKENS is now in the sytnax file for T-Flows. Compiler warning are gone now. Thorough tests are not yet conducted. On branch bojan_more_robust_communicator modified: Documentation/Syntax/.vim/syntax/fortran.vim modified: Sources/Convert/Convert_Mod/Load_Gmsh.f90 modified: Sources/Convert/makefile modified: Sources/Convert/makefile_explicit_dependencies modified: Sources/Divide/makefile modified: Sources/Divide/makefile_explicit_dependencies modified: Sources/Generate/makefile modified: Sources/Generate/makefile_explicit_dependencies modified: Sources/Shared/File_Mod/Read_Line.f90 modified: Sources/Shared/Grid_Mod/Print_Regions_List.f90 modified: Sources/Shared/Tokenizer_Mod.f90 modified: Sources/Shared/Tokenizer_Mod/Parse.f90 --- Documentation/Syntax/.vim/syntax/fortran.vim | 2 ++ Sources/Convert/Convert_Mod/Load_Gmsh.f90 | 4 ++-- Sources/Convert/makefile | 2 +- .../Convert/makefile_explicit_dependencies | 3 ++- Sources/Divide/makefile | 2 +- Sources/Divide/makefile_explicit_dependencies | 12 +++-------- Sources/Generate/makefile | 2 +- .../Generate/makefile_explicit_dependencies | 3 ++- Sources/Shared/File_Mod/Read_Line.f90 | 6 +++--- .../Shared/Grid_Mod/Print_Regions_List.f90 | 4 ++-- Sources/Shared/Tokenizer_Mod.f90 | 20 ++++++++++--------- Sources/Shared/Tokenizer_Mod/Parse.f90 | 5 +++-- 12 files changed, 33 insertions(+), 32 deletions(-) diff --git a/Documentation/Syntax/.vim/syntax/fortran.vim b/Documentation/Syntax/.vim/syntax/fortran.vim index 82dfbe582..76f39fe46 100644 --- a/Documentation/Syntax/.vim/syntax/fortran.vim +++ b/Documentation/Syntax/.vim/syntax/fortran.vim @@ -424,6 +424,8 @@ if b:fortran_dialect == "f08" syn keyword fortranConstant HUGE TINY HUGE_INT EULER PI syn keyword fortranConstant ONE_THIRD TWO_THIRDS ONE_SIXTH syn keyword fortranConstant MD MAX_VARS_INTERFACE +" Constants from Tokenizer_Mod + syn keyword fortranConstant MAX_TOKENS " Constants related to indentation (O think they are defined in a few places - bad! syn keyword fortranConstant IN_0 IN_1 IN_2 IN_3 IN_4 IN_5 " Constants from Info_Mod diff --git a/Sources/Convert/Convert_Mod/Load_Gmsh.f90 b/Sources/Convert/Convert_Mod/Load_Gmsh.f90 index 6ff35cb43..c273e06fd 100644 --- a/Sources/Convert/Convert_Mod/Load_Gmsh.f90 +++ b/Sources/Convert/Convert_Mod/Load_Gmsh.f90 @@ -54,12 +54,12 @@ subroutine Load_Gmsh(Convert, Grid, file_name) if(char(byte(1)) .eq. 'E' .and. & char(byte(2)) .eq. 'n' .and. & char(byte(3)) .eq. 'd') then - do i = 1, MAX_TOKENS*2 + do i = 1, len(Line % whole) read(fu, end=2) byte(0); pos = pos + 1 if(byte(0) .eq. 10) exit end do Line % whole = '' - do i = 1, MAX_TOKENS*2 + do i = 1, len(Line % whole) read(fu, end=2) byte(0); pos = pos + 1 if(byte(0) .eq. 10) exit if(byte(0) .ne. 13) Line % whole(i:i) = char(byte(0)) diff --git a/Sources/Convert/makefile b/Sources/Convert/makefile index d8f9c5b44..54ca5b308 100644 --- a/Sources/Convert/makefile +++ b/Sources/Convert/makefile @@ -200,9 +200,9 @@ endif SRC_F_MOD = Const_Mod.f90 \ Region_Mod.f90 \ String_Mod.f90 \ - Tokenizer_Mod.f90 \ Comm_Mod.f90 \ Assert_Mod.f90 \ + Tokenizer_Mod.f90 \ Message_Mod.f90 \ Vect_Mod.f90 \ Control_Mod.f90 \ diff --git a/Sources/Convert/makefile_explicit_dependencies b/Sources/Convert/makefile_explicit_dependencies index 742245d82..20d71f3c8 100644 --- a/Sources/Convert/makefile_explicit_dependencies +++ b/Sources/Convert/makefile_explicit_dependencies @@ -304,5 +304,6 @@ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- $(DIR_OBJECT)/Tokenizer_Mod.o:\ $(DIR_SHARED)/Tokenizer_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 diff --git a/Sources/Divide/makefile b/Sources/Divide/makefile index 1c7f515f7..9c46a1698 100644 --- a/Sources/Divide/makefile +++ b/Sources/Divide/makefile @@ -199,9 +199,9 @@ endif SRC_F_MOD = Const_Mod.f90 \ Region_Mod.f90 \ String_Mod.f90 \ - Tokenizer_Mod.f90 \ Comm_Mod.f90 \ Assert_Mod.f90 \ + Tokenizer_Mod.f90 \ Message_Mod.f90 \ Vect_Mod.f90 \ Control_Mod.f90 \ diff --git a/Sources/Divide/makefile_explicit_dependencies b/Sources/Divide/makefile_explicit_dependencies index d4b6c4c93..3985220af 100644 --- a/Sources/Divide/makefile_explicit_dependencies +++ b/Sources/Divide/makefile_explicit_dependencies @@ -12,14 +12,7 @@ $(DIR_OBJECT)/Divide_Mod.o:\ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ -Divide_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o - -#--------------------------------------------------- -# Dependencies for: ./Divide_Mod/Logo_Div.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Logo_Div.o:\ -$(DIR_OBJECT)/Const_Mod.o +Divide_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Message_Mod.f90 @@ -285,5 +278,6 @@ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- $(DIR_OBJECT)/Tokenizer_Mod.o:\ $(DIR_SHARED)/Tokenizer_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 diff --git a/Sources/Generate/makefile b/Sources/Generate/makefile index 61ee9335e..754355aed 100644 --- a/Sources/Generate/makefile +++ b/Sources/Generate/makefile @@ -200,9 +200,9 @@ endif SRC_F_MOD = Const_Mod.f90 \ Region_Mod.f90 \ String_Mod.f90 \ - Tokenizer_Mod.f90 \ Comm_Mod.f90 \ Assert_Mod.f90 \ + Tokenizer_Mod.f90 \ Message_Mod.f90 \ Vect_Mod.f90 \ Control_Mod.f90 \ diff --git a/Sources/Generate/makefile_explicit_dependencies b/Sources/Generate/makefile_explicit_dependencies index a86860ba6..c7576b2db 100644 --- a/Sources/Generate/makefile_explicit_dependencies +++ b/Sources/Generate/makefile_explicit_dependencies @@ -362,5 +362,6 @@ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- $(DIR_OBJECT)/Tokenizer_Mod.o:\ $(DIR_SHARED)/Tokenizer_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 diff --git a/Sources/Shared/File_Mod/Read_Line.f90 b/Sources/Shared/File_Mod/Read_Line.f90 index 8f3854ef3..5c9b38d42 100644 --- a/Sources/Shared/File_Mod/Read_Line.f90 +++ b/Sources/Shared/File_Mod/Read_Line.f90 @@ -5,7 +5,7 @@ subroutine Read_Line(File, un, reached_end, remove) ! In addition, it breaks the line in tokens (individual strings). ! ! ! ! A comment is each line which begins with "!", "#" or "%". ! -! Input line must not exceed MAX_TOKENS*2 characters in length ! +! Input line must not exceed len(Line % whole) characters in length ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -36,11 +36,11 @@ subroutine Read_Line(File, un, reached_end, remove) inquire(unit=un, formatted=fmtd) 1 continue if(fmtd .eq. 'YES') then - write(format(3:6), '(i4.4)') MAX_TOKENS*2 + write(format(3:6), '(i4.4)') len(Line % whole) read(un, format, end=2) Line % whole else Line % whole = '' - do i = 1, MAX_TOKENS*2 + do i = 1, len(Line % whole) read(un, end=2) byte if(byte .eq. 10) exit if(byte .ne. 13) Line % whole(i:i) = char(byte) diff --git a/Sources/Shared/Grid_Mod/Print_Regions_List.f90 b/Sources/Shared/Grid_Mod/Print_Regions_List.f90 index 90c420335..53b4fc9c4 100644 --- a/Sources/Shared/Grid_Mod/Print_Regions_List.f90 +++ b/Sources/Shared/Grid_Mod/Print_Regions_List.f90 @@ -7,8 +7,8 @@ subroutine Print_Regions_List(Grid) !---------------------------------[Arguments]----------------------------------! class(Grid_Type) :: Grid !-----------------------------------[Locals]-----------------------------------! - integer :: j, ll, lc - character(MAX_TOKENS*2) :: reg_list + integer :: j, ll, lc + character(DL) :: reg_list !==============================================================================! ! Clear the list diff --git a/Sources/Shared/Tokenizer_Mod.f90 b/Sources/Shared/Tokenizer_Mod.f90 index 34411c02c..fd89d94cf 100644 --- a/Sources/Shared/Tokenizer_Mod.f90 +++ b/Sources/Shared/Tokenizer_Mod.f90 @@ -1,27 +1,29 @@ +#include "../Shared/Assert.h90" + !==============================================================================! module Tokenizer_Mod !------------------------------------------------------------------------------! ! Holds functionality to parse lines into tokens. Tokenizes lines. ! !------------------------------------------------------------------------------! !----------------------------------[Modules]-----------------------------------! - use Const_Mod + use Assert_Mod !------------------------------------------------------------------------------! implicit none !------------------------------[Local parameters]------------------------------! - integer, parameter :: MAX_TOKENS = 2048 + integer, parameter :: MAX_TOKENS = 32 !==============================================================================! !--------------------! ! Tokenizer type ! !--------------------! type Tokenizer_Type - character(MAX_TOKENS*2) :: whole ! whole string - character(SL) :: tokens(MAX_TOKENS) ! tokens - integer :: n_tokens ! number of tokens - integer :: s(MAX_TOKENS), & ! tokens starts ... - e(MAX_TOKENS) ! ... and ends - character(1) :: first, last ! the first and last ... - ! character in the whole + character(DL) :: whole ! whole string + character(SL) :: tokens(MAX_TOKENS) ! tokens + integer :: n_tokens ! number of tokens + integer :: s(MAX_TOKENS), & ! tokens starts ... + e(MAX_TOKENS) ! ... and ends + character(1) :: first, last ! the first and last ... + ! character in the whole contains procedure :: Parse diff --git a/Sources/Shared/Tokenizer_Mod/Parse.f90 b/Sources/Shared/Tokenizer_Mod/Parse.f90 index a0d232249..e5a6b7dfc 100644 --- a/Sources/Shared/Tokenizer_Mod/Parse.f90 +++ b/Sources/Shared/Tokenizer_Mod/Parse.f90 @@ -1,5 +1,5 @@ !==============================================================================! - pure subroutine Parse(Tok) + subroutine Parse(Tok) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -19,10 +19,11 @@ pure subroutine Parse(Tok) Tok % n_tokens = 1 Tok % s(1)=1 end if - do i = 1, MAX_TOKENS*2 - 2 + do i = 1, len(Tok % whole) - 1 if( Tok % whole(i: i ) < '!' .and. & Tok % whole(i+1:i+1) >= '!') then Tok % n_tokens = Tok % n_tokens + 1 + Assert(Tok % n_tokens <= MAX_TOKENS) Tok % s(Tok % n_tokens) = i+1 end if if( Tok % whole(i :i ) >= '!' .and. & From 7a568c817fb2d9cdaa38e02e9bf7df1da0374dfd Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 5 Apr 2023 02:47:43 +0200 Subject: [PATCH 193/223] Fixed line indentation - insignificant. --- Sources/Shared/Isoap_Mod/Isopol.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Shared/Isoap_Mod/Isopol.f90 b/Sources/Shared/Isoap_Mod/Isopol.f90 index 5b55bdca2..bb7c8f243 100644 --- a/Sources/Shared/Isoap_Mod/Isopol.f90 +++ b/Sources/Shared/Isoap_Mod/Isopol.f90 @@ -56,7 +56,7 @@ SUBROUTINE ISOPOL(ISOAP, & ISE(NS,NV),ISNEW,ITYPE,IV,IV1,IVISE(NS,NV),IVNEW,IVNEWT, & NEDGE(NS),NINT,NIPNEW,NISCUT,NIV,NIVNEW !* Avoid unused warning - ASSOCIATE(ISOAP => ISOAP); END ASSOCIATE + ASSOCIATE(ISOAP => ISOAP); END ASSOCIATE !* Determination of the faces intersected by the isosurface NISCUT=0 !* NEDGE(IS) = Number of intersected edges of the face IS From 8e201c0ddae9e96216bd8e7fa497efcae9560cad Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 5 Apr 2023 02:50:07 +0200 Subject: [PATCH 194/223] Last modification proved to be a pain in the neck Going back to 968a1d884c73e663c1f115954fe5ce7ebcad6753 On branch bojan_more_robust_communicator modified: Tokenizer_Mod.f90 --- Sources/Shared/Tokenizer_Mod.f90 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Sources/Shared/Tokenizer_Mod.f90 b/Sources/Shared/Tokenizer_Mod.f90 index fd89d94cf..aaf6bb7de 100644 --- a/Sources/Shared/Tokenizer_Mod.f90 +++ b/Sources/Shared/Tokenizer_Mod.f90 @@ -10,20 +10,20 @@ module Tokenizer_Mod !------------------------------------------------------------------------------! implicit none !------------------------------[Local parameters]------------------------------! - integer, parameter :: MAX_TOKENS = 32 + integer, parameter :: MAX_TOKENS = 2048 !==============================================================================! !--------------------! ! Tokenizer type ! !--------------------! type Tokenizer_Type - character(DL) :: whole ! whole string - character(SL) :: tokens(MAX_TOKENS) ! tokens - integer :: n_tokens ! number of tokens - integer :: s(MAX_TOKENS), & ! tokens starts ... - e(MAX_TOKENS) ! ... and ends - character(1) :: first, last ! the first and last ... - ! character in the whole + character(MAX_TOKENS*2) :: whole ! whole string + character(SL) :: tokens(MAX_TOKENS) ! tokens + integer :: n_tokens ! number of tokens + integer :: s(MAX_TOKENS), & ! tokens starts ... + e(MAX_TOKENS) ! ... and ends + character(1) :: first, last ! the first and last ... + ! character in the whole contains procedure :: Parse From f0202da7227414194c4d5f71ffb566adea21f49b Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 5 Apr 2023 03:04:42 +0200 Subject: [PATCH 195/223] An error has be reduced to warning. In cases of simulaitons with multiple domains, in particulart when mutliple domains are meshed concurrently in GMSH to ensure comformity but some are deleted just before saving the files, the error picked here can occur. However, in that case it is really not an error but rather some faces are hanging blank on purpose. On branch bojan_more_robust_communicator modified: Convert_Mod/Find_Parents.f90 --- Sources/Convert/Convert_Mod/Find_Parents.f90 | 21 +++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/Sources/Convert/Convert_Mod/Find_Parents.f90 b/Sources/Convert/Convert_Mod/Find_Parents.f90 index 7436795a8..b367fe64e 100644 --- a/Sources/Convert/Convert_Mod/Find_Parents.f90 +++ b/Sources/Convert/Convert_Mod/Find_Parents.f90 @@ -195,15 +195,18 @@ subroutine Find_Parents(Convert, Grid) end do ! bc if(n_match_tot .ne. Grid % n_bnd_cells) then - call Message % Error(70, 'Number of boundary cells found is not the '// & - 'same as the one prescribed boundary cells. '// & - 'The probable cause for it is that some ' // & - 'internal faces in Gmsh are denoted as ' // & - 'boundary conditions (physical groups). ' // & - '\n \n ' // & - 'Check the Gmsh mesh for physical groups ' // & - 'and try to repair this.', & - file=__FILE__, line=__LINE__) + call Message % Warning(80, & + 'Number of boundary cells found here is not the same as ' // & + 'the number of boundary cells prescribed in Gmsh. Possible ' // & + 'cause for it is that some internal faces in Gmsh are ' // & + 'marked as boundary conditions (physical groups). \n \n ' // & + 'It might also be that you deleted some volumes in Gmsh ' // & + 'intentionally to ensure conformal mappings for simulations '// & + 'in multiple domains. If that is the case, it is probably ' // & + 'safe to ignore this warning. \n \n ' // & + 'It is, nonetheless, advised to check the Gmsh mesh for ' // & + 'physical groups.', & + file=__FILE__, line=__LINE__) end if call Profiler % Stop('Find_Parents') From 4a0a90d1e9a0acbeb7fd4cdebf64dfff0d1ae4e4 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 5 Apr 2023 05:05:29 +0200 Subject: [PATCH 196/223] Resolved compiler warning for Tokenizer again OK, so it was not the size of the Tokenizer about which compiler was complaining, but the size of the Tokenizer when it is inisde another procedure, this time it was Frameless in Message_Mod. To resolve the warning, I ditched the local Tokenizer from Frameless and use global (singleton) one called "Line". Also, the definition of the line had to be moved, from File_Mod to Tokenizer_Mod, where it should have naturally been all along. On branch bojan_more_robust_communicator modified: Shared/File_Mod.f90 modified: Shared/Message_Mod/Frameless.f90 modified: Shared/Tokenizer_Mod.f90 --- Sources/Shared/File_Mod.f90 | 10 +++--- Sources/Shared/Message_Mod/Frameless.f90 | 41 ++++++++++++------------ Sources/Shared/Tokenizer_Mod.f90 | 5 +++ 3 files changed, 30 insertions(+), 26 deletions(-) diff --git a/Sources/Shared/File_Mod.f90 b/Sources/Shared/File_Mod.f90 index 9c505d695..cac4cffba 100644 --- a/Sources/Shared/File_Mod.f90 +++ b/Sources/Shared/File_Mod.f90 @@ -1,3 +1,4 @@ +#include "../Shared/Assert.h90" #include "../Shared/Unused.h90" !==============================================================================! @@ -40,11 +41,10 @@ module File_Mod end type - !-------------------------------------! - ! Singleton objects Line and File ! - !-------------------------------------! - type(Tokenizer_Type) :: Line - type(File_Type) :: File + !---------------------------! + ! Singleton object File ! + !---------------------------! + type(File_Type) :: File integer(SP) :: int4_array(MAX_ITEMS) integer(DP) :: int8_array(MAX_ITEMS) diff --git a/Sources/Shared/Message_Mod/Frameless.f90 b/Sources/Shared/Message_Mod/Frameless.f90 index 9067ae8d7..00cd94c50 100644 --- a/Sources/Shared/Message_Mod/Frameless.f90 +++ b/Sources/Shared/Message_Mod/Frameless.f90 @@ -5,10 +5,9 @@ subroutine Frameless(Msg, width, message_text) integer, intent(in) :: width character(*), intent(in) :: message_text !-----------------------------------[Locals]-----------------------------------! - type(Tokenizer_Type) :: Tok - integer :: i - integer :: cur_p, nex_p - character(DL) :: line + integer :: i + integer :: cur_p, nex_p + character(DL) :: out_line !------------------------[Avoid unused parent warning]-------------------------! Unused(Msg) !==============================================================================! @@ -18,13 +17,13 @@ subroutine Frameless(Msg, width, message_text) ! Load the argument into tokenizer and parse it ! ! ! !---------------------------------------------------! - Tok % whole = message_text - call Tok % Parse() + Line % whole = message_text + call Line % Parse() - ! Initialize the line - line = ' ' - line(2:2) = '#' - cur_p = 4 ! starts at 4 to allow for one leading space in the output + ! Initialize the output line + out_line = ' ' + out_line(2:2) = '#' + cur_p = 4 ! starts at 4 to allow for one leading space in output !-----------------------------------------------------! ! ! @@ -32,16 +31,16 @@ subroutine Frameless(Msg, width, message_text) ! ! !-----------------------------------------------------! i = 1 - do while (i .le. Tok % n_tokens) + do while (i .le. Line % n_tokens) 1 continue - nex_p = cur_p + len_trim(Tok % tokens(i)) + nex_p = cur_p + len_trim(Line % tokens(i)) !-------------------------------------------------! ! Keep on filling up this line, it still fits ! ! (+3 here is to compensate you started at 4) ! !-------------------------------------------------! - if(nex_p < width + 3 .and. Tok % tokens(i) .ne. '\n') then - write(line(cur_p:nex_p), '(a)') trim(Tok % tokens(i)) // ' ' + if(nex_p < width + 3 .and. Line % tokens(i) .ne. '\n') then + write(out_line(cur_p:nex_p), '(a)') trim(Line % tokens(i)) // ' ' !---------------------------------------------------------! ! Line is too long, print it and reset for new tokens ! @@ -49,15 +48,15 @@ subroutine Frameless(Msg, width, message_text) else ! Print what you have up to now - print '(a)', trim(line) + print '(a)', trim(out_line) - ! (Re)initialize the line - line = ' ' - line(2:2) = '#' - cur_p = 4 + ! (Re)initialize the output line + out_line = ' ' + out_line(2:2) = '#' + cur_p = 4 ! If you came here because of new line character, skip it. - if(Tok % tokens(i) .eq. '\n') i = i + 1 + if(Line % tokens(i) .eq. '\n') i = i + 1 goto 1 end if @@ -70,6 +69,6 @@ subroutine Frameless(Msg, width, message_text) ! Print the last line which was still in the forming ! ! ! !--------------------------------------------------------! - print '(a)', trim(line) + print '(a)', trim(out_line) end subroutine diff --git a/Sources/Shared/Tokenizer_Mod.f90 b/Sources/Shared/Tokenizer_Mod.f90 index aaf6bb7de..4f84bcab8 100644 --- a/Sources/Shared/Tokenizer_Mod.f90 +++ b/Sources/Shared/Tokenizer_Mod.f90 @@ -29,6 +29,11 @@ module Tokenizer_Mod end type + !---------------------------! + ! Singleton object Line ! + !---------------------------! + type(Tokenizer_Type) :: Line + contains # include "Tokenizer_Mod/Parse.f90" From 36b7fcfed19e153b55e1896b7c84251a13aec4ec Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 5 Apr 2023 05:09:20 +0200 Subject: [PATCH 197/223] IMPORTANT: changed the orientation of cells' faces when extracting cells from grid. The way it was before, the Front elements were pointing from VOF=1 towards VOF=0, which is wrong. Read also the comments close to the part of the code which changed. There is no doubt that the whole thing is still a bit nebulous, not surprising when one uses third party libraries, they are always shrouded in a bit of mystery. On branch bojan_more_robust_communicator modified: Shared/Polyhedron_Mod/Extract_From_Grid.f90 --- Sources/Shared/Polyhedron_Mod/Extract_From_Grid.f90 | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Sources/Shared/Polyhedron_Mod/Extract_From_Grid.f90 b/Sources/Shared/Polyhedron_Mod/Extract_From_Grid.f90 index 0944f23fa..8f3458d86 100644 --- a/Sources/Shared/Polyhedron_Mod/Extract_From_Grid.f90 +++ b/Sources/Shared/Polyhedron_Mod/Extract_From_Grid.f90 @@ -97,11 +97,12 @@ subroutine Extract_From_Grid(Pol, Grid, cell, phi_n) dy = Grid % yf(s) - Grid % yc(cell) dz = Grid % zf(s) - Grid % zc(cell) - ! They might be in the wrong order, correct if needed - ! (If the face is oriented outwards to current cell, - ! the nodes have to sorted in reverse order because - ! ISOAP library requies faces to point inwards) - if(sx*dx + sy*dy + sz*dz > 0) then + ! Faces' nodes might be in the wrong order, correct here if needed. + ! (If the face is oriented outwards to current cell,the nodes have to + ! sorted in reverse order because ISOAP requies faces to point inwards. + ! But then again, this seems to make the extracted iso-surface to point + ! from VOF = 1 towards VOF = 0, which is not in line with T-Flows.) + if(sx*dx + sy*dy + sz*dz < 0) then call Sort % Reverse_Order_Int(local_face_nodes(1:faces_n_nodes)) end if From a3ec392d966d0328d2a226c2fb1de5ddf787a345 Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 5 Apr 2023 05:12:40 +0200 Subject: [PATCH 198/223] Gives a proper name in Save_Debug_Front_Vtu. Funny thing ... in order to resolve this, I had to introduce new data member into Grid_Mod called "rank", which is just a number holding the domain number which grid represents. This rank is set in Load_Dim (from Grid_Mod) and special assertions are introduced in File_Mod/Set_Name to make sure the rank is not accidentaly left at zero. On branch bojan_more_robust_communicator modified: Process/Front_Mod/Save_Debug_Front_Vtu.f90 modified: Shared/File_Mod/Set_Name.f90 modified: Shared/Grid_Mod.f90 modified: Shared/Grid_Mod/Load_Dim.f90 --- Sources/Process/Front_Mod/Save_Debug_Front_Vtu.f90 | 9 ++++++--- Sources/Shared/File_Mod/Set_Name.f90 | 2 ++ Sources/Shared/Grid_Mod.f90 | 3 +++ Sources/Shared/Grid_Mod/Load_Dim.f90 | 6 ++++++ 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/Sources/Process/Front_Mod/Save_Debug_Front_Vtu.f90 b/Sources/Process/Front_Mod/Save_Debug_Front_Vtu.f90 index d3bd0aada..63c47cbf6 100644 --- a/Sources/Process/Front_Mod/Save_Debug_Front_Vtu.f90 +++ b/Sources/Process/Front_Mod/Save_Debug_Front_Vtu.f90 @@ -38,7 +38,8 @@ subroutine Save_Debug_Front_Vtu(Front, time_step) call File % Set_Name(name_out, & time_step=time_step, & appendix='-front', & - extension='.pvtu') + extension='.pvtu', & + domain=Grid % rank) call File % Open_For_Writing_Ascii(name_out, fu) ! Header @@ -84,7 +85,8 @@ subroutine Save_Debug_Front_Vtu(Front, time_step) processor = This_Proc(), & time_step = time_step, & appendix = '-front', & - extension = '.vtu') + extension = '.vtu', & + domain=Grid % rank) call File % Open_For_Writing_Ascii(name_out, fu) !------------! @@ -298,7 +300,8 @@ subroutine Save_Debug_Front_Vtu(Front, time_step) call File % Set_Name(name_out, & time_step=time_step, & appendix ='-intersections', & - extension='.vtu') + extension='.vtu', & + domain=Grid % rank) call File % Open_For_Writing_Ascii(name_out, fu) !------------! diff --git a/Sources/Shared/File_Mod/Set_Name.f90 b/Sources/Shared/File_Mod/Set_Name.f90 index 639c47f0e..000cdc3cd 100644 --- a/Sources/Shared/File_Mod/Set_Name.f90 +++ b/Sources/Shared/File_Mod/Set_Name.f90 @@ -46,6 +46,8 @@ subroutine Set_Name(File, & ! Handle problems with multiple domains ! !-------------------------------------------! if(present(domain)) then + Assert(domain >= 1) + Assert(domain <= MD) lnam = len_trim(problem_name(domain)) if(last_pos > 0) then name_out(last_pos+1:last_pos+lnam) = problem_name(domain)(1:lnam) diff --git a/Sources/Shared/Grid_Mod.f90 b/Sources/Shared/Grid_Mod.f90 index a7d5ffb41..25ed98291 100644 --- a/Sources/Shared/Grid_Mod.f90 +++ b/Sources/Shared/Grid_Mod.f90 @@ -47,6 +47,9 @@ module Grid_Mod integer :: per_y_reg = 0 ! periodic y region integer :: per_z_reg = 0 ! periodic z region + ! Rank (in case of simulations with multiple domains) + integer :: rank = 0 + ! Periodic span real :: per_x, per_y, per_z diff --git a/Sources/Shared/Grid_Mod/Load_Dim.f90 b/Sources/Shared/Grid_Mod/Load_Dim.f90 index f9eaa8786..5609a61f5 100644 --- a/Sources/Shared/Grid_Mod/Load_Dim.f90 +++ b/Sources/Shared/Grid_Mod/Load_Dim.f90 @@ -23,6 +23,12 @@ subroutine Load_Dim(Grid, this_proc, domain) domain=domain) call File % Open_For_Reading_Binary(name_in, fu, this_proc) + !----------------------------------------------! + ! Store rank (domain number) for this grid ! + !----------------------------------------------! + Grid % rank = 0 + if(present(domain)) Grid % rank = domain + !-------------------------! ! Read real precision ! !-------------------------! From e4ad9150ae5441b94dc8630635e6cd174b01d815 Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 6 Apr 2023 13:30:01 +0200 Subject: [PATCH 199/223] Some updates in vim control file On branch bojan_more_robust_communicator modified: Documentation/Syntax/.vim/syntax/control.vim --- Documentation/Syntax/.vim/syntax/control.vim | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Documentation/Syntax/.vim/syntax/control.vim b/Documentation/Syntax/.vim/syntax/control.vim index 150fb1971..b7c395330 100644 --- a/Documentation/Syntax/.vim/syntax/control.vim +++ b/Documentation/Syntax/.vim/syntax/control.vim @@ -231,6 +231,11 @@ syn keyword controlIntrinsic u v w t q p kin eps zeta f22 syn keyword controlIntrinsic c_01 c_02 c_03 c_04 c_05 c_06 q_01 q_02 q_03 q_04 q_05 q_06 syn keyword controlIntrinsic x y z rx ry rz syn keyword controlBoundaryConditon wall inflow outflow pressure convective symmetry +syn keyword controlLinearSolvers native petsc cg bicg incomplete_cholesky diagonal none asm hypre +syn keyword controlNumericalParameters simple piso linear parabolic gauss_theorem least_squares +syn keyword controlNumericalParameters central smart luds quick smart gamma minmod blended superbee avl_smart +syn keyword controlNumericalParameters cicsam upwind stacs +syn keyword controlNumericalParameters yes no " ============================================================================== " The default methods for highlighting. Can be overridden later. @@ -240,6 +245,8 @@ hi def link controlInteger Number hi def link controlFloat Number hi def link controlIntrinsic Identifier hi def link controlBoundaryConditon Keyword +hi def link controlLinearSolvers Keyword +hi def link controlNumericalParameters Keyword let b:current_syntax = "control" From 9d8ab306ada7cfa0c46cd4e2c2070a34919ecd3d Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 15 Apr 2023 07:38:38 +0200 Subject: [PATCH 200/223] A small update! On branch bojan_more_robust_communicator modified: Documentation/Syntax/.vim/syntax/fortran.vim --- Documentation/Syntax/.vim/syntax/fortran.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Documentation/Syntax/.vim/syntax/fortran.vim b/Documentation/Syntax/.vim/syntax/fortran.vim index 76f39fe46..7f49bfec2 100644 --- a/Documentation/Syntax/.vim/syntax/fortran.vim +++ b/Documentation/Syntax/.vim/syntax/fortran.vim @@ -440,8 +440,8 @@ if b:fortran_dialect == "f08" syn keyword fortranConstant NO_TURBULENCE_MODEL DNS LES_SMAGORINSKY LES_DYNAMIC syn keyword fortranConstant LES_WALE LES_TVM K_EPS K_EPS_ZETA_F DES_SPALART syn keyword fortranConstant SPALART_ALLMARAS RSM_HANJALIC_JAKIRLIC RSM_MANCEAU_HANJALIC - syn keyword fortranConstant HYBRID_LES_RANS HYBRID_LES_PRANDTL STABILIZED SGDH GGDH AFM - syn keyword fortranConstant SWITCH_DISTANCE SWITCH_VELOCITY + syn keyword fortranConstant HYBRID_LES_RANS HYBRID_LES_PRANDTL STABILIZED SGDH GGDH AFM A_POW B_POW + syn keyword fortranConstant SWITCH_DISTANCE SWITCH_VELOCITY THERMALLY_DRIVEN DENSITY_DRIVEN " Constants from Region_Mod syn keyword fortranConstant INFLOW WALL WALLFL OUTFLOW SYMMETRY CONVECT PRESSURE syn keyword fortranConstant INSIDE BUFFER PERIODIC_X PERIODIC_Y PERIODIC_Z UNDEFINED From 339619c6d94ceac6f5242cce603ca3c7f8f915c4 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 16 Apr 2023 11:55:55 +0200 Subject: [PATCH 201/223] Introduced Time_Type class and its object Time Date: Sun Apr 16 11:55:55 2023 +0200 On branch bojan_time_module modified: Sources/Process/Backup_Mod/Load.f90 modified: Sources/Process/Backup_Mod/Save.f90 modified: Sources/Process/Backup_Mod/Time_To_Save_Backup.f90 modified: Sources/Process/Field_Mod.f90 modified: Sources/Process/Field_Mod/Utilities/Report_Vol_Balance.f90 modified: Sources/Process/Field_Mod/Utilities/Report_Vol_Balance_Start.f90 modified: Sources/Process/Main_Pro.f90 modified: Sources/Process/Process_Mod/Compute_Energy.f90 modified: Sources/Process/Process_Mod/Compute_Momentum.f90 modified: Sources/Process/Process_Mod/Compute_Pressure.f90 modified: Sources/Process/Process_Mod/Compute_Scalar.f90 modified: Sources/Process/Process_Mod/Convective_Outflow.f90 modified: Sources/Process/Process_Mod/Correct_Velocity.f90 modified: Sources/Process/Process_Mod/Piso_Algorithm.f90 modified: Sources/Process/Results_Mod/Main_Results.f90 modified: Sources/Process/Results_Mod/Save_Vtu_Front.f90 modified: Sources/Process/Results_Mod/Save_Vtu_Results.f90 modified: Sources/Process/Results_Mod/Save_Vtu_Surf.f90 modified: Sources/Process/Results_Mod/Save_Vtu_Swarm.f90 modified: Sources/Process/Results_Mod/Time_To_Save_Results.f90 modified: Sources/Process/Results_Mod/Time_To_Save_Swarm.f90 modified: Sources/Process/Swarm_Mod/Advance_Particles.f90 modified: Sources/Process/Swarm_Mod/Calculate_Mean.f90 new file: Sources/Process/Time_Mod.f90 new file: Sources/Process/Time_Mod/Curr_Dt.f90 new file: Sources/Process/Time_Mod/First_Dt.f90 new file: Sources/Process/Time_Mod/Get_Time.f90 new file: Sources/Process/Time_Mod/Increase_Time.f90 new file: Sources/Process/Time_Mod/Last_Dt.f90 new file: Sources/Process/Time_Mod/Needs_More_Steps.f90 new file: Sources/Process/Time_Mod/Set_Curr_Dt.f90 new file: Sources/Process/Time_Mod/Set_First_Dt.f90 new file: Sources/Process/Time_Mod/Set_Last_Dt.f90 new file: Sources/Process/Time_Mod/Set_Time.f90 modified: Sources/Process/User_Mod/Beginning_Of_Compute_Energy.f90 modified: Sources/Process/User_Mod/Beginning_Of_Compute_Momentum.f90 modified: Sources/Process/User_Mod/Beginning_Of_Compute_Pressure.f90 modified: Sources/Process/User_Mod/Beginning_Of_Compute_Scalar.f90 modified: Sources/Process/User_Mod/Beginning_Of_Compute_Vof.f90 modified: Sources/Process/User_Mod/Beginning_Of_Correct_Velocity.f90 modified: Sources/Process/User_Mod/Beginning_Of_Iteration.f90 modified: Sources/Process/User_Mod/Beginning_Of_Simulation.f90 modified: Sources/Process/User_Mod/Beginning_Of_Time_Step.f90 modified: Sources/Process/User_Mod/Calculate_Mean.f90 modified: Sources/Process/User_Mod/End_Of_Compute_Energy.f90 modified: Sources/Process/User_Mod/End_Of_Compute_Momentum.f90 modified: Sources/Process/User_Mod/End_Of_Compute_Pressure.f90 modified: Sources/Process/User_Mod/End_Of_Compute_Scalar.f90 modified: Sources/Process/User_Mod/End_Of_Compute_Vof.f90 modified: Sources/Process/User_Mod/End_Of_Correct_Velocity.f90 modified: Sources/Process/User_Mod/End_Of_Iteration.f90 modified: Sources/Process/User_Mod/End_Of_Simulation.f90 modified: Sources/Process/User_Mod/End_Of_Time_Step.f90 modified: Sources/Process/User_Mod/Insert_Particles.f90 modified: Sources/Process/User_Mod/Save_Results.f90 modified: Sources/Process/User_Mod/Save_Swarm.f90 modified: Tests/Functionality/Communication/User_Mod/Beginning_Of_Time_Step.f90 modified: Tests/Functionality/Omp/User_Mod/Beginning_Of_Simulation.f90 modified: Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/End_Of_Time_Step.f90 modified: Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/Save_Results.f90 modified: Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/End_Of_Time_Step.f90 modified: Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/Save_Results.f90 modified: Tests/Laminar/Cavity/Thermally_Driven/Conjugate/User_Mod/End_Of_Time_Step.f90 modified: Tests/Laminar/Cavity/Thermally_Driven/Direct/Variable_Properties_Air/User_Mod/Beginning_Of_Simulation.f90 modified: Tests/Laminar/Cavity/Thermally_Driven/Direct/Variable_Properties_Air/User_Mod/Beginning_Of_Time_Step.f90 modified: Tests/Laminar/Cylinder/Vertical/User_Mod/Beginning_Of_Iteration.f90 modified: Tests/Laminar/Cylinder/Vertical/User_Mod/Save_Results.f90 modified: Tests/Laminar/Flat_Plate/User_Mod/Plain_Nu.f90 modified: Tests/Laminar/Flat_Plate/User_Mod/Plain_Profiles.f90 modified: Tests/Laminar/Flat_Plate/User_Mod/Save_Results.f90 modified: Tests/Laminar/Membrane/2_Domains/User_Mod/Beginning_Of_Iteration.f90 modified: Tests/Les/Barc/User_Mod/Beginning_Of_Simulation.f90 modified: Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/End_Of_Time_Step.f90 modified: Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/Save_Results.f90 modified: Tests/Les/Channel_Re_Tau_180/User_Mod/Save_Results.f90 modified: Tests/Les/Forrest/User_Mod/Beginning_Of_Time_Step.f90 modified: Tests/Les/Forrest/User_Mod/End_Of_Time_Step.f90 modified: Tests/Les/Forrest/User_Mod/Save_Results.f90 modified: Tests/Les/Pipe_Re_Tau_180/User_Mod/End_Of_Time_Step.f90 modified: Tests/Les/Pipe_Re_Tau_180/User_Mod/Save_Results.f90 modified: Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 modified: Tests/Manual/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 modified: Tests/Manual/Conjugate/User_Mod/End_Of_Time_Step.f90 modified: Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 modified: Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Profiles.f90 modified: Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Results.f90 modified: Tests/Manual/Inflows/Option_4/User_Mod/End_Of_Time_Step.f90 modified: Tests/Manual/Matrix_Of_Cubes/User_Mod/Beginning_Of_Simulation.f90 modified: Tests/Manual/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 modified: Tests/Manual/Thermally_Driven/Varible/User_Mod/Beginning_Of_Simulation.f90 modified: Tests/Manual/Thermally_Driven/Varible/User_Mod/Beginning_Of_Time_Step.f90 modified: Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Cf_St.f90 modified: Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Profiles.f90 modified: Tests/Rans/Backstep_Re_28000/User_Mod/Save_Results.f90 modified: Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Save_Results.f90 modified: Tests/Rans/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 modified: Tests/Rans/Channel_Re_Tau_590/Uniform_Mesh/User_Mod/Save_Results.f90 modified: Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 modified: Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Profiles.f90 modified: Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Results.f90 modified: Tests/Rans/Pipe_Re_Tau_550/User_Mod/Save_Results.f90 modified: Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 modified: Tests/Swarm/Bend_90_Degrees/User_Mod/Insert_Particles.f90 modified: Tests/Swarm/Channel_Re_Tau_590/User_Mod/End_Of_Time_Step.f90 modified: Tests/Swarm/Channel_Re_Tau_590/User_Mod/Insert_Particles.f90 modified: Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Results.f90 modified: Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Swarm.f90 modified: Tests/Swarm/Cylinders_Periodic/User_Mod/Insert_Particles.f90 modified: Tests/Swarm/Rod_Bundle_Polyhedral/User_Mod/Insert_Particles.f90 modified: Tests/Swarm/T_Junction_Square/User_Mod/Insert_Particles.f90 modified: Tests/Swarm/Three_Phase_Flow/User_Mod/Insert_Particles.f90 modified: Tests/Vof/Dam_Break_3d/User_Mod/End_Of_Time_Step.f90 modified: Tests/Vof/Mencinger_And_Zun/User_Mod/Beginning_Of_Correct_Velocity.f90 modified: Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Compute_Momentum.f90 modified: Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Compute_Pressure.f90 modified: Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Correct_Velocity.f90 modified: Tests/Vof/Pie/User_Mod/End_Of_Time_Step.f90 modified: Tests/Vof/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 modified: Tests/Vof/Spurious/User_Mod/End_Of_Time_Step.f90 modified: Tests/Vof/Stefan/User_Mod/End_Of_Compute_Energy.f90 modified: Tests/Vof/Stefan/User_Mod/End_Of_Compute_Pressure.f90 modified: Tests/Vof/Stefan/User_Mod/End_Of_Compute_Vof.f90 modified: Tests/Vof/Sucking/User_Mod/End_Of_Compute_Energy.f90 modified: Tests/Vof/Sucking/User_Mod/End_Of_Compute_Pressure.f90 modified: Tests/Vof/Sucking/User_Mod/End_Of_Compute_Vof.f90 modified: Tests/Vof/Vertical_Tube/User_Mod/End_Of_Time_Step.f90 --- Sources/Process/Backup_Mod/Load.f90 | 26 +++--- Sources/Process/Backup_Mod/Save.f90 | 25 +++-- .../Backup_Mod/Time_To_Save_Backup.f90 | 7 +- Sources/Process/Field_Mod.f90 | 1 + .../Utilities/Report_Vol_Balance.f90 | 12 +-- .../Utilities/Report_Vol_Balance_Start.f90 | 10 +- Sources/Process/Main_Pro.f90 | 93 ++++++++----------- .../Process/Process_Mod/Compute_Energy.f90 | 7 +- .../Process/Process_Mod/Compute_Momentum.f90 | 8 +- .../Process/Process_Mod/Compute_Pressure.f90 | 11 +-- .../Process/Process_Mod/Compute_Scalar.f90 | 8 +- .../Process_Mod/Convective_Outflow.f90 | 45 +++++---- .../Process/Process_Mod/Correct_Velocity.f90 | 7 +- .../Process/Process_Mod/Piso_Algorithm.f90 | 9 +- Sources/Process/Results_Mod/Main_Results.f90 | 52 +++++------ .../Process/Results_Mod/Save_Vtu_Front.f90 | 37 ++++---- .../Process/Results_Mod/Save_Vtu_Results.f90 | 77 ++++++++------- Sources/Process/Results_Mod/Save_Vtu_Surf.f90 | 13 ++- .../Process/Results_Mod/Save_Vtu_Swarm.f90 | 19 ++-- .../Results_Mod/Time_To_Save_Results.f90 | 6 +- .../Results_Mod/Time_To_Save_Swarm.f90 | 10 +- .../Process/Swarm_Mod/Advance_Particles.f90 | 7 +- Sources/Process/Swarm_Mod/Calculate_Mean.f90 | 5 +- Sources/Process/Time_Mod.f90 | 56 +++++++++++ Sources/Process/Time_Mod/Curr_Dt.f90 | 9 ++ Sources/Process/Time_Mod/First_Dt.f90 | 9 ++ Sources/Process/Time_Mod/Get_Time.f90 | 9 ++ Sources/Process/Time_Mod/Increase_Time.f90 | 10 ++ Sources/Process/Time_Mod/Last_Dt.f90 | 9 ++ Sources/Process/Time_Mod/Needs_More_Steps.f90 | 38 ++++++++ Sources/Process/Time_Mod/Set_Curr_Dt.f90 | 10 ++ Sources/Process/Time_Mod/Set_First_Dt.f90 | 10 ++ Sources/Process/Time_Mod/Set_Last_Dt.f90 | 10 ++ Sources/Process/Time_Mod/Set_Time.f90 | 10 ++ Sources/Process/Turb_Mod/Calculate_Mean.f90 | 6 +- Sources/Process/Turb_Mod/Compute_F22.f90 | 5 +- Sources/Process/Turb_Mod/Compute_Stress.f90 | 5 +- Sources/Process/Turb_Mod/Compute_Variable.f90 | 5 +- Sources/Process/Turb_Mod/Main_Turb.f90 | 39 ++++---- .../Turb_Mod/Src_Zeta_K_Eps_Zeta_F.f90 | 5 +- .../User_Mod/Beginning_Of_Compute_Energy.f90 | 4 +- .../Beginning_Of_Compute_Momentum.f90 | 4 +- .../Beginning_Of_Compute_Pressure.f90 | 4 +- .../User_Mod/Beginning_Of_Compute_Scalar.f90 | 4 +- .../User_Mod/Beginning_Of_Compute_Vof.f90 | 5 +- .../Beginning_Of_Correct_Velocity.f90 | 4 +- .../User_Mod/Beginning_Of_Iteration.f90 | 13 +-- .../User_Mod/Beginning_Of_Simulation.f90 | 13 +-- .../User_Mod/Beginning_Of_Time_Step.f90 | 5 +- Sources/Process/User_Mod/Calculate_Mean.f90 | 5 +- .../User_Mod/End_Of_Compute_Energy.f90 | 3 +- .../User_Mod/End_Of_Compute_Momentum.f90 | 4 +- .../User_Mod/End_Of_Compute_Pressure.f90 | 3 +- .../User_Mod/End_Of_Compute_Scalar.f90 | 4 +- .../Process/User_Mod/End_Of_Compute_Vof.f90 | 9 +- .../User_Mod/End_Of_Correct_Velocity.f90 | 3 +- Sources/Process/User_Mod/End_Of_Iteration.f90 | 12 +-- .../Process/User_Mod/End_Of_Simulation.f90 | 12 +-- Sources/Process/User_Mod/End_Of_Time_Step.f90 | 4 +- Sources/Process/User_Mod/Insert_Particles.f90 | 4 +- Sources/Process/User_Mod/Save_Results.f90 | 13 ++- Sources/Process/User_Mod/Save_Swarm.f90 | 13 ++- Sources/Process/Vof_Mod/Core/Compute_Vof.f90 | 9 +- Sources/Process/Vof_Mod/Core/Main_Vof.f90 | 5 +- Sources/Process/makefile | 1 + .../Process/makefile_explicit_dependencies | 23 ++--- .../User_Mod/Beginning_Of_Time_Step.f90 | 4 +- .../Omp/User_Mod/Beginning_Of_Simulation.f90 | 13 +-- .../User_Mod/End_Of_Time_Step.f90 | 8 +- .../Uniform_Mesh/User_Mod/Save_Results.f90 | 21 ++--- .../User_Mod/End_Of_Time_Step.f90 | 4 +- .../Channel_Re_2000/User_Mod/Save_Results.f90 | 13 ++- .../Conjugate/User_Mod/End_Of_Time_Step.f90 | 4 +- .../User_Mod/Beginning_Of_Simulation.f90 | 12 +-- .../User_Mod/Beginning_Of_Time_Step.f90 | 12 +-- .../User_Mod/Beginning_Of_Iteration.f90 | 4 +- .../Vertical/User_Mod/Save_Results.f90 | 5 +- .../Laminar/Flat_Plate/User_Mod/Plain_Nu.f90 | 9 +- .../Flat_Plate/User_Mod/Plain_Profiles.f90 | 37 +++++--- .../Flat_Plate/User_Mod/Save_Results.f90 | 9 +- .../User_Mod/Beginning_Of_Iteration.f90 | 4 +- .../Barc/User_Mod/Beginning_Of_Simulation.f90 | 5 +- .../User_Mod/End_Of_Time_Step.f90 | 8 +- .../Periodic_Domain/User_Mod/Save_Results.f90 | 13 ++- .../User_Mod/Save_Results.f90 | 3 +- .../User_Mod/Beginning_Of_Time_Step.f90 | 5 +- .../Les/Forrest/User_Mod/End_Of_Time_Step.f90 | 8 +- Tests/Les/Forrest/User_Mod/Save_Results.f90 | 15 ++- .../User_Mod/End_Of_Time_Step.f90 | 8 +- .../Pipe_Re_Tau_180/User_Mod/Save_Results.f90 | 21 ++--- .../User_Mod/Save_Results.f90 | 21 ++--- .../Stretched_Mesh/User_Mod/Save_Results.f90 | 11 +-- .../Conjugate/User_Mod/End_Of_Time_Step.f90 | 4 +- .../User_Mod/Save_Impinging_Jet_Nu.f90 | 5 +- .../User_Mod/Save_Impinging_Jet_Profiles.f90 | 17 ++-- .../User_Mod/Save_Results.f90 | 9 +- .../Option_4/User_Mod/End_Of_Time_Step.f90 | 8 +- .../User_Mod/Beginning_Of_Simulation.f90 | 5 +- .../User_Mod/End_Of_Time_Step.f90 | 6 +- .../User_Mod/Beginning_Of_Simulation.f90 | 4 +- .../User_Mod/Beginning_Of_Time_Step.f90 | 4 +- .../User_Mod/Backstep_Cf_St.f90 | 8 +- .../User_Mod/Backstep_Profiles.f90 | 26 +++--- .../User_Mod/Save_Results.f90 | 9 +- .../Rsm/User_Mod/Save_Results.f90 | 21 ++--- .../Stretched_Mesh/User_Mod/Save_Results.f90 | 21 ++--- .../Uniform_Mesh/User_Mod/Save_Results.f90 | 21 ++--- .../User_Mod/Impinging_Jet_Nu.f90 | 9 +- .../User_Mod/Impinging_Jet_Profiles.f90 | 17 ++-- .../User_Mod/Save_Results.f90 | 9 +- .../Pipe_Re_Tau_550/User_Mod/Save_Results.f90 | 21 ++--- .../User_Mod/Save_Results.f90 | 17 ++-- .../User_Mod/Insert_Particles.f90 | 12 +-- .../User_Mod/End_Of_Time_Step.f90 | 8 +- .../User_Mod/Insert_Particles.f90 | 6 +- .../User_Mod/Save_Results.f90 | 7 +- .../User_Mod/Save_Swarm.f90 | 7 +- .../User_Mod/Insert_Particles.f90 | 6 +- .../User_Mod/Insert_Particles.f90 | 6 +- .../User_Mod/Insert_Particles.f90 | 6 +- .../User_Mod/Insert_Particles.f90 | 6 +- .../User_Mod/End_Of_Time_Step.f90 | 10 +- .../Beginning_Of_Correct_Velocity.f90 | 6 +- .../User_Mod/End_Of_Compute_Momentum.f90 | 6 +- .../User_Mod/End_Of_Compute_Pressure.f90 | 5 +- .../User_Mod/End_Of_Correct_Velocity.f90 | 7 +- Tests/Vof/Pie/User_Mod/End_Of_Time_Step.f90 | 17 +--- .../User_Mod/End_Of_Time_Step.f90 | 24 ++--- .../Spurious/User_Mod/End_Of_Time_Step.f90 | 10 +- .../Stefan/User_Mod/End_Of_Compute_Energy.f90 | 5 +- .../User_Mod/End_Of_Compute_Pressure.f90 | 3 +- .../Stefan/User_Mod/End_Of_Compute_Vof.f90 | 3 +- .../User_Mod/End_Of_Compute_Energy.f90 | 9 +- .../User_Mod/End_Of_Compute_Pressure.f90 | 3 +- .../Sucking/User_Mod/End_Of_Compute_Vof.f90 | 7 +- .../User_Mod/End_Of_Time_Step.f90 | 4 +- 136 files changed, 812 insertions(+), 812 deletions(-) create mode 100644 Sources/Process/Time_Mod.f90 create mode 100644 Sources/Process/Time_Mod/Curr_Dt.f90 create mode 100644 Sources/Process/Time_Mod/First_Dt.f90 create mode 100644 Sources/Process/Time_Mod/Get_Time.f90 create mode 100644 Sources/Process/Time_Mod/Increase_Time.f90 create mode 100644 Sources/Process/Time_Mod/Last_Dt.f90 create mode 100644 Sources/Process/Time_Mod/Needs_More_Steps.f90 create mode 100644 Sources/Process/Time_Mod/Set_Curr_Dt.f90 create mode 100644 Sources/Process/Time_Mod/Set_First_Dt.f90 create mode 100644 Sources/Process/Time_Mod/Set_Last_Dt.f90 create mode 100644 Sources/Process/Time_Mod/Set_Time.f90 diff --git a/Sources/Process/Backup_Mod/Load.f90 b/Sources/Process/Backup_Mod/Load.f90 index 6858fc214..ae9566e13 100644 --- a/Sources/Process/Backup_Mod/Load.f90 +++ b/Sources/Process/Backup_Mod/Load.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Load(Backup, Flow, Turb, Vof, Swarm, time, time_step, bckp) + subroutine Load(Backup, Flow, Turb, Vof, Swarm, bckp) !------------------------------------------------------------------------------! ! Loads backup files name.backup ! !------------------------------------------------------------------------------! @@ -10,8 +10,6 @@ subroutine Load(Backup, Flow, Turb, Vof, Swarm, time, time_step, bckp) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - real :: time ! time of simulation - integer :: time_step ! current time step logical :: bckp, present !-----------------------------------[Locals]-----------------------------------! type(Comm_Type), pointer :: Comm @@ -19,8 +17,9 @@ subroutine Load(Backup, Flow, Turb, Vof, Swarm, time, time_step, bckp) type(Bulk_Type), pointer :: bulk type(Var_Type), pointer :: phi character(SL) :: name_in, answer, name_mean - integer :: vc, sc + integer :: vc, sc, ts integer(DP) :: d + real :: st ! saved time, simulation time !==============================================================================! ! Take aliases @@ -76,20 +75,21 @@ subroutine Load(Backup, Flow, Turb, Vof, Swarm, time, time_step, bckp) ! ! !---------------! - !-----------------------------------------------! - ! Skip three coordinates for the time being ! - !-----------------------------------------------! - ! call Backup % Load_Cell_Real(Grid, d, vc, 'x_coords', Grid % xc) - ! call Backup % Load_Cell_Real(Grid, d, vc, 'y_coords', Grid % yc) - ! call Backup % Load_Cell_Real(Grid, d, vc, 'z_coords', Grid % zc) + !---------------------------------! + ! Related to time integration ! + !---------------------------------! ! Time step - call Backup % Load_Int(Comm, d, vc, 'time_step', time_step) + call Backup % Load_Int(Comm, d, vc, 'time_step', ts) + call Time % Set_First_Dt(ts) ! Simulation time - call Backup % Load_Real(Comm, d, vc, 'time', time) + call Backup % Load_Real(Comm, d, vc, 'time', st) + call Time % Set_Time(st) - ! Bulk flows and pressure drops in each direction + !-----------------------------------------------------! + ! Bulk flows and pressure drops in each direction ! + !-----------------------------------------------------! call Backup % Load_Real(Comm, d, vc, 'bulk_flux_x', bulk % flux_x) call Backup % Load_Real(Comm, d, vc, 'bulk_flux_y', bulk % flux_y) call Backup % Load_Real(Comm, d, vc, 'bulk_flux_z', bulk % flux_z) diff --git a/Sources/Process/Backup_Mod/Save.f90 b/Sources/Process/Backup_Mod/Save.f90 index 995e291eb..84e5f4d2f 100644 --- a/Sources/Process/Backup_Mod/Save.f90 +++ b/Sources/Process/Backup_Mod/Save.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Save(Backup, Flow, Turb, Vof, Swarm, time, time_step, dom) + subroutine Save(Backup, Flow, Turb, Vof, Swarm, dom) !------------------------------------------------------------------------------! ! Saves backup files name.backup ! !------------------------------------------------------------------------------! @@ -10,8 +10,6 @@ subroutine Save(Backup, Flow, Turb, Vof, Swarm, time, time_step, dom) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - real :: time ! time of simulation - integer :: time_step ! current time step integer, optional :: dom !-----------------------------------[Locals]-----------------------------------! type(Comm_Type), pointer :: Comm @@ -31,7 +29,7 @@ subroutine Save(Backup, Flow, Turb, Vof, Swarm, time, time_step, dom) Comm => Grid % Comm ! Name backup file - call File % Set_Name(name_out, time_step=time_step, & + call File % Set_Name(name_out, time_step = Time % Curr_Dt(), & extension='.backup', domain=dom) ! Open backup file @@ -46,29 +44,28 @@ subroutine Save(Backup, Flow, Turb, Vof, Swarm, time, time_step, dom) ! Intialize number of stored variables vc = 0 - !-----------------------------------------------------------------------! - ! Save cell-centre coordinates. Could be useful for interpolations ! - !-----------------------------------------------------------------------! - call Backup % Save_Cell_Real(Grid, d, vc, 'x_coords', Grid % xc) - call Backup % Save_Cell_Real(Grid, d, vc, 'y_coords', Grid % yc) - call Backup % Save_Cell_Real(Grid, d, vc, 'z_coords', Grid % zc) - !---------------! ! ! ! Save data ! ! ! !---------------! + !---------------------------------! + ! Related to time integration ! + !---------------------------------! + ! Time step - call Backup % Save_Int(Comm, d, vc, 'time_step', time_step) + call Backup % Save_Int(Comm, d, vc, 'time_step', Time % Curr_Dt()) ! Simulation time - call Backup % Save_Real(Comm, d, vc, 'time', time) + call Backup % Save_Real(Comm, d, vc, 'time', Time % Get_Time()) ! Number of processors call Backup % Save_Int(Comm, d, vc, 'n_proc', N_Procs()) - ! Bulk flows and pressure drops in each direction + !-----------------------------------------------------! + ! Bulk flows and pressure drops in each direction ! + !-----------------------------------------------------! call Backup % Save_Real(Comm, d, vc, 'bulk_flux_x', bulk % flux_x) call Backup % Save_Real(Comm, d, vc, 'bulk_flux_y', bulk % flux_y) call Backup % Save_Real(Comm, d, vc, 'bulk_flux_z', bulk % flux_z) diff --git a/Sources/Process/Backup_Mod/Time_To_Save_Backup.f90 b/Sources/Process/Backup_Mod/Time_To_Save_Backup.f90 index 26f0e512a..bd77cac24 100644 --- a/Sources/Process/Backup_Mod/Time_To_Save_Backup.f90 +++ b/Sources/Process/Backup_Mod/Time_To_Save_Backup.f90 @@ -1,13 +1,12 @@ !==============================================================================! - logical function Time_To_Save_Backup(Backup, curr_dt) + logical function Time_To_Save_Backup(Backup) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! class(Backup_Type) :: Backup - integer :: curr_dt ! current time step !==============================================================================! - Time_To_Save_Backup = mod(curr_dt, backup % interval) .eq. 0 & - .and. .not. curr_dt .eq. 0 + Time_To_Save_Backup = mod(Time % Curr_Dt(), backup % interval) .eq. 0 & + .and. .not. Time % Curr_Dt() .eq. 0 end function diff --git a/Sources/Process/Field_Mod.f90 b/Sources/Process/Field_Mod.f90 index a06c21b93..23e2bcc34 100644 --- a/Sources/Process/Field_Mod.f90 +++ b/Sources/Process/Field_Mod.f90 @@ -12,6 +12,7 @@ module Field_Mod use Face_Mod use Bulk_Mod use Solver_Mod + use Time_Mod use Numerics_Mod !------------------------------------------------------------------------------! implicit none diff --git a/Sources/Process/Field_Mod/Utilities/Report_Vol_Balance.f90 b/Sources/Process/Field_Mod/Utilities/Report_Vol_Balance.f90 index 1bb7b7ac3..1f752d91f 100644 --- a/Sources/Process/Field_Mod/Utilities/Report_Vol_Balance.f90 +++ b/Sources/Process/Field_Mod/Utilities/Report_Vol_Balance.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Report_Vol_Balance(Flow, Sol, curr_dt, ini) + subroutine Report_Vol_Balance(Flow, Sol, ini) !------------------------------------------------------------------------------! ! Opens file for volume balance reporting. !------------------------------------------------------------------------------! @@ -7,7 +7,7 @@ subroutine Report_Vol_Balance(Flow, Sol, curr_dt, ini) !---------------------------------[Arguments]----------------------------------! class(Field_Type), target :: Flow type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt, ini + integer, intent(in) :: ini !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid real, contiguous, pointer :: b(:) @@ -28,12 +28,12 @@ subroutine Report_Vol_Balance(Flow, Sol, curr_dt, ini) if(First_Proc()) then if(Flow % p_m_coupling == PISO) then write(Flow % fuvbr, '(a,i6.6,a,i3.3,a,i2.2,es13.5)') & - '# ts-', curr_dt, & - ' oi-', ini, & + '# ts-', Time % Curr_Dt(), & + ' oi-', ini, & ' ii-', Flow % i_corr, src else - write(Flow % fuvbr, '(a,i6.6,a,i3.3,es13.5)') & - '# ts-', curr_dt, & + write(Flow % fuvbr, '(a,i6.6,a,i3.3,es13.5)') & + '# ts-', Time % Curr_Dt(), & ' oi-', ini, src end if end if diff --git a/Sources/Process/Field_Mod/Utilities/Report_Vol_Balance_Start.f90 b/Sources/Process/Field_Mod/Utilities/Report_Vol_Balance_Start.f90 index 824236f27..b89aab0ef 100644 --- a/Sources/Process/Field_Mod/Utilities/Report_Vol_Balance_Start.f90 +++ b/Sources/Process/Field_Mod/Utilities/Report_Vol_Balance_Start.f90 @@ -1,12 +1,12 @@ !==============================================================================! - subroutine Report_Vol_Balance_Start(Flow, curr_dt, ini) + subroutine Report_Vol_Balance_Start(Flow, ini) !------------------------------------------------------------------------------! ! Opens file for volume balance reporting. !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! class(Field_Type) :: Flow - integer, intent(in) :: curr_dt, ini + integer, intent(in) :: ini !==============================================================================! if(First_Proc()) then @@ -15,14 +15,16 @@ subroutine Report_Vol_Balance_Start(Flow, curr_dt, ini) Flow % fuvbr, & This_Proc()) if(Flow % p_m_coupling == PISO) then - if(curr_dt .eq. 1 .and. ini .eq. 1 .and. Flow % i_corr .eq. 1) then + if(Time % Curr_Dt() .eq. 1 .and. & + ini .eq. 1 .and. & + Flow % i_corr .eq. 1) then write(Flow % fuvbr, '(a)') '# Report on volume balance' write(Flow % fuvbr, '(a)') '# ts- time step; ' // & 'oi- outer iteration; ' // & 'ii- inner iteration' end if else - if(curr_dt .eq. 1 .and. ini .eq. 1) then + if(Time % Curr_Dt() .eq. 1 .and. ini .eq. 1) then write(Flow % fuvbr, '(a)') '# Report on volume balance' write(Flow % fuvbr, '(a)') '# ts- time step; ' // & 'oi- outer iteration' diff --git a/Sources/Process/Main_Pro.f90 b/Sources/Process/Main_Pro.f90 index 19c8ae7a7..b02f68c48 100644 --- a/Sources/Process/Main_Pro.f90 +++ b/Sources/Process/Main_Pro.f90 @@ -9,7 +9,7 @@ program Process_Prog !----------------------------------[Locals]------------------------------------! character(len=7) :: root_control = 'control' character(len=9) :: dom_control(MD) = 'control.d' - integer :: curr_dt, sc, tp + integer :: sc, tp, ldt logical :: read_backup(MD), exit_now, pot_init type(Grid_Type) :: Grid(MD) ! grid used in computations type(Field_Type) :: Flow(MD) ! flow field we will be solving for @@ -21,9 +21,6 @@ program Process_Prog type(Monitor_Type) :: monitor(MD) ! monitors type(Porosity_Type) :: Por(MD) ! porosity type(Interface_Type) :: inter(MD,MD) ! interfaces between domains - real :: time ! physical time of the simulation - integer :: first_dt ! first time step in this run - integer :: last_dt ! number of time steps integer :: max_ini ! max number of inner iterations integer :: min_ini ! min number of inner iterations integer :: n_stat_t ! first time step for turb. statistic @@ -45,8 +42,8 @@ program Process_Prog end do ! Initialize variables - time = 0. ! initialize time to zero - read_backup(:) = .false. ! can turn .true. in Load_Backup + call Time % Set_Time(0.0) ! initialize time to zero + read_backup(:) = .false. ! can turn .true. in Load_Backup !------------------------------! ! Start parallel execution ! @@ -105,9 +102,10 @@ program Process_Prog n_i_cell= 8, n_i_face=8, n_i_node=8) ! Initialize first and current and read the last time step - curr_dt = 0 - first_dt = 0 - call Control % Number_Of_Time_Steps(last_dt, verbose=.true.) + call Time % Set_Curr_Dt(0) + call Time % Set_First_Dt(0) + call Control % Number_Of_Time_Steps(ldt, verbose=.true.) + call Time % Set_Last_Dt(ldt) call Control % Starting_Time_Step_For_Turb_Statistics(n_stat_t, & verbose = .true.) call Control % Starting_Time_Step_For_Swarm_Statistics(n_stat_p, & @@ -161,8 +159,7 @@ program Process_Prog ! Read backup file if directed so, and set the "backup" to .true. or .false. do d = 1, n_dom call Control % Switch_To_Domain(d) ! take proper control file - call Backup % Load(Flow(d), Turb(d), Vof(d), Swarm(d), & - time, first_dt, read_backup(d)) + call Backup % Load(Flow(d), Turb(d), Vof(d), Swarm(d), read_backup(d)) ! Initialize variables if(.not. read_backup(d)) then @@ -221,7 +218,7 @@ program Process_Prog !-------------------------------------------------------------! ! Perform potential initialization in the first time step ! !-------------------------------------------------------------! - if(first_dt .eq. 0) then + if(Time % First_Dt() .eq. 0) then do d = 1, n_dom call Control % Switch_To_Domain(d) ! not sure if this call is needed call Control % Potential_Initialization(pot_init, .true.) @@ -231,21 +228,16 @@ program Process_Prog ! Good time to call user function for beginning of simulation do d = 1, n_dom - call User_Mod_Beginning_Of_Simulation(Flow(d), Turb(d), & - Vof(d), Swarm(d), & - first_dt, time) + call User_Mod_Beginning_Of_Simulation(Flow(d), Turb(d), Vof(d), Swarm(d)) end do ! Save initial condition - if(first_dt .eq. 0 .and. Results % initial) then - call Results % Main_Results(curr_dt, last_dt, time, n_dom, & - Flow, Turb, Vof, Swarm, exit_now) - end if + call Results % Main_Results(n_dom, Flow, Turb, Vof, Swarm, exit_now) !-------------------------------------! ! The time loop really begins now ! !-------------------------------------! - do curr_dt = first_dt + 1, last_dt + do while (Time % Needs_More_Steps()) !------------------------------------! ! Preparations for new time step ! @@ -260,11 +252,10 @@ program Process_Prog call Eddies_Mod_Advance (turb_planes(d) % plane(tp)) end do - if(d .eq. 1) time = time + Flow(d) % dt + if(d .eq. 1) call Time % Increase_Time(Flow(d) % dt) ! Beginning of time step - call User_Mod_Beginning_Of_Time_Step(Flow(d), Turb(d), Vof(d), & - Swarm(d), curr_dt, time) + call User_Mod_Beginning_Of_Time_Step(Flow(d), Turb(d), Vof(d), Swarm(d)) ! Start info boxes. call Info % Time_Start() @@ -273,7 +264,7 @@ program Process_Prog ! Initialize and print time info box if(d .eq. 1) then - call Info % Time_Fill(curr_dt, time) + call Info % Time_Fill(Time % Curr_Dt(), Time % Get_Time()) call Info % Time_Print() end if @@ -283,14 +274,13 @@ program Process_Prog ! Interface tracking if(Flow(d) % with_interface) then call Process % Update_Boundary_Values(Flow(d), Turb(d), Vof(d), 'VOF') - call Vof(d) % Main_Vof(Flow(d), Turb(d), Sol(d), curr_dt) + call Vof(d) % Main_Vof(Flow(d), Turb(d), Sol(d)) call Vof(d) % Update_Physical_Properties() end if ! Lagrangian particle tracking if(Flow(d) % with_particles) then - call User_Mod_Insert_Particles(Flow(d), Turb(d), Vof(d), & - Swarm(d), curr_dt, time) + call User_Mod_Insert_Particles(Flow(d), Turb(d), Vof(d), Swarm(d)) end if end do ! through domains @@ -313,13 +303,12 @@ program Process_Prog call Control % Switch_To_Domain(d) ! Beginning of iteration - call User_Mod_Beginning_Of_Iteration(Flow(d), Turb(d), Vof(d), & - Swarm(d), curr_dt, time) + call User_Mod_Beginning_Of_Iteration(Flow(d), Turb(d), Vof(d), Swarm(d)) call Info % Iter_Fill(ini) ! Future? call Process % Simple_Step(Flow(d), Turb(d), Vof(d), & - ! Future? Sol(d), curr_dt, ini) + ! Future? Sol(d), ini) ! Compute velocity gradients call Flow(d) % Grad_Variable(Flow(d) % u) @@ -328,28 +317,27 @@ program Process_Prog ! All three velocity components one after another call Process % Compute_Momentum(Flow(d), Turb(d), Vof(d), Por(d), & - Sol(d), curr_dt, ini) - call Process % Compute_Pressure(Flow(d), Vof(d), Sol(d), curr_dt, ini) - call Process % Correct_Velocity(Flow(d), Vof(d), Sol(d), curr_dt, ini) + Sol(d), ini) + call Process % Compute_Pressure(Flow(d), Vof(d), Sol(d), ini) + call Process % Correct_Velocity(Flow(d), Vof(d), Sol(d), ini) call Process % Piso_Algorithm(Flow(d), Turb(d), Vof(d), Por(d), & - Sol(d), curr_dt, ini) + Sol(d), ini) call Flow(d) % Calculate_Bulk_Fluxes(Flow(d) % v_flux % n) ! Deal with turbulence (if you dare ;-)) - call Turb(d) % Main_Turb(Sol(d), curr_dt, ini) + call Turb(d) % Main_Turb(Sol(d), ini) ! Energy (practically temperature) if(Flow(d) % heat_transfer) then - call Process % Compute_Energy(Flow(d), Turb(d), Vof(d), & - Sol(d), curr_dt, ini) + call Process % Compute_Energy(Flow(d), Turb(d), Vof(d), Sol(d), ini) end if ! Passive scalars do sc = 1, Flow(d) % n_scalars - call Process % Compute_Scalar(Flow(d), Turb(d), Vof(d), & - Sol(d), curr_dt, ini, sc) + call Process % Compute_Scalar(Flow(d), Turb(d), Vof(d), Sol(d), & + ini, sc) end do ! Update the values at boundaries @@ -359,8 +347,8 @@ program Process_Prog call Info % Iter_Print(d) ! End of iteration - call User_Mod_End_Of_Iteration(Flow(d), Turb(d), Vof(d), Swarm(d), & - curr_dt, time) + call User_Mod_End_Of_Iteration(Flow(d), Turb(d), Vof(d), Swarm(d)) + end do ! through domains if(ini >= min_ini) then @@ -379,7 +367,7 @@ program Process_Prog 1 continue do d = 1, n_dom - call Process % Convective_Outflow(Flow(d), Turb(d), Vof(d), curr_dt) + call Process % Convective_Outflow(Flow(d), Turb(d), Vof(d)) end do do d = 1, n_dom @@ -391,33 +379,31 @@ program Process_Prog call Control % Switch_To_Domain(d) ! Write the values in monitoring points - call Monitor(d) % Write_Vars(Flow(d), curr_dt) + call Monitor(d) % Write_Vars(Flow(d), Time % Curr_Dt()) ! Calculate mean values - call Turb(d) % Calculate_Mean(n_stat_t, curr_dt) - call User_Mod_Calculate_Mean(Turb(d), n_stat_t, curr_dt) + call Turb(d) % Calculate_Mean(n_stat_t) + call User_Mod_Calculate_Mean(Turb(d), n_stat_t) ! Adjust pressure drops to keep the mass fluxes constant call Bulk_Mod_Adjust_P_Drops(Flow(d) % bulk, Flow(d) % dt) ! Lagrangian particle tracking if(Flow(d) % with_particles) then - if(curr_dt >= first_dt_p) then - call Swarm_Mod_Advance_Particles(Swarm(d), curr_dt, & - n_stat_p, first_dt_p) + if(Time % Curr_Dt() >= first_dt_p) then + call Swarm_Mod_Advance_Particles(Swarm(d), n_stat_p, first_dt_p) end if end if ! Just before the end of time step call User_Mod_End_Of_Time_Step(Flow(d), Turb(d), Vof(d), Swarm(d), & - curr_dt, n_stat_t, n_stat_p, time) + n_stat_t, n_stat_p) end do !----------------------! ! Save the results ! !----------------------! - call Results % Main_Results(curr_dt, last_dt, time, n_dom, & - Flow, Turb, Vof, Swarm, exit_now) + call Results % Main_Results(n_dom, Flow, Turb, Vof, Swarm, exit_now) ! Ran more than a set wall clock time limit if(Info % Time_To_Exit() .or. exit_now) then @@ -425,11 +411,10 @@ program Process_Prog end if ! Last time step reached; call user function for end of simulation - if(curr_dt .eq. last_dt) then + if(Time % Curr_Dt() .eq. Time % Last_Dt()) then do d = 1, n_dom call Control % Switch_To_Domain(d) - call User_Mod_End_Of_Simulation(Flow(d), Turb(d), Vof(d), Swarm(d), & - curr_dt, time) + call User_Mod_End_Of_Simulation(Flow(d), Turb(d), Vof(d), Swarm(d)) end do end if diff --git a/Sources/Process/Process_Mod/Compute_Energy.f90 b/Sources/Process/Process_Mod/Compute_Energy.f90 index cd64c59ee..7471bd6b8 100644 --- a/Sources/Process/Process_Mod/Compute_Energy.f90 +++ b/Sources/Process/Process_Mod/Compute_Energy.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Compute_Energy(Process, Flow, Turb, Vof, Sol, curr_dt, ini) + subroutine Compute_Energy(Process, Flow, Turb, Vof, Sol, ini) !------------------------------------------------------------------------------! ! Purpose: Solve transport equation for scalar (such as temperature) ! !------------------------------------------------------------------------------! @@ -10,7 +10,6 @@ subroutine Compute_Energy(Process, Flow, Turb, Vof, Sol, curr_dt, ini) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt integer, intent(in) :: ini !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid @@ -73,7 +72,7 @@ subroutine Compute_Energy(Process, Flow, Turb, Vof, Sol, curr_dt, ini) call Sol % Alias_Native (A, b) ! User function - call User_Mod_Beginning_Of_Compute_Energy(Flow, Turb, Vof, Sol, curr_dt, ini) + call User_Mod_Beginning_Of_Compute_Energy(Flow, Turb, Vof, Sol, ini) ! Initialize cross diffusion sources, matrix and right hand side cross (:) = 0.0 @@ -302,7 +301,7 @@ subroutine Compute_Energy(Process, Flow, Turb, Vof, Sol, curr_dt, ini) end if ! User function - call User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol, curr_dt, ini) + call User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol, ini) call Work % Disconnect_Real_Cell(cap_dens, q_int, q_turb, cross) diff --git a/Sources/Process/Process_Mod/Compute_Momentum.f90 b/Sources/Process/Process_Mod/Compute_Momentum.f90 index da1392f03..45767e5b7 100644 --- a/Sources/Process/Process_Mod/Compute_Momentum.f90 +++ b/Sources/Process/Process_Mod/Compute_Momentum.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Compute_Momentum(Process, Flow, Turb, Vof, Por, Sol, curr_dt, ini) + subroutine Compute_Momentum(Process, Flow, Turb, Vof, Por, Sol, ini) !------------------------------------------------------------------------------! ! Discretizes and solves momentum conservation equations ! !------------------------------------------------------------------------------! @@ -11,7 +11,6 @@ subroutine Compute_Momentum(Process, Flow, Turb, Vof, Por, Sol, curr_dt, ini) type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol type(Porosity_Type), target :: Por - integer, intent(in) :: curr_dt integer, intent(in) :: ini !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid @@ -99,8 +98,7 @@ subroutine Compute_Momentum(Process, Flow, Turb, Vof, Por, Sol, curr_dt, ini) b => Sol % Nat % b % val ! User function - call User_Mod_Beginning_Of_Compute_Momentum(Flow, Turb, Vof, Sol, & - curr_dt, ini) + call User_Mod_Beginning_Of_Compute_Momentum(Flow, Turb, Vof, Sol, ini) !-------------------------------------------------------! ! Store the old volume fluxes for Choi's correction ! @@ -396,7 +394,7 @@ subroutine Compute_Momentum(Process, Flow, Turb, Vof, Por, Sol, curr_dt, ini) call Grid % Exchange_Cells_Real(M % sav) ! User function - call User_Mod_End_Of_Compute_Momentum(Flow, Turb, Vof, Sol, curr_dt, ini) + call User_Mod_End_Of_Compute_Momentum(Flow, Turb, Vof, Sol, ini) call Work % Disconnect_Real_Cell(cross) diff --git a/Sources/Process/Process_Mod/Compute_Pressure.f90 b/Sources/Process/Process_Mod/Compute_Pressure.f90 index c840c7329..6ea7ff81d 100644 --- a/Sources/Process/Process_Mod/Compute_Pressure.f90 +++ b/Sources/Process/Process_Mod/Compute_Pressure.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Compute_Pressure(Process, Flow, Vof, Sol, curr_dt, ini) + subroutine Compute_Pressure(Process, Flow, Vof, Sol, ini) !------------------------------------------------------------------------------! ! Forms and solves pressure equation for the SIMPLE method. ! !------------------------------------------------------------------------------! @@ -9,7 +9,6 @@ subroutine Compute_Pressure(Process, Flow, Vof, Sol, curr_dt, ini) type(Field_Type), target :: Flow type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt integer, intent(in) :: ini !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid @@ -61,10 +60,10 @@ subroutine Compute_Pressure(Process, Flow, Vof, Sol, curr_dt, ini) call Flow % Alias_Momentum(u, v, w) ! Volume balance reporting - call Flow % Report_Vol_Balance_Start(curr_dt, ini) + call Flow % Report_Vol_Balance_Start(ini) ! User function - call User_Mod_Beginning_Of_Compute_Pressure(Flow, Vof, Sol, curr_dt, ini) + call User_Mod_Beginning_Of_Compute_Pressure(Flow, Vof, Sol, ini) !--------------------------------------------------! ! Find the value for normalization of pressure ! @@ -137,7 +136,7 @@ subroutine Compute_Pressure(Process, Flow, Vof, Sol, curr_dt, ini) end do ! Volume balance reporting - call Flow % Report_Vol_Balance(Sol, curr_dt, ini) + call Flow % Report_Vol_Balance(Sol, ini) !------------------------------------------! ! Cross diffusion fluxes for pressure ! @@ -241,7 +240,7 @@ subroutine Compute_Pressure(Process, Flow, Vof, Sol, curr_dt, ini) p % n(:) = p % n(:) - 0.5*(p_max+p_min) ! User function - call User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol, curr_dt, ini) + call User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol, ini) ! Volume balance reporting call Flow % Report_Vol_Balance_Stop() diff --git a/Sources/Process/Process_Mod/Compute_Scalar.f90 b/Sources/Process/Process_Mod/Compute_Scalar.f90 index fe270155f..5b10bcf7d 100644 --- a/Sources/Process/Process_Mod/Compute_Scalar.f90 +++ b/Sources/Process/Process_Mod/Compute_Scalar.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Compute_Scalar(Process, Flow, Turb, Vof, Sol, curr_dt, ini, sc) + subroutine Compute_Scalar(Process, Flow, Turb, Vof, Sol, ini, sc) !------------------------------------------------------------------------------! ! Purpose: Solve transport equation for user defined scalar. ! !------------------------------------------------------------------------------! @@ -10,7 +10,6 @@ subroutine Compute_Scalar(Process, Flow, Turb, Vof, Sol, curr_dt, ini, sc) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt integer, intent(in) :: ini integer, intent(in) :: sc !-----------------------------------[Locals]-----------------------------------! @@ -54,8 +53,7 @@ subroutine Compute_Scalar(Process, Flow, Turb, Vof, Sol, curr_dt, ini, sc) call Sol % Alias_Native (A, b) ! User function - call User_Mod_Beginning_Of_Compute_Scalar(Flow, Turb, Vof, Sol, & - curr_dt, ini, sc) + call User_Mod_Beginning_Of_Compute_Scalar(Flow, Turb, Vof, Sol, ini, sc) ! Initialize cross diffusion sources, matrix and right hand side cross(:) = 0.0 @@ -236,7 +234,7 @@ subroutine Compute_Scalar(Process, Flow, Turb, Vof, Sol, curr_dt, ini, sc) call Flow % Grad_Variable(phi) ! User function - call User_Mod_End_Of_Compute_Scalar(Flow, Turb, Vof, Sol, curr_dt, ini, sc) + call User_Mod_End_Of_Compute_Scalar(Flow, Turb, Vof, Sol, ini, sc) call Work % Disconnect_Real_Cell(q_turb, cross) diff --git a/Sources/Process/Process_Mod/Convective_Outflow.f90 b/Sources/Process/Process_Mod/Convective_Outflow.f90 index 48d1150ed..7db47a6dd 100644 --- a/Sources/Process/Process_Mod/Convective_Outflow.f90 +++ b/Sources/Process/Process_Mod/Convective_Outflow.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) + subroutine Convective_Outflow(Process, Flow, Turb, Vof) !------------------------------------------------------------------------------! ! Extrapoloate variables on the boundaries where needed. ! !------------------------------------------------------------------------------! @@ -9,7 +9,6 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) type(Field_Type), target :: Flow type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof - integer, intent(in) :: curr_dt !------------------------------[Local parameters]------------------------------! integer, parameter :: BEGIN = 12 !-----------------------------------[Locals]-----------------------------------! @@ -55,7 +54,7 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) ! ! !------------------------! - if(curr_dt > BEGIN) then + if(Time % Curr_Dt() > BEGIN) then call Flow % Grad_Variable(Flow % u) call Flow % Grad_Variable(Flow % v) @@ -80,7 +79,7 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) end if ! boundary condition end do ! region - else ! curr_dt <= BEGIN + else ! Time % Curr_Dt() <= BEGIN do reg = Boundary_Regions() if(Grid % region % type(reg) .eq. CONVECT) then @@ -95,7 +94,7 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) end if ! boundary condition end do ! region - end if ! curr_dt > BEGIN + end if ! Time % Curr_Dt() > BEGIN !--------------------------! ! ! @@ -108,7 +107,7 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) !-----------------! if(Turb % model .eq. K_EPS) then - if(curr_dt > BEGIN) then + if(Time % Curr_Dt() > BEGIN) then call Flow % Grad_Variable(kin) call Flow % Grad_Variable(eps) @@ -137,7 +136,7 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) end if ! boundary condition end do ! region - else ! curr_dt <= BEGIN + else ! Time % Curr_Dt() <= BEGIN do reg = Boundary_Regions() if(Grid % region % type(reg) .eq. CONVECT) then @@ -154,7 +153,7 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) end if ! boundary condition end do ! region - end if ! curr_dt > BEGIN + end if ! Time % Curr_Dt() > BEGIN end if @@ -164,7 +163,7 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) if(Turb % model .eq. K_EPS_ZETA_F .or. & Turb % model .eq. HYBRID_LES_RANS) then - if(curr_dt > BEGIN) then + if(Time % Curr_Dt() > BEGIN) then call Flow % Grad_Variable(kin) call Flow % Grad_Variable(eps) @@ -202,7 +201,7 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) end if ! boundary condition end do ! region - else ! curr_dt <= BEGIN + else ! Time % Curr_Dt() <= BEGIN ! On the boundary perform the extrapolation do reg = Boundary_Regions() @@ -222,7 +221,7 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) end if ! boundary condition end do ! region - end if ! curr_dt > BEGIN + end if ! Time % Curr_Dt() > BEGIN end if @@ -232,7 +231,7 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) if(Turb % model .eq. SPALART_ALLMARAS .or. & Turb % model .eq. DES_SPALART) then - if(curr_dt > BEGIN) then + if(Time % Curr_Dt() > BEGIN) then call Flow % Grad_Variable(vis) @@ -249,7 +248,7 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) end if ! boundary condition end do ! region - else ! curr_dt <= BEGIN + else ! Time % Curr_Dt() <= BEGIN do reg = Boundary_Regions() if(Grid % region % type(reg) .eq. CONVECT) then @@ -262,7 +261,7 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) end if ! boundary condition end do ! region - end if ! curr_dt > BEGIN + end if ! Time % Curr_Dt() > BEGIN end if @@ -273,7 +272,7 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) if(Turb % model .eq. RSM_MANCEAU_HANJALIC .or. & Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then - if(curr_dt > BEGIN) then + if(Time % Curr_Dt() > BEGIN) then call Flow % Grad_Variable(uu) call Flow % Grad_Variable(vv) @@ -322,7 +321,7 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) end if ! boundary condition end do ! region - else ! curr_dt <= BEGIN + else ! Time % Curr_Dt() <= BEGIN do reg = Boundary_Regions() if(Grid % region % type(reg) .eq. CONVECT) then @@ -344,7 +343,7 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) end if ! boundary condition end do ! region - end if ! curr_dt > BEGIN + end if ! Time % Curr_Dt() > BEGIN end if @@ -357,7 +356,7 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) do sc = 1, Flow % n_scalars phi => Flow % scalar(sc) - if(curr_dt > BEGIN) then + if(Time % Curr_Dt() > BEGIN) then call Flow % Grad_Variable(phi) @@ -374,7 +373,7 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) end if ! boundary condition end do ! region - else ! curr_dt <= BEGIN + else ! Time % Curr_Dt() <= BEGIN do reg = Boundary_Regions() if(Grid % region % type(reg) .eq. CONVECT) then @@ -387,7 +386,7 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) end if ! boundary condition end do ! region - end if ! curr_dt > BEGIN + end if ! Time % Curr_Dt() > BEGIN end do ! sc @@ -399,7 +398,7 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) if(Flow % heat_transfer) then - if(curr_dt > BEGIN) then + if(Time % Curr_Dt() > BEGIN) then ! Temperature gradients might have been computed and ! stored already in t % x, t % y and t % z, check it @@ -418,7 +417,7 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) end if ! boundary condition end do ! region - else ! curr_dt <= BEGIN + else ! Time % Curr_Dt() <= BEGIN do reg = Boundary_Regions() if(Grid % region % type(reg) .eq. CONVECT) then @@ -431,7 +430,7 @@ subroutine Convective_Outflow(Process, Flow, Turb, Vof, curr_dt) end if ! boundary condition end do ! region - end if ! curr_dt < BEGIN + end if ! Time % Curr_Dt() < BEGIN end if diff --git a/Sources/Process/Process_Mod/Correct_Velocity.f90 b/Sources/Process/Process_Mod/Correct_Velocity.f90 index 8ab025da7..322f68064 100644 --- a/Sources/Process/Process_Mod/Correct_Velocity.f90 +++ b/Sources/Process/Process_Mod/Correct_Velocity.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Correct_Velocity(Process, Flow, Vof, Sol, curr_dt, ini) + subroutine Correct_Velocity(Process, Flow, Vof, Sol, ini) !------------------------------------------------------------------------------! ! Corrects the velocities, and mass (or volume) fluxes on cell faces. ! !------------------------------------------------------------------------------! @@ -9,7 +9,6 @@ subroutine Correct_Velocity(Process, Flow, Vof, Sol, curr_dt, ini) type(Field_Type), target :: Flow type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt integer, intent(in) :: ini !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid @@ -40,7 +39,7 @@ subroutine Correct_Velocity(Process, Flow, Vof, Sol, curr_dt, ini) call Flow % Alias_Momentum(u, v, w) ! User function - call User_Mod_Beginning_Of_Correct_Velocity(Flow, Vof, Sol, curr_dt, ini) + call User_Mod_Beginning_Of_Correct_Velocity(Flow, Vof, Sol, ini) !-----------------------------------------! ! Correct velocities and fluxes with ! @@ -138,7 +137,7 @@ subroutine Correct_Velocity(Process, Flow, Vof, Sol, curr_dt, ini) end if ! User function - call User_Mod_End_Of_Correct_Velocity(Flow, Vof, Sol, curr_dt, ini) + call User_Mod_End_Of_Correct_Velocity(Flow, Vof, Sol, ini) call Profiler % Stop('Correct_Velocity') diff --git a/Sources/Process/Process_Mod/Piso_Algorithm.f90 b/Sources/Process/Process_Mod/Piso_Algorithm.f90 index 9d193f68c..a6933ba27 100644 --- a/Sources/Process/Process_Mod/Piso_Algorithm.f90 +++ b/Sources/Process/Process_Mod/Piso_Algorithm.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Piso_Algorithm(Process, Flow, Turb, Vof, Por, Sol, curr_dt, ini) + subroutine Piso_Algorithm(Process, Flow, Turb, Vof, Por, Sol, ini) !------------------------------------------------------------------------------! ! PISO algorithm ! !------------------------------------------------------------------------------! @@ -11,7 +11,6 @@ subroutine Piso_Algorithm(Process, Flow, Turb, Vof, Por, Sol, curr_dt, ini) type(Vof_Type), target :: Vof type(Porosity_Type), target :: Por type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt ! current time step integer, intent(in) :: ini ! current inner iteration !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid @@ -29,9 +28,9 @@ subroutine Piso_Algorithm(Process, Flow, Turb, Vof, Por, Sol, curr_dt, ini) do corr_steps = 1, Flow % n_piso_corrections Flow % i_corr = corr_steps - call Process % Compute_Momentum(Flow, Turb, Vof, Por, Sol, curr_dt, ini) - call Process % Compute_Pressure(Flow, Vof, Sol, curr_dt, ini) - call Process % Correct_Velocity(Flow, Vof, Sol, curr_dt, ini) + call Process % Compute_Momentum(Flow, Turb, Vof, Por, Sol, ini) + call Process % Compute_Pressure(Flow, Vof, Sol, ini) + call Process % Correct_Velocity(Flow, Vof, Sol, ini) end do Flow % inside_piso_loop = .false. diff --git a/Sources/Process/Results_Mod/Main_Results.f90 b/Sources/Process/Results_Mod/Main_Results.f90 index 1b56c6644..6e6ec120c 100644 --- a/Sources/Process/Results_Mod/Main_Results.f90 +++ b/Sources/Process/Results_Mod/Main_Results.f90 @@ -1,7 +1,5 @@ !==============================================================================! - subroutine Main_Results(Results, & - curr_dt, last_dt, time, n_dom, & - Flow, Turb, Vof, Swarm, exit_now) + subroutine Main_Results(Results, n_dom, Flow, Turb, Vof, Swarm, exit_now) !------------------------------------------------------------------------------! ! Main function for saving results (postprocessing and backup) ! !------------------------------------------------------------------------------! @@ -9,8 +7,6 @@ subroutine Main_Results(Results, & implicit none !---------------------------------[Arguments]----------------------------------! class(Results_Type) :: Results - integer :: curr_dt, last_dt - real :: time ! physical time of the simulation integer :: n_dom type(Field_Type) :: Flow(MD) ! Flow field type(Turb_Type) :: Turb(MD) ! turbulence modelling @@ -26,66 +22,62 @@ subroutine Main_Results(Results, & inquire(file='save_now', exist=save_now) ! Is it time to save the backup file? - if(curr_dt .eq. last_dt .or. & - save_now .or. & - exit_now .or. & - Backup % Time_To_Save_Backup(curr_dt) .or. & + if(Time % Curr_Dt() .eq. Time % Last_Dt() .or. & + save_now .or. & + exit_now .or. & + Backup % Time_To_Save_Backup() .or. & Info % Time_To_Exit()) then do d = 1, n_dom call Control % Switch_To_Domain(d) - call Backup % Save(Flow(d), Turb(d), Vof(d), Swarm(d), & - time, curr_dt, dom=d) + call Backup % Save(Flow(d), Turb(d), Vof(d), Swarm(d), dom=d) end do end if ! Is it time to save results for post-processing? - if(curr_dt .eq. last_dt .or. & - save_now .or. & - exit_now .or. & - Results % Time_To_Save_Results(curr_dt) .or. & + if(Time % Curr_Dt() .eq. Time % Last_Dt() .or. & + save_now .or. & + exit_now .or. & + Results % Time_To_Save_Results() .or. & Info % Time_To_Exit()) then do d = 1, n_dom call Control % Switch_To_Domain(d) call Results % Save_Vtu_Results(Flow(d), Turb(d), Vof(d), Swarm(d), & - curr_dt, plot_inside=.true., domain=d) + plot_inside=.true., domain=d) call Results % Save_Vtu_Results(Flow(d), Turb(d), Vof(d), Swarm(d), & - curr_dt, plot_inside=.false., domain=d) + plot_inside=.false., domain=d) if(Flow(d) % with_interface) then if(Vof(d) % track_front) then - call Results % Save_Vtu_Front(Vof(d) % Front, curr_dt) + call Results % Save_Vtu_Front(Vof(d) % Front) end if if(Vof(d) % track_surface) then - call Results % Save_Vtu_Surf(Vof(d) % surf, curr_dt) + call Results % Save_Vtu_Surf(Vof(d) % surf) end if end if ! Write results in user-customized format - call User_Mod_Save_Results(Flow(d), Turb(d), Vof(d), Swarm(d), & - curr_dt, domain=d) + call User_Mod_Save_Results(Flow(d), Turb(d), Vof(d), Swarm(d), domain=d) if(Flow(d) % with_particles) then - call User_Mod_Save_Swarm(Flow(d), Turb(d), Vof(d), Swarm(d), & - curr_dt, domain=d) + call User_Mod_Save_Swarm(Flow(d), Turb(d), Vof(d), Swarm(d), domain=d) end if end do ! through domains end if ! Is it time to save particles for post-processing? - if(curr_dt .eq. last_dt .or. & - save_now .or. & - exit_now .or. & - Results % Time_To_Save_Swarm(curr_dt) .or. & + if(Time % Curr_Dt() .eq. Time % Last_Dt() .or. & + save_now .or. & + exit_now .or. & + Results % Time_To_Save_Swarm() .or. & Info % Time_To_Exit()) then do d = 1, n_dom call Control % Switch_To_Domain(d) if(Flow(d) % with_particles) then - call Results % Save_Vtu_Swarm(Swarm(d), curr_dt, domain=d) + call Results % Save_Vtu_Swarm(Swarm(d), domain=d) - call User_Mod_Save_Swarm(Flow(d), Turb(d), Vof(d), Swarm(d), & - curr_dt, domain=d) + call User_Mod_Save_Swarm(Flow(d), Turb(d), Vof(d), Swarm(d), domain=d) end if end do ! through domains diff --git a/Sources/Process/Results_Mod/Save_Vtu_Front.f90 b/Sources/Process/Results_Mod/Save_Vtu_Front.f90 index 00449002e..dfb7d540a 100644 --- a/Sources/Process/Results_Mod/Save_Vtu_Front.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Front.f90 @@ -1,14 +1,13 @@ !==============================================================================! - subroutine Save_Vtu_Front(Results, Front, time_step, domain) + subroutine Save_Vtu_Front(Results, Front, domain) !------------------------------------------------------------------------------! ! Writes surface vertices in VTU file format (for VisIt and Paraview) ! !------------------------------------------------------------------------------! implicit none !--------------------------------[Arguments]-----------------------------------! - class(Results_Type) :: Results - type(Front_Type), target :: Front - integer :: time_step - integer, optional :: domain + class(Results_Type), intent(in) :: Results + type(Front_Type), target :: Front + integer, optional :: domain !----------------------------------[Locals]------------------------------------! type(Vert_Type), pointer :: Vert integer :: v, e ! vertex and element counters @@ -27,16 +26,16 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) ! ! !----------------------------! - call File % Set_Name(name_out_8, & - time_step = time_step, & - appendix = '-front', & - extension = '.pvtu', & + call File % Set_Name(name_out_8, & + time_step = Time % Curr_Dt(), & + appendix = '-front', & + extension = '.pvtu', & domain = domain) - call File % Set_Name(name_out_9, & - processor = This_Proc(), & - time_step = time_step, & - appendix = '-front', & - extension = '.vtu', & + call File % Set_Name(name_out_9, & + processor = This_Proc(), & + time_step = Time % Curr_Dt(), & + appendix = '-front', & + extension = '.vtu', & domain = domain) if(This_Proc() .eq. 1) then @@ -307,11 +306,11 @@ subroutine Save_Vtu_Front(Results, Front, time_step, domain) !------------! if(This_Proc() .eq. 1) then do n = 1, N_Procs() - call File % Set_Name(name_out_9, & - processor = n, & - time_step = time_step, & - appendix = '-front', & - extension = '.vtu', & + call File % Set_Name(name_out_9, & + processor = n, & + time_step = Time % Curr_Dt(), & + appendix = '-front', & + extension = '.vtu', & domain = domain) write(f8) IN_2 // '' // LF end do diff --git a/Sources/Process/Results_Mod/Save_Vtu_Results.f90 b/Sources/Process/Results_Mod/Save_Vtu_Results.f90 index 2dd1c33c8..cd0e5f9c7 100644 --- a/Sources/Process/Results_Mod/Save_Vtu_Results.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Results.f90 @@ -1,20 +1,19 @@ !==============================================================================! subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & - ts, plot_inside, domain) + plot_inside, domain) !------------------------------------------------------------------------------! ! Writes results in VTU file format (for VisIt and Paraview) ! !------------------------------------------------------------------------------! !------------------------------------------------------------------------------! implicit none !--------------------------------[Arguments]-----------------------------------! - class(Results_Type) :: Results - type(Field_Type), target :: Flow - type(Turb_Type), target :: Turb - type(Vof_Type), target :: Vof - type(Swarm_Type), target :: Swarm - integer :: ts ! time step - logical :: plot_inside ! plot results inside? - integer, optional :: domain + class(Results_Type) :: Results + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb + type(Vof_Type), target :: Vof + type(Swarm_Type), target :: Swarm + logical :: plot_inside ! plot results inside? + integer, optional :: domain !----------------------------------[Locals]------------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: phi @@ -108,27 +107,27 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & ! ! !--------------------------------------! if(plot_inside) then - call File % Set_Name(name_out_8, & - time_step=ts, & - extension='.pvtu', & - domain=domain) - call File % Set_Name(name_out_9, & - processor=This_Proc(), & - time_step=ts, & - extension='.vtu', & - domain=domain) + call File % Set_Name(name_out_8, & + time_step = Time % Curr_Dt(), & + extension = '.pvtu', & + domain = domain) + call File % Set_Name(name_out_9, & + processor = This_Proc(), & + time_step = Time % Curr_Dt(), & + extension = '.vtu', & + domain = domain) else - call File % Set_Name(name_out_8, & - time_step=ts, & - appendix ='-bnd', & - extension='.pvtu', & - domain=domain) - call File % Set_Name(name_out_9, & - processor=This_Proc(), & - time_step=ts, & - appendix ='-bnd', & - extension='.vtu', & + call File % Set_Name(name_out_8, & + time_step = Time % Curr_Dt(), & + appendix = '-bnd', & + extension = '.pvtu', & domain=domain) + call File % Set_Name(name_out_9, & + processor = This_Proc(), & + time_step = Time % Curr_Dt(), & + appendix = '-bnd', & + extension = '.vtu', & + domain = domain) end if if(Parallel_Run() .and. First_Proc()) then @@ -1039,18 +1038,18 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & if(Parallel_Run() .and. First_Proc()) then do n = 1, N_Procs() if(plot_inside) then - call File % Set_Name(name_out_9, & - processor=n, & - time_step=ts, & - extension='.vtu', & - domain=domain) + call File % Set_Name(name_out_9, & + processor = n, & + time_step = Time % Curr_Dt(), & + extension = '.vtu', & + domain = domain) else - call File % Set_Name(name_out_9, & - processor=n, & - time_step=ts, & - appendix ='-bnd', & - extension='.vtu', & - domain=domain) + call File % Set_Name(name_out_9, & + processor = n, & + time_step = Time % Curr_Dt(), & + appendix = '-bnd', & + extension = '.vtu', & + domain = domain) end if write(f8) IN_2 // '' // LF end do diff --git a/Sources/Process/Results_Mod/Save_Vtu_Surf.f90 b/Sources/Process/Results_Mod/Save_Vtu_Surf.f90 index 94a32c856..8197cc488 100644 --- a/Sources/Process/Results_Mod/Save_Vtu_Surf.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Surf.f90 @@ -1,13 +1,12 @@ !==============================================================================! - subroutine Save_Vtu_Surf(Results, Surf, time_step) + subroutine Save_Vtu_Surf(Results, Surf) !------------------------------------------------------------------------------! ! Writes surface vertices in VTU file format (for VisIt and Paraview) ! !------------------------------------------------------------------------------! implicit none !--------------------------------[Arguments]-----------------------------------! - class(Results_Type) :: Results - type(Surf_Type), target :: Surf - integer :: time_step + class(Results_Type), intent(in) :: Results + type(Surf_Type), target, intent(in) :: Surf !----------------------------------[Locals]------------------------------------! type(Vert_Type), pointer :: Vert integer :: v, e ! vertex and element counters @@ -30,9 +29,9 @@ subroutine Save_Vtu_Surf(Results, Surf, time_step) if(First_Proc()) then - call File % Set_Name(name_out, & - time_step = time_step, & - appendix = '-surf', & + call File % Set_Name(name_out, & + time_step = Time % Curr_Dt(), & + appendix = '-surf', & extension = '.vtu') call File % Open_For_Writing_Ascii(name_out, fu) diff --git a/Sources/Process/Results_Mod/Save_Vtu_Swarm.f90 b/Sources/Process/Results_Mod/Save_Vtu_Swarm.f90 index e13a970ce..dc4f6f4fb 100644 --- a/Sources/Process/Results_Mod/Save_Vtu_Swarm.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Swarm.f90 @@ -1,14 +1,13 @@ !==============================================================================! - subroutine Save_Vtu_Swarm(Results, Swarm, time_step, domain) + subroutine Save_Vtu_Swarm(Results, Swarm, domain) !------------------------------------------------------------------------------! ! Writes particles in VTU file format (for VisIt and Paraview) ! !------------------------------------------------------------------------------! implicit none !--------------------------------[Arguments]-----------------------------------! - class(Results_Type) :: Results - type(Swarm_Type), target :: Swarm - integer :: time_step - integer, optional :: domain + class(Results_Type), intent(in) :: Results + type(Swarm_Type), target :: Swarm + integer, optional, intent(in) :: domain !----------------------------------[Locals]------------------------------------! type(Grid_Type), pointer :: Grid type(Field_Type), pointer :: Flow @@ -61,11 +60,11 @@ subroutine Save_Vtu_Swarm(Results, Swarm, time_step, domain) if(First_Proc()) then - call File % Set_Name(name_out, & - time_step=time_step, & - appendix ='-swarm', & - extension='.vtu', & - domain=domain) + call File % Set_Name(name_out, & + time_step = Time % Curr_Dt(), & + appendix = '-swarm', & + extension = '.vtu', & + domain = domain) call File % Open_For_Writing_Ascii(name_out, fu) !------------! diff --git a/Sources/Process/Results_Mod/Time_To_Save_Results.f90 b/Sources/Process/Results_Mod/Time_To_Save_Results.f90 index ebc0a1fd3..0af63c7a6 100644 --- a/Sources/Process/Results_Mod/Time_To_Save_Results.f90 +++ b/Sources/Process/Results_Mod/Time_To_Save_Results.f90 @@ -1,5 +1,5 @@ !==============================================================================! - logical function Time_To_Save_Results(Results, curr_dt) + logical function Time_To_Save_Results(Results) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -7,8 +7,8 @@ logical function Time_To_Save_Results(Results, curr_dt) integer :: curr_dt ! current time step !==============================================================================! - Time_To_Save_Results = mod(curr_dt, Results % interval) .eq. 0 & + Time_To_Save_Results = mod(Time % Curr_Dt(), Results % interval) .eq. 0 & .or. & - curr_dt .eq. 0 .and. Results % initial + Time % Curr_Dt() .eq. 0 .and. Results % initial end function diff --git a/Sources/Process/Results_Mod/Time_To_Save_Swarm.f90 b/Sources/Process/Results_Mod/Time_To_Save_Swarm.f90 index e0387e928..bac3a3952 100644 --- a/Sources/Process/Results_Mod/Time_To_Save_Swarm.f90 +++ b/Sources/Process/Results_Mod/Time_To_Save_Swarm.f90 @@ -1,14 +1,14 @@ !==============================================================================! - logical function Time_To_Save_Swarm(Results, curr_dt) + logical function Time_To_Save_Swarm(Results) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! class(Results_Type) :: Results - integer :: curr_dt ! current time step !==============================================================================! - Time_To_Save_Swarm = mod(curr_dt, Results % interval_swarm) .eq. 0 & - .or. & - curr_dt .eq. 0 .and. Results % initial + Time_To_Save_Swarm = mod(Time % Curr_Dt(), & + Results % interval_swarm) .eq. 0 & + .or. & + Time % Curr_Dt() .eq. 0 .and. Results % initial end function diff --git a/Sources/Process/Swarm_Mod/Advance_Particles.f90 b/Sources/Process/Swarm_Mod/Advance_Particles.f90 index b900a005c..881da009d 100644 --- a/Sources/Process/Swarm_Mod/Advance_Particles.f90 +++ b/Sources/Process/Swarm_Mod/Advance_Particles.f90 @@ -1,12 +1,11 @@ !==============================================================================! - subroutine Swarm_Mod_Advance_Particles(Swarm, n, n_stat_p, first_dt_p) + subroutine Swarm_Mod_Advance_Particles(Swarm, n_stat_p, first_dt_p) !------------------------------------------------------------------------------! ! Advances all particles in the Swarm. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! type(Swarm_Type), target :: Swarm - integer, intent(in) :: n ! current time step integer, intent(in) :: n_stat_p ! starting time for swarm statistics integer, intent(in) :: first_dt_p ! starting time for swarm simulation !-----------------------------------[Locals]-----------------------------------! @@ -50,7 +49,7 @@ subroutine Swarm_Mod_Advance_Particles(Swarm, n, n_stat_p, first_dt_p) end if ! Gaussian random no.s interval (for SEIM model) - Swarm % time_eim = n - first_dt_p + Swarm % time_eim = Time % Curr_Dt() - first_dt_p !---------------------------------------------! ! Store old particle coordinates ! @@ -120,7 +119,7 @@ subroutine Swarm_Mod_Advance_Particles(Swarm, n, n_stat_p, first_dt_p) call Swarm % Check_Periodicity(k, n_parts_in_buffers) ! Gathering Swarm statistics - call Swarm_Mod_Calculate_Mean(Swarm, k, n, n_stat_p) + call Swarm_Mod_Calculate_Mean(Swarm, k, n_stat_p) end if ! in this processor end if ! deposited or escaped diff --git a/Sources/Process/Swarm_Mod/Calculate_Mean.f90 b/Sources/Process/Swarm_Mod/Calculate_Mean.f90 index 6d6fdb740..d0776250a 100644 --- a/Sources/Process/Swarm_Mod/Calculate_Mean.f90 +++ b/Sources/Process/Swarm_Mod/Calculate_Mean.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Swarm_Mod_Calculate_Mean(Swarm, k, n, n_stat_p) + subroutine Swarm_Mod_Calculate_Mean(Swarm, k, n_stat_p) !------------------------------------------------------------------------------! ! Calculates particle time averaged velocity ! !------------------------------------------------------------------------------! @@ -7,7 +7,6 @@ subroutine Swarm_Mod_Calculate_Mean(Swarm, k, n, n_stat_p) !---------------------------------[Arguments]----------------------------------! type(Swarm_Type), target :: Swarm integer, intent(in) :: k ! particle index - integer, intent(in) :: n ! current time step (flow time step) integer, intent(in) :: n_stat_p ! starting time step for swarm statist. !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid @@ -25,7 +24,7 @@ subroutine Swarm_Mod_Calculate_Mean(Swarm, k, n, n_stat_p) Flow => Swarm % pnt_flow Turb => Swarm % pnt_turb - l = n - n_stat_p + l = Time % Curr_Dt() - n_stat_p if(l > -1) then !---------------------------------! diff --git a/Sources/Process/Time_Mod.f90 b/Sources/Process/Time_Mod.f90 new file mode 100644 index 000000000..2dfcd9e61 --- /dev/null +++ b/Sources/Process/Time_Mod.f90 @@ -0,0 +1,56 @@ +#include "../Shared/Assert.h90" +#include "../Shared/Unused.h90" + +!==============================================================================! + module Time_Mod +!------------------------------------------------------------------------------! +! Module containing data and procedures pertinent to time stepping ! +!------------------------------------------------------------------------------! +!----------------------------------[Modules]-----------------------------------! + use Assert_Mod +!------------------------------------------------------------------------------! + implicit none +!==============================================================================! + + !---------------! + ! Time type ! + !---------------! + type Time_Type + + real, private :: physical_time ! physical time of simulation [s] + integer, private :: current_time_step ! current dt in this simulation + integer, private :: first_time_step ! first dt in this simulation + integer, private :: last_time_step ! last dt in this simulation + + contains + procedure :: Curr_Dt + procedure :: First_Dt + procedure :: Get_Time + procedure :: Last_Dt + procedure :: Needs_More_Steps + procedure :: Increase_Time + procedure :: Set_Curr_Dt + procedure :: Set_First_Dt + procedure :: Set_Last_Dt + procedure :: Set_Time + + end type + + !----------------------! + ! Singleton object ! + !----------------------! + type(Time_Type) :: Time + + contains +# include "Time_Mod/Curr_Dt.f90" +# include "Time_Mod/First_Dt.f90" +# include "Time_Mod/Get_Time.f90" +# include "Time_Mod/Last_Dt.f90" +# include "Time_Mod/Needs_More_Steps.f90" +# include "Time_Mod/Increase_Time.f90" +# include "Time_Mod/Set_Curr_Dt.f90" +# include "Time_Mod/Set_First_Dt.f90" +# include "Time_Mod/Set_Last_Dt.f90" +# include "Time_Mod/Set_Time.f90" + + end module diff --git a/Sources/Process/Time_Mod/Curr_Dt.f90 b/Sources/Process/Time_Mod/Curr_Dt.f90 new file mode 100644 index 000000000..7f419e9fc --- /dev/null +++ b/Sources/Process/Time_Mod/Curr_Dt.f90 @@ -0,0 +1,9 @@ +!==============================================================================! + pure integer function Curr_Dt(Time) +!---------------------------------[Arguments]----------------------------------! + class(Time_Type), intent(in) :: Time +!==============================================================================! + + Curr_Dt = Time % current_time_step + + end function diff --git a/Sources/Process/Time_Mod/First_Dt.f90 b/Sources/Process/Time_Mod/First_Dt.f90 new file mode 100644 index 000000000..66a54d058 --- /dev/null +++ b/Sources/Process/Time_Mod/First_Dt.f90 @@ -0,0 +1,9 @@ +!==============================================================================! + pure integer function First_Dt(Time) +!---------------------------------[Arguments]----------------------------------! + class(Time_Type), intent(in) :: Time +!==============================================================================! + + First_Dt = Time % first_time_step + + end function diff --git a/Sources/Process/Time_Mod/Get_Time.f90 b/Sources/Process/Time_Mod/Get_Time.f90 new file mode 100644 index 000000000..c85a45680 --- /dev/null +++ b/Sources/Process/Time_Mod/Get_Time.f90 @@ -0,0 +1,9 @@ +!==============================================================================! + pure real function Get_Time(Time) +!---------------------------------[Arguments]----------------------------------! + class(Time_Type), intent(in) :: Time +!==============================================================================! + + Get_Time = Time % physical_time + + end function diff --git a/Sources/Process/Time_Mod/Increase_Time.f90 b/Sources/Process/Time_Mod/Increase_Time.f90 new file mode 100644 index 000000000..6bf7a92ed --- /dev/null +++ b/Sources/Process/Time_Mod/Increase_Time.f90 @@ -0,0 +1,10 @@ +!==============================================================================! + pure subroutine Increase_Time(Time, val) +!---------------------------------[Arguments]----------------------------------! + class(Time_Type), intent(inout) :: Time + real, intent(in) :: val +!==============================================================================! + + Time % physical_time = Time % physical_time + val + + end subroutine diff --git a/Sources/Process/Time_Mod/Last_Dt.f90 b/Sources/Process/Time_Mod/Last_Dt.f90 new file mode 100644 index 000000000..555e91973 --- /dev/null +++ b/Sources/Process/Time_Mod/Last_Dt.f90 @@ -0,0 +1,9 @@ +!==============================================================================! + pure integer function Last_Dt(Time) +!---------------------------------[Arguments]----------------------------------! + class(Time_Type), intent(in) :: Time +!==============================================================================! + + Last_Dt = Time % last_time_step + + end function diff --git a/Sources/Process/Time_Mod/Needs_More_Steps.f90 b/Sources/Process/Time_Mod/Needs_More_Steps.f90 new file mode 100644 index 000000000..56538030e --- /dev/null +++ b/Sources/Process/Time_Mod/Needs_More_Steps.f90 @@ -0,0 +1,38 @@ +!==============================================================================! + logical function Needs_More_Steps(Time) +!---------------------------------[Arguments]----------------------------------! + class(Time_Type), intent(inout) :: Time +!-----------------------------------[Locals]-----------------------------------! + logical, save :: first_entry = .true. +!==============================================================================! + + !--------------------------------------------! + ! You visit this for the first time, you ! + ! are at the beginning of a simulation ! + !--------------------------------------------! + if(first_entry) then + Time % current_time_step = Time % First_Time_Step + 1 + first_entry = .false. + + !-----------------------------------------! + ! You are not in the first time step, ! + ! increase the time step counter ! + !-----------------------------------------! + else + Time % current_time_step = & + Time % current_time_step + 1 + + end if + + !-------------------------------------------------! + ! Decide if more time steps are needed or not ! + !-------------------------------------------------! + if(Time % current_time_step .gt. Time % last_time_step) then + Needs_More_Steps = .false. + + else + Needs_More_Steps = .true. + + end if + + end function diff --git a/Sources/Process/Time_Mod/Set_Curr_Dt.f90 b/Sources/Process/Time_Mod/Set_Curr_Dt.f90 new file mode 100644 index 000000000..65e8bc8a6 --- /dev/null +++ b/Sources/Process/Time_Mod/Set_Curr_Dt.f90 @@ -0,0 +1,10 @@ +!==============================================================================! + pure subroutine Set_Curr_Dt(Time, val) +!---------------------------------[Arguments]----------------------------------! + class(Time_Type), intent(inout) :: Time + integer, intent(in) :: val +!==============================================================================! + + Time % current_time_step = val + + end subroutine diff --git a/Sources/Process/Time_Mod/Set_First_Dt.f90 b/Sources/Process/Time_Mod/Set_First_Dt.f90 new file mode 100644 index 000000000..a4f4f7527 --- /dev/null +++ b/Sources/Process/Time_Mod/Set_First_Dt.f90 @@ -0,0 +1,10 @@ +!==============================================================================! + pure subroutine Set_First_Dt(Time, val) +!---------------------------------[Arguments]----------------------------------! + class(Time_Type), intent(inout) :: Time + integer, intent(in) :: val +!==============================================================================! + + Time % first_time_step = val + + end subroutine diff --git a/Sources/Process/Time_Mod/Set_Last_Dt.f90 b/Sources/Process/Time_Mod/Set_Last_Dt.f90 new file mode 100644 index 000000000..7c1a8a211 --- /dev/null +++ b/Sources/Process/Time_Mod/Set_Last_Dt.f90 @@ -0,0 +1,10 @@ +!==============================================================================! + pure subroutine Set_Last_Dt(Time, val) +!---------------------------------[Arguments]----------------------------------! + class(Time_Type), intent(inout) :: Time + integer, intent(in) :: val +!==============================================================================! + + Time % last_time_step = val + + end subroutine diff --git a/Sources/Process/Time_Mod/Set_Time.f90 b/Sources/Process/Time_Mod/Set_Time.f90 new file mode 100644 index 000000000..bd09d934c --- /dev/null +++ b/Sources/Process/Time_Mod/Set_Time.f90 @@ -0,0 +1,10 @@ +!==============================================================================! + pure subroutine Set_Time(Time, val) +!---------------------------------[Arguments]----------------------------------! + class(Time_Type), intent(inout) :: Time + real, intent(in) :: val +!==============================================================================! + + Time % physical_time = val + + end subroutine diff --git a/Sources/Process/Turb_Mod/Calculate_Mean.f90 b/Sources/Process/Turb_Mod/Calculate_Mean.f90 index 91a5a73ec..5a5e3358e 100644 --- a/Sources/Process/Turb_Mod/Calculate_Mean.f90 +++ b/Sources/Process/Turb_Mod/Calculate_Mean.f90 @@ -1,12 +1,12 @@ !==============================================================================! - subroutine Calculate_Mean(Turb, n0, n1) + subroutine Calculate_Mean(Turb, n0) !------------------------------------------------------------------------------! ! Calculates time averaged velocity and velocity fluctuations. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! class(Turb_Type), target :: Turb - integer :: n0, n1 + integer, intent(in) :: n0 !-----------------------------------[Locals]-----------------------------------! type(Field_Type), pointer :: Flow type(Grid_Type), pointer :: Grid @@ -84,7 +84,7 @@ subroutine Calculate_Mean(Turb, n0, n1) ut_res => Turb % ut_res; vt_res => Turb % vt_res; wt_res => Turb % wt_res t2_res => Turb % t2_res - n = n1 - n0 + n = Time % Curr_Dt() - n0 if(n > -1) then diff --git a/Sources/Process/Turb_Mod/Compute_F22.f90 b/Sources/Process/Turb_Mod/Compute_F22.f90 index 3cb4c94d5..afd6a0d84 100644 --- a/Sources/Process/Turb_Mod/Compute_F22.f90 +++ b/Sources/Process/Turb_Mod/Compute_F22.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Compute_F22(Turb, Sol, curr_dt, ini, phi) + subroutine Compute_F22(Turb, Sol, ini, phi) !------------------------------------------------------------------------------! ! Discretizes and solves eliptic relaxation equations for f22. ! !------------------------------------------------------------------------------! @@ -7,7 +7,6 @@ subroutine Compute_F22(Turb, Sol, curr_dt, ini, phi) !--------------------------------[Arguments]-----------------------------------! class(Turb_Type) :: Turb type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt integer, intent(in) :: ini type(Var_Type) :: phi !----------------------------------[Locals]------------------------------------! @@ -20,8 +19,6 @@ subroutine Compute_F22(Turb, Sol, curr_dt, ini, phi) real :: a0, a12, a21 real :: phi_x_f, phi_y_f, phi_z_f real, contiguous, pointer :: cross(:) -!------------------------[Avoid unused parent warning]-------------------------! - Unused(curr_dt) !------------------------------------------------------------------------------! ! ! ! The form of equations which are solved: ! diff --git a/Sources/Process/Turb_Mod/Compute_Stress.f90 b/Sources/Process/Turb_Mod/Compute_Stress.f90 index 1043ed1c5..c4d387ad7 100644 --- a/Sources/Process/Turb_Mod/Compute_Stress.f90 +++ b/Sources/Process/Turb_Mod/Compute_Stress.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Compute_Stress(Turb, Sol, curr_dt, ini, phi) + subroutine Compute_Stress(Turb, Sol, ini, phi) !------------------------------------------------------------------------------! ! Discretizes and solves transport equation for Re stresses for RSM. ! !------------------------------------------------------------------------------! @@ -7,7 +7,6 @@ subroutine Compute_Stress(Turb, Sol, curr_dt, ini, phi) !---------------------------------[Arguments]----------------------------------! class(Turb_Type), target :: Turb type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt integer, intent(in) :: ini type(Var_Type) :: phi !-----------------------------------[Locals]-----------------------------------! @@ -30,8 +29,6 @@ subroutine Compute_Stress(Turb, Sol, curr_dt, ini, phi) real, contiguous, pointer :: phi_x(:), phi_y(:), phi_z(:), cross(:) real, contiguous, pointer :: u1uj_phij(:), u2uj_phij(:), u3uj_phij(:) real, contiguous, pointer :: u1uj_phij_x(:), u2uj_phij_y(:), u3uj_phij_z(:) -!------------------------[Avoid unused parent warning]-------------------------! - Unused(curr_dt) !------------------------------------------------------------------------------! ! ! ! The form of equations which are being solved: ! diff --git a/Sources/Process/Turb_Mod/Compute_Variable.f90 b/Sources/Process/Turb_Mod/Compute_Variable.f90 index c17c9f93c..ca5096ea1 100644 --- a/Sources/Process/Turb_Mod/Compute_Variable.f90 +++ b/Sources/Process/Turb_Mod/Compute_Variable.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Compute_Variable(Turb, Sol, curr_dt, ini, phi) + subroutine Compute_Variable(Turb, Sol, ini, phi) !------------------------------------------------------------------------------! ! Discretizes and solves transport equations for different turbulent ! ! variables. ! @@ -8,7 +8,6 @@ subroutine Compute_Variable(Turb, Sol, curr_dt, ini, phi) !--------------------------------[Arguments]-----------------------------------! class(Turb_Type), target :: Turb type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt integer, intent(in) :: ini type(Var_Type) :: phi !----------------------------------[Locals]------------------------------------! @@ -220,7 +219,7 @@ subroutine Compute_Variable(Turb, Sol, curr_dt, ini, phi) if(phi % name .eq. 'KIN') call Turb % Src_Kin_K_Eps_Zeta_F(Sol) if(phi % name .eq. 'EPS') call Turb % Src_Eps_K_Eps_Zeta_F(Sol) if(phi % name .eq. 'ZETA') & - call Turb % Src_Zeta_K_Eps_Zeta_F(Sol, curr_dt) + call Turb % Src_Zeta_K_Eps_Zeta_F(Sol) if(Flow % heat_transfer) then if(phi % name .eq. 'T2') call Turb % Src_T2(Sol) end if diff --git a/Sources/Process/Turb_Mod/Main_Turb.f90 b/Sources/Process/Turb_Mod/Main_Turb.f90 index 53c0f521e..354698fba 100644 --- a/Sources/Process/Turb_Mod/Main_Turb.f90 +++ b/Sources/Process/Turb_Mod/Main_Turb.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Main_Turb(Turb, Sol, curr_dt, ini) + subroutine Main_Turb(Turb, Sol, ini) !------------------------------------------------------------------------------! ! Turbulence model main function (called inside inner iterations) ! !------------------------------------------------------------------------------! @@ -7,7 +7,6 @@ subroutine Main_Turb(Turb, Sol, curr_dt, ini) !---------------------------------[Arguments]----------------------------------! class(Turb_Type) :: Turb type(Solver_Type) :: Sol - integer, intent(in) :: curr_dt ! current time step integer, intent(in) :: ini ! inner iteration !----------------------------------[Locals]------------------------------------! type(Field_Type), pointer :: Flow @@ -38,13 +37,13 @@ subroutine Main_Turb(Turb, Sol, curr_dt, ini) call Calculate_Shear_And_Vorticity(Flow) call Turb % Time_And_Length_Scale(Grid) - call Turb % Compute_Variable(Sol, curr_dt, ini, Turb % kin) - call Turb % Compute_Variable(Sol, curr_dt, ini, Turb % eps) + call Turb % Compute_Variable(Sol, ini, Turb % kin) + call Turb % Compute_Variable(Sol, ini, Turb % eps) if(Flow % heat_transfer) then call Turb % Calculate_Stress () call Turb % Calculate_Heat_Flux() - call Turb % Compute_Variable(Sol, curr_dt, ini, Turb % t2) + call Turb % Compute_Variable(Sol, ini, Turb % t2) end if call Turb % Vis_T_K_Eps() @@ -65,22 +64,22 @@ subroutine Main_Turb(Turb, Sol, curr_dt, ini) call Calculate_Shear_And_Vorticity(Flow) - call Turb % Compute_Variable(Sol, curr_dt, ini, Turb % kin) - call Turb % Compute_Variable(Sol, curr_dt, ini, Turb % eps) + call Turb % Compute_Variable(Sol, ini, Turb % kin) + call Turb % Compute_Variable(Sol, ini, Turb % eps) if(Flow % heat_transfer) then call Turb % Calculate_Stress () call Turb % Calculate_Heat_Flux() - call Turb % Compute_Variable(Sol, curr_dt, ini, Turb % t2) + call Turb % Compute_Variable(Sol, ini, Turb % t2) end if - call Turb % Compute_F22(Sol, curr_dt, ini, Turb % f22) - call Turb % Compute_Variable(Sol, curr_dt, ini, Turb % zeta) + call Turb % Compute_F22(Sol, ini, Turb % f22) + call Turb % Compute_Variable(Sol, ini, Turb % zeta) ! For some cases, it is beneficial to start simulations with ! turbulent viscosity computed with k-eps. Particularly for ! cases with mild pressure drops such as channel, pipe flows - if(curr_dt < 10) then + if(Time % Curr_Dt() < 10) then call Turb % Vis_T_K_Eps() else call Turb % Vis_T_K_Eps_Zeta_F() @@ -97,19 +96,19 @@ subroutine Main_Turb(Turb, Sol, curr_dt, ini) call Flow % Grad_Variable(Flow % v) call Flow % Grad_Variable(Flow % w) - call Turb % Compute_Stress(Sol, curr_dt, ini, Turb % uu) - call Turb % Compute_Stress(Sol, curr_dt, ini, Turb % vv) - call Turb % Compute_Stress(Sol, curr_dt, ini, Turb % ww) + call Turb % Compute_Stress(Sol, ini, Turb % uu) + call Turb % Compute_Stress(Sol, ini, Turb % vv) + call Turb % Compute_Stress(Sol, ini, Turb % ww) - call Turb % Compute_Stress(Sol, curr_dt, ini, Turb % uv) - call Turb % Compute_Stress(Sol, curr_dt, ini, Turb % uw) - call Turb % Compute_Stress(Sol, curr_dt, ini, Turb % vw) + call Turb % Compute_Stress(Sol, ini, Turb % uv) + call Turb % Compute_Stress(Sol, ini, Turb % uw) + call Turb % Compute_Stress(Sol, ini, Turb % vw) if(Turb % model .eq. RSM_MANCEAU_HANJALIC) then - call Turb % Compute_F22(Sol, curr_dt, ini, Turb % f22) + call Turb % Compute_F22(Sol, ini, Turb % f22) end if - call Turb % Compute_Stress(Sol, curr_dt, ini, Turb % eps) + call Turb % Compute_Stress(Sol, ini, Turb % eps) call Turb % Vis_T_Rsm() @@ -122,7 +121,7 @@ subroutine Main_Turb(Turb, Sol, curr_dt, ini) Turb % model .eq. DES_SPALART) then call Calculate_Shear_And_Vorticity(Flow) - call Turb % Compute_Variable(Sol, curr_dt, ini, Turb % vis) + call Turb % Compute_Variable(Sol, ini, Turb % vis) call Turb % Vis_T_Spalart_Allmaras() end if diff --git a/Sources/Process/Turb_Mod/Src_Zeta_K_Eps_Zeta_F.f90 b/Sources/Process/Turb_Mod/Src_Zeta_K_Eps_Zeta_F.f90 index 20961fcd4..81b0474aa 100644 --- a/Sources/Process/Turb_Mod/Src_Zeta_K_Eps_Zeta_F.f90 +++ b/Sources/Process/Turb_Mod/Src_Zeta_K_Eps_Zeta_F.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Src_Zeta_K_Eps_Zeta_F(Turb, Sol, curr_dt) + subroutine Src_Zeta_K_Eps_Zeta_F(Turb, Sol) !------------------------------------------------------------------------------! ! Calculate source terms in equation for zeta. ! ! Term which is negative is put on left hand side in diagonal of ! @@ -9,7 +9,6 @@ subroutine Src_Zeta_K_Eps_Zeta_F(Turb, Sol, curr_dt) !--------------------------------[Arguments]-----------------------------------! class(Turb_Type), target :: Turb type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt !----------------------------------[Locals]------------------------------------! type(Field_Type), pointer :: Flow type(Grid_Type), pointer :: Grid @@ -44,7 +43,7 @@ subroutine Src_Zeta_K_Eps_Zeta_F(Turb, Sol, curr_dt) ! instabilities for some cases such as Flow around cylinder. That is why we ! choose this particular way to the add source term. do c = Cells_In_Domain() - if(curr_dt > 500) then + if(Time % Curr_Dt() > 500) then b(c) = b(c) + f22 % n(c) * Grid % vol(c) * Flow % density(c) else b(c) = b(c) + max(0.0, f22 % n(c)*Grid % vol(c)) * Flow % density(c) diff --git a/Sources/Process/User_Mod/Beginning_Of_Compute_Energy.f90 b/Sources/Process/User_Mod/Beginning_Of_Compute_Energy.f90 index 5929682f0..3c5bc6dc3 100644 --- a/Sources/Process/User_Mod/Beginning_Of_Compute_Energy.f90 +++ b/Sources/Process/User_Mod/Beginning_Of_Compute_Energy.f90 @@ -1,6 +1,5 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Compute_Energy(Flow, Turb, Vof, Sol, & - curr_dt, ini) + subroutine User_Mod_Beginning_Of_Compute_Energy(Flow, Turb, Vof, Sol, ini) !------------------------------------------------------------------------------! ! This function is called at the beginning of Compute_Energy function. ! !------------------------------------------------------------------------------! @@ -10,7 +9,6 @@ subroutine User_Mod_Beginning_Of_Compute_Energy(Flow, Turb, Vof, Sol, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt ! current time step integer, intent(in) :: ini ! inner iteration !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid diff --git a/Sources/Process/User_Mod/Beginning_Of_Compute_Momentum.f90 b/Sources/Process/User_Mod/Beginning_Of_Compute_Momentum.f90 index 4a7e4a493..ae2582fb1 100644 --- a/Sources/Process/User_Mod/Beginning_Of_Compute_Momentum.f90 +++ b/Sources/Process/User_Mod/Beginning_Of_Compute_Momentum.f90 @@ -1,6 +1,5 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Compute_Momentum(Flow, Turb, Vof, Sol, & - curr_dt, ini) + subroutine User_Mod_Beginning_Of_Compute_Momentum(Flow, Turb, Vof, Sol, ini) !------------------------------------------------------------------------------! ! This function is called at the beginning of Compute_Momentum function. ! !------------------------------------------------------------------------------! @@ -10,7 +9,6 @@ subroutine User_Mod_Beginning_Of_Compute_Momentum(Flow, Turb, Vof, Sol, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt ! current time step integer, intent(in) :: ini ! inner iteration !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid diff --git a/Sources/Process/User_Mod/Beginning_Of_Compute_Pressure.f90 b/Sources/Process/User_Mod/Beginning_Of_Compute_Pressure.f90 index d8d6cd360..19c9a44c3 100644 --- a/Sources/Process/User_Mod/Beginning_Of_Compute_Pressure.f90 +++ b/Sources/Process/User_Mod/Beginning_Of_Compute_Pressure.f90 @@ -1,6 +1,5 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Compute_Pressure(Flow, Vof, Sol, & - curr_dt, ini) + subroutine User_Mod_Beginning_Of_Compute_Pressure(Flow, Vof, Sol, ini) !------------------------------------------------------------------------------! ! This function is called at the beginning of Compute_Pressure function. ! !------------------------------------------------------------------------------! @@ -9,7 +8,6 @@ subroutine User_Mod_Beginning_Of_Compute_Pressure(Flow, Vof, Sol, & type(Field_Type), target :: Flow type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt ! current time step integer, intent(in) :: ini ! inner iteration !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid diff --git a/Sources/Process/User_Mod/Beginning_Of_Compute_Scalar.f90 b/Sources/Process/User_Mod/Beginning_Of_Compute_Scalar.f90 index 5d865c96c..321d56f36 100644 --- a/Sources/Process/User_Mod/Beginning_Of_Compute_Scalar.f90 +++ b/Sources/Process/User_Mod/Beginning_Of_Compute_Scalar.f90 @@ -1,6 +1,5 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Compute_Scalar(Flow, Turb, Vof, Sol, & - curr_dt, ini, sc) + subroutine User_Mod_Beginning_Of_Compute_Scalar(Flow, Turb, Vof, Sol, ini, sc) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Scalar function. ! !------------------------------------------------------------------------------! @@ -10,7 +9,6 @@ subroutine User_Mod_Beginning_Of_Compute_Scalar(Flow, Turb, Vof, Sol, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt ! current time step integer, intent(in) :: ini ! inner iteration integer, intent(in) :: sc ! scalar index !-----------------------------------[Locals]-----------------------------------! diff --git a/Sources/Process/User_Mod/Beginning_Of_Compute_Vof.f90 b/Sources/Process/User_Mod/Beginning_Of_Compute_Vof.f90 index a350d3e4c..0efaa329e 100644 --- a/Sources/Process/User_Mod/Beginning_Of_Compute_Vof.f90 +++ b/Sources/Process/User_Mod/Beginning_Of_Compute_Vof.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Compute_Vof(Vof, Sol, curr_dt) + subroutine User_Mod_Beginning_Of_Compute_Vof(Vof, Sol) !------------------------------------------------------------------------------! ! This function is called at the beginning of Compute_Vof function. ! !------------------------------------------------------------------------------! @@ -7,7 +7,6 @@ subroutine User_Mod_Beginning_Of_Compute_Vof(Vof, Sol, curr_dt) !---------------------------------[Arguments]----------------------------------! type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt ! current time step !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Field_Type), pointer :: Flow @@ -21,7 +20,7 @@ subroutine User_Mod_Beginning_Of_Compute_Vof(Vof, Sol, curr_dt) fun => Vof % fun A => Sol % Nat % A - if(curr_dt > 120) then + if(Time % Curr_Dt() > 120) then ! Do something end if diff --git a/Sources/Process/User_Mod/Beginning_Of_Correct_Velocity.f90 b/Sources/Process/User_Mod/Beginning_Of_Correct_Velocity.f90 index 2ba8ae04f..ec33a81c7 100644 --- a/Sources/Process/User_Mod/Beginning_Of_Correct_Velocity.f90 +++ b/Sources/Process/User_Mod/Beginning_Of_Correct_Velocity.f90 @@ -1,6 +1,5 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Correct_Velocity(Flow, Vof, Sol, & - curr_dt, ini) + subroutine User_Mod_Beginning_Of_Correct_Velocity(Flow, Vof, Sol, ini) !------------------------------------------------------------------------------! ! This function is called at the beginning of Correct_Velocity function. ! !------------------------------------------------------------------------------! @@ -9,7 +8,6 @@ subroutine User_Mod_Beginning_Of_Correct_Velocity(Flow, Vof, Sol, & type(Field_Type), target :: Flow type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt integer, intent(in) :: ini !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid diff --git a/Sources/Process/User_Mod/Beginning_Of_Iteration.f90 b/Sources/Process/User_Mod/Beginning_Of_Iteration.f90 index f7067b2d5..5577673c6 100644 --- a/Sources/Process/User_Mod/Beginning_Of_Iteration.f90 +++ b/Sources/Process/User_Mod/Beginning_Of_Iteration.f90 @@ -1,17 +1,14 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Iteration(Flow, Turb, Vof, Swarm, & - curr_dt, time) + subroutine User_Mod_Beginning_Of_Iteration(Flow, Turb, Vof, Swarm) !------------------------------------------------------------------------------! ! This function is called at the beginning of iteration. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type), target :: Flow - type(Turb_Type), target :: Turb - type(Vof_Type), target :: Vof - type(Swarm_Type), target :: Swarm - integer, intent(in) :: curr_dt ! time step - real, intent(in) :: time ! physical time + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb + type(Vof_Type), target :: Vof + type(Swarm_Type), target :: Swarm !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: u, v, w, t, phi diff --git a/Sources/Process/User_Mod/Beginning_Of_Simulation.f90 b/Sources/Process/User_Mod/Beginning_Of_Simulation.f90 index 5281cc00a..9ea72abc8 100644 --- a/Sources/Process/User_Mod/Beginning_Of_Simulation.f90 +++ b/Sources/Process/User_Mod/Beginning_Of_Simulation.f90 @@ -1,17 +1,14 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Simulation(Flow, Turb, Vof, Swarm, & - curr_dt, time) + subroutine User_Mod_Beginning_Of_Simulation(Flow, Turb, Vof, Swarm) !------------------------------------------------------------------------------! ! This function is called at the beginning of simulation. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type), target :: Flow - type(Turb_Type), target :: Turb - type(Vof_Type), target :: Vof - type(Swarm_Type), target :: Swarm - integer, intent(in) :: curr_dt ! time step - real, intent(in) :: time ! physical time + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb + type(Vof_Type), target :: Vof + type(Swarm_Type), target :: Swarm !==============================================================================! end subroutine diff --git a/Sources/Process/User_Mod/Beginning_Of_Time_Step.f90 b/Sources/Process/User_Mod/Beginning_Of_Time_Step.f90 index 23b1f5026..271b71557 100644 --- a/Sources/Process/User_Mod/Beginning_Of_Time_Step.f90 +++ b/Sources/Process/User_Mod/Beginning_Of_Time_Step.f90 @@ -1,6 +1,5 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Time_Step(Flow, Turb, Vof, Swarm, & - curr_dt, time) + subroutine User_Mod_Beginning_Of_Time_Step(Flow, Turb, Vof, Swarm) !------------------------------------------------------------------------------! ! This function is called at the beginning of time step. ! !------------------------------------------------------------------------------! @@ -10,8 +9,6 @@ subroutine User_Mod_Beginning_Of_Time_Step(Flow, Turb, Vof, Swarm, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: curr_dt ! time step - real, intent(in) :: time ! physical time !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: u, v, w, t, phi diff --git a/Sources/Process/User_Mod/Calculate_Mean.f90 b/Sources/Process/User_Mod/Calculate_Mean.f90 index 44cf7b9e9..a19507438 100644 --- a/Sources/Process/User_Mod/Calculate_Mean.f90 +++ b/Sources/Process/User_Mod/Calculate_Mean.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Calculate_Mean(Turb, n0, n1) + subroutine User_Mod_Calculate_Mean(Turb, n0) !------------------------------------------------------------------------------! ! User-defined calculation of time-averaged values. ! ! Follow Turb_Mod/Calculate_Mean.f90 as guideline for this function. ! @@ -8,7 +8,6 @@ subroutine User_Mod_Calculate_Mean(Turb, n0, n1) !---------------------------------[Arguments]----------------------------------! type(Turb_Type), target :: Turb integer, intent(in) :: n0 - integer, intent(in) :: n1 !-----------------------------------[Locals]-----------------------------------! type(Field_Type), pointer :: Flow type(Grid_Type), pointer :: Grid @@ -17,7 +16,7 @@ subroutine User_Mod_Calculate_Mean(Turb, n0, n1) if(.not. Turb % statistics) return - n = n1 - n0 + n = Time % Curr_Dt() - n0 ! Take aliases Flow => Turb % pnt_flow diff --git a/Sources/Process/User_Mod/End_Of_Compute_Energy.f90 b/Sources/Process/User_Mod/End_Of_Compute_Energy.f90 index df98cb251..a30edbc63 100644 --- a/Sources/Process/User_Mod/End_Of_Compute_Energy.f90 +++ b/Sources/Process/User_Mod/End_Of_Compute_Energy.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol, curr_dt, ini) + subroutine User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol, ini) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Energy function. ! !------------------------------------------------------------------------------! @@ -9,7 +9,6 @@ subroutine User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol, curr_dt, ini) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt ! current time step integer, intent(in) :: ini ! inner iteration !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid diff --git a/Sources/Process/User_Mod/End_Of_Compute_Momentum.f90 b/Sources/Process/User_Mod/End_Of_Compute_Momentum.f90 index 02984e13d..2499ca015 100644 --- a/Sources/Process/User_Mod/End_Of_Compute_Momentum.f90 +++ b/Sources/Process/User_Mod/End_Of_Compute_Momentum.f90 @@ -1,6 +1,5 @@ !==============================================================================! - subroutine User_Mod_End_Of_Compute_Momentum(Flow, Turb, Vof, Sol, & - curr_dt, ini) + subroutine User_Mod_End_Of_Compute_Momentum(Flow, Turb, Vof, Sol, ini) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Momentum function. ! !------------------------------------------------------------------------------! @@ -10,7 +9,6 @@ subroutine User_Mod_End_Of_Compute_Momentum(Flow, Turb, Vof, Sol, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt ! current time step integer, intent(in) :: ini ! inner iteration !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid diff --git a/Sources/Process/User_Mod/End_Of_Compute_Pressure.f90 b/Sources/Process/User_Mod/End_Of_Compute_Pressure.f90 index c872b75bc..ab6fcbacd 100644 --- a/Sources/Process/User_Mod/End_Of_Compute_Pressure.f90 +++ b/Sources/Process/User_Mod/End_Of_Compute_Pressure.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol, curr_dt, ini) + subroutine User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol, ini) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Pressure function. ! !------------------------------------------------------------------------------! @@ -8,7 +8,6 @@ subroutine User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol, curr_dt, ini) type(Field_Type), target :: Flow type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt ! current time step integer, intent(in) :: ini ! inner iteration !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid diff --git a/Sources/Process/User_Mod/End_Of_Compute_Scalar.f90 b/Sources/Process/User_Mod/End_Of_Compute_Scalar.f90 index 0600d3464..91ca3878f 100644 --- a/Sources/Process/User_Mod/End_Of_Compute_Scalar.f90 +++ b/Sources/Process/User_Mod/End_Of_Compute_Scalar.f90 @@ -1,6 +1,5 @@ !==============================================================================! - subroutine User_Mod_End_Of_Compute_Scalar(Flow, Turb, Vof, Sol, & - curr_dt, ini, sc) + subroutine User_Mod_End_Of_Compute_Scalar(Flow, Turb, Vof, Sol, ini, sc) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Scalar function. ! !------------------------------------------------------------------------------! @@ -10,7 +9,6 @@ subroutine User_Mod_End_Of_Compute_Scalar(Flow, Turb, Vof, Sol, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt ! current time step integer, intent(in) :: ini ! inner iteration integer, intent(in) :: sc ! scalar index !-----------------------------------[Locals]-----------------------------------! diff --git a/Sources/Process/User_Mod/End_Of_Compute_Vof.f90 b/Sources/Process/User_Mod/End_Of_Compute_Vof.f90 index d26300a2f..a8d2adae5 100644 --- a/Sources/Process/User_Mod/End_Of_Compute_Vof.f90 +++ b/Sources/Process/User_Mod/End_Of_Compute_Vof.f90 @@ -1,13 +1,12 @@ !==============================================================================! - subroutine User_Mod_End_Of_Compute_Vof(Vof, Sol, curr_dt) + subroutine User_Mod_End_Of_Compute_Vof(Vof, Sol) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Vof function. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Vof_Type), target :: Vof - type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt ! current time step + type(Vof_Type), target :: Vof + type(Solver_Type), target :: Sol !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Field_Type), pointer :: Flow @@ -21,7 +20,7 @@ subroutine User_Mod_End_Of_Compute_Vof(Vof, Sol, curr_dt) fun => Vof % fun A => Sol % Nat % A - if(curr_dt > 120) then + if(Time % Curr_Dt() > 120) then ! Do something end if diff --git a/Sources/Process/User_Mod/End_Of_Correct_Velocity.f90 b/Sources/Process/User_Mod/End_Of_Correct_Velocity.f90 index 86212faad..3012a8f40 100644 --- a/Sources/Process/User_Mod/End_Of_Correct_Velocity.f90 +++ b/Sources/Process/User_Mod/End_Of_Correct_Velocity.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_End_Of_Correct_Velocity(Flow, Vof, Sol, curr_dt, ini) + subroutine User_Mod_End_Of_Correct_Velocity(Flow, Vof, Sol, ini) !------------------------------------------------------------------------------! ! This function is called at the end of Correct_Velocity function. ! !------------------------------------------------------------------------------! @@ -8,7 +8,6 @@ subroutine User_Mod_End_Of_Correct_Velocity(Flow, Vof, Sol, curr_dt, ini) type(Field_Type), target :: Flow type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt integer, intent(in) :: ini !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid diff --git a/Sources/Process/User_Mod/End_Of_Iteration.f90 b/Sources/Process/User_Mod/End_Of_Iteration.f90 index 022c2c291..1a6293da2 100644 --- a/Sources/Process/User_Mod/End_Of_Iteration.f90 +++ b/Sources/Process/User_Mod/End_Of_Iteration.f90 @@ -1,16 +1,14 @@ !==============================================================================! - subroutine User_Mod_End_Of_Iteration(Flow, Turb, Vof, Swarm, n, time) + subroutine User_Mod_End_Of_Iteration(Flow, Turb, Vof, Swarm) !------------------------------------------------------------------------------! ! This function is called at the end of time step. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type), target :: Flow - type(Turb_Type), target :: Turb - type(Vof_Type), target :: Vof - type(Swarm_Type), target :: Swarm - integer, intent(in) :: n ! time step - real, intent(in) :: time ! physical time + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb + type(Vof_Type), target :: Vof + type(Swarm_Type), target :: Swarm !==============================================================================! end subroutine diff --git a/Sources/Process/User_Mod/End_Of_Simulation.f90 b/Sources/Process/User_Mod/End_Of_Simulation.f90 index c0084b136..e0ef719eb 100644 --- a/Sources/Process/User_Mod/End_Of_Simulation.f90 +++ b/Sources/Process/User_Mod/End_Of_Simulation.f90 @@ -1,16 +1,14 @@ !==============================================================================! - subroutine User_Mod_End_Of_Simulation(Flow, Turb, Vof, Swarm, curr_dt, time) + subroutine User_Mod_End_Of_Simulation(Flow, Turb, Vof, Swarm) !------------------------------------------------------------------------------! ! This function is called at the end of simulation. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type), target :: Flow - type(Turb_Type), target :: Turb - type(Vof_Type), target :: Vof - type(Swarm_Type), target :: Swarm - integer, intent(in) :: curr_dt ! time step - real, intent(in) :: time ! physical time + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb + type(Vof_Type), target :: Vof + type(Swarm_Type), target :: Swarm !==============================================================================! end subroutine diff --git a/Sources/Process/User_Mod/End_Of_Time_Step.f90 b/Sources/Process/User_Mod/End_Of_Time_Step.f90 index f9dbab005..e0ee8e0b9 100644 --- a/Sources/Process/User_Mod/End_Of_Time_Step.f90 +++ b/Sources/Process/User_Mod/End_Of_Time_Step.f90 @@ -1,6 +1,6 @@ !==============================================================================! subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & - n, n_stat_t, n_stat_p, time) + n_stat_t, n_stat_p) !------------------------------------------------------------------------------! ! This function is called at the end of time step. ! !------------------------------------------------------------------------------! @@ -10,10 +10,8 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: n ! time step integer, intent(in) :: n_stat_t ! start time step for Turb. stat. integer, intent(in) :: n_stat_p ! start time step for Swarm. stat. - real, intent(in) :: time ! physical time !==============================================================================! end subroutine diff --git a/Sources/Process/User_Mod/Insert_Particles.f90 b/Sources/Process/User_Mod/Insert_Particles.f90 index 80aa2a8d9..1e04f6bfc 100644 --- a/Sources/Process/User_Mod/Insert_Particles.f90 +++ b/Sources/Process/User_Mod/Insert_Particles.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, curr_dt, time) + subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm) !------------------------------------------------------------------------------! ! Insert particles for Lagrangian particle tracking ! !------------------------------------------------------------------------------! @@ -9,8 +9,6 @@ subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, curr_dt, time) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: curr_dt ! time step - real, intent(in) :: time ! physical time !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: u, v, w, t, phi diff --git a/Sources/Process/User_Mod/Save_Results.f90 b/Sources/Process/User_Mod/Save_Results.f90 index f46b8e77a..13ebd38f5 100644 --- a/Sources/Process/User_Mod/Save_Results.f90 +++ b/Sources/Process/User_Mod/Save_Results.f90 @@ -1,17 +1,16 @@ !==============================================================================! - subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) + subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, domain) !------------------------------------------------------------------------------! ! This subroutine is called each RESULTS_SAVE_INTERVAL (set in control ! ! file), at the end of a simulation and after 'save_now' command. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type), target :: Flow - type(Turb_Type), target :: Turb - type(Vof_Type), target :: Vof - type(Swarm_Type), target :: Swarm - integer, intent(in) :: ts ! time step - integer, optional :: domain + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb + type(Vof_Type), target :: Vof + type(Swarm_Type), target :: Swarm + integer, optional :: domain !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Bulk_Type), pointer :: bulk diff --git a/Sources/Process/User_Mod/Save_Swarm.f90 b/Sources/Process/User_Mod/Save_Swarm.f90 index 20c8855fc..439e9e6c8 100644 --- a/Sources/Process/User_Mod/Save_Swarm.f90 +++ b/Sources/Process/User_Mod/Save_Swarm.f90 @@ -1,17 +1,16 @@ !==============================================================================! - subroutine User_Mod_Save_Swarm(Flow, Turb, Vof, Swarm, ts, domain) + subroutine User_Mod_Save_Swarm(Flow, Turb, Vof, Swarm, domain) !------------------------------------------------------------------------------! ! This subroutine is called each RESULTS_SAVE_INTERVAL (set in control ! ! file), at the end of a simulation and after 'save_now' command. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type), target :: Flow - type(Turb_Type), target :: Turb - type(Vof_Type), target :: Vof - type(Swarm_Type), target :: Swarm - integer, intent(in) :: ts ! time step - integer, optional :: domain + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb + type(Vof_Type), target :: Vof + type(Swarm_Type), target :: Swarm + integer, optional :: domain !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Bulk_Type), pointer :: bulk diff --git a/Sources/Process/Vof_Mod/Core/Compute_Vof.f90 b/Sources/Process/Vof_Mod/Core/Compute_Vof.f90 index 9cd9c8d03..3cbf54b1f 100644 --- a/Sources/Process/Vof_Mod/Core/Compute_Vof.f90 +++ b/Sources/Process/Vof_Mod/Core/Compute_Vof.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Compute_Vof(Vof, Sol, dt, curr_dt) + subroutine Compute_Vof(Vof, Sol, dt) !------------------------------------------------------------------------------! ! Solves Volume Fraction equation using UPWIND ADVECTION and CICSAM ! !------------------------------------------------------------------------------! @@ -8,7 +8,6 @@ subroutine Compute_Vof(Vof, Sol, dt, curr_dt) class(Vof_Type), target :: Vof type(Solver_Type), target :: Sol real :: dt - integer, intent(in) :: curr_dt ! current time step !-----------------------------------[Locals]-----------------------------------! type(Field_Type), pointer :: Flow type(Grid_Type), pointer :: Grid @@ -26,7 +25,7 @@ subroutine Compute_Vof(Vof, Sol, dt, curr_dt) call Profiler % Start('Compute_Vof (without solvers)') - call User_Mod_Beginning_Of_Compute_Vof(Vof, Sol, curr_dt) + call User_Mod_Beginning_Of_Compute_Vof(Vof, Sol) ! Take aliases Flow => Vof % pnt_flow @@ -53,7 +52,7 @@ subroutine Compute_Vof(Vof, Sol, dt, curr_dt) if(n_sub > 1) then if(First_Proc()) then call File % Append_For_Writing_Ascii('alert-dt-vof.dat', fu) - write(fu,*) 'Courant Number was exceded at iteration: ', curr_dt + write(fu,*) 'Courant Number exceded at iteration: ', Time % Curr_Dt() write(fu,*) 'Co_max = ', courant_max write(fu,*) 'Try reducing time step' close(fu) @@ -248,7 +247,7 @@ subroutine Compute_Vof(Vof, Sol, dt, curr_dt) call Flow % Grad_Variable(fun) - call User_Mod_End_Of_Compute_Vof(Vof, Sol, curr_dt) + call User_Mod_End_Of_Compute_Vof(Vof, Sol) call Profiler % Stop('Compute_Vof (without solvers)') diff --git a/Sources/Process/Vof_Mod/Core/Main_Vof.f90 b/Sources/Process/Vof_Mod/Core/Main_Vof.f90 index 06acb7266..20574240a 100644 --- a/Sources/Process/Vof_Mod/Core/Main_Vof.f90 +++ b/Sources/Process/Vof_Mod/Core/Main_Vof.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Main_Vof(Vof, Flow, Turb, Sol, curr_dt) + subroutine Main_Vof(Vof, Flow, Turb, Sol) !------------------------------------------------------------------------------! ! Initialize inteface tracking simulations ! !------------------------------------------------------------------------------! @@ -9,7 +9,6 @@ subroutine Main_Vof(Vof, Flow, Turb, Sol, curr_dt) type(Field_Type), target :: Flow type(Turb_Type), target :: Turb type(Solver_Type) :: Sol - integer, intent(in) :: curr_dt ! time step !------------------------[Avoid unused parent warning]-------------------------! Unused(Turb) !==============================================================================! @@ -26,7 +25,7 @@ subroutine Main_Vof(Vof, Flow, Turb, Sol, curr_dt) ! Advance vof function (fun) and ! ! re-create its smooth variant ! !------------------------------------! - call Vof % Compute_Vof(Sol, Flow % dt, curr_dt) + call Vof % Compute_Vof(Sol, Flow % dt) call Vof % Smooth_For_Curvature_Csf() !------------------------------------------------! diff --git a/Sources/Process/makefile b/Sources/Process/makefile index fcd52d1c6..bd81dffe0 100644 --- a/Sources/Process/makefile +++ b/Sources/Process/makefile @@ -310,6 +310,7 @@ SRC_F_MOD += Point_Mod.f90 \ Native_Mod.f90 \ Petsc_Mod.f90 \ Solver_Mod.f90 \ + Time_Mod.f90 \ Numerics_Mod.f90 \ Field_Mod.f90 \ Front_Mod.f90 \ diff --git a/Sources/Process/makefile_explicit_dependencies b/Sources/Process/makefile_explicit_dependencies index fdf9b829f..075c6cde3 100644 --- a/Sources/Process/makefile_explicit_dependencies +++ b/Sources/Process/makefile_explicit_dependencies @@ -43,8 +43,6 @@ $(DIR_OBJECT)/Turb_Mod.o \ Turb_Mod/*.f90 \ $(DIR_OBJECT)/Swarm_Mod.o \ Swarm_Mod/*.f90 \ -$(DIR_OBJECT)/Solver_Mod.o \ -Solver_Mod/*.f90 \ $(DIR_OBJECT)/Results_Mod.o \ Results_Mod/*.f90 \ $(DIR_OBJECT)/Read_Controls_Mod.o \ @@ -192,6 +190,14 @@ $(DIR_OBJECT)/Field_Mod.o \ Field_Mod/*/*.f90 \ Eddies_Mod/*.f90 +#--------------------------------------------------- +# Dependencies for: ./Time_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Time_Mod.o:\ +Time_Mod/*.f90 \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 + #--------------------------------------------------- # Dependencies for: ./User_Mod.f90 #--------------------------------------------------- @@ -216,6 +222,8 @@ Native_Mod/*.f90 # Dependencies for: ./Field_Mod.f90 #--------------------------------------------------- $(DIR_OBJECT)/Field_Mod.o:\ +$(DIR_OBJECT)/Time_Mod.o \ +Time_Mod/*.f90 \ $(DIR_OBJECT)/Solver_Mod.o \ Solver_Mod/*.f90 \ $(DIR_OBJECT)/Numerics_Mod.o \ @@ -353,14 +361,6 @@ $(DIR_SHARED)/Comm_Mod/*/*.f90 \ $(DIR_OBJECT)/Bulk_Mod.o \ Bulk_Mod/*.f90 -#--------------------------------------------------- -# Dependencies for: ./Process_Mod/Logo_Pro.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Logo_Pro.o:\ -$(DIR_OBJECT)/Solver_Mod.o \ -Solver_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o - #--------------------------------------------------- # Dependencies for: ./Surf_Mod.f90 #--------------------------------------------------- @@ -653,5 +653,6 @@ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- $(DIR_OBJECT)/Tokenizer_Mod.o:\ $(DIR_SHARED)/Tokenizer_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 diff --git a/Tests/Functionality/Communication/User_Mod/Beginning_Of_Time_Step.f90 b/Tests/Functionality/Communication/User_Mod/Beginning_Of_Time_Step.f90 index d8eb0ec9c..a6d546675 100644 --- a/Tests/Functionality/Communication/User_Mod/Beginning_Of_Time_Step.f90 +++ b/Tests/Functionality/Communication/User_Mod/Beginning_Of_Time_Step.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Time_Step(Flow, Turb, Vof, Swarm, n, time) + subroutine User_Mod_Beginning_Of_Time_Step(Flow, Turb, Vof, Swarm) !------------------------------------------------------------------------------! ! This function is called at the beginning of time step. ! !------------------------------------------------------------------------------! @@ -9,8 +9,6 @@ subroutine User_Mod_Beginning_Of_Time_Step(Flow, Turb, Vof, Swarm, n, time) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: n ! time step - real, intent(in) :: time ! physical time !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: G type(Var_Type), pointer :: u, v, w, t, phi diff --git a/Tests/Functionality/Omp/User_Mod/Beginning_Of_Simulation.f90 b/Tests/Functionality/Omp/User_Mod/Beginning_Of_Simulation.f90 index eda75787d..4d7c9f080 100644 --- a/Tests/Functionality/Omp/User_Mod/Beginning_Of_Simulation.f90 +++ b/Tests/Functionality/Omp/User_Mod/Beginning_Of_Simulation.f90 @@ -1,17 +1,14 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Simulation(Flow, Turb, Vof, Swarm, & - curr_dt, time) + subroutine User_Mod_Beginning_Of_Simulation(Flow, Turb, Vof, Swarm) !------------------------------------------------------------------------------! ! This function is called at the beginning of simulation. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type), target :: Flow - type(Turb_Type), target :: Turb - type(Vof_Type), target :: Vof - type(Swarm_Type), target :: Swarm - integer, intent(in) :: curr_dt ! time step - real, intent(in) :: time ! physical time + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb + type(Vof_Type), target :: Vof + type(Swarm_Type), target :: Swarm !------------------------------[Local parameters]------------------------------! integer, parameter :: ITERS = 6000 !-----------------------------------[Locals]-----------------------------------! diff --git a/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/End_Of_Time_Step.f90 b/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/End_Of_Time_Step.f90 index 2247a798e..19d35c9ac 100644 --- a/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/End_Of_Time_Step.f90 @@ -1,6 +1,6 @@ !==============================================================================! subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & - n, n_stat_t, n_stat_p, time) + n_stat_t, n_stat_p) !------------------------------------------------------------------------------! ! This function is called at the end of time step. ! !------------------------------------------------------------------------------! @@ -10,10 +10,8 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: n ! time step integer, intent(in) :: n_stat_t ! 1st step for turbulence statist. integer, intent(in) :: n_stat_p ! 1st step for particle statistics - real, intent(in) :: time ! physical time !----------------------------------[Locals]------------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: u, v, w @@ -30,10 +28,10 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & w => Flow % w ! If not time for disturbing the velocity field, return - if(mod(n,100) .ne. 0) return + if(mod(Time % Curr_Dt(), 100) .ne. 0) return ! If too late to disturb, get out too - if(n > 1000) return + if(Time % Curr_Dt() > 1000) return ! Minimum and maximum size of eddies rmin = 0.2 diff --git a/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/Save_Results.f90 b/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/Save_Results.f90 index 5518aa7bf..8abb06cc2 100644 --- a/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/Save_Results.f90 +++ b/Tests/Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh/User_Mod/Save_Results.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) + subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, domain) !------------------------------------------------------------------------------! ! This subroutine reads name.1d file created by Convert or Generator and ! ! averages the results in homogeneous directions. ! @@ -12,7 +12,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: ts ! time step integer, optional :: domain !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid @@ -35,7 +34,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !==============================================================================! ! Don't save if this is intial condition, nothing is developed yet - if(ts .eq. 0) return + if(Time % Curr_Dt() .eq. 0) return ! Take aliases Grid => Flow % pnt_grid @@ -53,14 +52,14 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call File % Set_Name(coord_name, extension='.1d') ! Set file names for results - call File % Set_Name(res_name, & - time_step=ts, & - appendix='-res', & - extension='.dat') - call File % Set_Name(res_name_plus, & - time_step=ts, & - appendix='-res-plus', & - extension='.dat') + call File % Set_Name(res_name, & + time_step = Time % Curr_Dt(), & + appendix = '-res', & + extension = '.dat') + call File % Set_Name(res_name_plus, & + time_step = Time % Curr_Dt(), & + appendix = '-res-plus', & + extension = '.dat') !------------------! ! Read 1d file ! diff --git a/Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/End_Of_Time_Step.f90 b/Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/End_Of_Time_Step.f90 index ae181a5dd..d1dbd2fe8 100644 --- a/Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/End_Of_Time_Step.f90 @@ -1,6 +1,6 @@ !==============================================================================! subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & - n, n_stat_t, n_stat_p, time) + n_stat_t, n_stat_p) !------------------------------------------------------------------------------! ! Append viscous forces to pressure drops. ! !------------------------------------------------------------------------------! @@ -10,10 +10,8 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: n ! time step integer, intent(in) :: n_stat_t ! 1st step for turbulence statist. integer, intent(in) :: n_stat_p ! 1st step for particle statistics - real, intent(in) :: time ! physical time !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Bulk_Type), pointer :: bulk diff --git a/Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/Save_Results.f90 b/Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/Save_Results.f90 index 0f4d8106c..c64bdd260 100644 --- a/Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/Save_Results.f90 +++ b/Tests/Laminar/Accuracy_Test/Channel_Re_2000/User_Mod/Save_Results.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) + subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, domain) !------------------------------------------------------------------------------! ! This subroutine reads name.1d file created by Convert or Generator and ! ! averages the results in homogeneous directions. ! @@ -12,7 +12,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: ts integer, optional :: domain !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid @@ -27,7 +26,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !==============================================================================! ! Don't save if this is intial condition, nothing is developed yet - if(ts .eq. 0) return + if(Time % Curr_Dt() .eq. 0) return ! Take aliases Grid => Flow % pnt_grid @@ -38,10 +37,10 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call File % Set_Name(coord_name, extension='.1d') ! Set file name for results - call File % Set_Name(res_name, & - time_step=ts, & - appendix='-res', & - extension='.dat') + call File % Set_Name(res_name, & + time_step = Time % Curr_Dt(), & + appendix = '-res', & + extension = '.dat') !------------------! ! Read 1d file ! diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/User_Mod/End_Of_Time_Step.f90 b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/User_Mod/End_Of_Time_Step.f90 index d56329089..15761e304 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Conjugate/User_Mod/End_Of_Time_Step.f90 @@ -1,6 +1,6 @@ !==============================================================================! subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & - n, n_stat_t, n_stat_p, time) + n_stat_t, n_stat_p) !------------------------------------------------------------------------------! ! This function is called at the end of time step. ! !------------------------------------------------------------------------------! @@ -10,10 +10,8 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: n ! time step integer, intent(in) :: n_stat_t ! start time step for Turb. stat. integer, intent(in) :: n_stat_p ! start time step for Swarm. stat. - real, intent(in) :: time ! physical time !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: t diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Direct/Variable_Properties_Air/User_Mod/Beginning_Of_Simulation.f90 b/Tests/Laminar/Cavity/Thermally_Driven/Direct/Variable_Properties_Air/User_Mod/Beginning_Of_Simulation.f90 index 38e43b7d5..e444b39fd 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Direct/Variable_Properties_Air/User_Mod/Beginning_Of_Simulation.f90 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Direct/Variable_Properties_Air/User_Mod/Beginning_Of_Simulation.f90 @@ -1,16 +1,14 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Simulation(Flow, Turb, Vof, Swarm, n, time) + subroutine User_Mod_Beginning_Of_Simulation(Flow, Turb, Vof, Swarm) !------------------------------------------------------------------------------! ! This function is called at the beginning of simulation. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type), target :: Flow - type(Turb_Type), target :: Turb - type(Vof_Type), target :: Vof - type(Swarm_Type), target :: Swarm - integer, intent(in) :: n ! time step - real, intent(in) :: time ! physical time + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb + type(Vof_Type), target :: Vof + type(Swarm_Type), target :: Swarm !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid integer :: i, fu diff --git a/Tests/Laminar/Cavity/Thermally_Driven/Direct/Variable_Properties_Air/User_Mod/Beginning_Of_Time_Step.f90 b/Tests/Laminar/Cavity/Thermally_Driven/Direct/Variable_Properties_Air/User_Mod/Beginning_Of_Time_Step.f90 index 095f8231d..f182abde1 100644 --- a/Tests/Laminar/Cavity/Thermally_Driven/Direct/Variable_Properties_Air/User_Mod/Beginning_Of_Time_Step.f90 +++ b/Tests/Laminar/Cavity/Thermally_Driven/Direct/Variable_Properties_Air/User_Mod/Beginning_Of_Time_Step.f90 @@ -1,16 +1,14 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Time_Step(Flow, Turb, Vof, Swarm, n, time) + subroutine User_Mod_Beginning_Of_Time_Step(Flow, Turb, Vof, Swarm) !------------------------------------------------------------------------------! ! This function is called at the beginning of time step. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type), target :: Flow - type(Turb_Type), target :: Turb - type(Vof_Type), target :: Vof - type(Swarm_Type), target :: Swarm - integer, intent(in) :: n ! time step - real, intent(in) :: time ! physical time + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb + type(Vof_Type), target :: Vof + type(Swarm_Type), target :: Swarm !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: u, v, w, t, phi diff --git a/Tests/Laminar/Cylinder/Vertical/User_Mod/Beginning_Of_Iteration.f90 b/Tests/Laminar/Cylinder/Vertical/User_Mod/Beginning_Of_Iteration.f90 index f6acbf05c..fe10fe5d1 100644 --- a/Tests/Laminar/Cylinder/Vertical/User_Mod/Beginning_Of_Iteration.f90 +++ b/Tests/Laminar/Cylinder/Vertical/User_Mod/Beginning_Of_Iteration.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Iteration(Flow, Turb, Vof, Swarm, n, time) + subroutine User_Mod_Beginning_Of_Iteration(Flow, Turb, Vof, Swarm) !------------------------------------------------------------------------------! ! This function is called at the beginning of time step. ! !------------------------------------------------------------------------------! @@ -9,8 +9,6 @@ subroutine User_Mod_Beginning_Of_Iteration(Flow, Turb, Vof, Swarm, n, time) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: n ! time step - real, intent(in) :: time ! physical time !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: u, v, w, t, phi diff --git a/Tests/Laminar/Cylinder/Vertical/User_Mod/Save_Results.f90 b/Tests/Laminar/Cylinder/Vertical/User_Mod/Save_Results.f90 index 8f56b672f..e8f1ed462 100644 --- a/Tests/Laminar/Cylinder/Vertical/User_Mod/Save_Results.f90 +++ b/Tests/Laminar/Cylinder/Vertical/User_Mod/Save_Results.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) + subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, domain) !------------------------------------------------------------------------------! ! This subroutine reads name.1d file created by Convert or Generator and ! ! averages the results in homogeneous directions. ! @@ -12,7 +12,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: ts ! time step integer, optional :: domain !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid @@ -29,7 +28,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !==============================================================================! ! Don't save if this is intial condition, nothing is developed yet - if(ts .eq. 0) return + if(Time % Curr_Dt() .eq. 0) return ! Take aliases Grid => Flow % pnt_grid diff --git a/Tests/Laminar/Flat_Plate/User_Mod/Plain_Nu.f90 b/Tests/Laminar/Flat_Plate/User_Mod/Plain_Nu.f90 index d1743a0b1..1c29392d0 100644 --- a/Tests/Laminar/Flat_Plate/User_Mod/Plain_Nu.f90 +++ b/Tests/Laminar/Flat_Plate/User_Mod/Plain_Nu.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Plain_Nu(Flow, Turb, ts) + subroutine User_Mod_Plain_Nu(Flow, Turb) !------------------------------------------------------------------------------! ! Subroutine extracts skin friction coefficient and Stanton number for ! ! backstep case. ! @@ -12,7 +12,7 @@ subroutine User_Mod_Plain_Nu(Flow, Turb, ts) type(Var_Type), pointer :: u, v, w, t type(Grid_Type), pointer :: Grid type(Bulk_Type), pointer :: bulk - integer :: n_prob, pl, c, dummy, i, count, k, c1, c2, s, fu, ts + integer :: n_prob, pl, c, dummy, i, count, k, c1, c2, s, fu character(SL) :: result_name real, allocatable :: r1_p(:), r2_p(:), z_p(:), & um_p(:), vm_p(:), wm_p(:), & @@ -158,7 +158,10 @@ subroutine User_Mod_Plain_Nu(Flow, Turb, ts) end if end do - call File % Set_Name(result_name, time_step=ts, appendix='-Nu', extension='.dat') + call File % Set_Name(result_name, & + time_step = Time % Curr_Dt(), & + appendix = '-Nu', & + extension = '.dat') call File % Open_For_Writing_Ascii(result_name, fu) write(fu,*) '# x, Cf, Cf_corr, Nu, Nu_corr, q' diff --git a/Tests/Laminar/Flat_Plate/User_Mod/Plain_Profiles.f90 b/Tests/Laminar/Flat_Plate/User_Mod/Plain_Profiles.f90 index 6a9a936af..b1f33c929 100644 --- a/Tests/Laminar/Flat_Plate/User_Mod/Plain_Profiles.f90 +++ b/Tests/Laminar/Flat_Plate/User_Mod/Plain_Profiles.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Plain_Profiles(Flow, Turb, ts) + subroutine User_Mod_Plain_Profiles(Flow, Turb) !------------------------------------------------------------------------------! ! Description !------------------------------------------------------------------------------! @@ -12,7 +12,7 @@ subroutine User_Mod_Plain_Profiles(Flow, Turb, ts) type(Var_Type), pointer :: kin, eps, zeta, f22 type(Grid_Type), pointer :: Grid integer :: n_prob, pl, c, idumm, i, count, & - k, c1, c2, s, n_hor, fu, ts + k, c1, c2, s, n_hor, fu character(SL) :: coord_name, result_name real, parameter :: u_b = 11.3, h = 0.038 real, allocatable :: x1_p(:), x2_p(:), lnum(:), z_p(:), & @@ -175,27 +175,38 @@ subroutine User_Mod_Plain_Profiles(Flow, Turb, ts) end do if(k == 1) then - call File % Set_Name(result_name, time_step=ts, appendix='-1', extension='.dat') + call File % Set_Name(result_name, time_step=Time % Curr_Dt(), & + appendix='-1', extension='.dat') else if(k == 2) then - call File % Set_Name(result_name, time_step=ts, appendix='-2', extension='.dat') + call File % Set_Name(result_name, time_step=Time % Curr_Dt(), & + appendix='-2', extension='.dat') else if(k == 3) then - call File % Set_Name(result_name, time_step=ts, appendix='-3', extension='.dat') + call File % Set_Name(result_name, time_step=Time % Curr_Dt(), & + appendix='-3', extension='.dat') else if(k == 4) then - call File % Set_Name(result_name, time_step=ts, appendix='-4', extension='.dat') + call File % Set_Name(result_name, time_step=Time % Curr_Dt(), & + appendix='-4', extension='.dat') else if(k == 5) then - call File % Set_Name(result_name, time_step=ts, appendix='-5', extension='.dat') + call File % Set_Name(result_name, time_step=Time % Curr_Dt(), & + appendix='-5', extension='.dat') else if(k == 6) then - call File % Set_Name(result_name, time_step=ts, appendix='-6', extension='.dat') + call File % Set_Name(result_name, time_step=Time % Curr_Dt(), & + appendix='-6', extension='.dat') else if(k == 7) then - call File % Set_Name(result_name, time_step=ts, appendix='-7', extension='.dat') + call File % Set_Name(result_name, time_step=Time % Curr_Dt(), & + appendix='-7', extension='.dat') else if(k == 8) then - call File % Set_Name(result_name, time_step=ts, appendix='-8', extension='.dat') + call File % Set_Name(result_name, time_step=Time % Curr_Dt(), & + appendix='-8', extension='.dat') else if(k == 9) then - call File % Set_Name(result_name, time_step=ts, appendix='-9', extension='.dat') + call File % Set_Name(result_name, time_step=Time % Curr_Dt(), & + appendix='-9', extension='.dat') else if(k == 10) then - call File % Set_Name(result_name, time_step=ts, appendix='-10', extension='.dat') + call File % Set_Name(result_name, time_step=Time % Curr_Dt(), & + appendix='-10', extension='.dat') else if(k == 11) then - call File % Set_Name(result_name, time_step=ts, appendix='-11', extension='.dat') + call File % Set_Name(result_name, time_step=Time % Curr_Dt(), & + appendix='-11', extension='.dat') end if call File % Open_For_Writing_Ascii(result_name, fu) diff --git a/Tests/Laminar/Flat_Plate/User_Mod/Save_Results.f90 b/Tests/Laminar/Flat_Plate/User_Mod/Save_Results.f90 index d16f916bf..6b1d02081 100644 --- a/Tests/Laminar/Flat_Plate/User_Mod/Save_Results.f90 +++ b/Tests/Laminar/Flat_Plate/User_Mod/Save_Results.f90 @@ -2,7 +2,7 @@ #include "Plain_Nu.f90" !==============================================================================! - subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) + subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, domain) !------------------------------------------------------------------------------! ! Calls user-define subroutines ! !------------------------------------------------------------------------------! @@ -12,14 +12,13 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: ts integer, optional :: domain !==============================================================================! ! Don't save if this is intial condition, nothing is developed yet - if(ts .eq. 0) return + if(Time % Curr_Dt() .eq. 0) return - call User_Mod_Plain_Profiles(Flow, Turb, ts) - call User_Mod_Plain_Nu (Flow, Turb, ts) + call User_Mod_Plain_Profiles(Flow, Turb) + call User_Mod_Plain_Nu (Flow, Turb) end subroutine diff --git a/Tests/Laminar/Membrane/2_Domains/User_Mod/Beginning_Of_Iteration.f90 b/Tests/Laminar/Membrane/2_Domains/User_Mod/Beginning_Of_Iteration.f90 index 27f810942..b48015bf2 100644 --- a/Tests/Laminar/Membrane/2_Domains/User_Mod/Beginning_Of_Iteration.f90 +++ b/Tests/Laminar/Membrane/2_Domains/User_Mod/Beginning_Of_Iteration.f90 @@ -1,7 +1,7 @@ #include "T_Sat.f90" !==============================================================================! - subroutine User_Mod_Beginning_Of_Iteration(Flow, Turb, Vof, Swarm, n, time) + subroutine User_Mod_Beginning_Of_Iteration(Flow, Turb, Vof, Swarm) !------------------------------------------------------------------------------! ! This function is called at the beginning of time step. ! !------------------------------------------------------------------------------! @@ -11,8 +11,6 @@ subroutine User_Mod_Beginning_Of_Iteration(Flow, Turb, Vof, Swarm, n, time) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer :: n ! time step - real :: time ! physical time !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: u, v, w, t, scalar diff --git a/Tests/Les/Barc/User_Mod/Beginning_Of_Simulation.f90 b/Tests/Les/Barc/User_Mod/Beginning_Of_Simulation.f90 index 6ee69e0b8..f9cb19880 100644 --- a/Tests/Les/Barc/User_Mod/Beginning_Of_Simulation.f90 +++ b/Tests/Les/Barc/User_Mod/Beginning_Of_Simulation.f90 @@ -1,6 +1,5 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Simulation(Flow, Turb, Vof, Swarm, & - curr_dt, time) + subroutine User_Mod_Beginning_Of_Simulation(Flow, Turb, Vof, Swarm) !------------------------------------------------------------------------------! ! This function is called at the beginning of simulation. ! !------------------------------------------------------------------------------! @@ -10,8 +9,6 @@ subroutine User_Mod_Beginning_Of_Simulation(Flow, Turb, Vof, Swarm, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: curr_dt ! time step - real, intent(in) :: time ! physical time !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid !==============================================================================! diff --git a/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/End_Of_Time_Step.f90 b/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/End_Of_Time_Step.f90 index cc321ef58..189727d97 100644 --- a/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/End_Of_Time_Step.f90 @@ -1,6 +1,6 @@ !==============================================================================! subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & - n, n_stat_t, n_stat_p, time) + n_stat_t, n_stat_p) !------------------------------------------------------------------------------! ! This function is called at the end of time step. ! !------------------------------------------------------------------------------! @@ -10,10 +10,8 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: n ! time step integer, intent(in) :: n_stat_t ! 1st t.s. statistics turbulence integer, intent(in) :: n_stat_p ! 1st t.s. statistics particles - real, intent(in) :: time ! physical time !----------------------------------[Locals]------------------------------------! type(Var_Type), pointer :: u, v, w, t type(Grid_Type), pointer :: Grid @@ -24,10 +22,10 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & !==============================================================================! ! If not time for disturbing the velocity field, return - if(mod(n, 120) .ne. 0) return + if(mod(Time % Curr_Dt(), 120) .ne. 0) return ! If too late to disturb, get out too - if(n > 1200) return + if(Time % Curr_Dt() > 1200) return ! Take aliases Grid => Flow % pnt_grid diff --git a/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/Save_Results.f90 b/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/Save_Results.f90 index 18946dbbd..edc34aaa8 100644 --- a/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/Save_Results.f90 +++ b/Tests/Les/Channel_Re_Tau_180/Periodic_Domain/User_Mod/Save_Results.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) + subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, domain) !------------------------------------------------------------------------------! ! This subroutine reads name.1d file created by Convert or Generator and ! ! averages the results in homogeneous directions. ! @@ -12,7 +12,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: ts integer, optional :: domain !-----------------------------------[Locals]-----------------------------------! type(Var_Type), pointer :: u, v, w, t @@ -32,7 +31,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !==============================================================================! ! Don't save if this is intial condition, nothing is developed yet - if(ts .eq. 0) return + if(Time % Curr_Dt() .eq. 0) return ! Take aliases Grid => Flow % pnt_grid @@ -52,9 +51,13 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call File % Set_Name(coord_name, extension='.1d') !call File % Set_Name(0, res_name, "-res.dat") - call File % Set_Name(res_name, time_step=ts, extension='-res.dat') + call File % Set_Name(res_name, & + time_step = Time % Curr_Dt(), & + extension = '-res.dat') !call File % Set_Name(0, res_name_plus, "-res-plus.dat") - call File % Set_Name(res_name_plus, time_step=ts, extension='-res-plus.dat') + call File % Set_Name(res_name_plus, & + time_step = Time % Curr_Dt(), & + extension = '-res-plus.dat') !------------------! ! Read 1d file ! diff --git a/Tests/Les/Channel_Re_Tau_180/User_Mod/Save_Results.f90 b/Tests/Les/Channel_Re_Tau_180/User_Mod/Save_Results.f90 index 3d33528ce..f4f6bacdd 100644 --- a/Tests/Les/Channel_Re_Tau_180/User_Mod/Save_Results.f90 +++ b/Tests/Les/Channel_Re_Tau_180/User_Mod/Save_Results.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) + subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, domain) !------------------------------------------------------------------------------! ! This subroutine reads name.1d file created by Convert or Generator and ! ! averages the results for paerticles in homogeneous directions. ! @@ -13,7 +13,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: ts ! time step integer, optional :: domain !-----------------------------------[Locals]-----------------------------------! type(Var_Type), pointer :: u, v, w, t diff --git a/Tests/Les/Forrest/User_Mod/Beginning_Of_Time_Step.f90 b/Tests/Les/Forrest/User_Mod/Beginning_Of_Time_Step.f90 index f5611280f..1a4600fd1 100644 --- a/Tests/Les/Forrest/User_Mod/Beginning_Of_Time_Step.f90 +++ b/Tests/Les/Forrest/User_Mod/Beginning_Of_Time_Step.f90 @@ -1,6 +1,5 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Time_Step(Flow, Turb, Vof, Swarm, & - curr_dt, time) + subroutine User_Mod_Beginning_Of_Time_Step(Flow, Turb, Vof, Swarm) !------------------------------------------------------------------------------! ! This function is called at the beginning of time step. ! !------------------------------------------------------------------------------! @@ -10,8 +9,6 @@ subroutine User_Mod_Beginning_Of_Time_Step(Flow, Turb, Vof, Swarm, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: curr_dt ! time step - real, intent(in) :: time ! physical time !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: u, v, w, t, phi diff --git a/Tests/Les/Forrest/User_Mod/End_Of_Time_Step.f90 b/Tests/Les/Forrest/User_Mod/End_Of_Time_Step.f90 index 5d3c0f2cb..79a694406 100644 --- a/Tests/Les/Forrest/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Les/Forrest/User_Mod/End_Of_Time_Step.f90 @@ -1,6 +1,6 @@ !==============================================================================! subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & - n, n_stat_t, n_stat_p, time) + n_stat_t, n_stat_p) !------------------------------------------------------------------------------! ! This function is called at the end of time step. ! !------------------------------------------------------------------------------! @@ -10,10 +10,8 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: n ! time step integer, intent(in) :: n_stat_t ! 1st t.s. statistics turbulence integer, intent(in) :: n_stat_p ! 1st t.s. statistics particles - real, intent(in) :: time ! physical time !----------------------------------[Locals]------------------------------------! type(Var_Type), pointer :: u, v, w, t type(Grid_Type), pointer :: Grid @@ -24,10 +22,10 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & !==============================================================================! ! If not time for disturbing the velocity field, return - if(mod(n, 120) .ne. 0) return + if(mod(Time % Curr_Dt(), 120) .ne. 0) return ! If too late to disturb, get out too - if(n > 1200) return + if(Time % Curr_Dt() > 1200) return ! Take aliases Grid => Flow % pnt_grid diff --git a/Tests/Les/Forrest/User_Mod/Save_Results.f90 b/Tests/Les/Forrest/User_Mod/Save_Results.f90 index 4532d029a..488098969 100644 --- a/Tests/Les/Forrest/User_Mod/Save_Results.f90 +++ b/Tests/Les/Forrest/User_Mod/Save_Results.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) + subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, domain) !------------------------------------------------------------------------------! ! This subroutine reads name.1d file created by Convert or Generator and ! ! averages the results in homogeneous directions. ! @@ -12,7 +12,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: ts ! time step integer, optional :: domain !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid @@ -33,13 +32,13 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !==============================================================================! ! Don't save if this is intial condition, nothing is developed yet - if(ts .eq. 0) return + if(Time % Curr_Dt() .eq. 0) return if(.not. Turb % statistics) return call Control % Read_Int_Item('STARTING_TIME_STEP_FOR_TURB_STATISTICS', & HUGE_INT, n_stat, .false.) - if(ts < n_stat) return + if(Time % Curr_Dt() < n_stat) return h_ref = 20.0 @@ -56,10 +55,10 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call File % Set_Name(coord_name, extension='.1d') ! Set file names for results - call File % Set_Name(res_name, & - time_step=ts, & - appendix='-res', & - extension='.dat') + call File % Set_Name(res_name, & + time_step = Time % Curr_Dt(), & + appendix = '-res', & + extension = '.dat') !------------------! ! Read 1d file ! !------------------! diff --git a/Tests/Les/Pipe_Re_Tau_180/User_Mod/End_Of_Time_Step.f90 b/Tests/Les/Pipe_Re_Tau_180/User_Mod/End_Of_Time_Step.f90 index c1350cef8..bb5d48198 100644 --- a/Tests/Les/Pipe_Re_Tau_180/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Les/Pipe_Re_Tau_180/User_Mod/End_Of_Time_Step.f90 @@ -1,6 +1,6 @@ !==============================================================================! subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & - n, n_stat_t, n_stat_p, time) + n_stat_t, n_stat_p) !------------------------------------------------------------------------------! ! This function is called at the beginning of time step. ! !------------------------------------------------------------------------------! @@ -10,10 +10,8 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: n ! time step integer, intent(in) :: n_stat_t ! 1st step for turbulence statist. integer, intent(in) :: n_stat_p ! 1st step for particle statistics - real, intent(in) :: time ! physical time !----------------------------------[Locals]------------------------------------! type(Var_Type), pointer :: u, v, w, t type(Grid_Type), pointer :: Grid @@ -30,10 +28,10 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & t => Flow % t ! If not time for disturbing the velocity field, return - if(mod(n, 100) .ne. 0) return + if(mod(Time % Curr_Dt(), 100) .ne. 0) return ! If too late to disturb, get out too - if(n > 3000) return + if(Time % Curr_Dt() > 3000) return ! Print a message if(First_Proc()) then diff --git a/Tests/Les/Pipe_Re_Tau_180/User_Mod/Save_Results.f90 b/Tests/Les/Pipe_Re_Tau_180/User_Mod/Save_Results.f90 index 83ca7b308..233265247 100644 --- a/Tests/Les/Pipe_Re_Tau_180/User_Mod/Save_Results.f90 +++ b/Tests/Les/Pipe_Re_Tau_180/User_Mod/Save_Results.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) + subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, domain) !------------------------------------------------------------------------------! ! This subroutine reads name.1d file created by Convert or Generator and ! ! averages the results in homogeneous directions. ! @@ -12,7 +12,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: ts integer, optional :: domain !-----------------------------------[Locals]-----------------------------------! type(Var_Type), pointer :: u, v, w, t @@ -35,7 +34,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !==============================================================================! ! Don't save if this is intial condition, nothing is developed yet - if(ts .eq. 0) return + if(Time % Curr_Dt() .eq. 0) return ! Take aliases Grid => Flow % pnt_grid @@ -53,14 +52,14 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call File % Set_Name(coord_name, extension='.1r') ! Set file names for results - call File % Set_Name(res_name, & - time_step=ts, & - appendix='-res', & - extension='.dat') - call File % Set_Name(res_name_plus, & - time_step=ts, & - appendix='-res-plus', & - extension='.dat') + call File % Set_Name(res_name, & + time_step = Time % Curr_Dt(), & + appendix = '-res', & + extension = '.dat') + call File % Set_Name(res_name_plus, & + time_step = Time % Curr_Dt(), & + appendix = '-res-plus', & + extension = '.dat') !------------------! ! Read 1d file ! diff --git a/Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 b/Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 index 4df9aa1c5..3627b4867 100644 --- a/Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 +++ b/Tests/Les/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) + subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, domain) !------------------------------------------------------------------------------! ! This subroutine reads name.1d file created by Convert or Generator and ! ! averages the results in homogeneous directions. ! @@ -12,7 +12,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: ts integer, optional :: domain !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid @@ -36,7 +35,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !==============================================================================! ! Don't save if this is intial condition, nothing is developed yet - if(ts .eq. 0) return + if(Time % Curr_Dt() .eq. 0) return call Work % Connect_Real_Cell(tz_mean) @@ -64,14 +63,14 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call File % Set_Name(coord_name, extension='.1d') ! Set file names for results - call File % Set_Name(res_name, & - time_step=ts, & - appendix='-res', & - extension='.dat') - call File % Set_Name(res_name_plus, & - time_step=ts, & - appendix='-res-plus', & - extension='.dat') + call File % Set_Name(res_name, & + time_step = Time % Curr_Dt(), & + appendix = '-res', & + extension = '.dat') + call File % Set_Name(res_name_plus, & + time_step = Time % Curr_Dt(), & + appendix = '-res-plus', & + extension = '.dat') !------------------! ! Read 1d file ! diff --git a/Tests/Manual/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 b/Tests/Manual/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 index bc03d927e..a17c43d77 100644 --- a/Tests/Manual/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 +++ b/Tests/Manual/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) + subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, domain) !------------------------------------------------------------------------------! ! This subroutine reads name.1d file created by Convert or Generator and ! ! averages the results in homogeneous directions. ! @@ -12,7 +12,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: ts ! time step integer, optional :: domain !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid @@ -31,7 +30,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !==============================================================================! ! Don't save if this is intial condition, nothing is developed yet - if(ts .eq. 0) return + if(Time % Curr_Dt() .eq. 0) return ! This version of the Save_Results works only for sequential runs if(Parallel_Run()) then @@ -60,9 +59,9 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call File % Set_Name(coord_name, extension='.1d') ! Set file name for results - call File % Set_Name(res_name, & - time_step=ts, & - appendix='-res-plus', & + call File % Set_Name(res_name, & + time_step = Time % Curr_Dt(), & + appendix='-res-plus', & extension='.dat') !------------------! diff --git a/Tests/Manual/Conjugate/User_Mod/End_Of_Time_Step.f90 b/Tests/Manual/Conjugate/User_Mod/End_Of_Time_Step.f90 index 853650ed0..c8ef5b0f9 100644 --- a/Tests/Manual/Conjugate/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Manual/Conjugate/User_Mod/End_Of_Time_Step.f90 @@ -1,6 +1,6 @@ !==============================================================================! subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & - n, n_stat_t, n_stat_p, time) + n_stat_t, n_stat_p) !------------------------------------------------------------------------------! ! This function is called at the end of time step. ! !------------------------------------------------------------------------------! @@ -10,10 +10,8 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: n ! time step integer, intent(in) :: n_stat_t ! start time step for Turb. stat. integer, intent(in) :: n_stat_p ! start time step for Swarm. stat. - real, intent(in) :: time ! physical time !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: t diff --git a/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 b/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 index ea33494af..f8a2936ce 100644 --- a/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 +++ b/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Nu.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Save_Impinging_Jet_Nu(Turb, ts) + subroutine Save_Impinging_Jet_Nu(Turb) !------------------------------------------------------------------------------! ! The subroutine creates ASCII file with Nusselt number averaged ! ! in azimuthal direction. ! @@ -7,7 +7,6 @@ subroutine Save_Impinging_Jet_Nu(Turb, ts) implicit none !---------------------------------[Arguments]----------------------------------! type(Turb_Type), target :: Turb - integer, intent(in) :: ts ! time step !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Field_Type), pointer :: Flow @@ -145,7 +144,7 @@ subroutine Save_Impinging_Jet_Nu(Turb, ts) if(First_Proc()) then ! Set the file name - call File % Set_Name(res_name, time_step=ts, & + call File % Set_Name(res_name, time_step=Time % Curr_Dt(), & appendix='-nu-utau', extension='.dat') call File % Open_For_Writing_Ascii(res_name, fu) diff --git a/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Profiles.f90 b/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Profiles.f90 index 8cbce171e..54e66927f 100644 --- a/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Profiles.f90 +++ b/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Impinging_Jet_Profiles.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Save_Impinging_Jet_Profiles(Turb, ts) + subroutine Save_Impinging_Jet_Profiles(Turb) !------------------------------------------------------------------------------! ! Subroutine reads the .1d file with wall normal coordinates and extracts ! ! solutions for comparison with corresponding experimental measurements. ! @@ -7,7 +7,6 @@ subroutine Save_Impinging_Jet_Profiles(Turb, ts) implicit none !---------------------------------[Arguments]----------------------------------! type(Turb_Type), target :: Turb - integer, intent(in) :: ts ! time step !------------------------------[Local parameters]------------------------------! real, parameter :: U_AVER = 1.14 !-----------------------------------[Locals]-----------------------------------! @@ -73,43 +72,43 @@ subroutine Save_Impinging_Jet_Profiles(Turb, ts) r1 = 0.0 r2 = 0.04 lnum = 0.0 - call File % Set_Name(res_name, time_step=ts, & + call File % Set_Name(res_name, time_step=Time % Curr_Dt(), & appendix='-0.0D', extension='.dat') else if(k .eq. 1) then r1 = 0.992 r2 = 1.0 lnum = 0.5 - call File % Set_Name(res_name, time_step=ts, & + call File % Set_Name(res_name, time_step=Time % Curr_Dt(), & appendix='-0.5D', extension='.dat') else if(k .eq. 2) then r1 = 2.0 r2 = 2.1500 lnum = 1.0 - call File % Set_Name(res_name, time_step=ts, & + call File % Set_Name(res_name, time_step=Time % Curr_Dt(), & appendix='-1.0D', extension='.dat') else if(k .eq. 3) then r1 = 2.9744 r2 = 3.0684 lnum = 1.5 - call File % Set_Name(res_name, time_step=ts, & + call File % Set_Name(res_name, time_step=Time % Curr_Dt(), & appendix='-1.5D', extension='.dat') else if(k .eq. 4) then r1 = 3.9098 r2 = 4.1433 lnum = 2.0 - call File % Set_Name(res_name, time_step=ts, & + call File % Set_Name(res_name, time_step=Time % Curr_Dt(), & appendix='-2.0D', extension='.dat') else if(k .eq. 5) then r1 = 0.4803200E+01 r2 = 0.5347000E+01 lnum = 2.5 - call File % Set_Name(res_name, time_step=ts, & + call File % Set_Name(res_name, time_step=Time % Curr_Dt(), & appendix='-2.5D', extension='.dat') else if(k .eq. 6) then r1 = 0.5876600E+01 r2 = 0.6000000E+01 lnum = 3.0 - call File % Set_Name(res_name, time_step=ts, & + call File % Set_Name(res_name, time_step=Time % Curr_Dt(), & appendix='-3.0D', extension='.dat') end if diff --git a/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Results.f90 b/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Results.f90 index b1158a997..adfa515ac 100644 --- a/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Results.f90 +++ b/Tests/Manual/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Results.f90 @@ -2,7 +2,7 @@ #include "Save_Impinging_Jet_Profiles.f90" !==============================================================================! - subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) + subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, domain) !------------------------------------------------------------------------------! ! Calls Save_Impinging_Jet_Nu and Save_Impinging_Jet_Profile functions. ! !------------------------------------------------------------------------------! @@ -12,14 +12,13 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) type(Turb_Type) :: Turb type(Vof_Type) :: Vof type(Swarm_Type) :: Swarm - integer, intent(in) :: ts ! time step integer, optional :: domain !==============================================================================! ! Don't save if this is intial condition, nothing is developed yet - if(ts .eq. 0) return + if(Time % Curr_Dt() .eq. 0) return - call Save_Impinging_Jet_Nu (Turb, ts) - call Save_Impinging_Jet_Profiles(Turb, ts) + call Save_Impinging_Jet_Nu (Turb) + call Save_Impinging_Jet_Profiles(Turb) end subroutine diff --git a/Tests/Manual/Inflows/Option_4/User_Mod/End_Of_Time_Step.f90 b/Tests/Manual/Inflows/Option_4/User_Mod/End_Of_Time_Step.f90 index ec357760b..759fe8d91 100644 --- a/Tests/Manual/Inflows/Option_4/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Manual/Inflows/Option_4/User_Mod/End_Of_Time_Step.f90 @@ -1,6 +1,6 @@ !==============================================================================! subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & - curr_dt, n_stat_t, n_stat_p, time) + n_stat_t, n_stat_p) !------------------------------------------------------------------------------! ! This function is called at the end of time step. ! !------------------------------------------------------------------------------! @@ -10,10 +10,8 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: curr_dt ! time step integer, intent(in) :: n_stat_t ! 1st t.s. statistics turbulence integer, intent(in) :: n_stat_p ! 1st t.s. statistics particles - real, intent(in) :: time ! physical time !----------------------------------[Locals]------------------------------------! type(Var_Type), pointer :: u, v, w, t type(Grid_Type), pointer :: Grid @@ -25,10 +23,10 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & !==============================================================================! ! If not time for disturbing the velocity field, return - if(mod(curr_dt, 120) .ne. 0) return + if(mod(Time % Curr_Dt(), 120) .ne. 0) return ! If too late to disturb, get out too - if(curr_dt > 1440) return + if(Time % Curr_Dt() > 1440) return ! Take aliases Grid => Flow % pnt_grid diff --git a/Tests/Manual/Matrix_Of_Cubes/User_Mod/Beginning_Of_Simulation.f90 b/Tests/Manual/Matrix_Of_Cubes/User_Mod/Beginning_Of_Simulation.f90 index 66cb4f474..6c5972dd2 100644 --- a/Tests/Manual/Matrix_Of_Cubes/User_Mod/Beginning_Of_Simulation.f90 +++ b/Tests/Manual/Matrix_Of_Cubes/User_Mod/Beginning_Of_Simulation.f90 @@ -1,6 +1,5 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Simulation(Flow, Turb, Vof, Swarm, & - curr_dt, time) + subroutine User_Mod_Beginning_Of_Simulation(Flow, Turb, Vof, Swarm) !------------------------------------------------------------------------------! ! This function is called at the beginning of simulation. ! ! ! @@ -13,8 +12,6 @@ subroutine User_Mod_Beginning_Of_Simulation(Flow, Turb, Vof, Swarm, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: curr_dt ! time step - real, intent(in) :: time ! physical time !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid integer :: n, n_probes, backup_dt diff --git a/Tests/Manual/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 b/Tests/Manual/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 index 3a7b6d625..f827f021b 100644 --- a/Tests/Manual/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Manual/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 @@ -1,6 +1,6 @@ !==============================================================================! subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & - n, n_stat_t, n_stat_p, time) + n_stat_t, n_stat_p) !------------------------------------------------------------------------------! ! This function is computing benchmark for rising bubble. ! !------------------------------------------------------------------------------! @@ -10,10 +10,8 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer :: n ! current time step integer :: n_stat_t ! 1st t.s. statistics turbulence integer :: n_stat_p ! 1st t.s. statistics particles - real :: time ! physical time !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: fun @@ -44,7 +42,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & if (First_Proc()) then call File % Append_For_Writing_Ascii('benchmark.dat', fu) - write(fu,'(4(2x,e16.10e2))') time, & + write(fu,'(4(2x,e16.10e2))') Time % Get_Time(), & b_volume, & c_position/b_volume, & rise_velocity/b_volume diff --git a/Tests/Manual/Thermally_Driven/Varible/User_Mod/Beginning_Of_Simulation.f90 b/Tests/Manual/Thermally_Driven/Varible/User_Mod/Beginning_Of_Simulation.f90 index 38e43b7d5..b900c1997 100644 --- a/Tests/Manual/Thermally_Driven/Varible/User_Mod/Beginning_Of_Simulation.f90 +++ b/Tests/Manual/Thermally_Driven/Varible/User_Mod/Beginning_Of_Simulation.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Simulation(Flow, Turb, Vof, Swarm, n, time) + subroutine User_Mod_Beginning_Of_Simulation(Flow, Turb, Vof, Swarm) !------------------------------------------------------------------------------! ! This function is called at the beginning of simulation. ! !------------------------------------------------------------------------------! @@ -9,8 +9,6 @@ subroutine User_Mod_Beginning_Of_Simulation(Flow, Turb, Vof, Swarm, n, time) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: n ! time step - real, intent(in) :: time ! physical time !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid integer :: i, fu diff --git a/Tests/Manual/Thermally_Driven/Varible/User_Mod/Beginning_Of_Time_Step.f90 b/Tests/Manual/Thermally_Driven/Varible/User_Mod/Beginning_Of_Time_Step.f90 index 095f8231d..81a9168de 100644 --- a/Tests/Manual/Thermally_Driven/Varible/User_Mod/Beginning_Of_Time_Step.f90 +++ b/Tests/Manual/Thermally_Driven/Varible/User_Mod/Beginning_Of_Time_Step.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Time_Step(Flow, Turb, Vof, Swarm, n, time) + subroutine User_Mod_Beginning_Of_Time_Step(Flow, Turb, Vof, Swarm) !------------------------------------------------------------------------------! ! This function is called at the beginning of time step. ! !------------------------------------------------------------------------------! @@ -9,8 +9,6 @@ subroutine User_Mod_Beginning_Of_Time_Step(Flow, Turb, Vof, Swarm, n, time) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: n ! time step - real, intent(in) :: time ! physical time !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: u, v, w, t, phi diff --git a/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Cf_St.f90 b/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Cf_St.f90 index a7c26d381..0dd1d7d07 100644 --- a/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Cf_St.f90 +++ b/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Cf_St.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Backstep_Cf_St(Flow, Turb, ts) + subroutine User_Mod_Backstep_Cf_St(Flow, Turb) !------------------------------------------------------------------------------! ! Subroutine extracts skin friction coefficient and Stanton number for ! ! backstep case. ! @@ -25,7 +25,6 @@ subroutine User_Mod_Backstep_Cf_St(Flow, Turb, ts) real :: kin_vis, u_tan, u_tau, tau_wall real :: dens_const, visc_const real :: capa_const, cond_const - integer :: ts !==============================================================================! ! Take aliases @@ -158,7 +157,10 @@ subroutine User_Mod_Backstep_Cf_St(Flow, Turb, ts) end if end do - call File % Set_Name(result_name, time_step=ts, appendix='-cf-st', extension='.dat') + call File % Set_Name(result_name, & + time_step = Time % Curr_Dt(), & + appendix = '-cf-st', & + extension = '.dat') call File % Open_For_Writing_Ascii(result_name, fu) write(fu,*) '# x, Cf, St, U, T, yPlus' diff --git a/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Profiles.f90 b/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Profiles.f90 index 680d2ba5f..3abfe883c 100644 --- a/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Profiles.f90 +++ b/Tests/Rans/Backstep_Re_28000/User_Mod/Backstep_Profiles.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Backstep_Profiles(Flow, Turb, ts) + subroutine User_Mod_Backstep_Profiles(Flow, Turb) !------------------------------------------------------------------------------! ! Description !------------------------------------------------------------------------------! @@ -12,7 +12,7 @@ subroutine User_Mod_Backstep_Profiles(Flow, Turb, ts) type(Var_Type), pointer :: kin, eps, zeta, f22 type(Grid_Type), pointer :: Grid integer :: n_prob, pl, c, idumm, i, count, & - k, c1, c2, s, n_hor, fu, ts + k, c1, c2, s, n_hor, fu character(SL) :: coord_name, result_name real, parameter :: u_b = 11.3, h = 0.038 real, allocatable :: x1_p(:), x2_p(:), lnum(:), z_p(:), & @@ -187,37 +187,37 @@ subroutine User_Mod_Backstep_Profiles(Flow, Turb, ts) end do if(k == 1) then - call File % Set_Name(result_name, time_step=ts, & + call File % Set_Name(result_name, time_step=Time % Curr_Dt(), & appendix='-0.35h', extension='.h.dat') else if(k == 2) then - call File % Set_Name(result_name, time_step=ts, & + call File % Set_Name(result_name, time_step=Time % Curr_Dt(), & appendix='-1.68h', extension='.h.dat') else if(k == 3) then - call File % Set_Name(result_name, time_step=ts, & + call File % Set_Name(result_name, time_step=Time % Curr_Dt(), & appendix='-2.30h', extension='.h.dat') else if(k == 4) then - call File % Set_Name(result_name, time_step=ts, & + call File % Set_Name(result_name, time_step=Time % Curr_Dt(), & appendix='-3.15h', extension='.h.dat') else if(k == 5) then - call File % Set_Name(result_name, time_step=ts, & + call File % Set_Name(result_name, time_step=Time % Curr_Dt(), & appendix='-3.92h', extension='.h.dat') else if(k == 6) then - call File % Set_Name(result_name, time_step=ts, & + call File % Set_Name(result_name, time_step=Time % Curr_Dt(), & appendix='-4.70h', extension='.h.dat') else if(k == 7) then - call File % Set_Name(result_name, time_step=ts, & + call File % Set_Name(result_name, time_step=Time % Curr_Dt(), & appendix='-5.20h', extension='.h.dat') else if(k == 8) then - call File % Set_Name(result_name, time_step=ts, & + call File % Set_Name(result_name, time_step=Time % Curr_Dt(), & appendix='-6.50h', extension='.h.dat') else if(k == 9) then - call File % Set_Name(result_name, time_step=ts, & + call File % Set_Name(result_name, time_step=Time % Curr_Dt(), & appendix='-8.90h', extension='.h.dat') else if(k == 10) then - call File % Set_Name(result_name, time_step=ts, & + call File % Set_Name(result_name, time_step=Time % Curr_Dt(), & appendix='-26.0h', extension='.h.dat') else if(k == 11) then - call File % Set_Name(result_name, time_step=ts, & + call File % Set_Name(result_name, time_step=Time % Curr_Dt(), & appendix='-52.0h', extension='.h.dat') end if diff --git a/Tests/Rans/Backstep_Re_28000/User_Mod/Save_Results.f90 b/Tests/Rans/Backstep_Re_28000/User_Mod/Save_Results.f90 index baf703ddb..9966dc505 100644 --- a/Tests/Rans/Backstep_Re_28000/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Backstep_Re_28000/User_Mod/Save_Results.f90 @@ -2,7 +2,7 @@ #include "Backstep_Cf_St.f90" !==============================================================================! - subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) + subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, domain) !------------------------------------------------------------------------------! ! Calls User_Backstep_Profiles and User_Backstep_Cf_St functions. ! !------------------------------------------------------------------------------! @@ -12,14 +12,13 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: ts integer, optional :: domain !==============================================================================! ! Don't save if this is intial condition, nothing is developed yet - if(ts .eq. 0) return + if(Time % Curr_Dt() .eq. 0) return - call User_Mod_Backstep_Profiles(Flow, Turb, ts) - call User_Mod_Backstep_Cf_St (Flow, Turb, ts) + call User_Mod_Backstep_Profiles(Flow, Turb) + call User_Mod_Backstep_Cf_St (Flow, Turb) end subroutine diff --git a/Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Save_Results.f90 b/Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Save_Results.f90 index 709729253..f387c2300 100644 --- a/Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Channel_Re_Tau_590/Rsm/User_Mod/Save_Results.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) + subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, domain) !------------------------------------------------------------------------------! ! This subroutine reads name.1d file created by Convert or Generator and ! ! averages the results in homogeneous directions. ! @@ -12,7 +12,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: ts ! time step integer, optional :: domain !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid @@ -37,7 +36,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !==============================================================================! ! Don't save if this is intial condition, nothing is developed yet - if(ts .eq. 0) return + if(Time % Curr_Dt() .eq. 0) return ! Take aliases Grid => Flow % pnt_grid @@ -58,14 +57,14 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call File % Set_Name(coord_name, extension='.1d') ! Set file names for results - call File % Set_Name(res_name, & - time_step=ts, & - appendix='-res', & - extension='.dat') - call File % Set_Name(res_name_plus, & - time_step=ts, & - appendix='-res-plus', & - extension='.dat') + call File % Set_Name(res_name, & + time_step = Time % Curr_Dt(), & + appendix = '-res', & + extension = '.dat') + call File % Set_Name(res_name_plus, & + time_step = Time % Curr_Dt(), & + appendix = '-res-plus', & + extension = '.dat') !------------------! ! Read 1d file ! diff --git a/Tests/Rans/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 b/Tests/Rans/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 index f074ac893..8f430649f 100644 --- a/Tests/Rans/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Channel_Re_Tau_590/Stretched_Mesh/User_Mod/Save_Results.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) + subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, domain) !------------------------------------------------------------------------------! ! This subroutine reads name.1d file created by Convert or Generator and ! ! averages the results in homogeneous directions. ! @@ -12,7 +12,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: ts ! time step integer, optional :: domain !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid @@ -36,7 +35,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !==============================================================================! ! Don't save if this is intial condition, nothing is developed yet - if(ts .eq. 0) return + if(Time % Curr_Dt() .eq. 0) return ! Take aliases Grid => Flow % pnt_grid @@ -57,14 +56,14 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call File % Set_Name(coord_name, extension='.1d') ! Set file name for results - call File % Set_Name(res_name, & - time_step=ts, & - appendix='-res', & - extension='.dat') - call File % Set_Name(res_name_plus, & - time_step=ts, & - appendix='-res-plus', & - extension='.dat') + call File % Set_Name(res_name, & + time_step = Time % Curr_Dt(), & + appendix = '-res', & + extension = '.dat') + call File % Set_Name(res_name_plus, & + time_step = Time % Curr_Dt(), & + appendix = '-res-plus', & + extension = '.dat') !------------------! ! Read 1d file ! diff --git a/Tests/Rans/Channel_Re_Tau_590/Uniform_Mesh/User_Mod/Save_Results.f90 b/Tests/Rans/Channel_Re_Tau_590/Uniform_Mesh/User_Mod/Save_Results.f90 index eb12aca41..adef25453 100644 --- a/Tests/Rans/Channel_Re_Tau_590/Uniform_Mesh/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Channel_Re_Tau_590/Uniform_Mesh/User_Mod/Save_Results.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) + subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, domain) !------------------------------------------------------------------------------! ! This subroutine reads name.1d file created by Convert or Generator and ! ! averages the results in homogeneous directions. ! @@ -12,7 +12,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: ts ! time step integer, optional :: domain !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid @@ -36,7 +35,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !==============================================================================! ! Don't save if this is intial condition, nothing is developed yet - if(ts .eq. 0) return + if(Time % Curr_Dt() .eq. 0) return ! Take aliases Grid => Flow % pnt_grid @@ -57,14 +56,14 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call File % Set_Name(coord_name, extension='.1d') ! Set file name for results - call File % Set_Name(res_name, & - time_step=ts, & - appendix='-res', & - extension='.dat') - call File % Set_Name(res_name_plus, & - time_step=ts, & - appendix='-res-plus', & - extension='.dat') + call File % Set_Name(res_name, & + time_step = Time % Curr_Dt(), & + appendix = '-res', & + extension = '.dat') + call File % Set_Name(res_name_plus, & + time_step = Time % Curr_Dt(), & + appendix = '-res-plus', & + extension = '.dat') !------------------! ! Read 1d file ! diff --git a/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 b/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 index 742a707b7..d2e6d1c65 100644 --- a/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 +++ b/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Nu.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Impinging_Jet_Nu(Turb, ts) + subroutine User_Mod_Impinging_Jet_Nu(Turb) !------------------------------------------------------------------------------! ! The subroutine creates ASCII file with Nusselt number averaged ! ! in azimuthal direction. ! @@ -7,7 +7,6 @@ subroutine User_Mod_Impinging_Jet_Nu(Turb, ts) implicit none !---------------------------------[Arguments]----------------------------------! type(Turb_Type), target :: Turb - integer, intent(in) :: ts ! time step !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Field_Type), pointer :: Flow @@ -155,8 +154,10 @@ subroutine User_Mod_Impinging_Jet_Nu(Turb, ts) if(First_Proc()) then ! Set the file name - call File % Set_Name(res_name, time_step=ts, & - appendix='-nu-utau', extension='.dat') + call File % Set_Name(res_name, & + time_step = Time % Curr_Dt(), & + appendix = '-nu-utau', & + extension = '.dat') call File % Open_For_Writing_Ascii(res_name, fu) ! Write the file out diff --git a/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Profiles.f90 b/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Profiles.f90 index 15de91b21..3d790a4f5 100644 --- a/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Profiles.f90 +++ b/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Impinging_Jet_Profiles.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Impinging_Jet_Profiles(Turb, ts) + subroutine User_Mod_Impinging_Jet_Profiles(Turb) !------------------------------------------------------------------------------! ! Subroutine reads the .1d file with wall normal coordinates and extracts ! ! solutions for comparison with corresponding experimental measurements. ! @@ -7,7 +7,6 @@ subroutine User_Mod_Impinging_Jet_Profiles(Turb, ts) implicit none !---------------------------------[Arguments]----------------------------------! type(Turb_Type), target :: Turb - integer, intent(in) :: ts ! time step !------------------------------[Local parameters]------------------------------! real, parameter :: U_AVER = 1.14 !-----------------------------------[Locals]-----------------------------------! @@ -74,43 +73,43 @@ subroutine User_Mod_Impinging_Jet_Profiles(Turb, ts) r1 = 0.0 r2 = 0.04 lnum = 0.0 - call File % Set_Name(res_name, time_step=ts, & + call File % Set_Name(res_name, time_step=Time % Curr_Dt(), & appendix='-0.0D', extension='.dat') else if(k .eq. 1) then r1 = 0.992 r2 = 1.0 lnum = 0.5 - call File % Set_Name(res_name, time_step=ts, & + call File % Set_Name(res_name, time_step=Time % Curr_Dt(), & appendix='-0.5D', extension='.dat') else if(k .eq. 2) then r1 = 2.0 r2 = 2.1500 lnum = 1.0 - call File % Set_Name(res_name, time_step=ts, & + call File % Set_Name(res_name, time_step=Time % Curr_Dt(), & appendix='-1.0D', extension='.dat') else if(k .eq. 3) then r1 = 2.9744 r2 = 3.0684 lnum = 1.5 - call File % Set_Name(res_name, time_step=ts, & + call File % Set_Name(res_name, time_step=Time % Curr_Dt(), & appendix='-1.5D', extension='.dat') else if(k .eq. 4) then r1 = 3.9098 r2 = 4.1433 lnum = 2.0 - call File % Set_Name(res_name, time_step=ts, & + call File % Set_Name(res_name, time_step=Time % Curr_Dt(), & appendix='-2.0D', extension='.dat') else if(k .eq. 5) then r1 = 0.4803200E+01 r2 = 0.5347000E+01 lnum = 2.5 - call File % Set_Name(res_name, time_step=ts, & + call File % Set_Name(res_name, time_step=Time % Curr_Dt(), & appendix='-2.5D', extension='.dat') else if(k .eq. 6) then r1 = 0.5876600E+01 r2 = 0.6000000E+01 lnum = 3.0 - call File % Set_Name(res_name, time_step=ts, & + call File % Set_Name(res_name, time_step=Time % Curr_Dt(), & appendix='-3.0D', extension='.dat') end if diff --git a/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Results.f90 b/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Results.f90 index 542b02473..3998c990d 100644 --- a/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Impinging_Jet_2d_Distant_Re_23000/User_Mod/Save_Results.f90 @@ -2,7 +2,7 @@ #include "Impinging_Jet_Profiles.f90" !==============================================================================! - subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) + subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, domain) !------------------------------------------------------------------------------! ! Calls User_Impinging_Jet_Nu and User_Impinging_Jet_Profile functions. ! !------------------------------------------------------------------------------! @@ -12,14 +12,13 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) type(Turb_Type) :: Turb type(Vof_Type) :: Vof type(Swarm_Type) :: Swarm - integer, intent(in) :: ts ! time step integer, optional :: domain !==============================================================================! ! Don't save if this is intial condition, nothing is developed yet - if(ts .eq. 0) return + if(Time % Curr_Dt() .eq. 0) return - call User_Mod_Impinging_Jet_Nu (Turb, ts) - call User_Mod_Impinging_Jet_Profiles(Turb, ts) + call User_Mod_Impinging_Jet_Nu (Turb) + call User_Mod_Impinging_Jet_Profiles(Turb) end subroutine diff --git a/Tests/Rans/Pipe_Re_Tau_550/User_Mod/Save_Results.f90 b/Tests/Rans/Pipe_Re_Tau_550/User_Mod/Save_Results.f90 index 28525bec1..9ed9fcdc8 100644 --- a/Tests/Rans/Pipe_Re_Tau_550/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Pipe_Re_Tau_550/User_Mod/Save_Results.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) + subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, domain) !------------------------------------------------------------------------------! ! This subroutine reads name.1r file created by Convert or Generator and ! ! averages the results in homogeneous directions. ! @@ -12,7 +12,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: ts ! time step integer, optional :: domain !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid @@ -38,7 +37,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !==============================================================================! ! Don't save if this is intial condition, nothing is developed yet - if(ts .eq. 0) return + if(Time % Curr_Dt() .eq. 0) return ! Take aliases Grid => Flow % pnt_grid @@ -60,14 +59,14 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call File % Set_Name(coord_name, extension='.1r') ! Set file name for results - call File % Set_Name(res_name, & - time_step=ts, & - appendix='-res', & - extension='.dat') - call File % Set_Name(res_name_plus, & - time_step=ts, & - appendix='-res-plus', & - extension='.dat') + call File % Set_Name(res_name, & + time_step = Time % Curr_Dt(), & + appendix = '-res', & + extension = '.dat') + call File % Set_Name(res_name_plus, & + time_step = Time % Curr_Dt(), & + appendix = '-res-plus', & + extension = '.dat') !------------------! ! Read 1r file ! diff --git a/Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 b/Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 index 9d75e200d..f98406f46 100644 --- a/Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 +++ b/Tests/Rans/Rayleigh_Benard_Convection_Ra_10e09/User_Mod/Save_Results.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) + subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, domain) !------------------------------------------------------------------------------! ! This subroutine reads name.1d file created by Convert or Generator and ! ! averages the results in homogeneous directions. ! @@ -12,7 +12,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: ts integer, optional :: domain !-----------------------------------[Locals]-----------------------------------! integer :: n_prob, pl, c, i, count, s, c1, c2, n_points @@ -34,7 +33,7 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) !==============================================================================! ! Don't save if this is intial condition, nothing is developed yet - if(ts .eq. 0) return + if(Time % Curr_Dt() .eq. 0) return ! Take aliases Grid => Flow % pnt_grid @@ -60,13 +59,13 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, ts, domain) call File % Set_Name(coord_name, extension='.1d') ! Set file names for results - call File % Set_Name(res_name, & - time_step = ts, & - appendix = '-res', & + call File % Set_Name(res_name, & + time_step = Time % Curr_Dt(), & + appendix = '-res', & extension = '.dat') - call File % Set_Name(res_name_plus, & - time_step = ts, & - appendix = '-res-plus', & + call File % Set_Name(res_name_plus, & + time_step = Time % Curr_Dt(), & + appendix = '-res-plus', & extension = '.dat') !------------------! diff --git a/Tests/Swarm/Bend_90_Degrees/User_Mod/Insert_Particles.f90 b/Tests/Swarm/Bend_90_Degrees/User_Mod/Insert_Particles.f90 index e5b3a6cc8..c89ec73b7 100644 --- a/Tests/Swarm/Bend_90_Degrees/User_Mod/Insert_Particles.f90 +++ b/Tests/Swarm/Bend_90_Degrees/User_Mod/Insert_Particles.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, curr_dt, time) + subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm) !------------------------------------------------------------------------------! ! This function is called at the end of time step. ! !------------------------------------------------------------------------------! @@ -9,8 +9,6 @@ subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, curr_dt, time) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: curr_dt ! time step - real, intent(in) :: time ! physical time !----------------------------------[Locals]------------------------------------! type(Grid_Type), pointer :: Grid integer :: i, j, k, c, n_parts_in_buffers @@ -40,10 +38,10 @@ subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, curr_dt, time) !-------------------------------------------! n_old = Swarm % n_particles ! old number of particles - if(curr_dt .eq. 1001 .or. & - curr_dt .eq. 1501 .or. & - curr_dt .eq. 2001 .or. & - curr_dt .eq. 2501) then ! should be after the flow is developed + if(Time % Curr_Dt() .eq. 1001 .or. & + Time % Curr_Dt() .eq. 1501 .or. & + Time % Curr_Dt() .eq. 2001 .or. & + Time % Curr_Dt() .eq. 2501) then ! should be after the flow is developed ! First Particle in the center k = n_old + 1 diff --git a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/End_Of_Time_Step.f90 b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/End_Of_Time_Step.f90 index 278bc94b3..7248a6b29 100644 --- a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/End_Of_Time_Step.f90 @@ -1,6 +1,6 @@ !==============================================================================! subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & - n, n_stat_t, n_stat_p, time) + n_stat_t, n_stat_p) !------------------------------------------------------------------------------! ! This function is called at the end of time step. ! !------------------------------------------------------------------------------! @@ -10,10 +10,8 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: n ! current time step integer :: n_stat_t ! 1st t.s. for turb. stat. integer :: n_stat_p ! 1st t.s. for swarm. stat. - real :: time ! physical time !------------------------------[Local parameters]------------------------------! real, parameter :: LX = 6.28 ! streamwise real, parameter :: LY = 3.14 ! spanwise @@ -151,10 +149,10 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & !------------------------! ! If not time for disturbing the velocity field, return - if(mod(n, 120) .ne. 0) return + if(mod(Time % Curr_Dt(), 120) .ne. 0) return ! If too late to disturb, get out too - if(n > 1200) return + if(Time % Curr_Dt() > 1200) return ! Print a message if(First_Proc()) then diff --git a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Insert_Particles.f90 b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Insert_Particles.f90 index af49f4429..43c9c5abc 100644 --- a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Insert_Particles.f90 +++ b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Insert_Particles.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, n, time) + subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm) !------------------------------------------------------------------------------! ! This function is called at the beginning of time step. ! !------------------------------------------------------------------------------! @@ -9,8 +9,6 @@ subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, n, time) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: n ! current time step - real, intent(in) :: time ! physical time !----------------------------------[Locals]------------------------------------! type(Grid_Type), pointer :: Grid integer :: k, n_parts_in_buffers @@ -27,7 +25,7 @@ subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, n, time) !-----------------------! ! 24001st time step ! !-----------------------! - if(n .eq. 24001) then ! should be after the Flow is developed + if(Time % Curr_Dt() .eq. 24001) then ! should be after the Flow is developed ! Track maximum number of particles Swarm % n_particles = Swarm % max_particles diff --git a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Results.f90 b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Results.f90 index 92b44c01e..3a1ba7205 100644 --- a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Results.f90 +++ b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Results.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, curr_dt, domain) + subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, domain) !------------------------------------------------------------------------------! ! This subroutine reads name.1d file created by Convert or Generator and ! ! averages the results in homogeneous directions. ! @@ -12,7 +12,6 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, curr_dt, domain) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: curr_dt ! current time step integer, optional, intent(in) :: domain ! current domain !-----------------------------------[Locals]-----------------------------------! type(Var_Type), pointer :: u, v, w, t @@ -228,10 +227,10 @@ subroutine User_Mod_Save_Results(Flow, Turb, Vof, Swarm, curr_dt, domain) return end if - call File % Set_Name(result_name, time_step = curr_dt, & + call File % Set_Name(result_name, time_step = Time % Curr_Dt(), & appendix='-res', extension='.dat') call File % Open_For_Writing_Ascii(result_name, fu1) - call File % Set_Name(result_name_plus, time_step = curr_dt, & + call File % Set_Name(result_name_plus, time_step = Time % Curr_Dt(), & appendix='-res-plus', extension='.dat') call File % Open_For_Writing_Ascii(result_name_plus, fu2) diff --git a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Swarm.f90 b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Swarm.f90 index bbde7ddc1..b45d9fe67 100644 --- a/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Swarm.f90 +++ b/Tests/Swarm/Channel_Re_Tau_590/User_Mod/Save_Swarm.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Save_Swarm(Flow, Turb, Vof, Swarm, curr_dt, domain) + subroutine User_Mod_Save_Swarm(Flow, Turb, Vof, Swarm, domain) !------------------------------------------------------------------------------! ! This subroutine reads name.1d file created by Convert or Generator and ! ! averages the results for paerticles in homogeneous directions. ! @@ -13,7 +13,6 @@ subroutine User_Mod_Save_Swarm(Flow, Turb, Vof, Swarm, curr_dt, domain) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: curr_dt ! current time step integer, optional, intent(in) :: domain ! current domain !-----------------------------------[Locals]-----------------------------------! type(Var_Type), pointer :: u, v, w, t @@ -222,10 +221,10 @@ subroutine User_Mod_Save_Swarm(Flow, Turb, Vof, Swarm, curr_dt, domain) ! Creating files for swarm statistics call File % Set_Name(swarm_result_name, appendix='-swarm-res', & - time_step=curr_dt, extension='.dat') + time_step=Time % Curr_Dt(), extension='.dat') call File % Open_For_Writing_Ascii(swarm_result_name, fu1) call File % Set_Name(swarm_result_name_plus, appendix='-swarm-res-plus', & - time_step=curr_dt, extension='.dat') + time_step=Time % Curr_Dt(), extension='.dat') call File % Open_For_Writing_Ascii(swarm_result_name_plus, fu2) ! Calculating friction velocity and friction temperature (for the flow!) diff --git a/Tests/Swarm/Cylinders_Periodic/User_Mod/Insert_Particles.f90 b/Tests/Swarm/Cylinders_Periodic/User_Mod/Insert_Particles.f90 index b5645b523..29a9bf46f 100644 --- a/Tests/Swarm/Cylinders_Periodic/User_Mod/Insert_Particles.f90 +++ b/Tests/Swarm/Cylinders_Periodic/User_Mod/Insert_Particles.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, n, time) + subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm) !------------------------------------------------------------------------------! ! This function is called at the beginning of time step. ! !------------------------------------------------------------------------------! @@ -9,8 +9,6 @@ subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, n, time) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: n ! time step - real, intent(in) :: time ! physical time !----------------------------------[Locals]------------------------------------! integer :: i, j, k, n_parts_in_buffers real :: x, y, z, dy, dz, my, mz @@ -21,7 +19,7 @@ subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, n, time) !----------------------------------------------------! ! Initialize particles only in the 1st time step ! !----------------------------------------------------! - if(n .eq. 1) then + if(Time % Curr_Dt() .eq. 1) then dy = 4.0 / NJ dz = 1.0 / NK diff --git a/Tests/Swarm/Rod_Bundle_Polyhedral/User_Mod/Insert_Particles.f90 b/Tests/Swarm/Rod_Bundle_Polyhedral/User_Mod/Insert_Particles.f90 index eec9f8bcf..6a3c82544 100644 --- a/Tests/Swarm/Rod_Bundle_Polyhedral/User_Mod/Insert_Particles.f90 +++ b/Tests/Swarm/Rod_Bundle_Polyhedral/User_Mod/Insert_Particles.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, n, time) + subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm) !------------------------------------------------------------------------------! ! This function is called at the beginning of time step. ! !------------------------------------------------------------------------------! @@ -9,8 +9,6 @@ subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, n, time) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: n ! time step - real, intent(in) :: time ! physical time !----------------------------------[Locals]------------------------------------! integer :: i, j, k, n_parts_in_buffers real :: x, y, z, xo, yo, zo, dy, dz, my, mz @@ -22,7 +20,7 @@ subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, n, time) !----------------------------------------------------! ! Initialize particles only in the 1st time step ! !----------------------------------------------------! - if(n .eq. 1) then + if(Time % Curr_Dt() .eq. 1) then ! Leave 10% margin xo = -1.0 diff --git a/Tests/Swarm/T_Junction_Square/User_Mod/Insert_Particles.f90 b/Tests/Swarm/T_Junction_Square/User_Mod/Insert_Particles.f90 index db932a0f3..602ab18c7 100644 --- a/Tests/Swarm/T_Junction_Square/User_Mod/Insert_Particles.f90 +++ b/Tests/Swarm/T_Junction_Square/User_Mod/Insert_Particles.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, n, time) + subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm) !------------------------------------------------------------------------------! ! This function is called at the end of time step. ! !------------------------------------------------------------------------------! @@ -9,8 +9,6 @@ subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, n, time) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: n ! time step - real, intent(in) :: time ! physical time !----------------------------------[Locals]------------------------------------! type(Grid_Type), pointer :: Grid integer :: k, n_parts_in_buffers, c @@ -23,7 +21,7 @@ subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, n, time) !----------------------! ! 1201st time step ! !----------------------! - if(n .eq. 1201) then ! should be after the flow is developed + if(Time % Curr_Dt() .eq. 1201) then ! should be after the flow is developed ! Compute all particles Swarm % n_particles = Swarm % max_particles diff --git a/Tests/Swarm/Three_Phase_Flow/User_Mod/Insert_Particles.f90 b/Tests/Swarm/Three_Phase_Flow/User_Mod/Insert_Particles.f90 index eb7b204cd..ef31fade3 100644 --- a/Tests/Swarm/Three_Phase_Flow/User_Mod/Insert_Particles.f90 +++ b/Tests/Swarm/Three_Phase_Flow/User_Mod/Insert_Particles.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, n, time) + subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm) !------------------------------------------------------------------------------! ! This function is called at the beginning of time step. ! !------------------------------------------------------------------------------! @@ -9,8 +9,6 @@ subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, n, time) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: n ! time step - real, intent(in) :: time ! physical time !----------------------------------[Locals]------------------------------------! integer :: i, j, k, p, n_parts_in_buffers, c real :: x, y, z, xo, yo, zo, xn, yn, zn @@ -22,7 +20,7 @@ subroutine User_Mod_Insert_Particles(Flow, Turb, Vof, Swarm, n, time) !----------------------------------------------------! ! Initialize particles only in the 1st time step ! !----------------------------------------------------! - if(n .eq. 1) then + if(Time % Curr_Dt() .eq. 1) then ! Leave 10% margin xo = -0.005 diff --git a/Tests/Vof/Dam_Break_3d/User_Mod/End_Of_Time_Step.f90 b/Tests/Vof/Dam_Break_3d/User_Mod/End_Of_Time_Step.f90 index 7c578dddd..9b1649b71 100644 --- a/Tests/Vof/Dam_Break_3d/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Vof/Dam_Break_3d/User_Mod/End_Of_Time_Step.f90 @@ -1,6 +1,6 @@ !==============================================================================! - subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, n, n_stat_t, & - n_stat_p, time) + subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & + n_stat_t, n_stat_p) !------------------------------------------------------------------------------! ! This function is computing benchmark for dam break ! !------------------------------------------------------------------------------! @@ -10,9 +10,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, n, n_stat_t, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer :: n ! time step integer :: n_stat_t, n_stat_p - real :: time ! physical time !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: fun @@ -112,8 +110,8 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, n, n_stat_t, & ! Write to file if (First_Proc()) then call File % Append_For_Writing_Ascii('probe-data.dat', fu) - write(fu,'((e16.10e2),9(2x,e16.10e2),4(2x,e16.10e2))') & - time, b_volume, p_probe(1:size(nod_probe)), & + write(fu,'((e16.10e2),9(2x,e16.10e2),4(2x,e16.10e2))') & + Time % Get_Time(), b_volume, p_probe(1:size(nod_probe)), & h_probe(1:N_PROBE) close(fu) end if diff --git a/Tests/Vof/Mencinger_And_Zun/User_Mod/Beginning_Of_Correct_Velocity.f90 b/Tests/Vof/Mencinger_And_Zun/User_Mod/Beginning_Of_Correct_Velocity.f90 index fe80458ff..575d29511 100644 --- a/Tests/Vof/Mencinger_And_Zun/User_Mod/Beginning_Of_Correct_Velocity.f90 +++ b/Tests/Vof/Mencinger_And_Zun/User_Mod/Beginning_Of_Correct_Velocity.f90 @@ -1,6 +1,5 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Correct_Velocity(Flow, Vof, Sol, & - curr_dt, ini) + subroutine User_Mod_Beginning_Of_Correct_Velocity(Flow, Vof, Sol, ini) !------------------------------------------------------------------------------! ! This function is called at the end of Correct_Velocity function. ! !------------------------------------------------------------------------------! @@ -9,7 +8,6 @@ subroutine User_Mod_Beginning_Of_Correct_Velocity(Flow, Vof, Sol, & type(Field_Type), target :: Flow type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt integer, intent(in) :: ini !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid @@ -28,7 +26,7 @@ subroutine User_Mod_Beginning_Of_Correct_Velocity(Flow, Vof, Sol, & !-----------------------------------------------------------! ! Write down face-centered velocities before correction ! !-----------------------------------------------------------! - write(file_name(28:32), '(i5.5)') curr_dt + write(file_name(28:32), '(i5.5)') Time % Curr_Dt() write(file_name(34:36), '(i3.3)') ini open(99, file=file_name) diff --git a/Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Compute_Momentum.f90 b/Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Compute_Momentum.f90 index 8b14ca3d9..9cca71911 100644 --- a/Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Compute_Momentum.f90 +++ b/Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Compute_Momentum.f90 @@ -1,6 +1,5 @@ !==============================================================================! - subroutine User_Mod_End_Of_Compute_Momentum(Flow, Turb, Vof, Sol, & - curr_dt, ini) + subroutine User_Mod_End_Of_Compute_Momentum(Flow, Turb, Vof, Sol, ini) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Momentum function. ! !------------------------------------------------------------------------------! @@ -10,7 +9,6 @@ subroutine User_Mod_End_Of_Compute_Momentum(Flow, Turb, Vof, Sol, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt ! current time step integer, intent(in) :: ini ! inner iteration !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid @@ -27,7 +25,7 @@ subroutine User_Mod_End_Of_Compute_Momentum(Flow, Turb, Vof, Sol, & p => Flow % p M => Sol % Nat % M - write(file_name(28:32), '(i5.5)') curr_dt + write(file_name(28:32), '(i5.5)') Time % Curr_Dt() write(file_name(34:36), '(i3.3)') ini open(99, file=file_name) diff --git a/Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Compute_Pressure.f90 b/Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Compute_Pressure.f90 index 6154344a6..214f4d69d 100644 --- a/Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Compute_Pressure.f90 +++ b/Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Compute_Pressure.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol, curr_dt, ini) + subroutine User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol, ini) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Pressure function. ! !------------------------------------------------------------------------------! @@ -8,7 +8,6 @@ subroutine User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol, curr_dt, ini) type(Field_Type), target :: Flow type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt ! current time step integer, intent(in) :: ini ! inner iteration !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid @@ -26,7 +25,7 @@ subroutine User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol, curr_dt, ini) A => Sol % Nat % A b => Sol % Nat % b % val - write(file_name(10:14), '(i5.5)') curr_dt + write(file_name(10:14), '(i5.5)') Time % Curr_Dt() write(file_name(16:18), '(i3.3)') ini open(99, file=file_name) diff --git a/Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Correct_Velocity.f90 b/Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Correct_Velocity.f90 index e3494c579..b28e29651 100644 --- a/Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Correct_Velocity.f90 +++ b/Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Correct_Velocity.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_End_Of_Correct_Velocity(Flow, Vof, Sol, curr_dt, ini) + subroutine User_Mod_End_Of_Correct_Velocity(Flow, Vof, Sol, ini) !------------------------------------------------------------------------------! ! This function is called at the end of Correct_Velocity function. ! !------------------------------------------------------------------------------! @@ -8,7 +8,6 @@ subroutine User_Mod_End_Of_Correct_Velocity(Flow, Vof, Sol, curr_dt, ini) type(Field_Type), target :: Flow type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt integer, intent(in) :: ini !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid @@ -29,7 +28,7 @@ subroutine User_Mod_End_Of_Correct_Velocity(Flow, Vof, Sol, curr_dt, ini) !---------------------------------------------------! ! Write down corrected cell-centered velocities ! !---------------------------------------------------! - write(fil1_name(27:31), '(i5.5)') curr_dt + write(fil1_name(27:31), '(i5.5)') Time % Curr_Dt() write(fil1_name(33:35), '(i3.3)') ini open(99, file=fil1_name) @@ -48,7 +47,7 @@ subroutine User_Mod_End_Of_Correct_Velocity(Flow, Vof, Sol, curr_dt, ini) !---------------------------------------------------! ! Write down corrected face-centered velocities ! !---------------------------------------------------! - write(fil2_name(27:31), '(i5.5)') curr_dt + write(fil2_name(27:31), '(i5.5)') Time % Curr_Dt() write(fil2_name(33:35), '(i3.3)') ini open(99, file=fil2_name) diff --git a/Tests/Vof/Pie/User_Mod/End_Of_Time_Step.f90 b/Tests/Vof/Pie/User_Mod/End_Of_Time_Step.f90 index dafbf85e0..ef6fe2154 100644 --- a/Tests/Vof/Pie/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Vof/Pie/User_Mod/End_Of_Time_Step.f90 @@ -1,6 +1,6 @@ !==============================================================================! subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & - n, n_stat_t, n_stat_p, time) + n_stat_t, n_stat_p) !------------------------------------------------------------------------------! ! This function is computing benchmark for rising bubble. ! !------------------------------------------------------------------------------! @@ -10,10 +10,8 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: n ! current time step integer, intent(in) :: n_stat_t ! 1st t.s. statistics turbulence integer, intent(in) :: n_stat_p ! 1st t.s. statistics particles - real, intent(in) :: time ! physical time !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: fun @@ -57,7 +55,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & rise_vel_cen = (y_pos_cen - y_pos_cen_old) / Flow % dt ! Just open the file benchmark.dat - if(n .eq. 1) then + if(Time % Curr_Dt() .eq. 1) then call File % Open_For_Writing_Ascii('benchmark.dat', fu) close(fu) end if @@ -65,7 +63,7 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & !-------------------! ! Write results ! !-------------------! - if(n > 1) then + if(Time % Curr_Dt() > 1) then if(First_Proc()) then print *, 'y_pos_cen = ', y_pos_cen @@ -76,15 +74,8 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & ! Write to file call File % Append_For_Writing_Ascii('benchmark.dat', fu) - ! With circularity 2D: - ! write(fu,'(6(2x,es16.10e2))') time, b_volume, & - ! 2.0*PI/surface*sqrt(b_volume/PI), & - ! y_pos_cen, & - ! rise_vel_int, & - ! rise_vel_cen - ! With sphericity 3D: - write(fu,'(6(2x,es16.10e2))') time, b_volume, & + write(fu,'(6(2x,es16.10e2))') Time % Get_Time(), b_volume, & PI**(1.0/3.0)*(6.0*b_volume)**(2.0/3.0) & /surface, & y_pos_cen, & diff --git a/Tests/Vof/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 b/Tests/Vof/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 index 9ae36fba4..1070f74b8 100644 --- a/Tests/Vof/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Vof/Rising_Bubble/User_Mod/End_Of_Time_Step.f90 @@ -1,8 +1,8 @@ !==============================================================================! subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & - n, n_stat_t, n_stat_p, time) + n_stat_t, n_stat_p) !------------------------------------------------------------------------------! -! This function is computing benchmark for rising bubble. ! +! This function is computing benchmark for rising bubble. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -10,10 +10,8 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer :: n ! current time step integer :: n_stat_t ! 1st t.s. statistics turbulence integer :: n_stat_p ! 1st t.s. statistics particles - real :: time ! physical time !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: fun @@ -55,17 +53,13 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & ! Write to file if (First_Proc()) then call File % Append_For_Writing_Ascii('bench-data.dat', fu) - !with circularity 2D: -! write(fu,'(5(2X,E16.10E2))') time, b_volume, & -! 2.0*PI/surface*sqrt(b_volume/PI), & -! c_position/b_volume, & -! rise_velocity/b_volume - !with sphericity 3D: - write(fu,'(5(2X,E16.10E2))') time, b_volume, & - PI**(1.0/3.0)*(6.0*b_volume)**(2.0/3.0) & - /surface, & - c_position/b_volume, & - rise_velocity/b_volume + + ! With sphericity 3D + write(fu,'(5(2X,E16.10E2))') Time % Get_Time(), b_volume, & + PI**(1.0/3.0)*(6.0*b_volume)**(2.0/3.0) & + /surface, & + c_position/b_volume, & + rise_velocity/b_volume close(fu) end if diff --git a/Tests/Vof/Spurious/User_Mod/End_Of_Time_Step.f90 b/Tests/Vof/Spurious/User_Mod/End_Of_Time_Step.f90 index d5b51a516..d6dd6b2e0 100644 --- a/Tests/Vof/Spurious/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Vof/Spurious/User_Mod/End_Of_Time_Step.f90 @@ -1,6 +1,6 @@ !==============================================================================! - subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, n, & - n_stat_t, n_stat_p, time) + subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & + n_stat_t, n_stat_p) !------------------------------------------------------------------------------! ! This function computes position of contact line and high of droplet ! !------------------------------------------------------------------------------! @@ -10,10 +10,8 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, n, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer, intent(in) :: n ! time step integer, intent(in) :: n_stat_t integer, intent(in) :: n_stat_p - real, intent(in) :: time ! physical time !--------------------------------[Locals]--------------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: fun @@ -103,11 +101,11 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, n, & ! Write Results if (First_Proc()) then - if(n .eq. 1) then + if(Time % Curr_Dt() .eq. 1) then call File % Delete('spurious.dat') end if call File % Append_For_Writing_Ascii('spurious.dat', fu) - write(fu,'(6(2X,E16.10E2))') time, a_vof, u_rms, u_max, & + write(fu,'(6(2X,E16.10E2))') Time % Get_Time(), a_vof, u_rms, u_max, & p_max-p_min, p_in-p_out close(fu) end if diff --git a/Tests/Vof/Stefan/User_Mod/End_Of_Compute_Energy.f90 b/Tests/Vof/Stefan/User_Mod/End_Of_Compute_Energy.f90 index 98be15634..492d15063 100644 --- a/Tests/Vof/Stefan/User_Mod/End_Of_Compute_Energy.f90 +++ b/Tests/Vof/Stefan/User_Mod/End_Of_Compute_Energy.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol, curr_dt, ini) + subroutine User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol, ini) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Energy function. ! !------------------------------------------------------------------------------! @@ -9,7 +9,6 @@ subroutine User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol, curr_dt, ini) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt ! current time step integer, intent(in) :: ini ! inner iteration !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid @@ -29,7 +28,7 @@ subroutine User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol, curr_dt, ini) if(ini .eq. 1 .and. & Math % Approx_Real(Grid % ys(s), 0.0) .and. & Math % Approx_Real(Grid % zs(s), 0.0)) then - write(fu, '(99(es12.4))') curr_dt * Flow % dt, Grid % xs(s) + write(fu, '(99(es12.4))') Time % Curr_Dt() * Flow % dt, Grid % xs(s) end if end if diff --git a/Tests/Vof/Stefan/User_Mod/End_Of_Compute_Pressure.f90 b/Tests/Vof/Stefan/User_Mod/End_Of_Compute_Pressure.f90 index 783e7a06e..99943ab39 100644 --- a/Tests/Vof/Stefan/User_Mod/End_Of_Compute_Pressure.f90 +++ b/Tests/Vof/Stefan/User_Mod/End_Of_Compute_Pressure.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol, curr_dt, ini) + subroutine User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol, ini) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Pressure function. ! !------------------------------------------------------------------------------! @@ -8,7 +8,6 @@ subroutine User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol, curr_dt, ini) type(Field_Type), target :: Flow type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt ! current time step integer, intent(in) :: ini ! inner iteration !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid diff --git a/Tests/Vof/Stefan/User_Mod/End_Of_Compute_Vof.f90 b/Tests/Vof/Stefan/User_Mod/End_Of_Compute_Vof.f90 index 39fd48a07..d2c72d1da 100644 --- a/Tests/Vof/Stefan/User_Mod/End_Of_Compute_Vof.f90 +++ b/Tests/Vof/Stefan/User_Mod/End_Of_Compute_Vof.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_End_Of_Compute_Vof(Vof, Sol, curr_dt) + subroutine User_Mod_End_Of_Compute_Vof(Vof, Sol) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Vof function. ! !------------------------------------------------------------------------------! @@ -7,7 +7,6 @@ subroutine User_Mod_End_Of_Compute_Vof(Vof, Sol, curr_dt) !---------------------------------[Arguments]----------------------------------! type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt ! current time step !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Field_Type), pointer :: Flow diff --git a/Tests/Vof/Sucking/User_Mod/End_Of_Compute_Energy.f90 b/Tests/Vof/Sucking/User_Mod/End_Of_Compute_Energy.f90 index 90f9fde72..024346097 100644 --- a/Tests/Vof/Sucking/User_Mod/End_Of_Compute_Energy.f90 +++ b/Tests/Vof/Sucking/User_Mod/End_Of_Compute_Energy.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol, curr_dt, ini) + subroutine User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol, ini) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Energy function. ! !------------------------------------------------------------------------------! @@ -9,7 +9,6 @@ subroutine User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol, curr_dt, ini) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt ! current time step integer, intent(in) :: ini ! inner iteration !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid @@ -25,7 +24,7 @@ subroutine User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol, curr_dt, ini) ! Write out temperature distribution ! !----------------------------------------! profile_name = 'temperature_distribution_0000.num' - write(profile_name(26:29), '(i4.4)') curr_dt + write(profile_name(26:29), '(i4.4)') Time % Curr_Dt() call File % Open_For_Writing_Ascii(profile_name, fut) do s = 1, Grid % n_faces @@ -51,7 +50,7 @@ subroutine User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol, curr_dt, ini) ! Write out temperature gradients ! !-------------------------------------! profile_name = 'temperature_gradients_0000.num' - write(profile_name(23:26), '(i4.4)') curr_dt + write(profile_name(23:26), '(i4.4)') Time % Curr_Dt() call File % Open_For_Writing_Ascii(profile_name, fut) do s = 1, Grid % n_faces @@ -83,7 +82,7 @@ subroutine User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol, curr_dt, ini) if(ini .eq. 1 .and. & Math % Approx_Real(Grid % ys(s), 0.0) .and. & Math % Approx_Real(Grid % zs(s), 0.0)) then - write(fui, '(99(es12.4))') curr_dt * Flow % dt, Grid % xs(s) + write(fui, '(99(es12.4))') Time % Curr_Dt() * Flow % dt, Grid % xs(s) end if end if diff --git a/Tests/Vof/Sucking/User_Mod/End_Of_Compute_Pressure.f90 b/Tests/Vof/Sucking/User_Mod/End_Of_Compute_Pressure.f90 index 783e7a06e..99943ab39 100644 --- a/Tests/Vof/Sucking/User_Mod/End_Of_Compute_Pressure.f90 +++ b/Tests/Vof/Sucking/User_Mod/End_Of_Compute_Pressure.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol, curr_dt, ini) + subroutine User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol, ini) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Pressure function. ! !------------------------------------------------------------------------------! @@ -8,7 +8,6 @@ subroutine User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol, curr_dt, ini) type(Field_Type), target :: Flow type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt ! current time step integer, intent(in) :: ini ! inner iteration !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid diff --git a/Tests/Vof/Sucking/User_Mod/End_Of_Compute_Vof.f90 b/Tests/Vof/Sucking/User_Mod/End_Of_Compute_Vof.f90 index 39fd48a07..6821bb44a 100644 --- a/Tests/Vof/Sucking/User_Mod/End_Of_Compute_Vof.f90 +++ b/Tests/Vof/Sucking/User_Mod/End_Of_Compute_Vof.f90 @@ -1,13 +1,12 @@ !==============================================================================! - subroutine User_Mod_End_Of_Compute_Vof(Vof, Sol, curr_dt) + subroutine User_Mod_End_Of_Compute_Vof(Vof, Sol) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Vof function. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Vof_Type), target :: Vof - type(Solver_Type), target :: Sol - integer, intent(in) :: curr_dt ! current time step + type(Vof_Type), target :: Vof + type(Solver_Type), target :: Sol !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Field_Type), pointer :: Flow diff --git a/Tests/Vof/Vertical_Tube/User_Mod/End_Of_Time_Step.f90 b/Tests/Vof/Vertical_Tube/User_Mod/End_Of_Time_Step.f90 index 6e63eee2d..1f70544fa 100644 --- a/Tests/Vof/Vertical_Tube/User_Mod/End_Of_Time_Step.f90 +++ b/Tests/Vof/Vertical_Tube/User_Mod/End_Of_Time_Step.f90 @@ -1,6 +1,6 @@ !==============================================================================! subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & - n, n_stat_t, n_stat_p, time) + n_stat_t, n_stat_p) !------------------------------------------------------------------------------! ! This function is computing benchmark for rising bubble. ! !------------------------------------------------------------------------------! @@ -10,10 +10,8 @@ subroutine User_Mod_End_Of_Time_Step(Flow, Turb, Vof, Swarm, & type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Swarm_Type), target :: Swarm - integer :: n ! time step integer :: n_stat_t ! 1st step for turbulence statist. integer :: n_stat_p ! 1st step for particle statistics - real :: time ! physical time !--------------------------------[Locals]--------------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: fun From 1d0282fc7b01c8e478ccf3d0614e717da48d4c2a Mon Sep 17 00:00:00 2001 From: Niceno Date: Sun, 16 Apr 2023 21:12:37 +0200 Subject: [PATCH 202/223] Small update in Fortran syntax --- Documentation/Syntax/.vim/syntax/fortran.vim | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Documentation/Syntax/.vim/syntax/fortran.vim b/Documentation/Syntax/.vim/syntax/fortran.vim index 7f49bfec2..64c929f7a 100644 --- a/Documentation/Syntax/.vim/syntax/fortran.vim +++ b/Documentation/Syntax/.vim/syntax/fortran.vim @@ -445,11 +445,13 @@ if b:fortran_dialect == "f08" " Constants from Region_Mod syn keyword fortranConstant INFLOW WALL WALLFL OUTFLOW SYMMETRY CONVECT PRESSURE syn keyword fortranConstant INSIDE BUFFER PERIODIC_X PERIODIC_Y PERIODIC_Z UNDEFINED +" Constants from various procedures + syn keyword fortranConstant YES NO DEBUG BEGIN " After the constants, I have alternating definitions of types and objects derived from them syn keyword fortranTypeTflows Domain_Type Point_Type Block_Type Line_Type Range_Type Read_Controls_Type syn keyword fortranObjectTflows Dom points blocks lines ranges Read_Control Rc - syn keyword fortranTypeTflows Generate_Type Convert_Type Divide_Type Grid_Type Control_Type - syn keyword fortranObjectTflows Generate Convert Divide Grid Prim Dual Control + syn keyword fortranTypeTflows Generate_Type Convert_Type Divide_Type Grid_Type Control_Type Time_Type + syn keyword fortranObjectTflows Generate Convert Divide Grid Prim Dual Control Time syn keyword fortranTypeTflows Math_Type Sort_Type File_Type String_Type Work_Type Tokenizer_Type syn keyword fortranObjectTflows Math Sort File String Work Line Tok syn keyword fortranTypeTflows Comm_Type Backup_Type Field_Type Turb_Type Vof_Type Swarm_Type From 28a063a8c36d187341e05c0b65e0b9c30125731a Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 19 Apr 2023 17:50:26 +0200 Subject: [PATCH 203/223] Implicit none was missing everywhere in Time_Mod! On branch bojan_time_module modified: Time_Mod/Curr_Dt.f90 modified: Time_Mod/First_Dt.f90 modified: Time_Mod/Get_Time.f90 modified: Time_Mod/Increase_Time.f90 modified: Time_Mod/Last_Dt.f90 modified: Time_Mod/Needs_More_Steps.f90 modified: Time_Mod/Set_Curr_Dt.f90 modified: Time_Mod/Set_First_Dt.f90 modified: Time_Mod/Set_Last_Dt.f90 modified: Time_Mod/Set_Time.f90 --- Sources/Process/Time_Mod/Curr_Dt.f90 | 2 ++ Sources/Process/Time_Mod/First_Dt.f90 | 2 ++ Sources/Process/Time_Mod/Get_Time.f90 | 2 ++ Sources/Process/Time_Mod/Increase_Time.f90 | 2 ++ Sources/Process/Time_Mod/Last_Dt.f90 | 2 ++ Sources/Process/Time_Mod/Needs_More_Steps.f90 | 2 ++ Sources/Process/Time_Mod/Set_Curr_Dt.f90 | 2 ++ Sources/Process/Time_Mod/Set_First_Dt.f90 | 2 ++ Sources/Process/Time_Mod/Set_Last_Dt.f90 | 2 ++ Sources/Process/Time_Mod/Set_Time.f90 | 2 ++ 10 files changed, 20 insertions(+) diff --git a/Sources/Process/Time_Mod/Curr_Dt.f90 b/Sources/Process/Time_Mod/Curr_Dt.f90 index 7f419e9fc..4077340ca 100644 --- a/Sources/Process/Time_Mod/Curr_Dt.f90 +++ b/Sources/Process/Time_Mod/Curr_Dt.f90 @@ -1,5 +1,7 @@ !==============================================================================! pure integer function Curr_Dt(Time) +!------------------------------------------------------------------------------! + implicit none !---------------------------------[Arguments]----------------------------------! class(Time_Type), intent(in) :: Time !==============================================================================! diff --git a/Sources/Process/Time_Mod/First_Dt.f90 b/Sources/Process/Time_Mod/First_Dt.f90 index 66a54d058..49f1b2fa8 100644 --- a/Sources/Process/Time_Mod/First_Dt.f90 +++ b/Sources/Process/Time_Mod/First_Dt.f90 @@ -1,5 +1,7 @@ !==============================================================================! pure integer function First_Dt(Time) +!------------------------------------------------------------------------------! + implicit none !---------------------------------[Arguments]----------------------------------! class(Time_Type), intent(in) :: Time !==============================================================================! diff --git a/Sources/Process/Time_Mod/Get_Time.f90 b/Sources/Process/Time_Mod/Get_Time.f90 index c85a45680..da7f0c23b 100644 --- a/Sources/Process/Time_Mod/Get_Time.f90 +++ b/Sources/Process/Time_Mod/Get_Time.f90 @@ -1,5 +1,7 @@ !==============================================================================! pure real function Get_Time(Time) +!------------------------------------------------------------------------------! + implicit none !---------------------------------[Arguments]----------------------------------! class(Time_Type), intent(in) :: Time !==============================================================================! diff --git a/Sources/Process/Time_Mod/Increase_Time.f90 b/Sources/Process/Time_Mod/Increase_Time.f90 index 6bf7a92ed..55e4d1d4f 100644 --- a/Sources/Process/Time_Mod/Increase_Time.f90 +++ b/Sources/Process/Time_Mod/Increase_Time.f90 @@ -1,5 +1,7 @@ !==============================================================================! pure subroutine Increase_Time(Time, val) +!------------------------------------------------------------------------------! + implicit none !---------------------------------[Arguments]----------------------------------! class(Time_Type), intent(inout) :: Time real, intent(in) :: val diff --git a/Sources/Process/Time_Mod/Last_Dt.f90 b/Sources/Process/Time_Mod/Last_Dt.f90 index 555e91973..a4aec8cb6 100644 --- a/Sources/Process/Time_Mod/Last_Dt.f90 +++ b/Sources/Process/Time_Mod/Last_Dt.f90 @@ -1,5 +1,7 @@ !==============================================================================! pure integer function Last_Dt(Time) +!------------------------------------------------------------------------------! + implicit none !---------------------------------[Arguments]----------------------------------! class(Time_Type), intent(in) :: Time !==============================================================================! diff --git a/Sources/Process/Time_Mod/Needs_More_Steps.f90 b/Sources/Process/Time_Mod/Needs_More_Steps.f90 index 56538030e..4d02f0a41 100644 --- a/Sources/Process/Time_Mod/Needs_More_Steps.f90 +++ b/Sources/Process/Time_Mod/Needs_More_Steps.f90 @@ -1,5 +1,7 @@ !==============================================================================! logical function Needs_More_Steps(Time) +!------------------------------------------------------------------------------! + implicit none !---------------------------------[Arguments]----------------------------------! class(Time_Type), intent(inout) :: Time !-----------------------------------[Locals]-----------------------------------! diff --git a/Sources/Process/Time_Mod/Set_Curr_Dt.f90 b/Sources/Process/Time_Mod/Set_Curr_Dt.f90 index 65e8bc8a6..429d130ff 100644 --- a/Sources/Process/Time_Mod/Set_Curr_Dt.f90 +++ b/Sources/Process/Time_Mod/Set_Curr_Dt.f90 @@ -1,5 +1,7 @@ !==============================================================================! pure subroutine Set_Curr_Dt(Time, val) +!------------------------------------------------------------------------------! + implicit none !---------------------------------[Arguments]----------------------------------! class(Time_Type), intent(inout) :: Time integer, intent(in) :: val diff --git a/Sources/Process/Time_Mod/Set_First_Dt.f90 b/Sources/Process/Time_Mod/Set_First_Dt.f90 index a4f4f7527..e0f495666 100644 --- a/Sources/Process/Time_Mod/Set_First_Dt.f90 +++ b/Sources/Process/Time_Mod/Set_First_Dt.f90 @@ -1,5 +1,7 @@ !==============================================================================! pure subroutine Set_First_Dt(Time, val) +!------------------------------------------------------------------------------! + implicit none !---------------------------------[Arguments]----------------------------------! class(Time_Type), intent(inout) :: Time integer, intent(in) :: val diff --git a/Sources/Process/Time_Mod/Set_Last_Dt.f90 b/Sources/Process/Time_Mod/Set_Last_Dt.f90 index 7c1a8a211..e41a5b121 100644 --- a/Sources/Process/Time_Mod/Set_Last_Dt.f90 +++ b/Sources/Process/Time_Mod/Set_Last_Dt.f90 @@ -1,5 +1,7 @@ !==============================================================================! pure subroutine Set_Last_Dt(Time, val) +!------------------------------------------------------------------------------! + implicit none !---------------------------------[Arguments]----------------------------------! class(Time_Type), intent(inout) :: Time integer, intent(in) :: val diff --git a/Sources/Process/Time_Mod/Set_Time.f90 b/Sources/Process/Time_Mod/Set_Time.f90 index bd09d934c..22ffc73ad 100644 --- a/Sources/Process/Time_Mod/Set_Time.f90 +++ b/Sources/Process/Time_Mod/Set_Time.f90 @@ -1,5 +1,7 @@ !==============================================================================! pure subroutine Set_Time(Time, val) +!------------------------------------------------------------------------------! + implicit none !---------------------------------[Arguments]----------------------------------! class(Time_Type), intent(inout) :: Time real, intent(in) :: val From aa9674520003162437d434e3e3c3925a3fdd909b Mon Sep 17 00:00:00 2001 From: Niceno Date: Wed, 19 Apr 2023 18:16:08 +0200 Subject: [PATCH 204/223] IMPORTANT: Introduced Iter_Mod Also introduced a new procedure in Grid_Mod, Load_And_Prepare_For_Processing to shorten the Main_Pro for a dozen lines or so. Date: Wed Apr 19 18:16:08 2023 +0200 On branch bojan_time_module modified: Documentation/Syntax/.vim/syntax/fortran.vim new file: Sources/Process/Iter_Mod.f90 new file: Sources/Process/Iter_Mod/Current.f90 new file: Sources/Process/Iter_Mod/Get_Max.f90 new file: Sources/Process/Iter_Mod/Get_Min.f90 new file: Sources/Process/Iter_Mod/Get_Tol.f90 new file: Sources/Process/Iter_Mod/Max_Fields_Residual.f90 new file: Sources/Process/Iter_Mod/Needs_More_Iterations.f90 new file: Sources/Process/Iter_Mod/Set_Max.f90 new file: Sources/Process/Iter_Mod/Set_Min.f90 new file: Sources/Process/Iter_Mod/Set_Tol.f90 modified: Sources/Process/Main_Pro.f90 modified: Sources/Process/Process_Mod/Compute_Energy.f90 modified: Sources/Process/Process_Mod/Compute_Momentum.f90 modified: Sources/Process/Process_Mod/Compute_Pressure.f90 modified: Sources/Process/Process_Mod/Compute_Scalar.f90 modified: Sources/Process/Process_Mod/Correct_Velocity.f90 modified: Sources/Process/Process_Mod/Piso_Algorithm.f90 modified: Sources/Process/Read_Controls_Mod.f90 modified: Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 new file: Sources/Process/Read_Controls_Mod/Iterations.f90 modified: Sources/Process/Read_Controls_Mod/Native_Solvers.f90 modified: Sources/Process/Read_Controls_Mod/Numerical_Schemes.f90 modified: Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 modified: Sources/Process/Read_Controls_Mod/Physical_Models.f90 modified: Sources/Process/Read_Controls_Mod/Physical_Properties.f90 modified: Sources/Process/Read_Controls_Mod/Solvers.f90 modified: Sources/Process/Turb_Mod.f90 modified: Sources/Process/Turb_Mod/Compute_F22.f90 modified: Sources/Process/Turb_Mod/Compute_Stress.f90 modified: Sources/Process/Turb_Mod/Compute_Variable.f90 modified: Sources/Process/Turb_Mod/Main_Turb.f90 modified: Sources/Process/User_Mod/Beginning_Of_Compute_Energy.f90 modified: Sources/Process/User_Mod/Beginning_Of_Compute_Momentum.f90 modified: Sources/Process/User_Mod/Beginning_Of_Compute_Pressure.f90 modified: Sources/Process/User_Mod/Beginning_Of_Compute_Scalar.f90 modified: Sources/Process/User_Mod/Beginning_Of_Correct_Velocity.f90 modified: Sources/Process/User_Mod/End_Of_Compute_Energy.f90 modified: Sources/Process/User_Mod/End_Of_Compute_Momentum.f90 modified: Sources/Process/User_Mod/End_Of_Compute_Pressure.f90 modified: Sources/Process/User_Mod/End_Of_Compute_Scalar.f90 modified: Sources/Process/User_Mod/End_Of_Correct_Velocity.f90 modified: Sources/Process/makefile modified: Sources/Process/makefile_explicit_dependencies modified: Sources/Shared/Grid_Mod.f90 new file: Sources/Shared/Grid_Mod/Load_And_Prepare_For_Processing.f90 modified: Tests/Vof/Mencinger_And_Zun/User_Mod/Beginning_Of_Correct_Velocity.f90 modified: Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Compute_Momentum.f90 modified: Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Compute_Pressure.f90 modified: Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Correct_Velocity.f90 modified: Tests/Vof/Stefan/User_Mod/End_Of_Compute_Energy.f90 modified: Tests/Vof/Stefan/User_Mod/End_Of_Compute_Pressure.f90 modified: Tests/Vof/Sucking/User_Mod/End_Of_Compute_Energy.f90 modified: Tests/Vof/Sucking/User_Mod/End_Of_Compute_Pressure.f90 --- Documentation/Syntax/.vim/syntax/fortran.vim | 6 +- Sources/Process/Iter_Mod.f90 | 55 ++ Sources/Process/Iter_Mod/Current.f90 | 11 + Sources/Process/Iter_Mod/Get_Max.f90 | 11 + Sources/Process/Iter_Mod/Get_Min.f90 | 11 + Sources/Process/Iter_Mod/Get_Tol.f90 | 11 + .../Process/Iter_Mod/Max_Fields_Residual.f90 | 32 + .../Iter_Mod/Needs_More_Iterations.f90 | 42 ++ Sources/Process/Iter_Mod/Set_Max.f90 | 12 + Sources/Process/Iter_Mod/Set_Min.f90 | 12 + Sources/Process/Iter_Mod/Set_Tol.f90 | 12 + Sources/Process/Main_Pro.f90 | 79 +- .../Process/Process_Mod/Compute_Energy.f90 | 11 +- .../Process/Process_Mod/Compute_Momentum.f90 | 11 +- .../Process/Process_Mod/Compute_Pressure.f90 | 11 +- .../Process/Process_Mod/Compute_Scalar.f90 | 9 +- .../Process/Process_Mod/Correct_Velocity.f90 | 7 +- .../Process/Process_Mod/Piso_Algorithm.f90 | 9 +- Sources/Process/Read_Controls_Mod.f90 | 2 + .../Read_Controls_Mod/Boundary_Conditions.f90 | 10 +- .../Process/Read_Controls_Mod/Iterations.f90 | 24 + .../Read_Controls_Mod/Native_Solvers.f90 | 8 +- .../Read_Controls_Mod/Numerical_Schemes.f90 | 8 +- .../Read_Controls_Mod/Petsc_Solvers.f90 | 10 +- .../Read_Controls_Mod/Physical_Models.f90 | 10 +- .../Read_Controls_Mod/Physical_Properties.f90 | 9 +- Sources/Process/Read_Controls_Mod/Solvers.f90 | 10 +- Sources/Process/Turb_Mod.f90 | 1 + Sources/Process/Turb_Mod/Compute_F22.f90 | 5 +- Sources/Process/Turb_Mod/Compute_Stress.f90 | 5 +- Sources/Process/Turb_Mod/Compute_Variable.f90 | 5 +- Sources/Process/Turb_Mod/Main_Turb.f90 | 41 +- .../User_Mod/Beginning_Of_Compute_Energy.f90 | 11 +- .../Beginning_Of_Compute_Momentum.f90 | 11 +- .../Beginning_Of_Compute_Pressure.f90 | 9 +- .../User_Mod/Beginning_Of_Compute_Scalar.f90 | 3 +- .../Beginning_Of_Correct_Velocity.f90 | 9 +- .../User_Mod/End_Of_Compute_Energy.f90 | 11 +- .../User_Mod/End_Of_Compute_Momentum.f90 | 11 +- .../User_Mod/End_Of_Compute_Pressure.f90 | 9 +- .../User_Mod/End_Of_Compute_Scalar.f90 | 5 +- .../User_Mod/End_Of_Correct_Velocity.f90 | 9 +- Sources/Process/makefile | 1 + .../Process/makefile_explicit_dependencies | 674 +++++++++--------- Sources/Shared/Grid_Mod.f90 | 2 + .../Load_And_Prepare_For_Processing.f90 | 27 + .../Beginning_Of_Correct_Velocity.f90 | 11 +- .../User_Mod/End_Of_Compute_Momentum.f90 | 5 +- .../User_Mod/End_Of_Compute_Pressure.f90 | 5 +- .../User_Mod/End_Of_Correct_Velocity.f90 | 7 +- .../Stefan/User_Mod/End_Of_Compute_Energy.f90 | 13 +- .../User_Mod/End_Of_Compute_Pressure.f90 | 9 +- .../User_Mod/End_Of_Compute_Energy.f90 | 13 +- .../User_Mod/End_Of_Compute_Pressure.f90 | 9 +- 54 files changed, 788 insertions(+), 576 deletions(-) create mode 100644 Sources/Process/Iter_Mod.f90 create mode 100644 Sources/Process/Iter_Mod/Current.f90 create mode 100644 Sources/Process/Iter_Mod/Get_Max.f90 create mode 100644 Sources/Process/Iter_Mod/Get_Min.f90 create mode 100644 Sources/Process/Iter_Mod/Get_Tol.f90 create mode 100644 Sources/Process/Iter_Mod/Max_Fields_Residual.f90 create mode 100644 Sources/Process/Iter_Mod/Needs_More_Iterations.f90 create mode 100644 Sources/Process/Iter_Mod/Set_Max.f90 create mode 100644 Sources/Process/Iter_Mod/Set_Min.f90 create mode 100644 Sources/Process/Iter_Mod/Set_Tol.f90 create mode 100644 Sources/Process/Read_Controls_Mod/Iterations.f90 create mode 100644 Sources/Shared/Grid_Mod/Load_And_Prepare_For_Processing.f90 diff --git a/Documentation/Syntax/.vim/syntax/fortran.vim b/Documentation/Syntax/.vim/syntax/fortran.vim index 64c929f7a..0a7fbf114 100644 --- a/Documentation/Syntax/.vim/syntax/fortran.vim +++ b/Documentation/Syntax/.vim/syntax/fortran.vim @@ -441,7 +441,7 @@ if b:fortran_dialect == "f08" syn keyword fortranConstant LES_WALE LES_TVM K_EPS K_EPS_ZETA_F DES_SPALART syn keyword fortranConstant SPALART_ALLMARAS RSM_HANJALIC_JAKIRLIC RSM_MANCEAU_HANJALIC syn keyword fortranConstant HYBRID_LES_RANS HYBRID_LES_PRANDTL STABILIZED SGDH GGDH AFM A_POW B_POW - syn keyword fortranConstant SWITCH_DISTANCE SWITCH_VELOCITY THERMALLY_DRIVEN DENSITY_DRIVEN + syn keyword fortranConstant SWITCH_DISTANCE SWITCH_VELOCITY THERMALLY_DRIVEN DENSITY_DRIVEN NO_BUOYANCY " Constants from Region_Mod syn keyword fortranConstant INFLOW WALL WALLFL OUTFLOW SYMMETRY CONVECT PRESSURE syn keyword fortranConstant INSIDE BUFFER PERIODIC_X PERIODIC_Y PERIODIC_Z UNDEFINED @@ -456,8 +456,8 @@ if b:fortran_dialect == "f08" syn keyword fortranObjectTflows Math Sort File String Work Line Tok syn keyword fortranTypeTflows Comm_Type Backup_Type Field_Type Turb_Type Vof_Type Swarm_Type syn keyword fortranObjectTflows Comm Global Backup Bac Flow Fld Turb Tur Vof Swarm Swr - syn keyword fortranTypeTflows Bulk_Type Face_Type - syn keyword fortranObjectTflows v_flux + syn keyword fortranTypeTflows Bulk_Type Face_Type Iter_Type + syn keyword fortranObjectTflows v_flux Iter syn keyword fortranTypeTflows Front_Type Surf_Type Elem_Type Side_Type Vert_Type Particle_Type syn keyword fortranObjectTflows Front Surf Elem side Vert Part syn keyword fortranTypeTflows Monitor_Type Results_Type Porosity_Type Profiler_Type Message_Type Info_Type diff --git a/Sources/Process/Iter_Mod.f90 b/Sources/Process/Iter_Mod.f90 new file mode 100644 index 000000000..82d87b5c0 --- /dev/null +++ b/Sources/Process/Iter_Mod.f90 @@ -0,0 +1,55 @@ +#include "../Shared/Assert.h90" +#include "../Shared/Unused.h90" + +!==============================================================================! + module Iter_Mod +!------------------------------------------------------------------------------! +! Module containing data and procedures pertinent to SIMPLE/PISO iterations ! +!------------------------------------------------------------------------------! +!----------------------------------[Modules]-----------------------------------! + use Field_Mod +!------------------------------------------------------------------------------! + implicit none +!==============================================================================! + + !---------------! + ! Iter type ! + !---------------! + type Iter_Type + + integer, private :: current_iteration = 0 + integer, private :: max_iterations ! maximum number of iterations + integer, private :: min_iterations ! minimum number of iterations + real, private :: tolerance ! tolerance for iterations + + contains + procedure :: Current + procedure :: Get_Max + procedure :: Get_Min + procedure :: Get_Tol + procedure :: Max_Fields_Residual + procedure :: Needs_More_Iterations + procedure :: Set_Max + procedure :: Set_Min + procedure :: Set_Tol + + end type + + !----------------------! + ! Singleton object ! + !----------------------! + type(Iter_Type) :: Iter + + contains + +# include "Iter_Mod/Current.f90" +# include "Iter_Mod/Get_Max.f90" +# include "Iter_Mod/Get_Min.f90" +# include "Iter_Mod/Get_Tol.f90" +# include "Iter_Mod/Max_Fields_Residual.f90" +# include "Iter_Mod/Needs_More_Iterations.f90" +# include "Iter_Mod/Set_Max.f90" +# include "Iter_Mod/Set_Min.f90" +# include "Iter_Mod/Set_Tol.f90" + + end module diff --git a/Sources/Process/Iter_Mod/Current.f90 b/Sources/Process/Iter_Mod/Current.f90 new file mode 100644 index 000000000..82e291de5 --- /dev/null +++ b/Sources/Process/Iter_Mod/Current.f90 @@ -0,0 +1,11 @@ +!==============================================================================! + pure integer function Current(Iter) +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Iter_Type), intent(in) :: Iter +!==============================================================================! + + Current = Iter % current_iteration + + end function diff --git a/Sources/Process/Iter_Mod/Get_Max.f90 b/Sources/Process/Iter_Mod/Get_Max.f90 new file mode 100644 index 000000000..52cdf4c2e --- /dev/null +++ b/Sources/Process/Iter_Mod/Get_Max.f90 @@ -0,0 +1,11 @@ +!==============================================================================! + pure integer function Get_Max(Iter) +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Iter_Type), intent(in) :: Iter +!==============================================================================! + + Get_Max = Iter % max_iterations + + end function diff --git a/Sources/Process/Iter_Mod/Get_Min.f90 b/Sources/Process/Iter_Mod/Get_Min.f90 new file mode 100644 index 000000000..8c71fb273 --- /dev/null +++ b/Sources/Process/Iter_Mod/Get_Min.f90 @@ -0,0 +1,11 @@ +!==============================================================================! + pure integer function Get_Min(Iter) +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Iter_Type), intent(in) :: Iter +!==============================================================================! + + Get_Min = Iter % min_iterations + + end function diff --git a/Sources/Process/Iter_Mod/Get_Tol.f90 b/Sources/Process/Iter_Mod/Get_Tol.f90 new file mode 100644 index 000000000..b9bc992b3 --- /dev/null +++ b/Sources/Process/Iter_Mod/Get_Tol.f90 @@ -0,0 +1,11 @@ +!==============================================================================! + pure real function Get_Tol(Iter) +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Iter_Type), intent(in) :: Iter +!==============================================================================! + + Get_Tol = Iter % tolerance + + end function diff --git a/Sources/Process/Iter_Mod/Max_Fields_Residual.f90 b/Sources/Process/Iter_Mod/Max_Fields_Residual.f90 new file mode 100644 index 000000000..4a64ee2eb --- /dev/null +++ b/Sources/Process/Iter_Mod/Max_Fields_Residual.f90 @@ -0,0 +1,32 @@ +!==============================================================================! + pure real function Max_Fields_Residual(Iter, Flow, n_dom) +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Iter_Type), intent(in) :: Iter + type(Field_Type), intent(in) :: Flow(MD) + integer, intent(in) :: n_dom +!-----------------------------------[Locals]-----------------------------------! + integer :: d, sc + real :: mr +!==============================================================================! + + mr = 0.0 + + do d = 1, n_dom + mr = max(mr, Flow(d) % vol_res) + mr = max(mr, Flow(d) % u % res) + mr = max(mr, Flow(d) % v % res) + mr = max(mr, Flow(d) % w % res) + if(Flow(d) % heat_transfer) then + mr = max(mr, Flow(d) % t % res) + end if + do sc = 1, Flow(d) % n_scalars + mr = max(mr, Flow(d) % scalar(sc) % res) + end do + end do + + Max_Fields_Residual = mr + + end function + diff --git a/Sources/Process/Iter_Mod/Needs_More_Iterations.f90 b/Sources/Process/Iter_Mod/Needs_More_Iterations.f90 new file mode 100644 index 000000000..50f2c1102 --- /dev/null +++ b/Sources/Process/Iter_Mod/Needs_More_Iterations.f90 @@ -0,0 +1,42 @@ +!==============================================================================! + logical function Needs_More_Iterations(Iter, Flow, n_dom) +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Iter_Type), intent(inout) :: Iter + type(Field_Type), intent(in) :: Flow(MD) + integer, intent(in) :: n_dom +!==============================================================================! + + !--------------------------------! + ! Increase current iteration ! + !--------------------------------! + Iter % current_iteration = Iter % current_iteration + 1 + + !------------------------------------------------------------------! + ! Minimum number of iterations hasn't been reached -> continue ! + !------------------------------------------------------------------! + if(Iter % Current() .le. Iter % Get_Min()) then + Needs_More_Iterations = .true. + return + end if + + !-----------------------------------------------------------! + ! Maximum number of iterations has been reached -> stop ! + !-----------------------------------------------------------! + if(Iter % Current() .gt. Iter % Get_Max()) then + Iter % current_iteration = 0 + Needs_More_Iterations = .false. + return + end if + + !---------------------------------------------------! + ! Residuals reached the tolerance level -> stop ! + !---------------------------------------------------! + if(Iter % Max_Fields_Residual(Flow, n_dom) <= Iter % Get_Tol()) then + Iter % current_iteration = 0 + Needs_More_Iterations = .false. + return + end if + + end function diff --git a/Sources/Process/Iter_Mod/Set_Max.f90 b/Sources/Process/Iter_Mod/Set_Max.f90 new file mode 100644 index 000000000..a68111070 --- /dev/null +++ b/Sources/Process/Iter_Mod/Set_Max.f90 @@ -0,0 +1,12 @@ +!==============================================================================! + pure subroutine Set_Max(Iter, val) +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Iter_Type), intent(inout) :: Iter + integer, intent(in) :: val +!==============================================================================! + + Iter % max_iterations = val + + end subroutine diff --git a/Sources/Process/Iter_Mod/Set_Min.f90 b/Sources/Process/Iter_Mod/Set_Min.f90 new file mode 100644 index 000000000..eb5f77807 --- /dev/null +++ b/Sources/Process/Iter_Mod/Set_Min.f90 @@ -0,0 +1,12 @@ +!==============================================================================! + pure subroutine Set_Min(Iter, val) +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Iter_Type), intent(inout) :: Iter + integer, intent(in) :: val +!==============================================================================! + + Iter % min_iterations = val + + end subroutine diff --git a/Sources/Process/Iter_Mod/Set_Tol.f90 b/Sources/Process/Iter_Mod/Set_Tol.f90 new file mode 100644 index 000000000..26b0acf1a --- /dev/null +++ b/Sources/Process/Iter_Mod/Set_Tol.f90 @@ -0,0 +1,12 @@ +!==============================================================================! + pure subroutine Set_Tol(Iter, val) +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Iter_Type), intent(inout) :: Iter + real, intent(in) :: val +!==============================================================================! + + Iter % tolerance = val + + end subroutine diff --git a/Sources/Process/Main_Pro.f90 b/Sources/Process/Main_Pro.f90 index b02f68c48..bd9c35525 100644 --- a/Sources/Process/Main_Pro.f90 +++ b/Sources/Process/Main_Pro.f90 @@ -21,15 +21,10 @@ program Process_Prog type(Monitor_Type) :: monitor(MD) ! monitors type(Porosity_Type) :: Por(MD) ! porosity type(Interface_Type) :: inter(MD,MD) ! interfaces between domains - integer :: max_ini ! max number of inner iterations - integer :: min_ini ! min number of inner iterations integer :: n_stat_t ! first time step for turb. statistic integer :: n_stat_p ! first time step for swarm statistic integer :: first_dt_p ! first t.s. for swarm computation - integer :: ini ! inner iteration counter - real :: simple_tol ! tolerance for SIMPLE algorithm - integer :: n_dom ! number of domains - integer :: d ! domain counter + integer :: n_dom, d ! number of domains, domain counter !==============================================================================! ! Initialize program profler @@ -72,30 +67,14 @@ program Process_Prog !-------------------------! call Info % Start_Info() - !--------------------! - ! Read all grids ! - !--------------------! + !-----------------------------------------------! + ! Load and prepare all grids for processing ! + !-----------------------------------------------! do d = 1, n_dom call Control % Switch_To_Domain(d) ! take domain's d control file - call Control % Read_Problem_Name(problem_name(d)) - - ! Load the finite volume Grid - call Grid(d) % Load_Cfn(This_Proc(), domain=d) - call Grid(d) % Load_Dim(This_Proc(), domain=d) - - ! Determine threads for OpenMP runs - call Control % Max_Threads(Grid(d) % Vect % d_threads, .true.) - call Grid(d) % Determine_Threads() - - call Grid(d) % Calculate_Face_Geometry() - - ! Find communication patterns - call Grid(d) % Form_Cells_Comm() - call Grid(d) % Form_Maps_For_Backup() + call Grid(d) % Load_And_Prepare_For_Processing(d) end do - - ! Out of domain loop - go back to root - call Control % Switch_To_Root() + call Control % Switch_To_Root() ! out of domain loop - go back to root ! Allocate memory for working arrays (RSM models are memory hungry) call Work % Allocate_Work(Grid, n_r_cell=24, n_r_face=8, n_r_node=8, & @@ -183,7 +162,6 @@ program Process_Prog call Control % Point_For_Monitoring_Planes(Flow(d) % bulk % xp, & Flow(d) % bulk % yp, & Flow(d) % bulk % zp) - ! Prepare ... call Bulk_Mod_Monitoring_Planes_Areas(Flow(d) % bulk, Grid(d)) @@ -257,7 +235,7 @@ program Process_Prog ! Beginning of time step call User_Mod_Beginning_Of_Time_Step(Flow(d), Turb(d), Vof(d), Swarm(d)) - ! Start info boxes. + ! Start info boxes call Info % Time_Start() call Info % Iter_Start() call Info % Bulk_Start() @@ -289,11 +267,9 @@ program Process_Prog ! Inner-iteration loop ! !--------------------------! call Control % Switch_To_Root() - call Control % Max_Simple_Iterations(max_ini) - call Control % Min_Simple_Iterations(min_ini) - call Control % Tolerance_For_Simple_Algorithm(simple_tol) + call Read_Control % Iterations() - do ini = 1, max_ini + do while (Iter % Needs_More_Iterations(Flow, n_dom)) ! Exchange data between domains call User_Mod_Interface_Exchange(inter, Flow, Turb, Vof, Swarm, n_dom) @@ -305,10 +281,10 @@ program Process_Prog ! Beginning of iteration call User_Mod_Beginning_Of_Iteration(Flow(d), Turb(d), Vof(d), Swarm(d)) - call Info % Iter_Fill(ini) + call Info % Iter_Fill(Iter % Current()) ! Future? call Process % Simple_Step(Flow(d), Turb(d), Vof(d), & - ! Future? Sol(d), ini) + ! Future? Sol(d)) ! Compute velocity gradients call Flow(d) % Grad_Variable(Flow(d) % u) @@ -317,27 +293,23 @@ program Process_Prog ! All three velocity components one after another call Process % Compute_Momentum(Flow(d), Turb(d), Vof(d), Por(d), & - Sol(d), ini) - call Process % Compute_Pressure(Flow(d), Vof(d), Sol(d), ini) - call Process % Correct_Velocity(Flow(d), Vof(d), Sol(d), ini) + Sol(d)) + call Process % Compute_Pressure(Flow(d), Vof(d), Sol(d)) + call Process % Correct_Velocity(Flow(d), Vof(d), Sol(d)) - call Process % Piso_Algorithm(Flow(d), Turb(d), Vof(d), Por(d), & - Sol(d), ini) + call Process % Piso_Algorithm(Flow(d), Turb(d), Vof(d), Por(d), Sol(d)) call Flow(d) % Calculate_Bulk_Fluxes(Flow(d) % v_flux % n) - ! Deal with turbulence (if you dare ;-)) - call Turb(d) % Main_Turb(Sol(d), ini) + ! Deal with turbulence + call Turb(d) % Main_Turb(Sol(d)) ! Energy (practically temperature) - if(Flow(d) % heat_transfer) then - call Process % Compute_Energy(Flow(d), Turb(d), Vof(d), Sol(d), ini) - end if + call Process % Compute_Energy(Flow(d), Turb(d), Vof(d), Sol(d)) ! Passive scalars do sc = 1, Flow(d) % n_scalars - call Process % Compute_Scalar(Flow(d), Turb(d), Vof(d), Sol(d), & - ini, sc) + call Process % Compute_Scalar(Flow(d), Turb(d), Vof(d), Sol(d), sc) end do ! Update the values at boundaries @@ -351,21 +323,11 @@ program Process_Prog end do ! through domains - if(ini >= min_ini) then - if( maxval(Flow(1:n_dom) % u % res) <= simple_tol .and. & - maxval(Flow(1:n_dom) % v % res) <= simple_tol .and. & - maxval(Flow(1:n_dom) % w % res) <= simple_tol .and. & - maxval(Flow(1:n_dom) % t % res) <= simple_tol .and. & - maxval(Flow(1:n_dom) % vol_res) <= simple_tol ) goto 1 - end if - - end do ! through inner iterations + end do ! through outer iterations !----------------------------------! ! End of the current time step ! !----------------------------------! -1 continue - do d = 1, n_dom call Process % Convective_Outflow(Flow(d), Turb(d), Vof(d)) end do @@ -375,7 +337,6 @@ program Process_Prog end do do d = 1, n_dom - call Control % Switch_To_Domain(d) ! Write the values in monitoring points diff --git a/Sources/Process/Process_Mod/Compute_Energy.f90 b/Sources/Process/Process_Mod/Compute_Energy.f90 index 7471bd6b8..c8bc728e2 100644 --- a/Sources/Process/Process_Mod/Compute_Energy.f90 +++ b/Sources/Process/Process_Mod/Compute_Energy.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Compute_Energy(Process, Flow, Turb, Vof, Sol, ini) + subroutine Compute_Energy(Process, Flow, Turb, Vof, Sol) !------------------------------------------------------------------------------! ! Purpose: Solve transport equation for scalar (such as temperature) ! !------------------------------------------------------------------------------! @@ -10,7 +10,6 @@ subroutine Compute_Energy(Process, Flow, Turb, Vof, Sol, ini) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: ini !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: u, v, w, t @@ -59,6 +58,8 @@ subroutine Compute_Energy(Process, Flow, Turb, Vof, Sol, ini) ! heat flux Flow % heat_flux [W/m^2] !==============================================================================! + if(.not. Flow % heat_transfer) return + call Profiler % Start('Compute_Energy (without solvers)') call Work % Connect_Real_Cell(cap_dens, q_int, q_turb, cross) @@ -72,7 +73,7 @@ subroutine Compute_Energy(Process, Flow, Turb, Vof, Sol, ini) call Sol % Alias_Native (A, b) ! User function - call User_Mod_Beginning_Of_Compute_Energy(Flow, Turb, Vof, Sol, ini) + call User_Mod_Beginning_Of_Compute_Energy(Flow, Turb, Vof, Sol) ! Initialize cross diffusion sources, matrix and right hand side cross (:) = 0.0 @@ -85,7 +86,7 @@ subroutine Compute_Energy(Process, Flow, Turb, Vof, Sol, ini) q_int (:) = 0.0 ! Old values (o and oo) - if(ini .eq. 1) then + if(Iter % Current() .eq. 1) then do c = 1, Grid % n_cells t % oo(c) = t % o(c) t % o (c) = t % n(c) @@ -301,7 +302,7 @@ subroutine Compute_Energy(Process, Flow, Turb, Vof, Sol, ini) end if ! User function - call User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol, ini) + call User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol) call Work % Disconnect_Real_Cell(cap_dens, q_int, q_turb, cross) diff --git a/Sources/Process/Process_Mod/Compute_Momentum.f90 b/Sources/Process/Process_Mod/Compute_Momentum.f90 index 45767e5b7..b0bcb26c8 100644 --- a/Sources/Process/Process_Mod/Compute_Momentum.f90 +++ b/Sources/Process/Process_Mod/Compute_Momentum.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Compute_Momentum(Process, Flow, Turb, Vof, Por, Sol, ini) + subroutine Compute_Momentum(Process, Flow, Turb, Vof, Por, Sol) !------------------------------------------------------------------------------! ! Discretizes and solves momentum conservation equations ! !------------------------------------------------------------------------------! @@ -11,7 +11,6 @@ subroutine Compute_Momentum(Process, Flow, Turb, Vof, Por, Sol, ini) type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol type(Porosity_Type), target :: Por - integer, intent(in) :: ini !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Bulk_Type), pointer :: bulk @@ -98,13 +97,13 @@ subroutine Compute_Momentum(Process, Flow, Turb, Vof, Por, Sol, ini) b => Sol % Nat % b % val ! User function - call User_Mod_Beginning_Of_Compute_Momentum(Flow, Turb, Vof, Sol, ini) + call User_Mod_Beginning_Of_Compute_Momentum(Flow, Turb, Vof, Sol) !-------------------------------------------------------! ! Store the old volume fluxes for Choi's correction ! !-------------------------------------------------------! if(.not. Flow % inside_piso_loop) then ! check about this - if(ini .eq. 1) then + if(Iter % Current() .eq. 1) then do s = 1, Grid % n_faces v_flux % oo(s) = v_flux % o(s) v_flux % o (s) = v_flux % n(s) @@ -174,7 +173,7 @@ subroutine Compute_Momentum(Process, Flow, Turb, Vof, Por, Sol, ini) ! Old values (o) and older than old (oo) if(.not. Flow % inside_piso_loop) then - if(ini .eq. 1) then + if(Iter % Current() .eq. 1) then do c = Cells_In_Domain_And_Buffers() ui % oo(c) = ui % o(c) ui % o (c) = ui % n(c) @@ -394,7 +393,7 @@ subroutine Compute_Momentum(Process, Flow, Turb, Vof, Por, Sol, ini) call Grid % Exchange_Cells_Real(M % sav) ! User function - call User_Mod_End_Of_Compute_Momentum(Flow, Turb, Vof, Sol, ini) + call User_Mod_End_Of_Compute_Momentum(Flow, Turb, Vof, Sol) call Work % Disconnect_Real_Cell(cross) diff --git a/Sources/Process/Process_Mod/Compute_Pressure.f90 b/Sources/Process/Process_Mod/Compute_Pressure.f90 index 6ea7ff81d..afb8cb3cb 100644 --- a/Sources/Process/Process_Mod/Compute_Pressure.f90 +++ b/Sources/Process/Process_Mod/Compute_Pressure.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Compute_Pressure(Process, Flow, Vof, Sol, ini) + subroutine Compute_Pressure(Process, Flow, Vof, Sol) !------------------------------------------------------------------------------! ! Forms and solves pressure equation for the SIMPLE method. ! !------------------------------------------------------------------------------! @@ -9,7 +9,6 @@ subroutine Compute_Pressure(Process, Flow, Vof, Sol, ini) type(Field_Type), target :: Flow type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: ini !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Bulk_Type), pointer :: bulk @@ -60,10 +59,10 @@ subroutine Compute_Pressure(Process, Flow, Vof, Sol, ini) call Flow % Alias_Momentum(u, v, w) ! Volume balance reporting - call Flow % Report_Vol_Balance_Start(ini) + call Flow % Report_Vol_Balance_Start(Iter % Current()) ! User function - call User_Mod_Beginning_Of_Compute_Pressure(Flow, Vof, Sol, ini) + call User_Mod_Beginning_Of_Compute_Pressure(Flow, Vof, Sol) !--------------------------------------------------! ! Find the value for normalization of pressure ! @@ -136,7 +135,7 @@ subroutine Compute_Pressure(Process, Flow, Vof, Sol, ini) end do ! Volume balance reporting - call Flow % Report_Vol_Balance(Sol, ini) + call Flow % Report_Vol_Balance(Sol, Iter % Current()) !------------------------------------------! ! Cross diffusion fluxes for pressure ! @@ -240,7 +239,7 @@ subroutine Compute_Pressure(Process, Flow, Vof, Sol, ini) p % n(:) = p % n(:) - 0.5*(p_max+p_min) ! User function - call User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol, ini) + call User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol) ! Volume balance reporting call Flow % Report_Vol_Balance_Stop() diff --git a/Sources/Process/Process_Mod/Compute_Scalar.f90 b/Sources/Process/Process_Mod/Compute_Scalar.f90 index 5b10bcf7d..105095a4f 100644 --- a/Sources/Process/Process_Mod/Compute_Scalar.f90 +++ b/Sources/Process/Process_Mod/Compute_Scalar.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Compute_Scalar(Process, Flow, Turb, Vof, Sol, ini, sc) + subroutine Compute_Scalar(Process, Flow, Turb, Vof, Sol, sc) !------------------------------------------------------------------------------! ! Purpose: Solve transport equation for user defined scalar. ! !------------------------------------------------------------------------------! @@ -10,7 +10,6 @@ subroutine Compute_Scalar(Process, Flow, Turb, Vof, Sol, ini, sc) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: ini integer, intent(in) :: sc !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid @@ -53,7 +52,7 @@ subroutine Compute_Scalar(Process, Flow, Turb, Vof, Sol, ini, sc) call Sol % Alias_Native (A, b) ! User function - call User_Mod_Beginning_Of_Compute_Scalar(Flow, Turb, Vof, Sol, ini, sc) + call User_Mod_Beginning_Of_Compute_Scalar(Flow, Turb, Vof, Sol, sc) ! Initialize cross diffusion sources, matrix and right hand side cross(:) = 0.0 @@ -69,7 +68,7 @@ subroutine Compute_Scalar(Process, Flow, Turb, Vof, Sol, ini, sc) !--------------------------! ! Old values (o and oo) - if(ini.lt.2) then + if(Iter % Current() .lt. 2) then do c = 1, Grid % n_cells phi % oo(c) = phi % o(c) phi % o (c) = phi % n(c) @@ -234,7 +233,7 @@ subroutine Compute_Scalar(Process, Flow, Turb, Vof, Sol, ini, sc) call Flow % Grad_Variable(phi) ! User function - call User_Mod_End_Of_Compute_Scalar(Flow, Turb, Vof, Sol, ini, sc) + call User_Mod_End_Of_Compute_Scalar(Flow, Turb, Vof, Sol, sc) call Work % Disconnect_Real_Cell(q_turb, cross) diff --git a/Sources/Process/Process_Mod/Correct_Velocity.f90 b/Sources/Process/Process_Mod/Correct_Velocity.f90 index 322f68064..61ccb0bac 100644 --- a/Sources/Process/Process_Mod/Correct_Velocity.f90 +++ b/Sources/Process/Process_Mod/Correct_Velocity.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Correct_Velocity(Process, Flow, Vof, Sol, ini) + subroutine Correct_Velocity(Process, Flow, Vof, Sol) !------------------------------------------------------------------------------! ! Corrects the velocities, and mass (or volume) fluxes on cell faces. ! !------------------------------------------------------------------------------! @@ -9,7 +9,6 @@ subroutine Correct_Velocity(Process, Flow, Vof, Sol, ini) type(Field_Type), target :: Flow type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: ini !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Bulk_Type), pointer :: bulk @@ -39,7 +38,7 @@ subroutine Correct_Velocity(Process, Flow, Vof, Sol, ini) call Flow % Alias_Momentum(u, v, w) ! User function - call User_Mod_Beginning_Of_Correct_Velocity(Flow, Vof, Sol, ini) + call User_Mod_Beginning_Of_Correct_Velocity(Flow, Vof, Sol) !-----------------------------------------! ! Correct velocities and fluxes with ! @@ -137,7 +136,7 @@ subroutine Correct_Velocity(Process, Flow, Vof, Sol, ini) end if ! User function - call User_Mod_End_Of_Correct_Velocity(Flow, Vof, Sol, ini) + call User_Mod_End_Of_Correct_Velocity(Flow, Vof, Sol) call Profiler % Stop('Correct_Velocity') diff --git a/Sources/Process/Process_Mod/Piso_Algorithm.f90 b/Sources/Process/Process_Mod/Piso_Algorithm.f90 index a6933ba27..7dac377d4 100644 --- a/Sources/Process/Process_Mod/Piso_Algorithm.f90 +++ b/Sources/Process/Process_Mod/Piso_Algorithm.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Piso_Algorithm(Process, Flow, Turb, Vof, Por, Sol, ini) + subroutine Piso_Algorithm(Process, Flow, Turb, Vof, Por, Sol) !------------------------------------------------------------------------------! ! PISO algorithm ! !------------------------------------------------------------------------------! @@ -11,7 +11,6 @@ subroutine Piso_Algorithm(Process, Flow, Turb, Vof, Por, Sol, ini) type(Vof_Type), target :: Vof type(Porosity_Type), target :: Por type(Solver_Type), target :: Sol - integer, intent(in) :: ini ! current inner iteration !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: u, v, w @@ -28,9 +27,9 @@ subroutine Piso_Algorithm(Process, Flow, Turb, Vof, Por, Sol, ini) do corr_steps = 1, Flow % n_piso_corrections Flow % i_corr = corr_steps - call Process % Compute_Momentum(Flow, Turb, Vof, Por, Sol, ini) - call Process % Compute_Pressure(Flow, Vof, Sol, ini) - call Process % Correct_Velocity(Flow, Vof, Sol, ini) + call Process % Compute_Momentum(Flow, Turb, Vof, Por, Sol) + call Process % Compute_Pressure(Flow, Vof, Sol) + call Process % Correct_Velocity(Flow, Vof, Sol) end do Flow % inside_piso_loop = .false. diff --git a/Sources/Process/Read_Controls_Mod.f90 b/Sources/Process/Read_Controls_Mod.f90 index ce64ccf79..4089f2d7a 100644 --- a/Sources/Process/Read_Controls_Mod.f90 +++ b/Sources/Process/Read_Controls_Mod.f90 @@ -24,6 +24,7 @@ module Read_Controls_Mod contains procedure :: Boundary_Conditions + procedure :: Iterations procedure, private :: Native_Solvers procedure :: Numerical_Schemes procedure, private :: Petsc_Solvers @@ -39,6 +40,7 @@ module Read_Controls_Mod ! Member function # include "Read_Controls_Mod/Boundary_Conditions.f90" +# include "Read_Controls_Mod/Iterations.f90" # include "Read_Controls_Mod/Native_Solvers.f90" # include "Read_Controls_Mod/Numerical_Schemes.f90" # include "Read_Controls_Mod/Petsc_Solvers.f90" diff --git a/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 b/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 index a1b8ec718..c66cb7f28 100644 --- a/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 +++ b/Sources/Process/Read_Controls_Mod/Boundary_Conditions.f90 @@ -5,11 +5,11 @@ subroutine Boundary_Conditions(Rc, Flow, Turb, Vof, turb_planes) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Read_Controls_Type) :: Rc - type(Field_Type), target :: Flow - type(Turb_Type), target :: Turb - type(Vof_Type), target :: Vof - type(Turb_Plane_Type) :: turb_planes + class(Read_Controls_Type), intent(in) :: Rc + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb + type(Vof_Type), target :: Vof + type(Turb_Plane_Type) :: turb_planes !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: u, v, w, t, p, fun diff --git a/Sources/Process/Read_Controls_Mod/Iterations.f90 b/Sources/Process/Read_Controls_Mod/Iterations.f90 new file mode 100644 index 000000000..f1cb04aa1 --- /dev/null +++ b/Sources/Process/Read_Controls_Mod/Iterations.f90 @@ -0,0 +1,24 @@ +!==============================================================================! + subroutine Iterations(Rc) +!------------------------------------------------------------------------------! +! Reads control file for variables which control outer iteration loop ! +!---------------------------------[Arguments]----------------------------------! + class(Read_Controls_Type), intent(in) :: Rc +!-----------------------------------[Locals]-----------------------------------! + integer :: max_out ! max number of inner iterations + integer :: min_out ! min number of inner iterations + real :: simple_tol ! tolerance for SIMPLE algorithm +!------------------------[Avoid unused parent warning]-------------------------! + Unused(Rc) +!==============================================================================! + + call Control % Max_Simple_Iterations(max_out) + call Control % Min_Simple_Iterations(min_out) + call Control % Tolerance_For_Simple_Algorithm(simple_tol) + + call Iter % Set_Max(max_out) + call Iter % Set_Min(min_out) + call Iter % Set_Tol(simple_tol) + + end subroutine + diff --git a/Sources/Process/Read_Controls_Mod/Native_Solvers.f90 b/Sources/Process/Read_Controls_Mod/Native_Solvers.f90 index 5595cc34a..7992718b1 100644 --- a/Sources/Process/Read_Controls_Mod/Native_Solvers.f90 +++ b/Sources/Process/Read_Controls_Mod/Native_Solvers.f90 @@ -10,10 +10,10 @@ subroutine Native_Solvers(Rc, Flow, Turb, Vof) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Read_Controls_Type) :: Rc - type(Field_Type), target :: Flow - type(Turb_Type), target :: Turb - type(Vof_Type), target :: Vof + class(Read_Controls_Type), intent(in) :: Rc + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb + type(Vof_Type), target :: Vof !----------------------------------[Locals]------------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: tq, ui, phi diff --git a/Sources/Process/Read_Controls_Mod/Numerical_Schemes.f90 b/Sources/Process/Read_Controls_Mod/Numerical_Schemes.f90 index d979294c3..c0bde001d 100644 --- a/Sources/Process/Read_Controls_Mod/Numerical_Schemes.f90 +++ b/Sources/Process/Read_Controls_Mod/Numerical_Schemes.f90 @@ -9,10 +9,10 @@ subroutine Numerical_Schemes(Rc, Flow, Turb, Vof) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Read_Controls_Type) :: Rc - type(Field_Type), target :: Flow - type(Turb_Type), target :: Turb - type(Vof_Type), target :: Vof + class(Read_Controls_Type), intent(in) :: Rc + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb + type(Vof_Type), target :: Vof !----------------------------------[Locals]------------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: tq, ui, phi diff --git a/Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 b/Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 index e8ac2e392..0af1ca1a5 100644 --- a/Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 +++ b/Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 @@ -7,11 +7,11 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Read_Controls_Type) :: Rc - type(Field_Type), target :: Flow - type(Turb_Type), target :: Turb - type(Vof_Type), target :: Vof - type(Solver_Type), target :: Sol + class(Read_Controls_Type), intent(in) :: Rc + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb + type(Vof_Type), target :: Vof + type(Solver_Type), target :: Sol !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: u, v, w, t, p, fun diff --git a/Sources/Process/Read_Controls_Mod/Physical_Models.f90 b/Sources/Process/Read_Controls_Mod/Physical_Models.f90 index 275e123f8..a16c127d2 100644 --- a/Sources/Process/Read_Controls_Mod/Physical_Models.f90 +++ b/Sources/Process/Read_Controls_Mod/Physical_Models.f90 @@ -9,11 +9,11 @@ subroutine Physical_Models(Rc, Flow, Turb, Vof, Swarm) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Read_Controls_Type) :: Rc - type(Field_Type), target :: Flow - type(Turb_Type), target :: Turb - type(Vof_Type), target :: Vof - type(Swarm_Type), target :: Swarm + class(Read_Controls_Type), intent(in) :: Rc + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb + type(Vof_Type), target :: Vof + type(Swarm_Type), target :: Swarm !----------------------------------[Locals]------------------------------------! type(Bulk_Type), pointer :: bulk character(SL) :: name diff --git a/Sources/Process/Read_Controls_Mod/Physical_Properties.f90 b/Sources/Process/Read_Controls_Mod/Physical_Properties.f90 index 86930db37..2f2d1577b 100644 --- a/Sources/Process/Read_Controls_Mod/Physical_Properties.f90 +++ b/Sources/Process/Read_Controls_Mod/Physical_Properties.f90 @@ -5,16 +5,17 @@ subroutine Physical_Properties(Rc, Flow, Vof, Swarm) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Read_Controls_Type) :: Rc - type(Field_Type) :: Flow - type(Vof_Type) :: Vof - type(Swarm_Type) :: Swarm + class(Read_Controls_Type), intent(in) :: Rc + type(Field_Type) :: Flow + type(Vof_Type) :: Vof + type(Swarm_Type) :: Swarm !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid real :: dens_const, visc_const real :: capa_const, cond_const !------------------------[Avoid unused parent warning]-------------------------! Unused(Rc) + Unused(Swarm) !==============================================================================! ! Take alias diff --git a/Sources/Process/Read_Controls_Mod/Solvers.f90 b/Sources/Process/Read_Controls_Mod/Solvers.f90 index fa93b183c..fa1e32c91 100644 --- a/Sources/Process/Read_Controls_Mod/Solvers.f90 +++ b/Sources/Process/Read_Controls_Mod/Solvers.f90 @@ -5,11 +5,11 @@ subroutine Solvers(Rc, Flow, Turb, Vof, Sol) !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Read_Controls_Type) :: Rc - type(Field_Type), target :: Flow - type(Turb_Type), target :: Turb - type(Vof_Type), target :: Vof - type(Solver_Type), target :: Sol + class(Read_Controls_Type), intent(in) :: Rc + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb + type(Vof_Type), target :: Vof + type(Solver_Type), target :: Sol !----------------------------------[Locals]------------------------------------! character(SL) :: name !==============================================================================! diff --git a/Sources/Process/Turb_Mod.f90 b/Sources/Process/Turb_Mod.f90 index 714495dc2..e9148be8b 100644 --- a/Sources/Process/Turb_Mod.f90 +++ b/Sources/Process/Turb_Mod.f90 @@ -9,6 +9,7 @@ module Turb_Mod !------------------------------------------------------------------------------! !----------------------------------[Modules]-----------------------------------! use Info_Mod + use Iter_Mod !------------------------------------------------------------------------------! implicit none !==============================================================================! diff --git a/Sources/Process/Turb_Mod/Compute_F22.f90 b/Sources/Process/Turb_Mod/Compute_F22.f90 index afd6a0d84..98b14e24a 100644 --- a/Sources/Process/Turb_Mod/Compute_F22.f90 +++ b/Sources/Process/Turb_Mod/Compute_F22.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Compute_F22(Turb, Sol, ini, phi) + subroutine Compute_F22(Turb, Sol, phi) !------------------------------------------------------------------------------! ! Discretizes and solves eliptic relaxation equations for f22. ! !------------------------------------------------------------------------------! @@ -7,7 +7,6 @@ subroutine Compute_F22(Turb, Sol, ini, phi) !--------------------------------[Arguments]-----------------------------------! class(Turb_Type) :: Turb type(Solver_Type), target :: Sol - integer, intent(in) :: ini type(Var_Type) :: phi !----------------------------------[Locals]------------------------------------! type(Field_Type), pointer :: Flow @@ -54,7 +53,7 @@ subroutine Compute_F22(Turb, Sol, ini, phi) b (:) = 0.0 ! Old values (o) and older than old (oo) - if(ini .eq. 1) then + if(Iter % Current() .eq. 1) then do c = Cells_In_Domain_And_Buffers() phi % oo(c) = phi % o(c) phi % o (c) = phi % n(c) diff --git a/Sources/Process/Turb_Mod/Compute_Stress.f90 b/Sources/Process/Turb_Mod/Compute_Stress.f90 index c4d387ad7..7413c1556 100644 --- a/Sources/Process/Turb_Mod/Compute_Stress.f90 +++ b/Sources/Process/Turb_Mod/Compute_Stress.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Compute_Stress(Turb, Sol, ini, phi) + subroutine Compute_Stress(Turb, Sol, phi) !------------------------------------------------------------------------------! ! Discretizes and solves transport equation for Re stresses for RSM. ! !------------------------------------------------------------------------------! @@ -7,7 +7,6 @@ subroutine Compute_Stress(Turb, Sol, ini, phi) !---------------------------------[Arguments]----------------------------------! class(Turb_Type), target :: Turb type(Solver_Type), target :: Sol - integer, intent(in) :: ini type(Var_Type) :: phi !-----------------------------------[Locals]-----------------------------------! type(Field_Type), pointer :: Flow @@ -66,7 +65,7 @@ subroutine Compute_Stress(Turb, Sol, ini, phi) b (:) = 0.0 ! Old values (o) and older than old (oo) - if(ini .eq. 1) then + if(Iter % Current() .eq. 1) then do c = Cells_In_Domain_And_Buffers() phi % oo(c) = phi % o(c) phi % o (c) = phi % n(c) diff --git a/Sources/Process/Turb_Mod/Compute_Variable.f90 b/Sources/Process/Turb_Mod/Compute_Variable.f90 index ca5096ea1..aedb63120 100644 --- a/Sources/Process/Turb_Mod/Compute_Variable.f90 +++ b/Sources/Process/Turb_Mod/Compute_Variable.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine Compute_Variable(Turb, Sol, ini, phi) + subroutine Compute_Variable(Turb, Sol, phi) !------------------------------------------------------------------------------! ! Discretizes and solves transport equations for different turbulent ! ! variables. ! @@ -8,7 +8,6 @@ subroutine Compute_Variable(Turb, Sol, ini, phi) !--------------------------------[Arguments]-----------------------------------! class(Turb_Type), target :: Turb type(Solver_Type), target :: Sol - integer, intent(in) :: ini type(Var_Type) :: phi !----------------------------------[Locals]------------------------------------! type(Field_Type), pointer :: Flow @@ -57,7 +56,7 @@ subroutine Compute_Variable(Turb, Sol, ini, phi) b (:) = 0.0 ! Old values (o) and older than old (oo) - if(ini .eq. 1) then + if(Iter % Current() .eq. 1) then do c = Cells_In_Domain_And_Buffers() phi % oo(c) = phi % o(c) phi % o (c) = phi % n(c) diff --git a/Sources/Process/Turb_Mod/Main_Turb.f90 b/Sources/Process/Turb_Mod/Main_Turb.f90 index 354698fba..f6ba9ed88 100644 --- a/Sources/Process/Turb_Mod/Main_Turb.f90 +++ b/Sources/Process/Turb_Mod/Main_Turb.f90 @@ -1,13 +1,12 @@ !==============================================================================! - subroutine Main_Turb(Turb, Sol, ini) + subroutine Main_Turb(Turb, Sol) !------------------------------------------------------------------------------! ! Turbulence model main function (called inside inner iterations) ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - class(Turb_Type) :: Turb - type(Solver_Type) :: Sol - integer, intent(in) :: ini ! inner iteration + class(Turb_Type) :: Turb + type(Solver_Type) :: Sol !----------------------------------[Locals]------------------------------------! type(Field_Type), pointer :: Flow type(Grid_Type), pointer :: Grid @@ -37,13 +36,13 @@ subroutine Main_Turb(Turb, Sol, ini) call Calculate_Shear_And_Vorticity(Flow) call Turb % Time_And_Length_Scale(Grid) - call Turb % Compute_Variable(Sol, ini, Turb % kin) - call Turb % Compute_Variable(Sol, ini, Turb % eps) + call Turb % Compute_Variable(Sol, Turb % kin) + call Turb % Compute_Variable(Sol, Turb % eps) if(Flow % heat_transfer) then call Turb % Calculate_Stress () call Turb % Calculate_Heat_Flux() - call Turb % Compute_Variable(Sol, ini, Turb % t2) + call Turb % Compute_Variable(Sol, Turb % t2) end if call Turb % Vis_T_K_Eps() @@ -64,17 +63,17 @@ subroutine Main_Turb(Turb, Sol, ini) call Calculate_Shear_And_Vorticity(Flow) - call Turb % Compute_Variable(Sol, ini, Turb % kin) - call Turb % Compute_Variable(Sol, ini, Turb % eps) + call Turb % Compute_Variable(Sol, Turb % kin) + call Turb % Compute_Variable(Sol, Turb % eps) if(Flow % heat_transfer) then call Turb % Calculate_Stress () call Turb % Calculate_Heat_Flux() - call Turb % Compute_Variable(Sol, ini, Turb % t2) + call Turb % Compute_Variable(Sol, Turb % t2) end if - call Turb % Compute_F22(Sol, ini, Turb % f22) - call Turb % Compute_Variable(Sol, ini, Turb % zeta) + call Turb % Compute_F22(Sol, Turb % f22) + call Turb % Compute_Variable(Sol, Turb % zeta) ! For some cases, it is beneficial to start simulations with ! turbulent viscosity computed with k-eps. Particularly for @@ -96,19 +95,19 @@ subroutine Main_Turb(Turb, Sol, ini) call Flow % Grad_Variable(Flow % v) call Flow % Grad_Variable(Flow % w) - call Turb % Compute_Stress(Sol, ini, Turb % uu) - call Turb % Compute_Stress(Sol, ini, Turb % vv) - call Turb % Compute_Stress(Sol, ini, Turb % ww) + call Turb % Compute_Stress(Sol, Turb % uu) + call Turb % Compute_Stress(Sol, Turb % vv) + call Turb % Compute_Stress(Sol, Turb % ww) - call Turb % Compute_Stress(Sol, ini, Turb % uv) - call Turb % Compute_Stress(Sol, ini, Turb % uw) - call Turb % Compute_Stress(Sol, ini, Turb % vw) + call Turb % Compute_Stress(Sol, Turb % uv) + call Turb % Compute_Stress(Sol, Turb % uw) + call Turb % Compute_Stress(Sol, Turb % vw) if(Turb % model .eq. RSM_MANCEAU_HANJALIC) then - call Turb % Compute_F22(Sol, ini, Turb % f22) + call Turb % Compute_F22(Sol, Turb % f22) end if - call Turb % Compute_Stress(Sol, ini, Turb % eps) + call Turb % Compute_Stress(Sol, Turb % eps) call Turb % Vis_T_Rsm() @@ -121,7 +120,7 @@ subroutine Main_Turb(Turb, Sol, ini) Turb % model .eq. DES_SPALART) then call Calculate_Shear_And_Vorticity(Flow) - call Turb % Compute_Variable(Sol, ini, Turb % vis) + call Turb % Compute_Variable(Sol, Turb % vis) call Turb % Vis_T_Spalart_Allmaras() end if diff --git a/Sources/Process/User_Mod/Beginning_Of_Compute_Energy.f90 b/Sources/Process/User_Mod/Beginning_Of_Compute_Energy.f90 index 3c5bc6dc3..52a4f4d14 100644 --- a/Sources/Process/User_Mod/Beginning_Of_Compute_Energy.f90 +++ b/Sources/Process/User_Mod/Beginning_Of_Compute_Energy.f90 @@ -1,15 +1,14 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Compute_Energy(Flow, Turb, Vof, Sol, ini) + subroutine User_Mod_Beginning_Of_Compute_Energy(Flow, Turb, Vof, Sol) !------------------------------------------------------------------------------! ! This function is called at the beginning of Compute_Energy function. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type), target :: Flow - type(Turb_Type), target :: Turb - type(Vof_Type), target :: Vof - type(Solver_Type), target :: Sol - integer, intent(in) :: ini ! inner iteration + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb + type(Vof_Type), target :: Vof + type(Solver_Type), target :: Sol !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: t, p diff --git a/Sources/Process/User_Mod/Beginning_Of_Compute_Momentum.f90 b/Sources/Process/User_Mod/Beginning_Of_Compute_Momentum.f90 index ae2582fb1..7d68ac118 100644 --- a/Sources/Process/User_Mod/Beginning_Of_Compute_Momentum.f90 +++ b/Sources/Process/User_Mod/Beginning_Of_Compute_Momentum.f90 @@ -1,15 +1,14 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Compute_Momentum(Flow, Turb, Vof, Sol, ini) + subroutine User_Mod_Beginning_Of_Compute_Momentum(Flow, Turb, Vof, Sol) !------------------------------------------------------------------------------! ! This function is called at the beginning of Compute_Momentum function. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type), target :: Flow - type(Turb_Type), target :: Turb - type(Vof_Type), target :: Vof - type(Solver_Type), target :: Sol - integer, intent(in) :: ini ! inner iteration + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb + type(Vof_Type), target :: Vof + type(Solver_Type), target :: Sol !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: u, v, w, p diff --git a/Sources/Process/User_Mod/Beginning_Of_Compute_Pressure.f90 b/Sources/Process/User_Mod/Beginning_Of_Compute_Pressure.f90 index 19c9a44c3..7347f7a4c 100644 --- a/Sources/Process/User_Mod/Beginning_Of_Compute_Pressure.f90 +++ b/Sources/Process/User_Mod/Beginning_Of_Compute_Pressure.f90 @@ -1,14 +1,13 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Compute_Pressure(Flow, Vof, Sol, ini) + subroutine User_Mod_Beginning_Of_Compute_Pressure(Flow, Vof, Sol) !------------------------------------------------------------------------------! ! This function is called at the beginning of Compute_Pressure function. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type), target :: Flow - type(Vof_Type), target :: Vof - type(Solver_Type), target :: Sol - integer, intent(in) :: ini ! inner iteration + type(Field_Type), target :: Flow + type(Vof_Type), target :: Vof + type(Solver_Type), target :: Sol !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: u, v, w, p diff --git a/Sources/Process/User_Mod/Beginning_Of_Compute_Scalar.f90 b/Sources/Process/User_Mod/Beginning_Of_Compute_Scalar.f90 index 321d56f36..f7981c19f 100644 --- a/Sources/Process/User_Mod/Beginning_Of_Compute_Scalar.f90 +++ b/Sources/Process/User_Mod/Beginning_Of_Compute_Scalar.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Compute_Scalar(Flow, Turb, Vof, Sol, ini, sc) + subroutine User_Mod_Beginning_Of_Compute_Scalar(Flow, Turb, Vof, Sol, sc) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Scalar function. ! !------------------------------------------------------------------------------! @@ -9,7 +9,6 @@ subroutine User_Mod_Beginning_Of_Compute_Scalar(Flow, Turb, Vof, Sol, ini, sc) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: ini ! inner iteration integer, intent(in) :: sc ! scalar index !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid diff --git a/Sources/Process/User_Mod/Beginning_Of_Correct_Velocity.f90 b/Sources/Process/User_Mod/Beginning_Of_Correct_Velocity.f90 index ec33a81c7..0254a6d33 100644 --- a/Sources/Process/User_Mod/Beginning_Of_Correct_Velocity.f90 +++ b/Sources/Process/User_Mod/Beginning_Of_Correct_Velocity.f90 @@ -1,14 +1,13 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Correct_Velocity(Flow, Vof, Sol, ini) + subroutine User_Mod_Beginning_Of_Correct_Velocity(Flow, Vof, Sol) !------------------------------------------------------------------------------! ! This function is called at the beginning of Correct_Velocity function. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type), target :: Flow - type(Vof_Type), target :: Vof - type(Solver_Type), target :: Sol - integer, intent(in) :: ini + type(Field_Type), target :: Flow + type(Vof_Type), target :: Vof + type(Solver_Type), target :: Sol !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: u, v, w, p diff --git a/Sources/Process/User_Mod/End_Of_Compute_Energy.f90 b/Sources/Process/User_Mod/End_Of_Compute_Energy.f90 index a30edbc63..618c25b4f 100644 --- a/Sources/Process/User_Mod/End_Of_Compute_Energy.f90 +++ b/Sources/Process/User_Mod/End_Of_Compute_Energy.f90 @@ -1,15 +1,14 @@ !==============================================================================! - subroutine User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol, ini) + subroutine User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Energy function. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type), target :: Flow - type(Turb_Type), target :: Turb - type(Vof_Type), target :: Vof - type(Solver_Type), target :: Sol - integer, intent(in) :: ini ! inner iteration + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb + type(Vof_Type), target :: Vof + type(Solver_Type), target :: Sol !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: t, p diff --git a/Sources/Process/User_Mod/End_Of_Compute_Momentum.f90 b/Sources/Process/User_Mod/End_Of_Compute_Momentum.f90 index 2499ca015..e6f76f6cd 100644 --- a/Sources/Process/User_Mod/End_Of_Compute_Momentum.f90 +++ b/Sources/Process/User_Mod/End_Of_Compute_Momentum.f90 @@ -1,15 +1,14 @@ !==============================================================================! - subroutine User_Mod_End_Of_Compute_Momentum(Flow, Turb, Vof, Sol, ini) + subroutine User_Mod_End_Of_Compute_Momentum(Flow, Turb, Vof, Sol) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Momentum function. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type), target :: Flow - type(Turb_Type), target :: Turb - type(Vof_Type), target :: Vof - type(Solver_Type), target :: Sol - integer, intent(in) :: ini ! inner iteration + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb + type(Vof_Type), target :: Vof + type(Solver_Type), target :: Sol !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: u, v, w, p diff --git a/Sources/Process/User_Mod/End_Of_Compute_Pressure.f90 b/Sources/Process/User_Mod/End_Of_Compute_Pressure.f90 index ab6fcbacd..60bbaa1b2 100644 --- a/Sources/Process/User_Mod/End_Of_Compute_Pressure.f90 +++ b/Sources/Process/User_Mod/End_Of_Compute_Pressure.f90 @@ -1,14 +1,13 @@ !==============================================================================! - subroutine User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol, ini) + subroutine User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Pressure function. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type), target :: Flow - type(Vof_Type), target :: Vof - type(Solver_Type), target :: Sol - integer, intent(in) :: ini ! inner iteration + type(Field_Type), target :: Flow + type(Vof_Type), target :: Vof + type(Solver_Type), target :: Sol !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: u, v, w, p diff --git a/Sources/Process/User_Mod/End_Of_Compute_Scalar.f90 b/Sources/Process/User_Mod/End_Of_Compute_Scalar.f90 index 91ca3878f..cb68afb31 100644 --- a/Sources/Process/User_Mod/End_Of_Compute_Scalar.f90 +++ b/Sources/Process/User_Mod/End_Of_Compute_Scalar.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_End_Of_Compute_Scalar(Flow, Turb, Vof, Sol, ini, sc) + subroutine User_Mod_End_Of_Compute_Scalar(Flow, Turb, Vof, Sol, sc) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Scalar function. ! !------------------------------------------------------------------------------! @@ -9,8 +9,7 @@ subroutine User_Mod_End_Of_Compute_Scalar(Flow, Turb, Vof, Sol, ini, sc) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: ini ! inner iteration - integer, intent(in) :: sc ! scalar index + integer, intent(in) :: sc ! scalar index !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: phi, p diff --git a/Sources/Process/User_Mod/End_Of_Correct_Velocity.f90 b/Sources/Process/User_Mod/End_Of_Correct_Velocity.f90 index 3012a8f40..927addd51 100644 --- a/Sources/Process/User_Mod/End_Of_Correct_Velocity.f90 +++ b/Sources/Process/User_Mod/End_Of_Correct_Velocity.f90 @@ -1,14 +1,13 @@ !==============================================================================! - subroutine User_Mod_End_Of_Correct_Velocity(Flow, Vof, Sol, ini) + subroutine User_Mod_End_Of_Correct_Velocity(Flow, Vof, Sol) !------------------------------------------------------------------------------! ! This function is called at the end of Correct_Velocity function. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type), target :: Flow - type(Vof_Type), target :: Vof - type(Solver_Type), target :: Sol - integer, intent(in) :: ini + type(Field_Type), target :: Flow + type(Vof_Type), target :: Vof + type(Solver_Type), target :: Sol !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: u, v, w, p diff --git a/Sources/Process/makefile b/Sources/Process/makefile index bd81dffe0..f61e6b863 100644 --- a/Sources/Process/makefile +++ b/Sources/Process/makefile @@ -313,6 +313,7 @@ SRC_F_MOD += Point_Mod.f90 \ Time_Mod.f90 \ Numerics_Mod.f90 \ Field_Mod.f90 \ + Iter_Mod.f90 \ Front_Mod.f90 \ Surf_Mod.f90 \ Info_Mod.f90 \ diff --git a/Sources/Process/makefile_explicit_dependencies b/Sources/Process/makefile_explicit_dependencies index 075c6cde3..26f470a52 100644 --- a/Sources/Process/makefile_explicit_dependencies +++ b/Sources/Process/makefile_explicit_dependencies @@ -1,35 +1,52 @@ #--------------------------------------------------- -# Dependencies for: ./Backup_Mod.f90 +# Dependencies for: ./Eddies_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Backup_Mod.o:\ -$(DIR_OBJECT)/User_Mod.o \ -User_Mod/*.f90 \ -Backup_Mod/*.f90 +$(DIR_OBJECT)/Eddies_Mod.o:\ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Field_Mod.o \ +Field_Mod/*/*.f90 \ +Eddies_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Monitor_Mod.f90 +# Dependencies for: ./Iter_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Monitor_Mod.o:\ -Monitor_Mod/*.f90 \ +$(DIR_OBJECT)/Iter_Mod.o:\ +Iter_Mod/*.f90 \ $(DIR_OBJECT)/Field_Mod.o \ Field_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Matrix_Mod.f90 +# Dependencies for: ./Time_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Matrix_Mod.o:\ -Matrix_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/Time_Mod.o:\ +Time_Mod/*.f90 \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Particle_Mod.f90 +# Dependencies for: ./Field_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Particle_Mod.o:\ -$(DIR_OBJECT)/Vof_Mod.o \ -Vof_Mod/*/*.f90 \ -Particle_Mod/*.f90 +$(DIR_OBJECT)/Field_Mod.o:\ +$(DIR_OBJECT)/Time_Mod.o \ +Time_Mod/*.f90 \ +$(DIR_OBJECT)/Solver_Mod.o \ +Solver_Mod/*.f90 \ +$(DIR_OBJECT)/Numerics_Mod.o \ +Numerics_Mod/*.f90 \ +Field_Mod/*/*.f90 \ +$(DIR_OBJECT)/Face_Mod.o \ +Face_Mod/*.f90 \ +$(DIR_OBJECT)/Bulk_Mod.o \ +Bulk_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Solver_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Solver_Mod.o:\ +Solver_Mod/*.f90 \ +$(DIR_OBJECT)/Petsc_Mod.o \ +Petsc_Mod/*/*.f90 #--------------------------------------------------- # Dependencies for: ./Process_Mod.f90 @@ -69,21 +86,11 @@ $(DIR_OBJECT)/Bulk_Mod.o \ Bulk_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Vector_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Vector_Mod.o:\ -Vector_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Results_Mod.f90 +# Dependencies for: ./Main_Pro.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Results_Mod.o:\ -Results_Mod/*.f90 \ -$(DIR_OBJECT)/Backup_Mod.o \ -Backup_Mod/*.f90 +$(DIR_OBJECT)/Main_Pro.o:\ +$(DIR_OBJECT)/Process_Mod.o \ +Process_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Native_Mod.f90 @@ -102,47 +109,23 @@ $(DIR_SHARED)/Control_Mod/*/*.f90 \ $(DIR_SHARED)/Control_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Interface_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Interface_Mod.o:\ -$(DIR_OBJECT)/Turb_Mod.o \ -Turb_Mod/*.f90 \ -$(DIR_OBJECT)/Profiler_Mod.o \ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -Interface_Mod/*.f90 \ -$(DIR_OBJECT)/Control_Mod.o \ -$(DIR_SHARED)/Control_Mod/*/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Read_Controls_Mod.f90 +# Dependencies for: ./Surf_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Read_Controls_Mod.o:\ -$(DIR_OBJECT)/Swarm_Mod.o \ -Swarm_Mod/*.f90 \ -Read_Controls_Mod/*.f90 \ -$(DIR_OBJECT)/Eddies_Mod.o \ -Eddies_Mod/*.f90 +$(DIR_OBJECT)/Surf_Mod.o:\ +Surf_Mod/readme \ +Surf_Mod/*.f90 \ +Front_Mod/readme \ +$(DIR_OBJECT)/Front_Mod.o \ +Front_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Numerics_Mod.f90 +# Dependencies for: ./Var_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Numerics_Mod.o:\ -$(DIR_OBJECT)/Work_Mod.o \ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_OBJECT)/Var_Mod.o \ +$(DIR_OBJECT)/Var_Mod.o:\ Var_Mod/*.f90 \ -Numerics_Mod/*.f90 \ -$(DIR_OBJECT)/Matrix_Mod.o \ -Matrix_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Main_Pro.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Main_Pro.o:\ -$(DIR_OBJECT)/Process_Mod.o \ -Process_Mod/*.f90 +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Vert_Mod.f90 @@ -153,50 +136,101 @@ $(DIR_OBJECT)/Point_Mod.o \ Point_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Porosity_Mod.f90 +# Dependencies for: ./Interface_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Porosity_Mod.o:\ -$(DIR_OBJECT)/Work_Mod.o \ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_OBJECT)/Stl_Mod.o \ -$(DIR_SHARED)/Stl_Mod/*.f90 \ -Porosity_Mod/*.f90 \ +$(DIR_OBJECT)/Interface_Mod.o:\ +$(DIR_OBJECT)/Turb_Mod.o \ +Turb_Mod/*.f90 \ +$(DIR_OBJECT)/Profiler_Mod.o \ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +Interface_Mod/*.f90 \ $(DIR_OBJECT)/Control_Mod.o \ $(DIR_SHARED)/Control_Mod/*/*.f90 \ $(DIR_SHARED)/Control_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Solver_Mod.f90 +# Dependencies for: ./Face_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Solver_Mod.o:\ -Solver_Mod/*.f90 \ -$(DIR_OBJECT)/Petsc_Mod.o \ -Petsc_Mod/*/*.f90 +$(DIR_OBJECT)/Face_Mod.o:\ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +Face_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Elem_Mod.f90 +# Dependencies for: ./Results_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Elem_Mod.o:\ -Elem_Mod/*.f90 +$(DIR_OBJECT)/Results_Mod.o:\ +Results_Mod/*.f90 \ +$(DIR_OBJECT)/Backup_Mod.o \ +Backup_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Eddies_Mod.f90 +# Dependencies for: ./Backup_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Eddies_Mod.o:\ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Backup_Mod.o:\ +$(DIR_OBJECT)/User_Mod.o \ +User_Mod/*.f90 \ +Backup_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Process_Mod/Initialize_Variables.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Initialize_Variables.o:\ +$(DIR_OBJECT)/Vof_Mod.o \ +Vof_Mod/*/*.f90 \ +$(DIR_OBJECT)/User_Mod.o \ +User_Mod/*.f90 \ +$(DIR_OBJECT)/Turb_Mod.o \ +Turb_Mod/*.f90 \ +$(DIR_OBJECT)/Swarm_Mod.o \ +Swarm_Mod/*.f90 \ +$(DIR_OBJECT)/Numerics_Mod.o \ +Numerics_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ $(DIR_OBJECT)/Field_Mod.o \ Field_Mod/*/*.f90 \ -Eddies_Mod/*.f90 +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o \ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 \ +$(DIR_OBJECT)/Bulk_Mod.o \ +Bulk_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Time_Mod.f90 +# Dependencies for: ./Process_Mod/Update_Boundary_Values.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Time_Mod.o:\ -Time_Mod/*.f90 \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Update_Boundary_Values.o:\ +$(DIR_OBJECT)/Vof_Mod.o \ +Vof_Mod/*/*.f90 \ +$(DIR_OBJECT)/Turb_Mod.o \ +Turb_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/Field_Mod.o \ +Field_Mod/*/*.f90 \ +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o \ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Point_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Point_Mod.o:\ +Point_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./User_Mod.f90 @@ -211,61 +245,60 @@ $(DIR_OBJECT)/Interface_Mod.o \ Interface_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Petsc_Mod.f90 +# Dependencies for: ./Matrix_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Petsc_Mod.o:\ -Petsc_Mod/*/*.f90 \ -$(DIR_OBJECT)/Native_Mod.o \ -Native_Mod/*.f90 +$(DIR_OBJECT)/Matrix_Mod.o:\ +Matrix_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Field_Mod.f90 +# Dependencies for: ./Vector_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Field_Mod.o:\ -$(DIR_OBJECT)/Time_Mod.o \ -Time_Mod/*.f90 \ -$(DIR_OBJECT)/Solver_Mod.o \ -Solver_Mod/*.f90 \ -$(DIR_OBJECT)/Numerics_Mod.o \ -Numerics_Mod/*.f90 \ -Field_Mod/*/*.f90 \ -$(DIR_OBJECT)/Face_Mod.o \ -Face_Mod/*.f90 \ -$(DIR_OBJECT)/Bulk_Mod.o \ -Bulk_Mod/*.f90 +$(DIR_OBJECT)/Vector_Mod.o:\ +Vector_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Front_Mod.f90 +# Dependencies for: ./Elem_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Front_Mod.o:\ -$(DIR_OBJECT)/Vert_Mod.o \ -Vert_Mod/*.f90 \ -$(DIR_OBJECT)/Side_Mod.o \ -$(DIR_SHARED)/Isoap_Mod/readme \ -$(DIR_OBJECT)/Isoap_Mod.o \ -$(DIR_SHARED)/Isoap_Mod/*.f90 \ -Front_Mod/readme \ -Front_Mod/*.f90 \ -$(DIR_OBJECT)/Field_Mod.o \ -Field_Mod/*/*.f90 \ -$(DIR_OBJECT)/Elem_Mod.o \ +$(DIR_OBJECT)/Elem_Mod.o:\ Elem_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Swarm_Mod.f90 +# Dependencies for: ./Monitor_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Swarm_Mod.o:\ +$(DIR_OBJECT)/Monitor_Mod.o:\ +Monitor_Mod/*.f90 \ +$(DIR_OBJECT)/Field_Mod.o \ +Field_Mod/*/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Read_Controls_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Read_Controls_Mod.o:\ +$(DIR_OBJECT)/Swarm_Mod.o \ Swarm_Mod/*.f90 \ -$(DIR_OBJECT)/Particle_Mod.o \ -Particle_Mod/*.f90 +Read_Controls_Mod/*.f90 \ +$(DIR_OBJECT)/Eddies_Mod.o \ +Eddies_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Turb_Mod.f90 +# Dependencies for: ./Porosity_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Turb_Mod.o:\ -Turb_Mod/*.f90 \ -$(DIR_OBJECT)/Info_Mod.o \ -Info_Mod/*.f90 +$(DIR_OBJECT)/Porosity_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_OBJECT)/Stl_Mod.o \ +$(DIR_SHARED)/Stl_Mod/*.f90 \ +Porosity_Mod/*.f90 \ +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Bulk_Mod.f90 @@ -276,15 +309,6 @@ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ Bulk_Mod/*.f90 -#--------------------------------------------------- -# Dependencies for: ./Var_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Var_Mod.o:\ -Var_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 - #--------------------------------------------------- # Dependencies for: ./Info_Mod.f90 #--------------------------------------------------- @@ -293,6 +317,24 @@ Info_Mod/*.f90 \ $(DIR_OBJECT)/Field_Mod.o \ Field_Mod/*/*.f90 +#--------------------------------------------------- +# Dependencies for: ./Turb_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Turb_Mod.o:\ +Turb_Mod/*.f90 \ +$(DIR_OBJECT)/Iter_Mod.o \ +Iter_Mod/*.f90 \ +$(DIR_OBJECT)/Info_Mod.o \ +Info_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Petsc_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Petsc_Mod.o:\ +Petsc_Mod/*/*.f90 \ +$(DIR_OBJECT)/Native_Mod.o \ +Native_Mod/*.f90 + #--------------------------------------------------- # Dependencies for: ./Surf_Mod/Place_Surf_At_Value.f90 #--------------------------------------------------- @@ -312,136 +354,106 @@ $(DIR_OBJECT)/Stl_Mod.o \ $(DIR_SHARED)/Stl_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Process_Mod/Update_Boundary_Values.f90 +# Dependencies for: ./Swarm_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Update_Boundary_Values.o:\ -$(DIR_OBJECT)/Vof_Mod.o \ -Vof_Mod/*/*.f90 \ -$(DIR_OBJECT)/Turb_Mod.o \ -Turb_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/Swarm_Mod.o:\ +Swarm_Mod/*.f90 \ +$(DIR_OBJECT)/Particle_Mod.o \ +Particle_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Numerics_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Numerics_Mod.o:\ +$(DIR_OBJECT)/Work_Mod.o \ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_OBJECT)/Var_Mod.o \ +Var_Mod/*.f90 \ +Numerics_Mod/*.f90 \ +$(DIR_OBJECT)/Matrix_Mod.o \ +Matrix_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Front_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Front_Mod.o:\ +$(DIR_OBJECT)/Vert_Mod.o \ +Vert_Mod/*.f90 \ +$(DIR_OBJECT)/Side_Mod.o \ +$(DIR_SHARED)/Isoap_Mod/readme \ +$(DIR_OBJECT)/Isoap_Mod.o \ +$(DIR_SHARED)/Isoap_Mod/*.f90 \ +Front_Mod/readme \ +Front_Mod/*.f90 \ $(DIR_OBJECT)/Field_Mod.o \ Field_Mod/*/*.f90 \ -$(DIR_OBJECT)/Control_Mod.o \ -$(DIR_SHARED)/Control_Mod/*/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o \ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 +$(DIR_OBJECT)/Elem_Mod.o \ +Elem_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Process_Mod/Initialize_Variables.f90 +# Dependencies for: ./Particle_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Initialize_Variables.o:\ +$(DIR_OBJECT)/Particle_Mod.o:\ $(DIR_OBJECT)/Vof_Mod.o \ Vof_Mod/*/*.f90 \ -$(DIR_OBJECT)/User_Mod.o \ -User_Mod/*.f90 \ -$(DIR_OBJECT)/Turb_Mod.o \ -Turb_Mod/*.f90 \ -$(DIR_OBJECT)/Swarm_Mod.o \ -Swarm_Mod/*.f90 \ -$(DIR_OBJECT)/Numerics_Mod.o \ -Numerics_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Field_Mod.o \ -Field_Mod/*/*.f90 \ -$(DIR_OBJECT)/Control_Mod.o \ -$(DIR_SHARED)/Control_Mod/*/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o \ -$(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 \ -$(DIR_OBJECT)/Bulk_Mod.o \ -Bulk_Mod/*.f90 +Particle_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Surf_Mod.f90 +# Dependencies for: ./Iso_Polygons_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Surf_Mod.o:\ -Surf_Mod/readme \ -Surf_Mod/*.f90 \ -Front_Mod/readme \ -$(DIR_OBJECT)/Front_Mod.o \ -Front_Mod/*.f90 +$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Face_Mod.f90 +# Dependencies for: ./Probe_1d_Cells.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Face_Mod.o:\ +$(DIR_OBJECT)/Probe_1d_Cells.o:\ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ $(DIR_SHARED)/Grid_Mod/*.f90 \ -Face_Mod/*.f90 +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Point_Mod.f90 +# Dependencies for: ./Probe_2d.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Point_Mod.o:\ -Point_Mod/*.f90 \ +$(DIR_OBJECT)/Probe_2d.o:\ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Message_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Message_Mod.o:\ -$(DIR_OBJECT)/Tokenizer_Mod.o \ -$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ -$(DIR_SHARED)/Message_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Isoap_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Isoap_Mod.o:\ -$(DIR_OBJECT)/Polyhedron_Mod.o \ -$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ -$(DIR_OBJECT)/Iso_Polygons_Mod.o \ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ -$(DIR_SHARED)/Isoap_Mod/readme \ -$(DIR_SHARED)/Isoap_Mod/*.f90 +$(DIR_SHARED)/Grid_Mod/*.f90 \ +$(DIR_OBJECT)/File_Mod.o \ +$(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./File_Mod.f90 +# Dependencies for: ./Message_Mod/Thick_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/File_Mod.o:\ -$(DIR_OBJECT)/String_Mod.o \ -$(DIR_SHARED)/String_Mod/*.f90 \ -$(DIR_OBJECT)/Message_Mod.o \ -$(DIR_SHARED)/Message_Mod/*.f90 \ -$(DIR_SHARED)/File_Mod/*.f90 +$(DIR_OBJECT)/Thick_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Region_Mod.f90 +# Dependencies for: ./Message_Mod/Thin_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Region_Mod.o:\ +$(DIR_OBJECT)/Thin_Line.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Gen_Mod.f90 +# Dependencies for: ./Message_Mod/Dashed_Line.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Gen_Mod.o:\ -$(DIR_SHARED)/Gen_Mod/*.f90 +$(DIR_OBJECT)/Dashed_Line.o:\ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Sort_Mod.f90 +# Dependencies for: ./Math_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Sort_Mod.o:\ -$(DIR_OBJECT)/Swap_Mod.o \ -$(DIR_SHARED)/Swap_Mod/*.f90 \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 +$(DIR_OBJECT)/Math_Mod.o:\ +$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- # Dependencies for: ./Polyhedron_Mod.f90 @@ -464,106 +476,97 @@ $(DIR_SHARED)/Control_Mod/*/*.f90 \ $(DIR_SHARED)/Control_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_1d_Cells.f90 +# Dependencies for: ./Tokenizer_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Cells.o:\ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Tokenizer_Mod.o:\ +$(DIR_SHARED)/Tokenizer_Mod/*.f90 \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Dashed_Line.f90 +# Dependencies for: ./Assert_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Dashed_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Assert_Mod.o:\ +$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_SHARED)/Comm_Mod/*/*.f90 \ +$(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thin_Line.f90 +# Dependencies for: ./Vtk_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thin_Line.o:\ +$(DIR_OBJECT)/Vtk_Mod.o:\ +$(DIR_SHARED)/Vtk_Mod/*.f90 \ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Message_Mod/Thick_Line.f90 +# Dependencies for: ./String_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Thick_Line.o:\ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/String_Mod.o:\ +$(DIR_SHARED)/String_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Work_Mod.f90 +# Dependencies for: ./File_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Work_Mod.o:\ -$(DIR_SHARED)/Work_Mod/*/*.f90 \ -$(DIR_SHARED)/Work_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 +$(DIR_OBJECT)/File_Mod.o:\ +$(DIR_OBJECT)/String_Mod.o \ +$(DIR_SHARED)/String_Mod/*.f90 \ +$(DIR_OBJECT)/Message_Mod.o \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_1d_Nodes.f90 +# Dependencies for: ./Stl_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_1d_Nodes.o:\ -$(DIR_OBJECT)/Sort_Mod.o \ -$(DIR_SHARED)/Sort_Mod/*.f90 \ -$(DIR_OBJECT)/Math_Mod.o \ -$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Stl_Mod.o:\ +$(DIR_SHARED)/Stl_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ $(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 \ -$(DIR_OBJECT)/File_Mod.o \ -$(DIR_SHARED)/File_Mod/*.f90 +$(DIR_SHARED)/Grid_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Vect_Mod.f90 +# Dependencies for: ./Isoap_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Vect_Mod.o:\ -$(DIR_SHARED)/Vect_Mod/*.f90 \ -$(DIR_OBJECT)/Region_Mod.o \ -$(DIR_OBJECT)/Assert_Mod.o \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_OBJECT)/Isoap_Mod.o:\ +$(DIR_OBJECT)/Polyhedron_Mod.o \ +$(DIR_SHARED)/Polyhedron_Mod/*.f90 \ +$(DIR_OBJECT)/Iso_Polygons_Mod.o \ +$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 \ +$(DIR_SHARED)/Isoap_Mod/readme \ +$(DIR_SHARED)/Isoap_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Profiler_Mod.f90 +# Dependencies for: ./Comm_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Profiler_Mod.o:\ -$(DIR_SHARED)/Profiler_Mod/*.f90 \ -$(DIR_OBJECT)/Control_Mod.o \ -$(DIR_SHARED)/Control_Mod/*/*.f90 \ -$(DIR_SHARED)/Control_Mod/*.f90 \ -$(DIR_OBJECT)/Comm_Mod.o \ +$(DIR_OBJECT)/Comm_Mod.o:\ +$(DIR_OBJECT)/Const_Mod.o \ $(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./Math_Mod.f90 +# Dependencies for: ./Region_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Math_Mod.o:\ -$(DIR_SHARED)/Math_Mod/*.f90 \ +$(DIR_OBJECT)/Region_Mod.o:\ $(DIR_OBJECT)/Const_Mod.o #--------------------------------------------------- -# Dependencies for: ./Swap_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Swap_Mod.o:\ -$(DIR_SHARED)/Swap_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Assert_Mod.f90 +# Dependencies for: ./Profiler_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Assert_Mod.o:\ +$(DIR_OBJECT)/Profiler_Mod.o:\ +$(DIR_SHARED)/Profiler_Mod/*.f90 \ +$(DIR_OBJECT)/Control_Mod.o \ +$(DIR_SHARED)/Control_Mod/*/*.f90 \ +$(DIR_SHARED)/Control_Mod/*.f90 \ $(DIR_OBJECT)/Comm_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 \ -$(DIR_SHARED)/Assert_Mod/*.f90 +$(DIR_SHARED)/Comm_Mod/*/*.f90 #--------------------------------------------------- -# Dependencies for: ./String_Mod.f90 +# Dependencies for: ./Sort_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/String_Mod.o:\ -$(DIR_SHARED)/String_Mod/*.f90 +$(DIR_OBJECT)/Sort_Mod.o:\ +$(DIR_OBJECT)/Swap_Mod.o \ +$(DIR_SHARED)/Swap_Mod/*.f90 \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ +$(DIR_OBJECT)/Math_Mod.o \ +$(DIR_SHARED)/Math_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Probe_1d_Cells_Nodes.f90 @@ -579,6 +582,16 @@ $(DIR_SHARED)/Grid_Mod/*.f90 \ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 +#--------------------------------------------------- +# Dependencies for: ./Work_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Work_Mod.o:\ +$(DIR_SHARED)/Work_Mod/*/*.f90 \ +$(DIR_SHARED)/Work_Mod/*.f90 \ +$(DIR_OBJECT)/Grid_Mod.o \ +$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ +$(DIR_SHARED)/Grid_Mod/*.f90 + #--------------------------------------------------- # Dependencies for: ./Grid_Mod.f90 #--------------------------------------------------- @@ -600,33 +613,10 @@ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Stl_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Stl_Mod.o:\ -$(DIR_SHARED)/Stl_Mod/*.f90 \ -$(DIR_OBJECT)/Grid_Mod.o \ -$(DIR_SHARED)/Grid_Mod/Metis_Partgraphrecursive.h90 \ -$(DIR_SHARED)/Grid_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Comm_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Comm_Mod.o:\ -$(DIR_OBJECT)/Const_Mod.o \ -$(DIR_SHARED)/Comm_Mod/*/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Iso_Polygons_Mod.f90 -#--------------------------------------------------- -$(DIR_OBJECT)/Iso_Polygons_Mod.o:\ -$(DIR_SHARED)/Iso_Polygons_Mod/*.f90 - -#--------------------------------------------------- -# Dependencies for: ./Vtk_Mod.f90 +# Dependencies for: ./Gen_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Vtk_Mod.o:\ -$(DIR_SHARED)/Vtk_Mod/*.f90 \ -$(DIR_OBJECT)/Const_Mod.o +$(DIR_OBJECT)/Gen_Mod.o:\ +$(DIR_SHARED)/Gen_Mod/*.f90 #--------------------------------------------------- # Dependencies for: ./Metis_Mod.f90 @@ -637,9 +627,11 @@ $(DIR_OBJECT)/Assert_Mod.o \ $(DIR_SHARED)/Assert_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Probe_2d.f90 +# Dependencies for: ./Probe_1d_Nodes.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Probe_2d.o:\ +$(DIR_OBJECT)/Probe_1d_Nodes.o:\ +$(DIR_OBJECT)/Sort_Mod.o \ +$(DIR_SHARED)/Sort_Mod/*.f90 \ $(DIR_OBJECT)/Math_Mod.o \ $(DIR_SHARED)/Math_Mod/*.f90 \ $(DIR_OBJECT)/Grid_Mod.o \ @@ -649,10 +641,28 @@ $(DIR_OBJECT)/File_Mod.o \ $(DIR_SHARED)/File_Mod/*.f90 #--------------------------------------------------- -# Dependencies for: ./Tokenizer_Mod.f90 +# Dependencies for: ./Message_Mod.f90 #--------------------------------------------------- -$(DIR_OBJECT)/Tokenizer_Mod.o:\ +$(DIR_OBJECT)/Message_Mod.o:\ +$(DIR_OBJECT)/Tokenizer_Mod.o \ $(DIR_SHARED)/Tokenizer_Mod/*.f90 \ +$(DIR_SHARED)/Message_Mod/*.f90 \ +$(DIR_OBJECT)/Const_Mod.o \ +$(DIR_OBJECT)/Assert_Mod.o \ +$(DIR_SHARED)/Assert_Mod/*.f90 + +#--------------------------------------------------- +# Dependencies for: ./Vect_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Vect_Mod.o:\ +$(DIR_SHARED)/Vect_Mod/*.f90 \ +$(DIR_OBJECT)/Region_Mod.o \ $(DIR_OBJECT)/Assert_Mod.o \ $(DIR_SHARED)/Assert_Mod/*.f90 +#--------------------------------------------------- +# Dependencies for: ./Swap_Mod.f90 +#--------------------------------------------------- +$(DIR_OBJECT)/Swap_Mod.o:\ +$(DIR_SHARED)/Swap_Mod/*.f90 + diff --git a/Sources/Shared/Grid_Mod.f90 b/Sources/Shared/Grid_Mod.f90 index 25ed98291..73605276d 100644 --- a/Sources/Shared/Grid_Mod.f90 +++ b/Sources/Shared/Grid_Mod.f90 @@ -219,6 +219,7 @@ module Grid_Mod procedure :: Initialize_New_Numbers procedure :: Is_Face_In_Cell procedure :: Is_Point_In_Cell + procedure :: Load_And_Prepare_For_Processing procedure :: Load_Cfn procedure :: Load_Dim procedure :: Merge_Duplicate_Nodes @@ -278,6 +279,7 @@ module Grid_Mod # include "Grid_Mod/Initialize_New_Numbers.f90" # include "Grid_Mod/Is_Face_In_Cell.f90" # include "Grid_Mod/Is_Point_In_Cell.f90" +# include "Grid_Mod/Load_And_Prepare_For_Processing.f90" # include "Grid_Mod/Load_Cfn.f90" # include "Grid_Mod/Load_Dim.f90" # include "Grid_Mod/Merge_Duplicate_Nodes.f90" diff --git a/Sources/Shared/Grid_Mod/Load_And_Prepare_For_Processing.f90 b/Sources/Shared/Grid_Mod/Load_And_Prepare_For_Processing.f90 new file mode 100644 index 000000000..4143f43d1 --- /dev/null +++ b/Sources/Shared/Grid_Mod/Load_And_Prepare_For_Processing.f90 @@ -0,0 +1,27 @@ +!==============================================================================! + subroutine Load_And_Prepare_For_Processing(Grid, d) +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Grid_Type), intent(inout) :: Grid + integer, intent(in) :: d +!==============================================================================! + + call Control % Read_Problem_Name(problem_name(d)) + + ! Load the finite volume Grid + call Grid % Load_Cfn(This_Proc(), domain=d) + call Grid % Load_Dim(This_Proc(), domain=d) + + ! Determine threads for OpenMP runs + call Control % Max_Threads(Grid % Vect % d_threads, .true.) + call Grid % Determine_Threads() + + call Grid % Calculate_Face_Geometry() + + ! Find communication patterns + call Grid % Form_Cells_Comm() + call Grid % Form_Maps_For_Backup() + + end subroutine + diff --git a/Tests/Vof/Mencinger_And_Zun/User_Mod/Beginning_Of_Correct_Velocity.f90 b/Tests/Vof/Mencinger_And_Zun/User_Mod/Beginning_Of_Correct_Velocity.f90 index 575d29511..33241cb28 100644 --- a/Tests/Vof/Mencinger_And_Zun/User_Mod/Beginning_Of_Correct_Velocity.f90 +++ b/Tests/Vof/Mencinger_And_Zun/User_Mod/Beginning_Of_Correct_Velocity.f90 @@ -1,14 +1,13 @@ !==============================================================================! - subroutine User_Mod_Beginning_Of_Correct_Velocity(Flow, Vof, Sol, ini) + subroutine User_Mod_Beginning_Of_Correct_Velocity(Flow, Vof, Sol) !------------------------------------------------------------------------------! ! This function is called at the end of Correct_Velocity function. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type), target :: Flow - type(Vof_Type), target :: Vof - type(Solver_Type), target :: Sol - integer, intent(in) :: ini + type(Field_Type), target :: Flow + type(Vof_Type), target :: Vof + type(Solver_Type), target :: Sol !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: u @@ -27,7 +26,7 @@ subroutine User_Mod_Beginning_Of_Correct_Velocity(Flow, Vof, Sol, ini) ! Write down face-centered velocities before correction ! !-----------------------------------------------------------! write(file_name(28:32), '(i5.5)') Time % Curr_Dt() - write(file_name(34:36), '(i3.3)') ini + write(file_name(34:36), '(i3.3)') Iter % Current() open(99, file=file_name) write(99, '(a)') '# User_Mod_Beginning_Of_Correct_Velocity: ' // & diff --git a/Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Compute_Momentum.f90 b/Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Compute_Momentum.f90 index 9cca71911..902e00250 100644 --- a/Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Compute_Momentum.f90 +++ b/Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Compute_Momentum.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_End_Of_Compute_Momentum(Flow, Turb, Vof, Sol, ini) + subroutine User_Mod_End_Of_Compute_Momentum(Flow, Turb, Vof, Sol) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Momentum function. ! !------------------------------------------------------------------------------! @@ -9,7 +9,6 @@ subroutine User_Mod_End_Of_Compute_Momentum(Flow, Turb, Vof, Sol, ini) type(Turb_Type), target :: Turb type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: ini ! inner iteration !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: u, p @@ -26,7 +25,7 @@ subroutine User_Mod_End_Of_Compute_Momentum(Flow, Turb, Vof, Sol, ini) M => Sol % Nat % M write(file_name(28:32), '(i5.5)') Time % Curr_Dt() - write(file_name(34:36), '(i3.3)') ini + write(file_name(34:36), '(i3.3)') Iter % Current() open(99, file=file_name) write(99, '(a)') '# User_Mod_End_Of_Compute_Momentum ' // & diff --git a/Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Compute_Pressure.f90 b/Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Compute_Pressure.f90 index 214f4d69d..2c0e2e838 100644 --- a/Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Compute_Pressure.f90 +++ b/Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Compute_Pressure.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol, ini) + subroutine User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Pressure function. ! !------------------------------------------------------------------------------! @@ -8,7 +8,6 @@ subroutine User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol, ini) type(Field_Type), target :: Flow type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: ini ! inner iteration !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: p, pp @@ -26,7 +25,7 @@ subroutine User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol, ini) b => Sol % Nat % b % val write(file_name(10:14), '(i5.5)') Time % Curr_Dt() - write(file_name(16:18), '(i3.3)') ini + write(file_name(16:18), '(i3.3)') Iter % Current() open(99, file=file_name) write(99, '(A)') '# compute_pressure: 1:x, 2:p, 3:pp, 4:p%x, 5:pp%x ' // & diff --git a/Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Correct_Velocity.f90 b/Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Correct_Velocity.f90 index b28e29651..59a1887bb 100644 --- a/Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Correct_Velocity.f90 +++ b/Tests/Vof/Mencinger_And_Zun/User_Mod/End_Of_Correct_Velocity.f90 @@ -1,5 +1,5 @@ !==============================================================================! - subroutine User_Mod_End_Of_Correct_Velocity(Flow, Vof, Sol, ini) + subroutine User_Mod_End_Of_Correct_Velocity(Flow, Vof, Sol) !------------------------------------------------------------------------------! ! This function is called at the end of Correct_Velocity function. ! !------------------------------------------------------------------------------! @@ -8,7 +8,6 @@ subroutine User_Mod_End_Of_Correct_Velocity(Flow, Vof, Sol, ini) type(Field_Type), target :: Flow type(Vof_Type), target :: Vof type(Solver_Type), target :: Sol - integer, intent(in) :: ini !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: u @@ -29,7 +28,7 @@ subroutine User_Mod_End_Of_Correct_Velocity(Flow, Vof, Sol, ini) ! Write down corrected cell-centered velocities ! !---------------------------------------------------! write(fil1_name(27:31), '(i5.5)') Time % Curr_Dt() - write(fil1_name(33:35), '(i3.3)') ini + write(fil1_name(33:35), '(i3.3)') Iter % Current() open(99, file=fil1_name) write(99, '(a)') '# User_Mod_End_Of_Correct_Velocity: 1:x 2:u 3:rho' @@ -48,7 +47,7 @@ subroutine User_Mod_End_Of_Correct_Velocity(Flow, Vof, Sol, ini) ! Write down corrected face-centered velocities ! !---------------------------------------------------! write(fil2_name(27:31), '(i5.5)') Time % Curr_Dt() - write(fil2_name(33:35), '(i3.3)') ini + write(fil2_name(33:35), '(i3.3)') Iter % Current() open(99, file=fil2_name) write(99, '(a)') '# User_Mod_End_Of_Correct_Velocity: ' // & diff --git a/Tests/Vof/Stefan/User_Mod/End_Of_Compute_Energy.f90 b/Tests/Vof/Stefan/User_Mod/End_Of_Compute_Energy.f90 index 492d15063..56ab00a03 100644 --- a/Tests/Vof/Stefan/User_Mod/End_Of_Compute_Energy.f90 +++ b/Tests/Vof/Stefan/User_Mod/End_Of_Compute_Energy.f90 @@ -1,15 +1,14 @@ !==============================================================================! - subroutine User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol, ini) + subroutine User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Energy function. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type), target :: Flow - type(Turb_Type), target :: Turb - type(Vof_Type), target :: Vof - type(Solver_Type), target :: Sol - integer, intent(in) :: ini ! inner iteration + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb + type(Vof_Type), target :: Vof + type(Solver_Type), target :: Sol !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid integer :: s, fu @@ -25,7 +24,7 @@ subroutine User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol, ini) if(any(Vof % Front % elems_at_face(1:2,s) .ne. 0)) then ! Write down Stefan's solution - if(ini .eq. 1 .and. & + if(Iter % Current() .eq. 1 .and. & Math % Approx_Real(Grid % ys(s), 0.0) .and. & Math % Approx_Real(Grid % zs(s), 0.0)) then write(fu, '(99(es12.4))') Time % Curr_Dt() * Flow % dt, Grid % xs(s) diff --git a/Tests/Vof/Stefan/User_Mod/End_Of_Compute_Pressure.f90 b/Tests/Vof/Stefan/User_Mod/End_Of_Compute_Pressure.f90 index 99943ab39..bd89a140e 100644 --- a/Tests/Vof/Stefan/User_Mod/End_Of_Compute_Pressure.f90 +++ b/Tests/Vof/Stefan/User_Mod/End_Of_Compute_Pressure.f90 @@ -1,14 +1,13 @@ !==============================================================================! - subroutine User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol, ini) + subroutine User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Pressure function. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type), target :: Flow - type(Vof_Type), target :: Vof - type(Solver_Type), target :: Sol - integer, intent(in) :: ini ! inner iteration + type(Field_Type), target :: Flow + type(Vof_Type), target :: Vof + type(Solver_Type), target :: Sol !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: p, pp diff --git a/Tests/Vof/Sucking/User_Mod/End_Of_Compute_Energy.f90 b/Tests/Vof/Sucking/User_Mod/End_Of_Compute_Energy.f90 index 024346097..12a36863f 100644 --- a/Tests/Vof/Sucking/User_Mod/End_Of_Compute_Energy.f90 +++ b/Tests/Vof/Sucking/User_Mod/End_Of_Compute_Energy.f90 @@ -1,15 +1,14 @@ !==============================================================================! - subroutine User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol, ini) + subroutine User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Energy function. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type), target :: Flow - type(Turb_Type), target :: Turb - type(Vof_Type), target :: Vof - type(Solver_Type), target :: Sol - integer, intent(in) :: ini ! inner iteration + type(Field_Type), target :: Flow + type(Turb_Type), target :: Turb + type(Vof_Type), target :: Vof + type(Solver_Type), target :: Sol !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid integer :: c1, c2, s, fui, fut @@ -79,7 +78,7 @@ subroutine User_Mod_End_Of_Compute_Energy(Flow, Turb, Vof, Sol, ini) if(any(Vof % Front % elems_at_face(1:2,s) .ne. 0)) then ! Write down Stefan's solution - if(ini .eq. 1 .and. & + if(Iter % Current() .eq. 1 .and. & Math % Approx_Real(Grid % ys(s), 0.0) .and. & Math % Approx_Real(Grid % zs(s), 0.0)) then write(fui, '(99(es12.4))') Time % Curr_Dt() * Flow % dt, Grid % xs(s) diff --git a/Tests/Vof/Sucking/User_Mod/End_Of_Compute_Pressure.f90 b/Tests/Vof/Sucking/User_Mod/End_Of_Compute_Pressure.f90 index 99943ab39..bd89a140e 100644 --- a/Tests/Vof/Sucking/User_Mod/End_Of_Compute_Pressure.f90 +++ b/Tests/Vof/Sucking/User_Mod/End_Of_Compute_Pressure.f90 @@ -1,14 +1,13 @@ !==============================================================================! - subroutine User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol, ini) + subroutine User_Mod_End_Of_Compute_Pressure(Flow, Vof, Sol) !------------------------------------------------------------------------------! ! This function is called at the end of Compute_Pressure function. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! - type(Field_Type), target :: Flow - type(Vof_Type), target :: Vof - type(Solver_Type), target :: Sol - integer, intent(in) :: ini ! inner iteration + type(Field_Type), target :: Flow + type(Vof_Type), target :: Vof + type(Solver_Type), target :: Sol !-----------------------------------[Locals]-----------------------------------! type(Grid_Type), pointer :: Grid type(Var_Type), pointer :: p, pp From e36776058f50ef64823a144e8f67a8f72f8eccac Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 20 Apr 2023 13:36:45 +0200 Subject: [PATCH 205/223] Nothing really, updated a comment. On branch bojan_iter_module modified: Sources/Process/Main_Pro.f90 --- Sources/Process/Main_Pro.f90 | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Sources/Process/Main_Pro.f90 b/Sources/Process/Main_Pro.f90 index bd9c35525..c1b52a20b 100644 --- a/Sources/Process/Main_Pro.f90 +++ b/Sources/Process/Main_Pro.f90 @@ -283,8 +283,7 @@ program Process_Prog call Info % Iter_Fill(Iter % Current()) - ! Future? call Process % Simple_Step(Flow(d), Turb(d), Vof(d), & - ! Future? Sol(d)) + ! Future? call Process % Simple_Step(Flow(d), Turb(d), Vof(d), Sol(d)) ! Compute velocity gradients call Flow(d) % Grad_Variable(Flow(d) % u) From 67afe646666ec0bc02973570faf89170348121c6 Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 20 Apr 2023 13:43:51 +0200 Subject: [PATCH 206/223] Updates in syntax for control and Fortran sources On branch bojan_iter_module modified: Documentation/Syntax/.vim/syntax/control.vim modified: Documentation/Syntax/.vim/syntax/fortran.vim --- Documentation/Syntax/.vim/syntax/control.vim | 4 ++++ Documentation/Syntax/.vim/syntax/fortran.vim | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Documentation/Syntax/.vim/syntax/control.vim b/Documentation/Syntax/.vim/syntax/control.vim index b7c395330..faf1f98bd 100644 --- a/Documentation/Syntax/.vim/syntax/control.vim +++ b/Documentation/Syntax/.vim/syntax/control.vim @@ -236,6 +236,9 @@ syn keyword controlNumericalParameters simple piso linear parabolic gauss_ syn keyword controlNumericalParameters central smart luds quick smart gamma minmod blended superbee avl_smart syn keyword controlNumericalParameters cicsam upwind stacs syn keyword controlNumericalParameters yes no +syn keyword controlTurbulenceModels k_eps_zeta_f k_eps les_tvm les_wal les_dynamic les_smagorinsky hybrid_les_prandtl +syn keyword controlTurbulenceModels des_spalart spalart_allmaras dns rsm_hanjalic_jakirlic rsm_manceau_hanjalic dns none +syn keyword controlTurbulenceModels high_re low_re ggdh sgdh afm " ============================================================================== " The default methods for highlighting. Can be overridden later. @@ -247,6 +250,7 @@ hi def link controlIntrinsic Identifier hi def link controlBoundaryConditon Keyword hi def link controlLinearSolvers Keyword hi def link controlNumericalParameters Keyword +hi def link controlTurbulenceModels Keyword let b:current_syntax = "control" diff --git a/Documentation/Syntax/.vim/syntax/fortran.vim b/Documentation/Syntax/.vim/syntax/fortran.vim index 0a7fbf114..777f1c4bd 100644 --- a/Documentation/Syntax/.vim/syntax/fortran.vim +++ b/Documentation/Syntax/.vim/syntax/fortran.vim @@ -465,7 +465,7 @@ if b:fortran_dialect == "f08" syn keyword fortranTypeTflows Matrix_Type Vector_Type Solver_Type Native_Type Petsc_Type Process_Type syn keyword fortranObjectTflows A M vector Sol Nat Pet Process syn keyword fortranTypeTflows Var_Type - syn keyword fortranObjectTflows u v w ui uj uk p t kin eps zeta f22 uu vv ww uv vw uw ut vt wt t2 vis + syn keyword fortranObjectTflows u v w ui uj uk p t kin eps zeta f22 uu vv ww uv vw uw ut vt wt t2 vis phi " Items which follow are not really objects, but I don't know where else to put them syn keyword fortranObjectTflows This_Proc N_Procs First_Proc Sequential_Run Parallel_Run " Macros might need a special group of their own. From 8c2e0a80fcc06108d77ee7451e2b27da54bc4d3c Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 20 Apr 2023 13:45:35 +0200 Subject: [PATCH 207/223] IMPORTANT FIX! The case when residuals did not reached the tolerance level were not considered at all :-( On branch bojan_iter_module modified: Sources/Process/Iter_Mod/Needs_More_Iterations.f90 --- .../Process/Iter_Mod/Needs_More_Iterations.f90 | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/Sources/Process/Iter_Mod/Needs_More_Iterations.f90 b/Sources/Process/Iter_Mod/Needs_More_Iterations.f90 index 50f2c1102..36b0c95aa 100644 --- a/Sources/Process/Iter_Mod/Needs_More_Iterations.f90 +++ b/Sources/Process/Iter_Mod/Needs_More_Iterations.f90 @@ -30,13 +30,24 @@ logical function Needs_More_Iterations(Iter, Flow, n_dom) return end if - !---------------------------------------------------! - ! Residuals reached the tolerance level -> stop ! - !---------------------------------------------------! + !--------------------------------------------! + ! You are in between minimum and maximum ! + ! number of iterations, check residuals ! + !--------------------------------------------! + + ! Residuals reached the tolerance level -> stop if(Iter % Max_Fields_Residual(Flow, n_dom) <= Iter % Get_Tol()) then Iter % current_iteration = 0 Needs_More_Iterations = .false. return + + ! Residuals did not reached the tolerance level -> continue + else + Needs_More_Iterations = .true. + return end if + ! You shouldn't be here + Assert(.false.) + end function From 2c9126e12b73e27dc345fc245bff3b2534e4a242 Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 20 Apr 2023 13:50:03 +0200 Subject: [PATCH 208/223] IMPORTANT: Tidied up the controls for solvers! There was a lot of mess in calling control functions for linear solvers, both native and PETSc. Default solver for non-symmetric systems was 'cg' in some cases, and what is much more dramatic, 'cg' was by default coupled with 'asm' preconditioner which is not symmetric in parallel and and messes up the convergence (in parallel). To cite Pierre Jolivet, on of the more experienced PETSc gurus: "KSPCG requires a symmetric PC. By default, PCASMType is PC_ASM_RESTRICT, which yields a non-symmetric preconditioner. With a single process, this does not matter, but with more than one process, it does. If you switch to -pc_asm_type basic, KSPCG should converge. That being said, for Laplace equation, there are much faster alternatives than PCASM, e.g., PCGAMG." On branch bojan_iter_module modified: Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 modified: Sources/Shared/Control_Mod/Native/Solver_For_Energy.f90 modified: Sources/Shared/Control_Mod/Native/Solver_For_Momentum.f90 modified: Sources/Shared/Control_Mod/Native/Solver_For_Potential.f90 modified: Sources/Shared/Control_Mod/Native/Solver_For_Pressure.f90 modified: Sources/Shared/Control_Mod/Native/Solver_For_Scalars.f90 modified: Sources/Shared/Control_Mod/Native/Solver_For_Turbulence.f90 modified: Sources/Shared/Control_Mod/Native/Solver_For_Vof.f90 modified: Sources/Shared/Control_Mod/Native/Solver_For_Wall_Distance.f90 --- .../Read_Controls_Mod/Petsc_Solvers.f90 | 109 ++++++++++-------- .../Control_Mod/Native/Solver_For_Energy.f90 | 7 +- .../Native/Solver_For_Momentum.f90 | 5 +- .../Native/Solver_For_Potential.f90 | 5 +- .../Native/Solver_For_Pressure.f90 | 5 +- .../Control_Mod/Native/Solver_For_Scalars.f90 | 7 +- .../Native/Solver_For_Turbulence.f90 | 7 +- .../Control_Mod/Native/Solver_For_Vof.f90 | 7 +- .../Native/Solver_For_Wall_Distance.f90 | 5 +- 9 files changed, 100 insertions(+), 57 deletions(-) diff --git a/Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 b/Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 index 0af1ca1a5..6578c9677 100644 --- a/Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 +++ b/Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 @@ -75,16 +75,20 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) v % tol = tol w % tol = tol else - if(First_Proc()) then - print *, '# NOTE! PETSc options for momentum are not specified.' // & - ' Using the default values' - end if - u % prec = 'asm' - v % prec = 'asm' - w % prec = 'asm' + u % solver = 'bicg' + v % solver = 'bicg' + w % solver = 'bicg' + u % prec = 'asm' + v % prec = 'asm' + w % prec = 'asm' u % prec_opts(1:MSI) = '' v % prec_opts(1:MSI) = '' w % prec_opts(1:MSI) = '' + if(First_Proc()) then + print '(a)', ' # NOTE! PETSc options for momentum are not' // & + ' specified. Using the default: ' // & + trim(u % solver) // '/' // trim(u % prec) + end if end if !---------------------------! @@ -94,8 +98,8 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) found, & .false.) if(found) then - call Control % Read_Char_Item_On('SOLVER', 'cg', sstring, .true.) - call Control % Read_Char_Item_On('PREC', 'asm', pstring, .true.) + call Control % Read_Char_Item_On('SOLVER', 'cg', sstring, .true.) + call Control % Read_Char_Item_On('PREC', 'gamg', pstring, .true.) call Control % Read_Strings_On ('PREC_OPTS', opts, n_opts, .false.) call Control % Read_Real_Item_On('TOLERANCE', 1.0e-5, tol, .true.) @@ -105,12 +109,14 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) Flow % pp % prec_opts(1:n_opts) = opts(1:n_opts) Flow % pp % tol = tol else + Flow % pp % solver = 'cg' + Flow % pp % prec = 'gamg' + Flow % pp % prec_opts(1:MSI) = '' if(First_Proc()) then - print *, '# NOTE! PETSc options for pressure are not specified.' // & - ' Using the default values' + print '(a)', ' # NOTE! PETSc options for pressure are not' // & + ' specified. Using the default: ' // & + trim(Flow % pp % solver) // '/' // trim(Flow % pp % prec) end if - Flow % pp % prec = 'asm' - Flow % pp % prec_opts(1:MSI) = '' end if !-----------------------------------! @@ -120,8 +126,8 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) found, & .false.) if(found) then - call Control % Read_Char_Item_On('SOLVER', 'bicg', sstring, .true.) - call Control % Read_Char_Item_On('PREC', 'asm', pstring, .true.) + call Control % Read_Char_Item_On('SOLVER', 'cg', sstring, .true.) + call Control % Read_Char_Item_On('PREC', 'gamg', pstring, .true.) call Control % Read_Strings_On ('PREC_OPTS', opts, n_opts, .false.) call Control % Read_Real_Item_On('TOLERANCE', 1.0e-5, tol, .true.) @@ -131,12 +137,15 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) Flow % wall_dist % prec_opts(1:n_opts) = opts(1:n_opts) Flow % wall_dist % tol = tol else + Flow % wall_dist % solver = 'cg' + Flow % wall_dist % prec = 'gamg' + Flow % wall_dist % prec_opts(1:MSI) = '' if(First_Proc()) then - print *, '# NOTE! PETSc options for potential are not specified.' // & - ' Using the default values' + print '(a)', ' # NOTE! PETSc options for wall distance are not' // & + ' specified. Using the default: ' // & + trim(Flow % wall_dist % solver) // '/' // & + trim(Flow % wall_dist % prec) end if - Flow % wall_dist % prec = 'asm' - Flow % wall_dist % prec_opts(1:MSI) = '' end if !----------------------------! @@ -146,8 +155,8 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) found, & .false.) if(found) then - call Control % Read_Char_Item_On('SOLVER', 'bicg', sstring, .true.) - call Control % Read_Char_Item_On('PREC', 'asm', pstring, .true.) + call Control % Read_Char_Item_On('SOLVER', 'cg', sstring, .true.) + call Control % Read_Char_Item_On('PREC', 'gamg', pstring, .true.) call Control % Read_Strings_On ('PREC_OPTS', opts, n_opts, .false.) call Control % Read_Real_Item_On('TOLERANCE', 1.0e-5, tol, .true.) @@ -157,12 +166,14 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) Flow % pot % prec_opts(1:n_opts) = opts(1:n_opts) Flow % pot % tol = tol else + Flow % pot % solver = 'cg' + Flow % pot % prec = 'gamg' + Flow % pot % prec_opts(1:MSI) = '' if(First_Proc()) then - print *, '# NOTE! PETSc options for potential are not specified.' // & - ' Using the default values' + print '(a)', ' # NOTE! PETSc options for potential are not' // & + ' specified. Using the default: ' // & + trim(Flow % pot % solver) // '/' // trim(Flow % pot % prec) end if - Flow % pot % prec = 'asm' - Flow % pot % prec_opts(1:MSI) = '' end if !----------------------! @@ -183,12 +194,14 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) Vof % fun % prec_opts(1:n_opts) = opts(1:n_opts) Vof % fun % tol = tol else + Vof % fun % solver = 'bicg' + Vof % fun % prec = 'asm' + Vof % fun % prec_opts(1:MSI) = '' if(First_Proc()) then - print *, '# NOTE! PETSc options for VOF are not specified.' // & - ' Using the default values' + print '(a)', ' # NOTE! PETSc options for VOF are not' // & + ' specified. Using the default: ' // & + trim(Vof % fun % solver) // '/' // trim(Vof % fun % prec) end if - Vof % fun % prec = 'asm' - Vof % fun % prec_opts(1:MSI) = '' end if !-------------------------! @@ -209,12 +222,14 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) t % prec_opts(1:n_opts) = opts(1:n_opts) t % tol = tol else + t % solver = 'bicg' + t % prec = 'asm' + t % prec_opts(1:MSI) = '' if(First_Proc()) then - print *, '# NOTE! PETSc options for energy are not specified.' // & - ' Using the default values' + print '(a)', ' # NOTE! PETSc options for energy are not' // & + ' specified. Using the default: ' // & + trim(t % solver) // '/' // trim(t % prec) end if - t % prec = 'asm' - t % prec_opts(1:MSI) = '' end if !--------------------------------! @@ -239,23 +254,25 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) phi % tol = tol end do else - if(First_Proc()) then - print *, '# NOTE! PETSc options for scalars are not specified.' // & - ' Using the default values' - end if do sc = 1, Flow % n_scalars phi => Flow % scalar(sc) - phi % prec = 'asm' + phi % solver = 'bicg' + phi % prec = 'asm' phi % prec_opts(1:MSI) = '' end do + if(First_Proc() .and. associated(phi)) then + print '(a)', ' # NOTE! PETSc options for scalars are not' // & + ' specified. Using the default: ' // & + trim(phi % solver) // '/' // trim(phi % prec) + end if end if !------------------------------! ! All turbuelnt quantities ! !------------------------------! call Control % Position_At_One_Key('PETSC_OPTIONS_FOR_TURBULENCE', & - found, & - .false.) + found, & + .false.) if(found) then call Control % Read_Char_Item_On('SOLVER', 'bicg', sstring, .true.) call Control % Read_Char_Item_On('PREC', 'asm', pstring, .true.) @@ -282,10 +299,6 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) tq % tol = tol end do else - if(First_Proc()) then - print *, '# NOTE! PETSc options for turbulence are not specified.' // & - ' Using the default values' - end if do i = 1, 12 if(i .eq. 1) tq => Turb % kin if(i .eq. 2) tq => Turb % eps @@ -299,9 +312,15 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) if(i .eq. 10) tq => Turb % uv if(i .eq. 11) tq => Turb % uw if(i .eq. 12) tq => Turb % vw - tq % prec = 'asm' + tq % solver = 'bicg' + tq % prec = 'asm' tq % prec_opts(1:MSI) = '' end do + if(First_Proc()) then + print '(a)', ' # NOTE! PETSc options for turbulence are not' // & + ' specified. Using the default: ' // & + trim(tq % solver) // '/' // trim(tq % prec) + end if end if end subroutine diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Energy.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Energy.f90 index 9903aac23..d6f511fe8 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Energy.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Energy.f90 @@ -1,5 +1,8 @@ !==============================================================================! subroutine Solver_For_Energy(Control, val, verbose) +!------------------------------------------------------------------------------! +! Default values in this, and her sister functions, is simply as follows: ! +! If matrix is expected to be symmetric, take 'cg', otherwise take 'bicg'. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -8,10 +11,10 @@ subroutine Solver_For_Energy(Control, val, verbose) logical, optional :: verbose !==============================================================================! - call Control % Read_Char_Item('SOLVER_FOR_ENERGY', 'cg', val, verbose) + call Control % Read_Char_Item('SOLVER_FOR_ENERGY', 'bicg', val, verbose) call String % To_Lower_Case(val) - if( val .ne. 'bicg' .and. val .ne. 'cg') then + if(val .ne. 'bicg' .and. val .ne. 'cg') then call Message % Error(60, & 'Unknown linear solver for energy: '//trim(val)// & '. \n This error is critical. Exiting.', & diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Momentum.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Momentum.f90 index e439dd449..2ffffec2e 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Momentum.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Momentum.f90 @@ -1,5 +1,8 @@ !==============================================================================! subroutine Solver_For_Momentum(Control, val, verbose) +!------------------------------------------------------------------------------! +! Default values in this, and her sister functions, is simply as follows: ! +! If matrix is expected to be symmetric, take 'cg', otherwise take 'bicg'. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -11,7 +14,7 @@ subroutine Solver_For_Momentum(Control, val, verbose) call Control % Read_Char_Item('SOLVER_FOR_MOMENTUM', 'bicg', val, verbose) call String % To_Lower_Case(val) - if( val .ne. 'bicg' .and. val .ne. 'cg') then + if(val .ne. 'bicg' .and. val .ne. 'cg') then call Message % Error(60, & 'Unknown linear solver for momentum: '//trim(val)// & '. \n This error is critical. Exiting.', & diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Potential.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Potential.f90 index 77777687a..0d79c1f38 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Potential.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Potential.f90 @@ -1,5 +1,8 @@ !==============================================================================! subroutine Solver_For_Potential(Control, val, verbose) +!------------------------------------------------------------------------------! +! Default values in this, and her sister functions, is simply as follows: ! +! If matrix is expected to be symmetric, take 'cg', otherwise take 'bicg'. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -11,7 +14,7 @@ subroutine Solver_For_Potential(Control, val, verbose) call Control % Read_Char_Item('SOLVER_FOR_POTENTIAL', 'cg', val, verbose) call String % To_Lower_Case(val) - if( val .ne. 'bicg' .and. val .ne. 'cg') then + if(val .ne. 'bicg' .and. val .ne. 'cg') then call Message % Error(60, & 'Unknown linear solver for potential: '//trim(val)// & '. \n This error is critical. Exiting.', & diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Pressure.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Pressure.f90 index 07bff6b10..216b1f381 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Pressure.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Pressure.f90 @@ -1,5 +1,8 @@ !==============================================================================! subroutine Solver_For_Pressure(Control, val, verbose) +!------------------------------------------------------------------------------! +! Default values in this, and her sister functions, is simply as follows: ! +! If matrix is expected to be symmetric, take 'cg', otherwise take 'bicg'. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -11,7 +14,7 @@ subroutine Solver_For_Pressure(Control, val, verbose) call Control % Read_Char_Item('SOLVER_FOR_PRESSURE', 'cg', val, verbose) call String % To_Lower_Case(val) - if( val .ne. 'bicg' .and. val .ne. 'cg') then + if(val .ne. 'bicg' .and. val .ne. 'cg') then call Message % Error(60, & 'Unknown linear solver for pressure: '//trim(val)// & '. \n This error is critical. Exiting.', & diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Scalars.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Scalars.f90 index ce9628a52..24502eb0c 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Scalars.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Scalars.f90 @@ -1,5 +1,8 @@ !==============================================================================! subroutine Solver_For_Scalars(Control, val, verbose) +!------------------------------------------------------------------------------! +! Default values in this, and her sister functions, is simply as follows: ! +! If matrix is expected to be symmetric, take 'cg', otherwise take 'bicg'. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -8,10 +11,10 @@ subroutine Solver_For_Scalars(Control, val, verbose) logical, optional :: verbose !==============================================================================! - call Control % Read_Char_Item('SOLVER_FOR_SCALARS', 'cg', val, verbose) + call Control % Read_Char_Item('SOLVER_FOR_SCALARS', 'bicg', val, verbose) call String % To_Lower_Case(val) - if( val .ne. 'bicg' .and. val .ne. 'cg') then + if(val .ne. 'bicg' .and. val .ne. 'cg') then call Message % Error(60, & 'Unknown linear solver for scalars: '//trim(val)// & '. \n This error is critical. Exiting.', & diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Turbulence.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Turbulence.f90 index f6370b23f..0e4cfd10b 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Turbulence.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Turbulence.f90 @@ -1,5 +1,8 @@ !==============================================================================! subroutine Solver_For_Turbulence(Control, val, verbose) +!------------------------------------------------------------------------------! +! Default values in this, and her sister functions, is simply as follows: ! +! If matrix is expected to be symmetric, take 'cg', otherwise take 'bicg'. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -8,10 +11,10 @@ subroutine Solver_For_Turbulence(Control, val, verbose) logical, optional :: verbose !==============================================================================! - call Control % Read_Char_Item('SOLVER_FOR_TURBULENCE', 'cg', val, verbose) + call Control % Read_Char_Item('SOLVER_FOR_TURBULENCE', 'bicg', val, verbose) call String % To_Lower_Case(val) - if( val .ne. 'bicg' .and. val .ne. 'cg') then + if(val .ne. 'bicg' .and. val .ne. 'cg') then call Message % Error(72, & 'Unknown linear solver for wall turbulence: '//trim(val)// & '. \n This error is critical. Exiting.', & diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Vof.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Vof.f90 index 02f64b0de..7965ba005 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Vof.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Vof.f90 @@ -1,5 +1,8 @@ !==============================================================================! subroutine Solver_For_Vof(Control, val, verbose) +!------------------------------------------------------------------------------! +! Default values in this, and her sister functions, is simply as follows: ! +! If matrix is expected to be symmetric, take 'cg', otherwise take 'bicg'. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -8,10 +11,10 @@ subroutine Solver_For_Vof(Control, val, verbose) logical, optional :: verbose !==============================================================================! - call Control % Read_Char_Item('SOLVER_FOR_VOF', 'cg', val, verbose) + call Control % Read_Char_Item('SOLVER_FOR_VOF', 'bicg', val, verbose) call String % To_Lower_Case(val) - if( val .ne. 'bicg' .and. val .ne. 'cg') then + if(val .ne. 'bicg' .and. val .ne. 'cg') then call Message % Error(72, & 'Unknown linear solver for wall multiphase: '//trim(val)// & '. \n This error is critical. Exiting.', & diff --git a/Sources/Shared/Control_Mod/Native/Solver_For_Wall_Distance.f90 b/Sources/Shared/Control_Mod/Native/Solver_For_Wall_Distance.f90 index 2a17e8d1c..3277213f3 100644 --- a/Sources/Shared/Control_Mod/Native/Solver_For_Wall_Distance.f90 +++ b/Sources/Shared/Control_Mod/Native/Solver_For_Wall_Distance.f90 @@ -1,5 +1,8 @@ !==============================================================================! subroutine Solver_For_Wall_Distance(Control, val, verbose) +!------------------------------------------------------------------------------! +! Default values in this, and her sister functions, is simply as follows: ! +! If matrix is expected to be symmetric, take 'cg', otherwise take 'bicg'. ! !------------------------------------------------------------------------------! implicit none !---------------------------------[Arguments]----------------------------------! @@ -11,7 +14,7 @@ subroutine Solver_For_Wall_Distance(Control, val, verbose) call Control % Read_Char_Item('SOLVER_FOR_WALL_DISTANCE', 'cg', val, verbose) call String % To_Lower_Case(val) - if( val .ne. 'bicg' .and. val .ne. 'cg') then + if(val .ne. 'bicg' .and. val .ne. 'cg') then call Message % Error(60, & 'Unknown linear solver for wall distance: '//trim(val)// & '. \n This error is critical. Exiting.', & From 7b4e96a36bd002c041bd00312f087fb2c4726c1c Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 20 Apr 2023 15:00:38 +0200 Subject: [PATCH 209/223] A commented block to check if matrix is symmetric Ideally, this should be a separate function. On branch bojan_iter_module modified: C_Petsc_Interface.c --- Sources/Process/C_Petsc_Interface.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Sources/Process/C_Petsc_Interface.c b/Sources/Process/C_Petsc_Interface.c index 55990acea..cb1321aef 100644 --- a/Sources/Process/C_Petsc_Interface.c +++ b/Sources/Process/C_Petsc_Interface.c @@ -140,6 +140,16 @@ err = MatAssemblyBegin(*A, MAT_FINAL_ASSEMBLY); err = MatAssemblyEnd (*A, MAT_FINAL_ASSEMBLY); + /*----------------------------------------------------------------+ + | Uncomment the block below to check if matrix is symmetric | + | It must be called after MatAssemblyBegin and MatAssemblyEnd | + | Ideally, this should become a separate function in the future | + +----------------------------------------------------------------*/ + /* PetscBool symmetric; + MatIsSymmetric(*A, 0.0, &symmetric); + if(!symmetric) {printf("Matrix is not symmetric\n");} + else {printf("Matrix is symmetric\n");} */ + /* If one wishes to repeatedly assemble matrices that retain the same nonzero pattern (such as within a time-dependent problem), the option should be specified after the first matrix has been From b8161fc7cd5d6ed6951aed97e034f7918c526e12 Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 20 Apr 2023 16:08:10 +0200 Subject: [PATCH 210/223] Expanded comments in Petsc_Mod a little bit. On branch bojan_iter_module modified: Petsc_Mod/True/Solve_Petsc.f90 --- Sources/Process/Petsc_Mod/True/Solve_Petsc.f90 | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Sources/Process/Petsc_Mod/True/Solve_Petsc.f90 b/Sources/Process/Petsc_Mod/True/Solve_Petsc.f90 index 436ffb7c4..8ef3753ff 100644 --- a/Sources/Process/Petsc_Mod/True/Solve_Petsc.f90 +++ b/Sources/Process/Petsc_Mod/True/Solve_Petsc.f90 @@ -30,6 +30,8 @@ subroutine Solve_Petsc(Pet, & !-----------------------------------------------------------! ! Fill up PETSc matrix with values from original matrix ! + !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -! + ! (This can be very slow, comparable to call to solver) ! !-----------------------------------------------------------! do i = 1, Pet % m_lower do j = A % row(i), A % row(i+1)-1 @@ -58,6 +60,9 @@ subroutine Solve_Petsc(Pet, & !-----------------------------------! ! Set solver and preconditioner ! + !- - - - - - - - - - - - - - - - - -! + ! (This can be very slow, much ! + ! slower than call to solver.) ! !-----------------------------------! solvers = solver; l = len_trim(solvers); solvers(l+1:l+1) = c_null_char precs = prec; l = len_trim(precs); precs (l+1:l+1) = c_null_char @@ -101,7 +106,10 @@ subroutine Solve_Petsc(Pet, & Pet % miter) !-----------! ! Solve ! - !-----------! + !- - - - - -+------------------------------------------------------! + ! (This step takes roughly half of the time of filling up the ! + ! PETSc matrix and setiting the preconditioner, put together) ! + !------------------------------------------------------------------! call C_Petsc_Ksp_Solve(Pet % ksp, Pet % b, Pet % x) ! Check if converged From 292d557df2db7c6ab204b72efd019c130667e501 Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 20 Apr 2023 16:43:36 +0200 Subject: [PATCH 211/223] Updated links to PETSc man pages. On branch bojan_iter_module modified: C_Petsc_Interface.c --- Sources/Process/C_Petsc_Interface.c | 80 +++++++++++++++-------------- 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/Sources/Process/C_Petsc_Interface.c b/Sources/Process/C_Petsc_Interface.c index cb1321aef..902b1dcc1 100644 --- a/Sources/Process/C_Petsc_Interface.c +++ b/Sources/Process/C_Petsc_Interface.c @@ -21,8 +21,8 @@ /*---------------------------------------------------------------------------+ | PetscInitialize (and PetcIntialized) | | | - | https://petsc.org/main/docs/manualpages/Sys/PetscInitialize.html | - | https://petsc.org/main/docs/manualpages/Sys/PetscInitialized.html | + | https://petsc.org/release/manualpages/Sys/PetscInitialize/ | + | https://petsc.org/release/manualpages/Sys/PetscInitialized/ | +---------------------------------------------------------------------------*/ void c_petsc_initialize_() { @@ -37,8 +37,8 @@ /*---------------------------------------------------------------------------+ | PetscFinalize (and PetscInitialized) | | | - | https://petsc.org/main/docs/manualpages/Sys/PetscFinalize.html | - | https://petsc.org/main/docs/manualpages/Sys/PetscInitialized.html | + | https://petsc.org/release/manualpages/Sys/PetscFinalize/ | + | https://petsc.org/release/manualpages/Sys/PetscFinalized/ | +---------------------------------------------------------------------------*/ void c_petsc_finalize_() { @@ -53,7 +53,7 @@ /*---------------------------------------------------------------------------+ | PetscOptionsSetValue | | | - | https://petsc.org/main/docs/manualpages/Sys/PetscOptionsSetValue.html | + | https://petsc.org/release/manualpages/Sys/PetscOptionsSetValue/ | +---------------------------------------------------------------------------*/ void c_petsc_options_value_(const char name[], const char value[]) { @@ -69,7 +69,7 @@ /*---------------------------------------------------------------------------+ | MatCreate | | | - | https://petsc.org/release/docs/manualpages/Mat/MatCreate.html | + | https://petsc.org/release/manualpages/Mat/MatCreate/ | +---------------------------------------------------------------------------*/ void c_petsc_mat_create_(Mat * A) { @@ -79,7 +79,7 @@ /*---------------------------------------------------------------------------+ | MatSetSizes | | | - | https://petsc.org/release/docs/manualpages/Mat/MatSetSizes.html | + | https://petsc.org/release/manualpages/Mat/MatSetSizes/ | +---------------------------------------------------------------------------*/ void c_petsc_mat_set_sizes_(Mat * A, PetscInt * m, PetscInt * M) { @@ -89,7 +89,7 @@ /*---------------------------------------------------------------------------+ | MatSetType (to MATAIJ) | | | - | https://petsc.org/release/docs/manualpages/Mat/MatSetType.html | + | https://petsc.org/release/manualpages/Mat/MatSetType/ | +---------------------------------------------------------------------------*/ void c_petsc_mat_set_type_to_mat_aij_(Mat * A) { @@ -101,10 +101,10 @@ | MatSeqAIJSetPreallocation | | | | Combines two calls which seems to be important or necessary | - | https://petsc.org/release/docs/manualpages/Mat/MATAIJ.html#MATAIJ | + | https://petsc.org/release/manualpages/Mat/MATAIJ/ | | | - | https://petsc.org/release/docs/manualpages/Mat/MatMPIAIJSetPreallocation.html - | https://petsc.org/release/docs/manualpages/Mat/MatSeqAIJSetPreallocation.html + | https://petsc.org/release/manualpages/Mat/MatMPIAIJSetPreallocation/ | + | https://petsc.org/release/manualpages/Mat/MatSeqAIJSetPreallocation/ | +---------------------------------------------------------------------------*/ void c_petsc_mat_aij_set_preallocation_(Mat * A, PetscInt * d_nnz, @@ -117,7 +117,7 @@ /*---------------------------------------------------------------------------+ | MatSetValue | | | - | https://petsc.org/release/docs/manualpages/Mat/MatSetValue.html | + | https://petsc.org/release/manualpages/Mat/MatSetValue/ | +---------------------------------------------------------------------------*/ void c_petsc_mat_set_value_(Mat * A, PetscInt * row, @@ -130,9 +130,9 @@ /*---------------------------------------------------------------------------+ | MatAssemblyBegin and MatAssemblyEnd | | | - | https://petsc.org/release/docs/manualpages/Mat/MatAssemblyBegin.html | - | https://petsc.org/release/docs/manualpages/Mat/MatAssemblyEnd.html | - | https://petsc.org/main/docs/manualpages/Mat/MatSetOption.html | + | https://petsc.org/release/manualpages/Mat/MatAssemblyBegin/ | + | https://petsc.org/release/manualpages/Mat/MatAssemblyEnd/ | + | https://petsc.org/release/manualpages/Mat/MatSetOption/ | +---------------------------------------------------------------------------*/ void c_petsc_assemble_mat_(Mat * A) { @@ -144,6 +144,8 @@ | Uncomment the block below to check if matrix is symmetric | | It must be called after MatAssemblyBegin and MatAssemblyEnd | | Ideally, this should become a separate function in the future | + | | + | https://petsc.org/release/manualpages/Mat/MatIsSymmetric/ | +----------------------------------------------------------------*/ /* PetscBool symmetric; MatIsSymmetric(*A, 0.0, &symmetric); @@ -160,8 +162,8 @@ /*---------------------------------------------------------------------------+ | MatSetNullSpace | | | - | https://petsc.org/release/docs/manualpages/Mat/MatNullSpaceCreate.html | - | https://petsc.org/release/docs/manualpages/Mat/MatSetNullSpace.html | + | https://petsc.org/release/manualpages/Mat/MatNullSpaceCreate/ | + | https://petsc.org/release/manualpages/Mat/MatSetNullSpace/ | +---------------------------------------------------------------------------*/ void c_petsc_mat_set_null_space_(Mat * A) { @@ -175,7 +177,7 @@ /*---------------------------------------------------------------------------+ | MatSetNullSpace | | | - | https://petsc.org/release/docs/manualpages/Mat/MatSetNullSpace.html | + | https://petsc.org/release/manualpages/Mat/MatSetNullSpace/ | +---------------------------------------------------------------------------*/ void c_petsc_mat_remove_null_space_(Mat * A) { @@ -191,7 +193,7 @@ /*---------------------------------------------------------------------------+ | VecCreate | | | - | https://petsc.org/release/docs/manualpages/Vec/VecCreate.html | + | https://petsc.org/release/manualpages/Vec/VecCreate/ | +---------------------------------------------------------------------------*/ void c_petsc_vec_create_(Vec * v) { @@ -201,7 +203,7 @@ /*---------------------------------------------------------------------------+ | VecCreateMPI | | | - | https://petsc.org/release/docs/manualpages/Vec/VecCreateMPI.html | + | https://petsc.org/release/manualpages/Vec/VecCreateMPI/ | +---------------------------------------------------------------------------*/ void c_petsc_vec_create_mpi_(Vec * v, PetscInt * m, PetscInt * M) { @@ -211,7 +213,7 @@ /*---------------------------------------------------------------------------+ | VecSetSizes | | | - | https://petsc.org/release/docs/manualpages/Vec/VecSetSizes.html | + | https://petsc.org/release/manualpages/Vec/VecSetSizes/ | +---------------------------------------------------------------------------*/ void c_petsc_vec_set_sizes_(Vec * v, PetscInt * m, PetscInt * M) { @@ -221,7 +223,7 @@ /*---------------------------------------------------------------------------+ | VecSetType (to VECSTANDARD) | | | - | https://petsc.org/release/docs/manualpages/Vec/VecSetType.html | + | https://petsc.org/release/manualpages/Vec/VecSetType/ | +---------------------------------------------------------------------------*/ void c_petsc_vec_set_type_to_standard_(Vec * v) { @@ -231,7 +233,7 @@ /*---------------------------------------------------------------------------+ | VecSetValue | | | - | https://petsc.org/release/docs/manualpages/Vec/VecSetValue.html | + | https://petsc.org/release/manualpages/Vec/VecSetValue/ | +---------------------------------------------------------------------------*/ void c_petsc_vec_set_value_(Vec * v, PetscInt * row, PetscScalar * value) { @@ -241,8 +243,8 @@ /*---------------------------------------------------------------------------+ | VecAssemblyBegin and VecAssemblyEnd | | | - | https://petsc.org/release/docs/manualpages/Vec/VecAssemblyBegin.html | - | https://petsc.org/release/docs/manualpages/Vec/VecAssemblyEnd.html | + | https://petsc.org/release/manualpages/Vec/VecAssemblyBegin/ | + | https://petsc.org/release/manualpages/Vec/VecAssemblyEnd/ | +---------------------------------------------------------------------------*/ void c_petsc_assemble_vec_(Vec * v) { @@ -253,7 +255,7 @@ /*---------------------------------------------------------------------------+ | VecGetValues | | | - | https://petsc.org/release/docs/manualpages/Vec/VecGetValues.html | + | https://petsc.org/release/manualpages/Vec/VecGetValues/ | +---------------------------------------------------------------------------*/ void c_petsc_vec_get_values_(Vec * v, PetscInt * ni, @@ -272,7 +274,7 @@ /*---------------------------------------------------------------------------+ | KSPCreate | | | - | https://petsc.org/release/docs/manualpages/KSP/KSPCreate.html | + | https://petsc.org/release/manualpages/KSP/KSPCreate/ | +---------------------------------------------------------------------------*/ void c_petsc_ksp_create_(KSP * ksp) { @@ -282,13 +284,13 @@ /*---------------------------------------------------------------------------+ | KSP routines to set solver and preconditioner | | | - | https://petsc.org/release/docs/manualpages/KSP/KSPSetOperators.html | - | https://petsc.org/release/docs/manualpages/KSP/KSPSetType.html | - | https://petsc.org/release/docs/manualpages/KSP/KSPGetPC.html | - | https://petsc.org/release/docs/manualpages/PC/PCSetType.html | - | https://petsc.org/release/docs/manualpages/KSP/KSPSetFromOptions.html | - | https://petsc.org/release/docs/manualpages/KSP/KSPSetUp.html | - | https://petsc.org/release/docs/manualpages/KSP/KSPSetInitialGuessNonzero.html + | https://petsc.org/release/manualpages/KSP/KSPSetOperators/ | + | https://petsc.org/release/manualpages/KSP/KSPSetType/ | + | https://petsc.org/release/manualpages/KSP/KSPGetPC/ | + | https://petsc.org/release/manualpages/PC/PCSetType/ | + | https://petsc.org/release/manualpages/KSP/KSPSetFromOptions/ | + | https://petsc.org/release/manualpages/KSP/KSPSetUp/ | + | https://petsc.org/release/manualpages/KSP/KSPSetInitialGuessNonzero/ |v +---------------------------------------------------------------------------*/ void c_petsc_set_solver_and_preconditioner_(KSP * ksp, PC * pc, @@ -326,7 +328,7 @@ /*---------------------------------------------------------------------------+ | KSPSetTolerances | | | - | https://petsc.org/release/docs/manualpages/KSP/KSPSetTolerances.html | + | https://petsc.org/release/manualpages/KSP/KSPSetTolerances/ | +---------------------------------------------------------------------------*/ void c_petsc_ksp_set_tolerances_(KSP * ksp, PetscScalar * rtol, @@ -339,7 +341,7 @@ /*---------------------------------------------------------------------------+ | KSPSetTolerances | | | - | https://petsc.org/release/docs/manualpages/KSP/KSPSolve.html | + | https://petsc.org/release/manualpages/KSP/KSPSolve/ | +---------------------------------------------------------------------------*/ void c_petsc_ksp_solve_(KSP * ksp, Vec * b, Vec * x) { @@ -349,7 +351,7 @@ /*---------------------------------------------------------------------------+ | KSPGetConvergedReason | | | - | https://petsc.org/main/docs/manualpages/KSP/KSPGetConvergedReason.html | + | https://petsc.org/release/manualpages/KSP/KSPGetConvergedReason/ | +---------------------------------------------------------------------------*/ void c_petsc_ksp_converged_reason_(KSP * ksp, KSPConvergedReason * reason) { @@ -359,7 +361,7 @@ /*---------------------------------------------------------------------------+ | KSPGetIterationNumber | | | - | https://petsc.org/release/docs/manualpages/KSP/KSPGetIterationNumber.html | + | https://petsc.org/release/manualpages/KSP/KSPGetIterationNumber/ | +---------------------------------------------------------------------------*/ void c_petsc_ksp_get_iteration_number_(KSP * ksp, PetscInt * its) { @@ -369,7 +371,7 @@ /*---------------------------------------------------------------------------+ | KSPGetResidualNorm | | | - | https://petsc.org/release/docs/manualpages/KSP/KSPGetResidualNorm.html | + | https://petsc.org/release/manualpages/KSP/KSPGetResidualNorm/ | +---------------------------------------------------------------------------*/ void c_petsc_ksp_get_residual_norm_(KSP * ksp, PetscScalar * rnorm) { From 520bfa5e243550e431c1444750b7d4d2ea4da3cd Mon Sep 17 00:00:00 2001 From: Niceno Date: Thu, 20 Apr 2023 17:16:37 +0200 Subject: [PATCH 212/223] Tried to fix the test for Heat_Exchanger/2_Domains On branch bojan_iter_module modified: test_build.sh --- Tests/test_build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tests/test_build.sh b/Tests/test_build.sh index f821a9347..3b1c7fd23 100755 --- a/Tests/test_build.sh +++ b/Tests/test_build.sh @@ -105,7 +105,7 @@ LES_RB_109_DIR=Les/Rayleigh_Benard_Convection_Ra_10e09 HYB_CHANNEL_HR_STRETCHED_DIR=Hybrid_Les_Rans/Channel_Re_Tau_2000/Stretched_Mesh HYB_CHANNEL_HR_UNIFORM_DIR=Hybrid_Les_Rans/Channel_Re_Tau_2000/Uniform_Mesh -# MULTDOM_HEAT_EXCHANGER_2_DIR=Laminar/Heat_Exchanger/2_Domains +# Not used (yet ... if ever): # MULTDOM_HEAT_EXCHANGER_3_DIR=Laminar/Heat_Exchanger/3_Domains #-------------------------------------------------------------- @@ -127,7 +127,6 @@ ALL_GENERATE_TESTS=( \ "$RANS_CHANNEL_LR_STRETCHED_DIR" \ "$RANS_CHANNEL_LR_UNIFORM_DIR" \ "$MULTDOM_BACKSTEP_DIR" \ - "$MULTDOM_HEAT_EXCHANGER_2_DIR" \ "$VOF_DAM_BREAK_2D_DIR" \ "$VOF_RISING_BUBBLE_DIR" \ "$SWARM_VOF_THREE_PHASE_DIR" \ @@ -149,6 +148,7 @@ ALL_CONVERT_TESTS=( \ "$LAMINAR_CONVECTIVE_DIR" \ "$RANS_FUEL_BUNDLE_DIR" \ "$RANS_IMPINGING_JET_DIR" \ + "$MULTDOM_HEAT_EXCHANGER_2_DIR" \ "$MULTDOM_MEMBRANE_DIR" \ "$SWARM_PERIODIC_CYL_DIR" \ "$SWARM_ROD_BUNDLE_POLYHEDRAL_DIR" \ From 26044ebd7ecdca9941181f0afd07794e7e7e1ad4 Mon Sep 17 00:00:00 2001 From: Niceno Date: Sat, 22 Apr 2023 08:45:36 +0200 Subject: [PATCH 213/223] Fixed the check for scalars On branch bojan_iter_module modified: Read_Controls_Mod/Petsc_Solvers.f90 --- Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 b/Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 index 6578c9677..0d8b51dba 100644 --- a/Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 +++ b/Sources/Process/Read_Controls_Mod/Petsc_Solvers.f90 @@ -260,10 +260,13 @@ subroutine Petsc_Solvers(Rc, Flow, Turb, Vof, Sol) phi % prec = 'asm' phi % prec_opts(1:MSI) = '' end do - if(First_Proc() .and. associated(phi)) then - print '(a)', ' # NOTE! PETSc options for scalars are not' // & - ' specified. Using the default: ' // & - trim(phi % solver) // '/' // trim(phi % prec) + if(Flow % n_scalars > 0) then + phi => Flow % scalar(1) ! probably not needed, but doesn't harm + if(First_Proc() .and. associated(phi)) then + print '(a)', ' # NOTE! PETSc options for scalars are not' // & + ' specified. Using the default: ' // & + trim(phi % solver) // '/' // trim(phi % prec) + end if end if end if From 6ae05184558a13d096d64dcff24935732183a911 Mon Sep 17 00:00:00 2001 From: yohei-sato-psi Date: Wed, 26 Apr 2023 17:14:14 +0200 Subject: [PATCH 214/223] fix typo: FORTRAN --- Sources/Convert/makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Sources/Convert/makefile b/Sources/Convert/makefile index 54ca5b308..e00eaf067 100644 --- a/Sources/Convert/makefile +++ b/Sources/Convert/makefile @@ -62,11 +62,11 @@ $(info # ) $(info # Note: The first item, for each of the options above, is the default. ) $(info # ) $(info # Examples: ) -$(info # make - compile with gnu compiler ) -$(info # make FORTAN=intel - compile with intel compiler ) -$(info # make DEBUG=yes - compile with gnu compiler in debug mode ) -$(info # make ASSERT=no - compile without assert with gnu compiler ) -$(info # make OMP=yes - compile with gnu compiler for parallel Convert ) +$(info # make - compile with gnu compiler ) +$(info # make FORTRAN=intel - compile with intel compiler ) +$(info # make DEBUG=yes - compile with gnu compiler in debug mode ) +$(info # make ASSERT=no - compile without assert with gnu compiler ) +$(info # make OMP=yes - compile with gnu compiler for parallel Convert ) $(info #-----------------------------------------------------------------------) #------------------- From 98b933bb1a151c6598eef62671d7f13f262c6689 Mon Sep 17 00:00:00 2001 From: yohei-sato-psi Date: Thu, 27 Apr 2023 09:33:22 +0200 Subject: [PATCH 215/223] bug fixed: DataArray -> PDataArray --- Sources/Process/Results_Mod/Save_Vtu_Vector_Real.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Process/Results_Mod/Save_Vtu_Vector_Real.f90 b/Sources/Process/Results_Mod/Save_Vtu_Vector_Real.f90 index 0af8868c1..fcbae7548 100644 --- a/Sources/Process/Results_Mod/Save_Vtu_Vector_Real.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Vector_Real.f90 @@ -37,7 +37,7 @@ subroutine Save_Vtu_Vector_Real(Results, & if(sweep .eq. 1) then if(Parallel_Run() .and. First_Proc()) then write(fs) IN_4 // & - '' // LF end if From 65d06ae7d57315df36d76e6a83ecc7ac796d9b4a Mon Sep 17 00:00:00 2001 From: yohei-sato-psi Date: Thu, 27 Apr 2023 09:41:22 +0200 Subject: [PATCH 216/223] bug fixed: format --- Sources/Process/Info_Mod/Time_Fill.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/Process/Info_Mod/Time_Fill.f90 b/Sources/Process/Info_Mod/Time_Fill.f90 index 1a48c112d..ca6ac4e82 100644 --- a/Sources/Process/Info_Mod/Time_Fill.f90 +++ b/Sources/Process/Info_Mod/Time_Fill.f90 @@ -27,7 +27,7 @@ subroutine Time_Fill(Info, n, sim_time) ! Write simulation time write(Info % time % line(4)(45:61), '(a17)') 'Simulation time :' write(Info % time % line(4)(63:71), '(1pe9.3)') sim_time - write(Info % time % line(4)(73:83), '(a3)') '[s]' + write(Info % time % line(4)(73:75), '(a3)') '[s]' ! Write wall-clock time write(Info % time % line(5)(45:61), '(a17)') 'Wall-clock time :' @@ -36,7 +36,7 @@ subroutine Time_Fill(Info, n, sim_time) seconds = floor( wall_time - 3600.0 * hours - 60.0 * minutes ) write(Info % time % line(5)(63:65), '(i3.3)') hours write(Info % time % line(5)(66:66), '(a1)') ':' - write(Info % time % line(5)(67:69), '(i2.2)') minutes + write(Info % time % line(5)(67:68), '(i2.2)') minutes write(Info % time % line(5)(69:69), '(a1)') ':' write(Info % time % line(5)(70:71), '(i2.2)') seconds write(Info % time % line(5)(73:83), '(a11)') '[hhh:mm:ss]' From a6df247b9724d554ce71b2b94b33f6e71802d837 Mon Sep 17 00:00:00 2001 From: yohei-sato-psi Date: Thu, 27 Apr 2023 09:56:10 +0200 Subject: [PATCH 217/223] avoid divided-by-zero --- .../Normalized_Root_Mean_Square.f90 | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/Sources/Process/Native_Mod/Normalized_Root_Mean_Square.f90 b/Sources/Process/Native_Mod/Normalized_Root_Mean_Square.f90 index d1a4357f6..f1f2c97c3 100644 --- a/Sources/Process/Native_Mod/Normalized_Root_Mean_Square.f90 +++ b/Sources/Process/Native_Mod/Normalized_Root_Mean_Square.f90 @@ -13,7 +13,7 @@ real function Normalized_Root_Mean_Square(Nat, ni, r, A, x, norm) real, intent(in) :: x(:) ! this goes to buffer cells real, optional, intent(in) :: norm ! number for normalization !-----------------------------------[Locals]-----------------------------------! - real :: rms, x_max, x_min + real :: rms, x_max, x_min, x_max_min integer :: i real, contiguous, pointer :: a_val(:) integer, contiguous, pointer :: a_dia(:) @@ -56,11 +56,18 @@ real function Normalized_Root_Mean_Square(Nat, ni, r, A, x, norm) call Global % Max_Real(x_max) ! Create a plateau for very small sources and values - if( (x_max-x_min) < NANO .and. rms < NANO ) then - rms = PICO - else - rms = rms / (x_max - x_min + TINY) - end if + !if( (x_max-x_min) < NANO .and. rms < NANO ) then + ! rms = PICO + !else + ! rms = rms / (x_max - x_min + TINY) + !end if + + ! avoid roundoff error and divided-by-zero + ! don't do rms = rms / (x_max - x_min + TINY) + ! because e.g. 1.0 - 1.0 + 1e-30 = 0.0 + x_max_min = x_max - x_min + x_max_min = max (x_max_min, TINY) + rms = rms / x_max_min Normalized_Root_Mean_Square = rms From cfb11cefc52b536b4fe869f3bd42391270a9035e Mon Sep 17 00:00:00 2001 From: yohei-sato-psi Date: Thu, 27 Apr 2023 14:51:45 +0200 Subject: [PATCH 218/223] Calculate Courant number after UDF --- Sources/Process/Process_Mod/Correct_Velocity.f90 | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Sources/Process/Process_Mod/Correct_Velocity.f90 b/Sources/Process/Process_Mod/Correct_Velocity.f90 index 61ccb0bac..d85148917 100644 --- a/Sources/Process/Process_Mod/Correct_Velocity.f90 +++ b/Sources/Process/Process_Mod/Correct_Velocity.f90 @@ -70,6 +70,10 @@ subroutine Correct_Velocity(Process, Flow, Vof, Sol) end if end do + + ! User function + call User_Mod_End_Of_Correct_Velocity(Flow, Vof, Sol, curr_dt, ini) + !------------------------------------! ! Calculate the max volume error ! ! with the new corrected fluxes ! @@ -135,9 +139,6 @@ subroutine Correct_Velocity(Process, Flow, Vof, Sol) end if end if - ! User function - call User_Mod_End_Of_Correct_Velocity(Flow, Vof, Sol) - call Profiler % Stop('Correct_Velocity') end subroutine From c1a4c8a2b8f1e28ba53f321be5d59f6eb079d4c2 Mon Sep 17 00:00:00 2001 From: yohei-sato-psi Date: Thu, 27 Apr 2023 15:02:42 +0200 Subject: [PATCH 219/223] implement wall adhesion force (contact angle model) correctly --- .../Vof_Mod/Curvature/Curvature_Csf.f90 | 52 +++++++++++-------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/Sources/Process/Vof_Mod/Curvature/Curvature_Csf.f90 b/Sources/Process/Vof_Mod/Curvature/Curvature_Csf.f90 index d82eb34b9..7212d6f08 100644 --- a/Sources/Process/Vof_Mod/Curvature/Curvature_Csf.f90 +++ b/Sources/Process/Vof_Mod/Curvature/Curvature_Csf.f90 @@ -13,7 +13,9 @@ subroutine Curvature_Csf(Vof) type(Var_Type), pointer :: smooth integer :: c, c1, c2, s, nb, nc, reg real :: v1(3), v2(3), v3(3), v4(3) - real :: norm_grad, dotprod + real :: norm_grad, dotprod, mag_ntan, theta + real :: nwallx, nwally, nwallz + real :: nintx, ninty, nintz, ntanx, ntany, ntanz real, contiguous, pointer :: div_x(:), div_y(:), div_z(:) !==============================================================================! @@ -54,9 +56,7 @@ subroutine Curvature_Csf(Vof) ! Tangent vector to walls/symmetries ! !---------------------------------------! do reg = Boundary_Regions() - if( Grid % region % type(reg) .eq. WALL & - .or. Grid % region % type(reg) .eq. WALLFL & - .or. Grid % region % type(reg) .eq. SYMMETRY) then + if( Grid % region % type(reg) .eq. SYMMETRY) then do s = Faces_In_Region(reg) c1 = Grid % faces_c(1,s) c2 = Grid % faces_c(2,s) @@ -115,25 +115,33 @@ subroutine Curvature_Csf(Vof) if(norm_grad > FEMTO) then - dotprod = Grid % dx(s) * Grid % sx(s) & - + Grid % dy(s) * Grid % sy(s) & - + Grid % dz(s) * Grid % sz(s) + ! unit normal vector of interface + nintx = Vof % nx(c1) + ninty = Vof % ny(c1) + nintz = Vof % nz(c1) + + ! unit wall normal vector directed into wall + nwallx = Grid % sx(s)/Grid %s(s) + nwally = Grid % sy(s)/Grid %s(s) + nwallz = Grid % sz(s)/Grid %s(s) + + ! ntan vector lies in wall and is normal to contact line, see Brackbill's paper + ! ntan = (nint - (nint.nwall) nwall) / abs(nint - (nint.nwall) nwall) + dotprod = nintx * nwallx + ninty * nwally + nintz * nwallz + ntanx = nintx - dotprod * nwallx + ntany = ninty - dotprod * nwally + ntanz = nintz - dotprod * nwallz + ! normalize + mag_ntan = sqrt( ntanx**2.0 + ntany**2.0 + ntanz**2.0 + FEMTO) + ntanx = ntanx/mag_ntan + ntany = ntany/mag_ntan + ntanz = ntanz/mag_ntan + + theta = fun % q(c2) * PI /180.0 + Vof % nx(c2) = nwallx * cos(theta) + ntanx * sin(theta) + Vof % ny(c2) = nwally * cos(theta) + ntany * sin(theta) + Vof % nz(c2) = nwallz * cos(theta) + ntanz * sin(theta) - Vof % nx(c1) = Grid % dx(s) / dotprod * Grid % s(s) & - * cos(fun % q(c2) * PI /180.0) & - + Vof % nx(c2) * sin(fun % q(c2) * PI /180.0) - - Vof % ny(c1) = Grid % dy(s) / dotprod * Grid % s(s) & - * cos(fun % q(c2) * PI /180.0) & - + Vof % ny(c2) * sin(fun % q(c2) * PI /180.0) - - Vof % nz(c1) = Grid % dz(s) / dotprod * Grid % s(s) & - * cos(fun % q(c2) * PI /180.0) & - + Vof % nz(c2) * sin(fun % q(c2) * PI /180.0) - - Vof % nx(c2) = Vof % nx(c1) - Vof % ny(c2) = Vof % ny(c1) - Vof % nz(c2) = Vof % nz(c1) end if end do ! faces From f29995040a61d027bdc399154529889e840d229d Mon Sep 17 00:00:00 2001 From: yohei-sato-psi Date: Thu, 27 Apr 2023 15:16:33 +0200 Subject: [PATCH 220/223] calculate Courant number after UDF --- Sources/Process/Process_Mod/Correct_Velocity.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Process/Process_Mod/Correct_Velocity.f90 b/Sources/Process/Process_Mod/Correct_Velocity.f90 index d85148917..767efed1f 100644 --- a/Sources/Process/Process_Mod/Correct_Velocity.f90 +++ b/Sources/Process/Process_Mod/Correct_Velocity.f90 @@ -72,7 +72,7 @@ subroutine Correct_Velocity(Process, Flow, Vof, Sol) ! User function - call User_Mod_End_Of_Correct_Velocity(Flow, Vof, Sol, curr_dt, ini) + call User_Mod_End_Of_Correct_Velocity(Flow, Vof, Sol) !------------------------------------! ! Calculate the max volume error ! From c22506fad7cbe30538d8d7f7e0793e24398798d8 Mon Sep 17 00:00:00 2001 From: yohei-sato-psi Date: Thu, 27 Apr 2023 15:33:39 +0200 Subject: [PATCH 221/223] include physical time into vtu files --- Sources/Process/Results_Mod/Save_Vtu_Results.f90 | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Sources/Process/Results_Mod/Save_Vtu_Results.f90 b/Sources/Process/Results_Mod/Save_Vtu_Results.f90 index cd0e5f9c7..0acfd0ab9 100644 --- a/Sources/Process/Results_Mod/Save_Vtu_Results.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Results.f90 @@ -23,7 +23,7 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & integer :: s1, s2, c1, c2, c_f, c_l real :: dist1, dist2 character(SL) :: name_out_8, name_out_9, name_mean - character(SL) :: str1, str2 + character(SL) :: str1, str2, str_time integer, pointer, contiguous :: int_save(:), type_save(:), offs_save(:) real, pointer, contiguous :: save_01(:), save_02(:), save_03(:) real, pointer, contiguous :: save_04(:), save_05(:), save_06(:) @@ -135,6 +135,7 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & end if call File % Open_For_Writing_Binary(name_out_9, f9) + write(str_time,'(E16.9)')Time % Get_Time() !------------! ! ! ! Header ! @@ -144,12 +145,24 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & write(f8) IN_0 // '' // LF write(f8) IN_0 // '' // LF write(f8) IN_1 // '' // LF + write(f8) IN_2 // '' // LF + ! TIME must be capitalized for visit + write(f8) IN_3 // ' ' // trim(str_time) // LF + write(f8) IN_3 // '' // LF + write(f8) IN_2 // '' // LF end if write(f9) IN_0 // '' // LF write(f9) IN_0 // '' // LF write(f9) IN_1 // '' // LF + write(f9) IN_2 // '' // LF + ! TIME must be capitalized for visit + write(f9) IN_3 // '' // trim(str_time) // LF + write(f9) IN_3 // '' // LF + write(f9) IN_2 // '' // LF write(str1,'(i0.0)') Grid % n_nodes if(plot_inside) then From e02e07a0ea73cd04eb0f89ae6f0e7c968e4696da Mon Sep 17 00:00:00 2001 From: yohei-sato-psi Date: Sat, 29 Apr 2023 09:50:44 +0200 Subject: [PATCH 222/223] allow initial condition for vof as real in addition to stl-file --- .../Process_Mod/Initialize_Variables.f90 | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/Sources/Process/Process_Mod/Initialize_Variables.f90 b/Sources/Process/Process_Mod/Initialize_Variables.f90 index 188f8a192..4e7a0b8a9 100644 --- a/Sources/Process/Process_Mod/Initialize_Variables.f90 +++ b/Sources/Process/Process_Mod/Initialize_Variables.f90 @@ -47,11 +47,12 @@ subroutine Initialize_Variables(Process, Flow, Turb, Vof, Swarm, Sol) integer :: n_points, k real, allocatable :: prof(:,:), x(:), y(:), z(:), dist(:) - logical :: found + logical :: found, file_exists ! Default values for initial conditions character(3) :: u_def = '0.0', v_def = '0.0', w_def = '0.0' character(3) :: t_def = '0.0', t2_def = '0.0', phi_def = '0.0' + character(3) :: vf_def = '0.0' character(3) :: kin_def = '0.0', eps_def = '0.0', f22_def = '0.0' character(3) :: vis_def = '0.0', zeta_def = '0.0' character(3) :: uu_def = '0.0', vv_def = '0.0', ww_def = '0.0' @@ -320,6 +321,15 @@ subroutine Initialize_Variables(Process, Flow, Turb, Vof, Swarm, Sol) t % oo(c) = t % n(c) end if + !---------! + ! Vof ! + !---------! + if(Flow % with_interface) then + vals(0) = vf_def + read(vals(Key_Ind('VOF', keys, nks)), *, err=999) Vof % fun % n(c) + 999 continue ! file name may be defined + end if + !-------------! ! Scalars ! !-------------! @@ -421,7 +431,12 @@ subroutine Initialize_Variables(Process, Flow, Turb, Vof, Swarm, Sol) !---------------------------------! if(Flow % with_interface) then read(vals(Key_Ind('VOF', keys, nks)), *) Vof % name_stl - call Vof % Initialize_From_Stl() + inquire(file = trim(Vof % name_stl), exist = file_exists) + + ! File exists + if(file_exists) then + call Vof % Initialize_From_Stl() + endif end if end if From 617a7a74a5642adb460d8ce650fc13ea6c5bb26c Mon Sep 17 00:00:00 2001 From: yohei-sato-psi Date: Tue, 2 May 2023 10:00:14 +0200 Subject: [PATCH 223/223] introduce keyword "SAVE_RESULTS_UNIT" in control. Units in vtu-file, e.g. [m/s], cause trouble in VisIt (visualization software). --- Documentation/all_control_keywords | 1 + Sources/Process/Results_Mod.f90 | 1 + .../Process/Results_Mod/Save_Vtu_Results.f90 | 423 ++++++++++-------- Sources/Shared/Control_Mod.f90 | 2 + .../Input_Output/Save_Results_Units.f90 | 30 ++ 5 files changed, 262 insertions(+), 195 deletions(-) create mode 100644 Sources/Shared/Control_Mod/Input_Output/Save_Results_Units.f90 diff --git a/Documentation/all_control_keywords b/Documentation/all_control_keywords index eb1d51dad..40e97f147 100644 --- a/Documentation/all_control_keywords +++ b/Documentation/all_control_keywords @@ -14,6 +14,7 @@ SAVE_BACKUP_NAME | skip | name of backup file you want to create SAVE_INITIAL_CONDITION | yes | no SAVE_RESULTS_AT_BOUNDARIES | yes | no + SAVE_RESULTS_UNITS | yes | no SWARM_SAVE_INTERVAL | 60 | any integer > 0 WALL_TIME_MAX_HOURS | 168.0 | any number PROFILER_INFO | percents | seconds diff --git a/Sources/Process/Results_Mod.f90 b/Sources/Process/Results_Mod.f90 index 74a933019..3543b9fe6 100644 --- a/Sources/Process/Results_Mod.f90 +++ b/Sources/Process/Results_Mod.f90 @@ -22,6 +22,7 @@ module Results_Mod type Results_Type logical :: boundary ! save results at boundaries or not + logical :: units ! save variable name with unit logical :: initial ! save intial condition or not integer :: interval ! result save interval integer :: interval_swarm ! result save interval for particles diff --git a/Sources/Process/Results_Mod/Save_Vtu_Results.f90 b/Sources/Process/Results_Mod/Save_Vtu_Results.f90 index 0acfd0ab9..6c7f255b0 100644 --- a/Sources/Process/Results_Mod/Save_Vtu_Results.f90 +++ b/Sources/Process/Results_Mod/Save_Vtu_Results.f90 @@ -23,7 +23,7 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & integer :: s1, s2, c1, c2, c_f, c_l real :: dist1, dist2 character(SL) :: name_out_8, name_out_9, name_mean - character(SL) :: str1, str2, str_time + character(SL) :: str1, str2, str_time, str_var integer, pointer, contiguous :: int_save(:), type_save(:), offs_save(:) real, pointer, contiguous :: save_01(:), save_02(:), save_03(:) real, pointer, contiguous :: save_04(:), save_05(:), save_06(:) @@ -413,16 +413,19 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & do c2 = c_f, c_l int_save(c2) = Grid % Comm % cell_proc(c2) end do - call Results % Save_Vtu_Scalar_Int("Grid Processor [1]", plot_inside, & - int_save(c_f:c_l), & - f8, f9, data_offset, run) + + str_var = Var_Name("Grid Processor","[1]",Results % units) + call Results % Save_Vtu_Scalar_Int(trim(str_var), plot_inside, & + int_save(c_f:c_l), & + f8, f9, data_offset, run) !-----------------! ! Cell thread ! !-----------------! int_save(c_f:c_l) = Grid % Vect % cell_thread(c_f:c_l) - call Results % Save_Vtu_Scalar_Int("Grid Thread [1]", plot_inside, & - int_save(c_f:c_l), & + str_var = Var_Name("Grid Thread","[1]",Results % units) + call Results % Save_Vtu_Scalar_Int(trim(str_var), plot_inside, & + int_save(c_f:c_l), & f8, f9, data_offset, run) !-------------------! @@ -430,42 +433,47 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & !-------------------! if(present(domain)) then int_save(c_f:c_l) = domain - call Results % Save_Vtu_Scalar_Int("Grid Domain [1]", plot_inside, & - int_save(c_f:c_l), & + str_var = Var_Name("Grid Domain","[1]",Results % units) + call Results % Save_Vtu_Scalar_Int(trim(str_var), plot_inside, & + int_save(c_f:c_l), & f8, f9, data_offset, run) end if !--------------! ! Velocity ! !--------------! - call Results % Save_Vtu_Vector_Real("Velocity [m/s]", plot_inside, & - Flow % u % n(c_f:c_l), & - Flow % v % n(c_f:c_l), & - Flow % w % n(c_f:c_l), & + str_var = Var_Name("Velocity","[m/s]",Results % units) + call Results % Save_Vtu_Vector_Real(trim(str_var), plot_inside, & + Flow % u % n(c_f:c_l), & + Flow % v % n(c_f:c_l), & + Flow % w % n(c_f:c_l), & f8, f9, data_offset, run) !--------------------! ! Courant number ! !--------------------! if(plot_inside) then call Flow % Calculate_Courant_In_Cells(save_01) - call Results % Save_Vtu_Scalar_Real("Courant Number [1]", plot_inside, & - save_01(c_f:c_l), & + str_var = Var_Name("Courant Number","[1]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & + save_01(c_f:c_l), & f8, f9, data_offset, run) end if !---------------! ! Potential ! !---------------! - call Results % Save_Vtu_Scalar_Real("Potential [m^2/s]", plot_inside, & - Flow % pot % n(c_f:c_l), & + str_var = Var_Name("Potential","[m^2/s]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & + Flow % pot % n(c_f:c_l), & f8, f9, data_offset, run) !--------------------------------------! ! Pressure correction and pressure ! !--------------------------------------! - call Results % Save_Vtu_Scalar_Real("Pressure Correction [Pa]", & - plot_inside, & - Flow % pp % n(c_f:c_l), & + str_var = Var_Name("Pressure Correction","[Pa]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), & + plot_inside, & + Flow % pp % n(c_f:c_l), & f8, f9, data_offset, run) save_01(:) = 0.0 save_02(:) = 0.0 @@ -475,14 +483,16 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & save_02(c1) = Flow % pp % y(c1) * Grid % vol(c1) save_03(c1) = Flow % pp % z(c1) * Grid % vol(c1) end do - call Results % Save_Vtu_Vector_Real("Pressure Correction Force [N]", & - plot_inside, & - save_01(c_f:c_l), & - save_02(c_f:c_l), & - save_03(c_f:c_l), & + str_var = Var_Name("Pressure Correction Force","[N]",Results % units) + call Results % Save_Vtu_Vector_Real(trim(str_var), & + plot_inside, & + save_01(c_f:c_l), & + save_02(c_f:c_l), & + save_03(c_f:c_l), & f8, f9, data_offset, run) - call Results % Save_Vtu_Scalar_Real("Pressure [Pa]", plot_inside, & + str_var = Var_Name("Pressure","[Pa]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & Flow % p % n(c_f:c_l), & f8, f9, data_offset, run) save_01(:) = 0.0 @@ -493,18 +503,21 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & save_02(c1) = Flow % p % y(c1) * Grid % vol(c1) save_03(c1) = Flow % p % z(c1) * Grid % vol(c1) end do - call Results % Save_Vtu_Vector_Real("PressureForce [N]", plot_inside, & - save_01(c_f:c_l), & - save_02(c_f:c_l), & - save_03(c_f:c_l), & + + str_var = Var_Name("PressureForce","[N]",Results % units) + call Results % Save_Vtu_Vector_Real(trim(str_var), plot_inside, & + save_01(c_f:c_l), & + save_02(c_f:c_l), & + save_03(c_f:c_l), & f8, f9, data_offset, run) !-----------------! ! Temperature ! !-----------------! if(Flow % heat_transfer) then - call Results % Save_Vtu_Scalar_Real("Temperature [K]", plot_inside, & - Flow % t % n(c_f:c_l), & + str_var = Var_Name("Temperature","[K]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & + Flow % t % n(c_f:c_l), & f8, f9, data_offset, run) save_01(:) = 0.0 save_02(:) = 0.0 @@ -523,11 +536,12 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & call Flow % Calculate_Grad_Matrix() end if - call Results % Save_Vtu_Vector_Real("Temperature Gradients [K/m]", & - plot_inside, & - save_01(c_f:c_l), & - save_02(c_f:c_l), & - save_03(c_f:c_l), & + str_var = Var_Name("Temperature Gradients","[K/m]",Results % units) + call Results % Save_Vtu_Vector_Real(trim(str_var), & + plot_inside, & + save_01(c_f:c_l), & + save_02(c_f:c_l), & + save_03(c_f:c_l), & f8, f9, data_offset, run) end if @@ -535,27 +549,32 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & !-------------------------! ! Physical properties ! !-------------------------! - call Results % Save_Vtu_Scalar_Real("Physical Density [kg/m^3]", & - plot_inside, & - Flow % density(c_f:c_l), & + str_var = Var_Name("Physical Density","[kg/m^3]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), & + plot_inside, & + Flow % density(c_f:c_l), & f8, f9, data_offset, run) - call Results % Save_Vtu_Scalar_Real("Physical Viscosity [Pa s]", & - plot_inside, & - Flow % viscosity(c_f:c_l), & + str_var = Var_Name("Physical Viscosity","[Pa s]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), & + plot_inside, & + Flow % viscosity(c_f:c_l), & f8, f9, data_offset, run) - call Results % Save_Vtu_Scalar_Real("Physical Conductivity [W/m/K]", & - plot_inside, & - Flow % conductivity(c_f:c_l), & + str_var = Var_Name("Physical Conductivity","[W/m/K]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), & + plot_inside, & + Flow % conductivity(c_f:c_l), & f8, f9, data_offset, run) - call Results % Save_Vtu_Scalar_Real("Physical Capacity [J/K]", & - plot_inside, & - Flow % capacity(c_f:c_l), & + str_var = Var_Name("Physical Capacity","[J/kg/K]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), & + plot_inside, & + Flow % capacity(c_f:c_l), & f8, f9, data_offset, run) if(Turb % rough_walls) then - call Results % Save_Vtu_Scalar_Real("Roughness Coefficient z_o [1]", & - plot_inside, & - Turb % z_o(c_f:c_l), & + str_var = Var_Name("Roughness Coefficient z_o","[1]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), & + plot_inside, & + Turb % z_o(c_f:c_l), & f8, f9, data_offset, run) end if @@ -564,34 +583,40 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & ! Volume fraction ! !---------------------! if(Flow % with_interface) then - call Results % Save_Vtu_Scalar_Real("Vof Sharp [1]", & - plot_inside, & - Vof % fun % n(c_f:c_l), & + str_var = Var_Name("Vof Sharp","[1]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), & + plot_inside, & + Vof % fun % n(c_f:c_l), & f8, f9, data_offset, run) - call Results % Save_Vtu_Scalar_Real("Vof Smooth [1]", & - plot_inside, & - Vof % smooth % n(c_f:c_l), & + str_var = Var_Name("Vof Smooth","[1]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), & + plot_inside, & + Vof % smooth % n(c_f:c_l), & f8, f9, data_offset, run) - call Results % Save_Vtu_Scalar_Real("Vof Curvature [1/m]", & - plot_inside, & - Vof % curv(c_f:c_l), & + str_var = Var_Name("Vof Curvature","[1/m]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), & + plot_inside, & + Vof % curv(c_f:c_l), & f8, f9, data_offset, run) - call Results % Save_Vtu_Vector_Real("Vof SurfaceNormals [1]", & - plot_inside, & - Vof % nx(c_f:c_l), & - Vof % ny(c_f:c_l), & - Vof % nz(c_f:c_l), & + str_var = Var_Name("Vof SurfaceNormals","[1]",Results % units) + call Results % Save_Vtu_Vector_Real(trim(str_var), & + plot_inside, & + Vof % nx(c_f:c_l), & + Vof % ny(c_f:c_l), & + Vof % nz(c_f:c_l), & f8, f9, data_offset, run) - call Results % Save_Vtu_Vector_Real("Vof SurfaceTensionForce [N]", & - plot_inside, & - Vof % surf_fx(c_f:c_l), & - Vof % surf_fy(c_f:c_l), & - Vof % surf_fz(c_f:c_l), & + str_var = Var_Name("Vof SurfaceTensionForce","[N]",Results % units) + call Results % Save_Vtu_Vector_Real(trim(str_var), & + plot_inside, & + Vof % surf_fx(c_f:c_l), & + Vof % surf_fy(c_f:c_l), & + Vof % surf_fz(c_f:c_l), & f8, f9, data_offset, run) if (allocated(Vof % m_dot)) then - call Results % Save_Vtu_Scalar_Real("Vof MassTransfer [kg/m^3/s]", & - plot_inside, & - Vof % m_dot(c_f:c_l), & + str_var = Var_Name("Vof MassTransfer","[kg/m^3/s]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), & + plot_inside, & + Vof % m_dot(c_f:c_l), & f8, f9, data_offset, run) end if end if @@ -600,11 +625,13 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & ! Number of impacts and reflections ! !---------------------------------------! if(Flow % with_particles .and. .not. plot_inside) then - call Results % Save_Vtu_Scalar_Real("Particles Reflected [1]", & + str_var = Var_Name("Particles Reflected","[1]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), & plot_inside, & Swarm % n_reflected(c_f:c_l), & f8, f9, data_offset, run) - call Results % Save_Vtu_Scalar_Real("Particles Deposited [1]", & + str_var = Var_Name("Particles Deposited","[1]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), & plot_inside, & Swarm % n_deposited(c_f:c_l), & f8, f9, data_offset, run) @@ -627,8 +654,9 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & do c1 = c_f, c_l phi_save(c1) = (Flow % vort(c1)**2 - Flow % shear(c1)**2)/4. end do - call Results % Save_Vtu_Scalar_Real("Q Criterion [1/s^2]", plot_inside, & - phi_save(c_f:c_l), & + str_var = Var_Name("Q Criterion","[1/s^2]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var),plot_inside, & + phi_save(c_f:c_l), & f8, f9, data_offset, run) !--------------------------! @@ -641,20 +669,18 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & Turb % model .eq. HYBRID_LES_RANS .or. & Turb % model .eq. RSM_MANCEAU_HANJALIC .or. & Turb % model .eq. RSM_HANJALIC_JAKIRLIC ) then - call Results % Save_Vtu_Scalar_Real( & - "Turbulent Kinetic Energy [m^2/s^2]", & - plot_inside, & - Turb % kin % n(c_f:c_l), & + str_var = Var_Name("Turbulent Kinetic Energy","[m^2/s^2]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & + Turb % kin % n(c_f:c_l), & f8, f9, data_offset, run) - call Results % Save_Vtu_Scalar_Real( & - "Turbulent Dissipation [m^2/s^3]", & - plot_inside, & - Turb % eps % n(c_f:c_l), & + str_var = Var_Name("Turbulent Dissipation","[m^2/s^3]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & + Turb % eps % n(c_f:c_l), & f8, f9, data_offset, run) - call Results % Save_Vtu_Scalar_Real( & - "Turbulent Kinetic Energy Production [m^2/s^3]", & - plot_inside, & - Turb % p_kin(c_f:c_l), & + str_var = Var_Name("Turbulent Kinetic Energy Production","[m^2/s^3]", & + Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & + Turb % p_kin(c_f:c_l), & f8, f9, data_offset, run) end if @@ -669,28 +695,29 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & ! plot_inside, & ! v2_calc (c_f:c_l), & ! f8, f9, data_offset, run) - call Results % Save_Vtu_Scalar_Real("Turbulent Quantity Zeta [1]", & - plot_inside, & - Turb % zeta % n(c_f:c_l), & + str_var = Var_Name("Turbulent Quantity Zeta","[1]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & + Turb % zeta % n(c_f:c_l), & f8, f9, data_offset, run) - call Results % Save_Vtu_Scalar_Real("Turbulent Quantity F22 [1]", & - plot_inside, & - Turb % f22 % n(c_f:c_l), & + str_var = Var_Name("Turbulent Quantity F22","[1]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & + Turb % f22 % n(c_f:c_l), & f8, f9, data_offset, run) if(Flow % heat_transfer) then - call Results % Save_Vtu_Scalar_Real("Turbulent Quantity T2 [K^2]", & - plot_inside, & - Turb % t2 % n(c_f:c_l), & + str_var = Var_Name("Turbulent Quantity T2","[K^2]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & + Turb % t2 % n(c_f:c_l), & f8, f9, data_offset, run) ! call Results % Save_Vtu_Scalar_Real("Turbulent T2 Production [K^2/s]",& ! plot_inside, & ! Turb % p_t2(c_f:c_l), & ! f8, f9, data_offset, run) - call Results % Save_Vtu_Vector_Real("Turbulent Heat Flux [K m/s]", & - plot_inside, & - Turb % ut % n(c_f:c_l), & - Turb % vt % n(c_f:c_l), & - Turb % wt % n(c_f:c_l), & + ! unit wrong ??? + str_var = Var_Name("Turbulent Heat Flux","[K m/s]",Results % units) + call Results % Save_Vtu_Vector_Real(trim(str_var), plot_inside, & + Turb % ut % n(c_f:c_l), & + Turb % vt % n(c_f:c_l), & + Turb % wt % n(c_f:c_l), & f8, f9, data_offset, run) ! call Results % Save_Vtu_Scalar_Real("Turbulent Quantity Alpha L", & ! plot_inside, & @@ -704,22 +731,22 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & end if if(Turb % model .eq. RSM_MANCEAU_HANJALIC) then - call Results % Save_Vtu_Scalar_Real("Turbulent Quantity F22 [1]", & - plot_inside, & - Turb % f22 % n(c_f:c_l), & + str_var = Var_Name("Turbulent Quantity F22","[1]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & + Turb % f22 % n(c_f:c_l), & f8, f9, data_offset, run) end if ! Save vis and vis_t if(Turb % model .eq. DES_SPALART .or. & Turb % model .eq. SPALART_ALLMARAS) then - call Results % Save_Vtu_Scalar_Real("Turbulent Viscosity [Pa s]", & - plot_inside, & - Turb % vis % n(c_f:c_l), & + str_var = Var_Name("Turbulent Viscosity","[Pa s]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & + Turb % vis % n(c_f:c_l), & f8, f9, data_offset, run) - call Results % Save_Vtu_Scalar_Real("Vorticity Magnitude [1/s]", & - plot_inside, & - Flow % vort(c_f:c_l), & + str_var = Var_Name("Vorticity Magnitude","[1/s]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & + Flow % vort(c_f:c_l), & f8, f9, data_offset, run) end if @@ -728,27 +755,24 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & Turb % model .ne. HYBRID_LES_RANS .and. & Turb % model .ne. DNS) then kin_vis_t(c_f:c_l) = Turb % vis_t(c_f:c_l) / Flow % viscosity(c_f:c_l) - call Results % Save_Vtu_Scalar_Real( & - "Eddy Over Molecular Viscosity [1]", & - plot_inside, & - kin_vis_t(c_f:c_l), & + str_var = Var_Name("Eddy Over Molecular Viscosity","[1]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & + kin_vis_t(c_f:c_l), & f8, f9, data_offset, run) end if if(Turb % model .eq. HYBRID_LES_RANS) then kin_vis_t(:) = 0.0 kin_vis_t(c_f:c_l) = Turb % vis_t(c_f:c_l) / Flow % viscosity(c_f:c_l) - call Results % Save_Vtu_Scalar_Real( & - "Rans Eddy Over Molecular Viscosity [1]", & - plot_inside, & - kin_vis_t(c_f:c_l), & + str_var = Var_Name("Rans Eddy Over Molecular Viscosity","[1]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & + kin_vis_t(c_f:c_l), & f8, f9, data_offset, run) kin_vis_t(:) = 0.0 kin_vis_t(c_f:c_l) = Turb % vis_t_sgs(c_f:c_l) / Flow % viscosity(c_f:c_l) - call Results % Save_Vtu_Scalar_Real( & - "Sgs Eddy Over Molecular Viscosity [1]", & - plot_inside, & - kin_vis_t(c_f:c_l), & + str_var = Var_Name("Sgs Eddy Over Molecular Viscosity","[1]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & + kin_vis_t(c_f:c_l), & f8, f9, data_offset, run) end if @@ -757,32 +781,32 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & Turb % model .eq. RSM_HANJALIC_JAKIRLIC) then ! Note: follows the order in which Paraview stores tensors - call Results % Save_Vtu_Tensor_6_Real("Reynolds Stress [m^2/s^2]", & - plot_inside, & - Turb % uu % n(c_f:c_l), & - Turb % vv % n(c_f:c_l), & - Turb % ww % n(c_f:c_l), & - Turb % uv % n(c_f:c_l), & - Turb % vw % n(c_f:c_l), & - Turb % uw % n(c_f:c_l), & + str_var = Var_Name("Reynolds Stress","[m^2/s^2]",Results % units) + call Results % Save_Vtu_Tensor_6_Real(trim(str_var), plot_inside, & + Turb % uu % n(c_f:c_l), & + Turb % vv % n(c_f:c_l), & + Turb % ww % n(c_f:c_l), & + Turb % uv % n(c_f:c_l), & + Turb % vw % n(c_f:c_l), & + Turb % uw % n(c_f:c_l), & f8, f9, data_offset, run) if(Flow % heat_transfer) then - call Results % Save_Vtu_Vector_Real("Turbulent Heat Flux [K m/s]", & - plot_inside, & - Turb % ut % n(c_f:c_l), & - Turb % vt % n(c_f:c_l), & - Turb % wt % n(c_f:c_l), & + str_var = Var_Name("Turbulent Heat Flux","[K m/s]",Results % units) + call Results % Save_Vtu_Vector_Real(trim(str_var), plot_inside, & + Turb % ut % n(c_f:c_l), & + Turb % vt % n(c_f:c_l), & + Turb % wt % n(c_f:c_l), & f8, f9, data_offset, run) end if end if ! Statistics for large-scale simulations of turbulence if(Turb % statistics) then - call Results % Save_Vtu_Vector_Real("Mean Velocity [m/s]", & - plot_inside, & - Turb % u_mean(c_f:c_l), & - Turb % v_mean(c_f:c_l), & - Turb % w_mean(c_f:c_l), & + str_var = Var_Name("Mean Velocity","[m/s]",Results % units) + call Results % Save_Vtu_Vector_Real(trim(str_var), plot_inside, & + Turb % u_mean(c_f:c_l), & + Turb % v_mean(c_f:c_l), & + Turb % w_mean(c_f:c_l), & f8, f9, data_offset, run) save_01(:) = 0.0 save_02(:) = 0.0 @@ -800,20 +824,18 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & save_05(c1) = Turb % vw_res(c1) - Turb % v_mean(c1) * Turb % w_mean(c1) save_06(c1) = Turb % uw_res(c1) - Turb % u_mean(c1) * Turb % w_mean(c1) end do - call Results % Save_Vtu_Tensor_6_Real( & - "Mean Reynolds Stress [m^s/s^2]", & - plot_inside, & - save_01(c_f:c_l), & - save_02(c_f:c_l), & - save_03(c_f:c_l), & - save_04(c_f:c_l), & - save_05(c_f:c_l), & - save_06(c_f:c_l), & + str_var = Var_Name("Mean Reynolds Stress","[m^s/s^2]",Results % units) + call Results % Save_Vtu_Tensor_6_Real(trim(str_var), plot_inside, & + save_01(c_f:c_l), & + save_02(c_f:c_l), & + save_03(c_f:c_l), & + save_04(c_f:c_l), & + save_05(c_f:c_l), & + save_06(c_f:c_l), & f8, f9, data_offset, run) if(Flow % heat_transfer) then - call Results % Save_Vtu_Scalar_Real( & - "Mean Temperature [K]", & - plot_inside, & + str_var = Var_Name("Mean Temperature","[K]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & Turb % t_mean(c_f:c_l), & f8, f9, data_offset, run) phi_save(:) = 0.0 @@ -826,17 +848,15 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & save_02(c1) = Turb % vt_res(c1) - Turb % v_mean(c1)*Turb % t_mean(c1) save_03(c1) = Turb % wt_res(c1) - Turb % w_mean(c1)*Turb % t_mean(c1) end do - call Results % Save_Vtu_Scalar_Real( & - "Mean Turbulent Quantity T2 [K^2]", & - plot_inside, & - phi_save(c_f:c_l), & + str_var = Var_Name("Mean Turbulent Quantity T2","[K^2]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & + phi_save(c_f:c_l), & f8, f9, data_offset, run) - call Results % Save_Vtu_Vector_Real( & - "Mean Turbulent Heat Flux [K m/s]", & - plot_inside, & - save_01(c_f:c_l), & - save_02(c_f:c_l), & - save_03(c_f:c_l), & + str_var = Var_Name("Mean Turbulent Heat Flux","[K m/s]",Results % units) + call Results % Save_Vtu_Vector_Real(trim(str_var), plot_inside, & + save_01(c_f:c_l), & + save_02(c_f:c_l), & + save_03(c_f:c_l), & f8, f9, data_offset, run) end if @@ -857,41 +877,41 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & ! Save y+ for all turbulence models if(Turb % model .ne. NO_TURBULENCE_MODEL .and. & Turb % model .ne. DNS) then - call Results % Save_Vtu_Scalar_Real("Turbulent Quantity Y Plus [1]", & - plot_inside, & - Turb % y_plus(c_f:c_l), & + str_var = Var_Name("Turbulent Quantity Y Plus","[1]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & + Turb % y_plus(c_f:c_l), & f8, f9, data_offset, run) end if ! Wall distance and delta, important for all models - call Results % Save_Vtu_Scalar_Real("Grid Cell Volume [m^3]", & - plot_inside, & - Grid % vol(c_f:c_l), & + str_var = Var_Name("Grid Cell Volume","[m^3]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & + Grid % vol(c_f:c_l), & f8, f9, data_offset, run) - call Results % Save_Vtu_Tensor_6_Real("Grid Cell Inertia [m^2]", & - plot_inside, & - Grid % ixx(c_f:c_l), & - Grid % iyy(c_f:c_l), & - Grid % izz(c_f:c_l), & - Grid % ixy(c_f:c_l), & - Grid % iyz(c_f:c_l), & - Grid % ixz(c_f:c_l), & + str_var = Var_Name("Grid Cell Inertia","[m^2]",Results % units) + call Results % Save_Vtu_Tensor_6_Real(trim(str_var), plot_inside, & + Grid % ixx(c_f:c_l), & + Grid % iyy(c_f:c_l), & + Grid % izz(c_f:c_l), & + Grid % ixy(c_f:c_l), & + Grid % iyz(c_f:c_l), & + Grid % ixz(c_f:c_l), & f8, f9, data_offset, run) - call Results % Save_Vtu_Scalar_Real("Grid Wall Distance [m]", & - plot_inside, & - Grid % wall_dist(c_f:c_l), & + str_var = Var_Name("Grid Wall Distance","[m]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & + Grid % wall_dist(c_f:c_l), & f8, f9, data_offset, run) - call Results % Save_Vtu_Scalar_Real("Grid Cell Delta Max [m]", & - plot_inside, & - Turb % h_max(c_f:c_l), & + str_var = Var_Name("Grid Cell Delta Max","[m]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & + Turb % h_max(c_f:c_l), & f8, f9, data_offset, run) - call Results % Save_Vtu_Scalar_Real("Grid Cell Delta Min [m]", & - plot_inside, & - Turb % h_min(c_f:c_l), & + str_var = Var_Name("Grid Cell Delta Min","[m]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & + Turb % h_min(c_f:c_l), & f8, f9, data_offset, run) - call Results % Save_Vtu_Scalar_Real("Grid Cell Delta Wall [m]", & - plot_inside, & - Turb % h_w (c_f:c_l), & + str_var = Var_Name("Grid Cell Delta Wall","[m]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & + Turb % h_w (c_f:c_l), & f8, f9, data_offset, run) !---------------------------------------------------------------------! @@ -938,9 +958,9 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & end do end do - call Results % Save_Vtu_Scalar_Real("T.K.E. Near Wall [m^2/s^2]", & - plot_inside, & - var_ins(c_f:c_l), & + str_var = Var_Name("T.K.E. Near Wall","[m^2/s^2]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & + var_ins(c_f:c_l), & f8, f9, data_offset, run) ! Copy internal values to boundary @@ -954,8 +974,8 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & end do end do - call Results % Save_Vtu_Scalar_Real("y+ Near Wall [1]", & - plot_inside, & + str_var = Var_Name("y+ Near Wall","[1]",Results % units) + call Results % Save_Vtu_Scalar_Real(trim(str_var), plot_inside, & var_ins(c_f:c_l), & f8, f9, data_offset, run) @@ -1079,3 +1099,16 @@ subroutine Save_Vtu_Results(Results, Flow, Turb, Vof, Swarm, & call Profiler % Stop('Save_Vtu_Results') end subroutine + +!==============================================================================! + Character(SL) function Var_Name(str1, str2, bool) +!------------------------------------------------------------------------------! + implicit none +!--------------------------------[Arguments]-----------------------------------! + character(*) :: str1, str2 + logical :: bool +!==============================================================================! + Var_Name = trim(str1) + if (bool) Var_Name = trim(Var_Name) // " " // trim(str2) + + end function diff --git a/Sources/Shared/Control_Mod.f90 b/Sources/Shared/Control_Mod.f90 index 24a46d777..bd721f042 100644 --- a/Sources/Shared/Control_Mod.f90 +++ b/Sources/Shared/Control_Mod.f90 @@ -46,6 +46,7 @@ module Control_Mod procedure :: Save_Backup_Name procedure :: Save_Initial_Condition procedure :: Save_Results_At_Boundaries + procedure :: Save_Results_Units procedure :: Wall_Time_Max_Hours procedure :: Backup_Save_Interval procedure :: Results_Save_Interval @@ -223,6 +224,7 @@ module Control_Mod # include "Control_Mod/Input_Output/Save_Backup_Name.f90" # include "Control_Mod/Input_Output/Save_Initial_Condition.f90" # include "Control_Mod/Input_Output/Save_Results_At_Boundaries.f90" +# include 'Control_Mod/Input_Output/Save_Results_Units.f90' # include "Control_Mod/Input_Output/Wall_Time_Max_Hours.f90" ! Save diff --git a/Sources/Shared/Control_Mod/Input_Output/Save_Results_Units.f90 b/Sources/Shared/Control_Mod/Input_Output/Save_Results_Units.f90 new file mode 100644 index 000000000..2363b5717 --- /dev/null +++ b/Sources/Shared/Control_Mod/Input_Output/Save_Results_Units.f90 @@ -0,0 +1,30 @@ +!==============================================================================! + subroutine Save_Results_Units(Control, save_results_uni, verbose) +!------------------------------------------------------------------------------! + implicit none +!---------------------------------[Arguments]----------------------------------! + class(Control_Type) :: Control + logical :: save_results_uni + logical, optional :: verbose +!-----------------------------------[Locals]-----------------------------------! + character(SL) :: val +!==============================================================================! + + call Control % Read_Char_Item('SAVE_RESULTS_UNITS', 'yes', & + val, verbose) + call String % To_Upper_Case(val) + + if( val .eq. 'YES' ) then + save_results_uni = .true. + + else if( val .eq. 'NO' ) then + save_results_uni = .false. + + else + call Message % Error(72, & + 'Unknown state for save results units: '//trim(val)// & + '. \n This error is critical. Exiting.', & + file=__FILE__, line=__LINE__, one_proc=.true.) + end if + + end subroutine