Skip to content

Commit 32692e1

Browse files
committed
brought version of FVM solver that worked
1 parent d6acd1b commit 32692e1

7 files changed

+35
-128
lines changed

src/OBJECTS

+1-10
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,4 @@
11
objects= \
2-
interface_physics.o \
3-
interface_assembler.o \
4-
interface_algebraic_solver.o \
5-
interface_linear_solver.o \
6-
interface_nonlinear_solver.o \
7-
utils.o \
82
class_string.o \
93
class_file.o \
104
class_set.o \
@@ -14,11 +8,8 @@ class_gmsh_loader.o \
148
module_mesh_utils.o \
159
class_mesh.o \
1610
class_assembler.o \
17-
<<<<<<< Updated upstream
18-
class_finite_volume_assembler.o \
1911
interface_linear_solver.o \
2012
class_conjugate_gradient.o \
2113
class_gauss_jacobi.o \
2214
class_gauss_seidel.o \
23-
class_sor.o \
24-
class_physics_unsteady_heat.o
15+
class_sor.o

src/class_assembler.f90

+9-15
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,17 @@
1-
!=====================================================================!
2-
! Class that coodinates tasks of discretiztion, mesh and physics
3-
!
4-
! Author: Komahan Boopathy
5-
!=====================================================================!
6-
71
module class_assembler
82

93
! import dependencies
104
use iso_fortran_env, only : dp => REAL64
115
use class_mesh, only : mesh
12-
use interface_physics, only : physics
13-
6+
147
implicit none
158

169
private
1710
public :: assembler
1811

1912
!===================================================================!
20-
! Class responsible for matrix, right hand side assembly and
21-
! boundary conditions
13+
! Class responsible for matrix, right hand side assembly and boundary
14+
! conditions
2215
!===================================================================!
2316

2417
type :: assembler
@@ -29,14 +22,15 @@ module class_assembler
2922
! Mesh object
3023
! type(mesh), pointer :: grid
3124
class(mesh) , allocatable :: grid
32-
25+
!class(physics), allocatable :: system(:) ! poisson on \Omega, dirichlet on dOmega1 , dirchlet dOmega3 , dirichlet, Neumann dOmega4
26+
3327
! Number of state varibles
3428
integer :: num_state_vars
3529

3630
! Flux vector
3731
real(dp), allocatable :: phi(:)
3832

39-
! Matrix filters (used by classical iterations)
33+
! Matrix filters
4034
integer :: DIAGONAL = 0
4135
integer :: LOWER_TRIANGLE = -1
4236
integer :: UPPER_TRIANGLE = 1
@@ -75,12 +69,13 @@ module class_assembler
7569

7670
type(assembler) function construct(grid) result (this)
7771

78-
class(mesh) , intent(in) :: grid
72+
type(mesh), intent(in) :: grid
7973

8074
print *, "constructing assembler"
8175

8276
! Set mesh
8377
allocate(this % grid, source = grid)
78+
call this % grid % to_string()
8479

8580
! Non symmetric jacobian
8681
this % symmetry = .true.
@@ -93,7 +88,6 @@ type(assembler) function construct(grid) result (this)
9388
allocate(this % phi(this % num_state_vars))
9489
this % phi = 0
9590

96-
! Filters for matrix assembly (used by solvers)
9791
this % DIAGONAL = 0
9892
this % LOWER_TRIANGLE = -1
9993
this % UPPER_TRIANGLE = 1
@@ -529,7 +523,7 @@ subroutine get_source(this, b)
529523
real(dp) , parameter :: phi_right = 0.0d0
530524
real(dp) , parameter :: phi_top = 0.0d0
531525
real(dp) , parameter :: phi_bottom = 0.0d0
532-
real(dp) , parameter :: phib = 1.0d0
526+
real(dp) , parameter :: phib = 0.0d0
533527

534528
!!$
535529
!!$ block

src/class_conjugate_gradient.f90

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
module class_conjugate_gradient
77

88
use iso_fortran_env , only : dp => REAL64
9-
use interface_linear_solver , only : abstract_linear_solver
9+
use interface_linear_solver , only : linear_solver
1010
use class_assembler , only : assembler
1111

1212
implicit none
@@ -19,7 +19,7 @@ module class_conjugate_gradient
1919
! Linear solver datatype
2020
!===================================================================!
2121

22-
type, extends(abstract_linear_solver) :: conjugate_gradient
22+
type, extends(linear_solver) :: conjugate_gradient
2323

2424
!type(assembler), pointer :: FVAssembler
2525
class(assembler), allocatable :: FVAssembler

src/class_gauss_seidel.f90

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
!=====================================================================!
2-
! Conjugate Gradient linear solver class that uses the functionalities
3-
! of assembler class in the iterative solution process.
2+
! Conjugate Gradient linear solver class that uses the functionalities of assembler class
3+
! in the iterative solution process.
44
!=====================================================================!
55

66
module class_gauss_seidel
77

8-
use iso_fortran_env , only : dp => REAL64
9-
use interface_algebraic_solver , only : algebraic_solver
10-
use class_assembler , only : assembler
8+
use iso_fortran_env , only : dp => REAL64
9+
use interface_linear_solver , only : linear_solver
10+
use class_assembler , only : assembler
1111

1212
implicit none
1313

@@ -19,7 +19,7 @@ module class_gauss_seidel
1919
! Linear solver datatype
2020
!===================================================================!
2121

22-
type, extends(algebraic_solver) :: gauss_seidel
22+
type, extends(linear_solver) :: gauss_seidel
2323

