surface_field.F90 coverage: 100.00 %func 65.12 %block
1) module Surface_Field_module
2)
3) ! IMPORTANT NOTE: This module can have no dependencies on other modules!!!
4)
5) use PFLOTRAN_Constants_module
6)
7) implicit none
8)
9) private
10)
11) #include "petsc/finclude/petscsys.h"
12) #include "petsc/finclude/petscvec.h"
13) #include "petsc/finclude/petscvec.h90"
14)
15) type, public :: surface_field_type
16)
17) Vec :: mannings0, mannings_loc
18)
19) Vec :: work, work_loc
20)
21) Vec :: area
22)
23) Vec :: press_subsurf ! MPI
24) Vec :: temp_subsurf ! MPI
25)
26) Vec :: subsurf_temp_vec_1dof ! MPI
27) Vec :: subsurf_temp_vec_ndof ! MPI
28) Vec :: subsurf_avg_vdarcy ! MPI +ve value => Flow from surface to subsurface
29)
30) ! residual vectors
31) Vec :: flow_r
32)
33) ! Solution vectors (yy = previous solution, xx = current iterate)
34) Vec :: flow_xx, flow_xx_loc, flow_dxx, flow_yy, flow_accum
35)
36) ! vectors to save temporally average quantities
37) Vec, pointer :: avg_vars_vec(:)
38) PetscInt :: nvars
39)
40) ! vectors to save temporally average flowrates
41) Vec :: flowrate_inst
42) Vec :: flowrate_aveg
43)
44) end type surface_field_type
45)
46) public :: SurfaceFieldCreate, &
47) SurfaceFieldDestroy
48)
49) contains
50)
51) ! ************************************************************************** !
52)
53) function SurfaceFieldCreate()
54) !
55) ! Allocates and initializes a new surface Field object
56) !
57) ! Author: Gautam Bisht
58) ! Date: 01/17/2012
59) !
60)
61) implicit none
62)
63) type(surface_field_type), pointer :: SurfaceFieldCreate
64)
65) type(surface_field_type), pointer :: surface_field
66)
67) allocate(surface_field)
68)
69) ! nullify PetscVecs
70) surface_field%mannings0 = 0
71) surface_field%mannings_loc = 0
72)
73) surface_field%work = 0
74) surface_field%work_loc = 0
75)
76) surface_field%area = 0
77)
78) surface_field%flow_r = 0
79) surface_field%flow_xx = 0
80) surface_field%flow_xx_loc = 0
81) surface_field%flow_dxx = 0
82) surface_field%flow_yy = 0
83) surface_field%flow_accum = 0
84)
85) surface_field%press_subsurf = 0
86)
87) surface_field%subsurf_temp_vec_1dof = 0
88) surface_field%subsurf_temp_vec_ndof = 0
89)
90) nullify(surface_field%avg_vars_vec)
91) surface_field%nvars = 0
92)
93) surface_field%flowrate_inst = 0
94) surface_field%flowrate_aveg = 0
95)
96) surface_field%temp_subsurf = 0
97)
98) SurfaceFieldCreate => surface_field
99)
100) end function SurfaceFieldCreate
101)
102) ! ************************************************************************** !
103)
104) subroutine SurfaceFieldDestroy(surface_field)
105) !
106) ! Deallocates a field object
107) !
108) ! Author: Gautam Bisht
109) ! Date: 01/17/2012
110) !
111)
112) implicit none
113)
114) type(surface_field_type), pointer :: surface_field
115)
116) PetscErrorCode :: ierr
117) PetscInt :: ivar
118)
119) ! Destroy PetscVecs
120) if (surface_field%mannings0 /= 0) then
121) call VecDestroy(surface_field%mannings0,ierr);CHKERRQ(ierr)
122) endif
123) if (surface_field%mannings_loc /= 0) then
124) call VecDestroy(surface_field%mannings_loc,ierr);CHKERRQ(ierr)
125) endif
126)
127) if (surface_field%work /= 0) then
128) call VecDestroy(surface_field%work,ierr);CHKERRQ(ierr)
129) endif
130) if (surface_field%work_loc /= 0) then
131) call VecDestroy(surface_field%work_loc,ierr);CHKERRQ(ierr)
132) endif
133)
134) if (surface_field%area /= 0) then
135) call VecDestroy(surface_field%area,ierr);CHKERRQ(ierr)
136) endif
137)
138) if (surface_field%press_subsurf /= 0) then
139) call VecDestroy(surface_field%press_subsurf,ierr);CHKERRQ(ierr)
140) endif
141)
142) if (surface_field%flow_r /= 0) then
143) call VecDestroy(surface_field%flow_r,ierr);CHKERRQ(ierr)
144) endif
145) if (surface_field%flow_xx /= 0) then
146) call VecDestroy(surface_field%flow_xx,ierr);CHKERRQ(ierr)
147) endif
148) if (surface_field%flow_xx_loc /= 0) then
149) call VecDestroy(surface_field%flow_xx_loc,ierr);CHKERRQ(ierr)
150) endif
151) if (surface_field%flow_dxx /= 0) then
152) call VecDestroy(surface_field%flow_dxx,ierr);CHKERRQ(ierr)
153) endif
154) if (surface_field%flow_yy /= 0) then
155) call VecDestroy(surface_field%flow_yy,ierr);CHKERRQ(ierr)
156) endif
157) if (surface_field%flow_accum /= 0) then
158) call VecDestroy(surface_field%flow_accum,ierr);CHKERRQ(ierr)
159) endif
160)
161) if (surface_field%subsurf_temp_vec_1dof/=0) then
162) call VecDestroy(surface_field%subsurf_temp_vec_1dof,ierr);CHKERRQ(ierr)
163) endif
164) if (surface_field%subsurf_temp_vec_ndof/=0) then
165) call VecDestroy(surface_field%subsurf_temp_vec_ndof,ierr);CHKERRQ(ierr)
166) endif
167)
168) do ivar = 1,surface_field%nvars
169) call VecDestroy(surface_field%avg_vars_vec(ivar),ierr);CHKERRQ(ierr)
170) enddo
171)
172) if (surface_field%flowrate_inst/=0) then
173) call VecDestroy(surface_field%flowrate_inst,ierr);CHKERRQ(ierr)
174) endif
175) if (surface_field%flowrate_aveg/=0) then
176) call VecDestroy(surface_field%flowrate_aveg,ierr);CHKERRQ(ierr)
177) endif
178)
179) if (surface_field%temp_subsurf /=0 ) then
180) call VecDestroy(surface_field%temp_subsurf,ierr);CHKERRQ(ierr)
181) endif
182)
183) if (associated(surface_field)) deallocate(surface_field)
184) nullify(surface_field)
185)
186) end subroutine SurfaceFieldDestroy
187)
188) end module Surface_Field_module