2424
!type(assembler), pointer :: FVAssembler
2525
class(assembler), allocatable :: FVAssembler

src/interface_algebraic_solver.f90

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ module interface_algebraic_solver
3333
!===================================================================!
3434

3535
interface
36-
subroutine solve_interface(this, system)
36+
subroutine solve_interface(this, system, x)
3737
import algebraic_solver
3838
import assembler
3939
import dp
4040
class(algebraic_solver), intent(in) :: this
4141
class(assembler) , intent(in) :: system
42-
!real(dp), allocatable , intent(out) :: x(:) ! maybe 2D for qdot
42+
real(dp), allocatable , intent(out) :: x(:) ! maybe 2D for qdot
4343
end subroutine solve_interface
4444
end interface
4545

src/interface_linear_solver.f90

+14-92
Original file line numberDiff line numberDiff line change
@@ -1,124 +1,46 @@
11
!=====================================================================!
2-
! Abstract class for linear solvers to extend and provide iterate
3-
! method.
4-
!
5-
! Author: Komahan Boopathy
2+
! Interface for linear solvers to implement.
63
!=====================================================================!
74

85
module interface_linear_solver
96

10-
use iso_fortran_env , only : dp => REAL64
11-
use interface_algebraic_solver, only : algebraic_solver
12-
use interface_assembler , only : assembler
7+
use iso_fortran_env , only : dp => REAL64
138

149
implicit none
1510

11+
! Expose only the linear solver interface
1612
private
1713
public :: linear_solver
1814

1915
!===================================================================!
20-
! Abstract linear solver datatype
16+
! Linear solver datatype
2117
!===================================================================!
2218

23-
type, abstract, extends(algebraic_solver) :: linear_solver
24-
25-
! Tolerances and print control for iterative solvers
19+
type, abstract :: linear_solver
20+
2621
real(dp) :: max_tol
2722
integer :: max_it
28-
integer :: print_level
29-
23+
3024
contains
31-
32-
! Generic solve procedure
33-
procedure :: solve
3425

35-
! Iteration behavior is deferred (specific to the type of solver)
36-
procedure(iterate_interface), deferred :: iterate
37-
26+
! type bound procedures
27+
procedure(solve_interface), deferred :: solve
28+
3829
end type linear_solver
3930

4031
!===================================================================!
41-
! Interface for deferred iterate function
32+
! Interface for multiple constructors
4233
!===================================================================!
4334

4435
interface
45-
subroutine iterate_interface(this, system, x)
36+
subroutine solve_interface(this, x)
4637
import linear_solver
47-
import assembler
4838
import dp
4939
class(linear_solver) , intent(in) :: this
50-
class(assembler) , intent(in) :: system
5140
real(dp), allocatable , intent(out) :: x(:)
52-
end subroutine iterate_interface
41+
end subroutine solve_interface
5342
end interface
54-
55-
contains
56-
57-
!===================================================================!
58-
! Iterative nonlinear solution A x = b(x)
59-
!===================================================================!
6043

61-
subroutine solve(this, system)
62-
63-
class(linear_solver) , intent(in) :: this
64-
class(assembler) , intent(in) :: system
65-
66-
! Locals
67-
real(dp), allocatable :: xold(:), ss(:)
68-
real(dp) :: update_norm
69-
integer :: iter, num_inner_iters
70-
71-
! Initial guess vector for the subspace is "b"
72-
allocate(x(system % num_state_vars))
73-
call system % get_source(x)
74-
if (norm2(x) .lt. epsilon(1.0_dp)) then
75-
print *, 'zero rhs? stopping'
76-
error stop
77-
end if
78-
79-
allocate(xold(system % num_state_vars))
80-
allocate(ss(system % num_state_vars))
81-
82-
if (this % print_level .eq. -1) then
83-
open(13, file='sor.res', action='write')
84-
write(13,*) "iteration ", " residual"
85-
end if
86-
87-
update_norm = huge(1.0d0); iter = 1;
88-
outer_iterations: do while (update_norm .gt. this % max_tol)
89-
90-
xold = x
91-
92-
! Inner iterations with CG (linear solver)
93-
if ( iter .eq. 1) then
94-
ss = 0.0d0
95-
call this % iterate(system, x, ss, num_inner_iters)
96-
else
97-
call system % get_skew_source(ss, x)
98-
call this % iterate(system, x, ss, num_inner_iters)
99-
end if
100-
101-
update_norm = norm2(x - xold)
102-
if (this % print_level .eq. -1) then
103-
write(13, *) iter, update_norm
104-
end if
105-
if (this % print_level .gt. 0) then
106-
print *, &
107-
& "outer iter ", iter, &
108-
& "num_inner_iters ", num_inner_iters, &
109-
& "update norm ", update_norm
110-
end if
111-
iter = iter + 1
112-
113-
end do outer_iterations
114-
115-
if (this % print_level .eq. -1) then
116-
close(13)
117-
end if
118-
119-
deallocate(xold)
120-
deallocate(ss)
44+
contains
12145

122-
end subroutine solve
123-
12446
end module interface_linear_solver

test/solve/test.f90

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ program test_mesh
1616

1717
implicit none
1818

19-
character(len=*) , parameter :: filename = "../rectangle.msh"
19+
character(len=*) , parameter :: filename = "../airfoil.msh"
2020
class(gmsh_loader) , allocatable :: gmsh
2121
class(mesh) , allocatable :: grid
2222
class(linear_solver) , allocatable :: solver

0 commit comments

Comments
 (0)