simulation_aux.F90 coverage: 100.00 %func 72.47 %block
1) module Simulation_Aux_module
2)
3) use PFLOTRAN_Constants_module
4)
5) implicit none
6)
7) private
8)
9) #include "petsc/finclude/petscsys.h"
10) #include "petsc/finclude/petscvec.h"
11) #include "petsc/finclude/petscvec.h90"
12)
13) type,public :: simulation_aux_type
14)
15) ! Note: These are GLOBAL vectors (i.e. they do not contain ghost control
16) ! volumes)
17)
18) ! Size of entire subsurface domain
19) Vec :: subsurf_pres
20) Vec :: subsurf_temp
21) Vec :: subsurf_sat
22) Vec :: subsurf_den
23)
24) Vec :: subsurf_por0
25) Vec :: subsurf_por
26) Vec :: subsurf_strain
27) Vec :: subsurf_stress
28)
29) ! Size of surface cells of subsurface domain
30) Vec :: subsurf_pres_top_bc
31) Vec :: subsurf_temp_top_bc
32) Vec :: subsurf_mflux_exchange_with_surf
33) Vec :: subsurf_hflux_exchange_with_surf
34)
35)
36) ! Size of entire surface domain
37) Vec :: surf_head
38) Vec :: surf_temp
39) Vec :: surf_mflux_exchange_with_subsurf
40) Vec :: surf_hflux_exchange_with_subsurf
41)
42) VecScatter :: surf_to_subsurf
43) VecScatter :: subsurf_to_surf
44) VecScatter :: subsurf_to_hydrogeophyics
45) VecScatter :: geomechanics_to_subsurf
46) VecScatter :: subsurf_to_geomechanics
47)
48) end type simulation_aux_type
49)
50) public :: SimAuxCreate, &
51) SimAuxCopyVecScatter, &
52) SimAuxCopySubsurfVec, &
53) SimAuxCopySubsurfTopBCVec, &
54) SimAuxCopySurfVec, &
55) SimAuxCopySubsurfGeomechVec, &
56) SimAuxDestroy
57)
58) contains
59)
60) ! ************************************************************************** !
61)
62) function SimAuxCreate()
63) !
64) ! This routine allocates auxillary object.
65) !
66) ! Author: Gautam Bisht,LBNL
67) ! Date: 08/20/13
68) !
69)
70) use Option_module
71)
72) implicit none
73)
74) type (simulation_aux_type),pointer :: SimAuxCreate
75)
76) type (simulation_aux_type),pointer :: aux
77)
78) allocate(aux)
79) aux%subsurf_pres = 0
80) aux%subsurf_temp = 0
81) aux%subsurf_sat = 0
82) aux%subsurf_den = 0
83) aux%subsurf_por0 = 0
84) aux%subsurf_por = 0
85) aux%subsurf_strain = 0
86) aux%subsurf_stress = 0
87) aux%subsurf_pres_top_bc = 0
88) aux%subsurf_temp_top_bc = 0
89) aux%subsurf_mflux_exchange_with_surf = 0
90) aux%subsurf_hflux_exchange_with_surf = 0
91)
92) aux%surf_head = 0
93) aux%surf_temp = 0
94) aux%surf_mflux_exchange_with_subsurf = 0
95) aux%surf_hflux_exchange_with_subsurf = 0
96)
97) aux%surf_to_subsurf = 0
98) aux%subsurf_to_surf = 0
99) aux%subsurf_to_hydrogeophyics = 0
100) aux%subsurf_to_geomechanics = 0
101) aux%geomechanics_to_subsurf = 0
102)
103) SimAuxCreate => aux
104)
105) end function SimAuxCreate
106)
107) ! ************************************************************************** !
108)
109) subroutine SimAuxCopyVecScatter(aux, vscat, vscat_index)
110) !
111) ! This routine copies VectorScatter to an appropriate context.
112) !
113) ! Author: Gautam Bisht,LBNL
114) ! Date: 10/02/13
115) !
116)
117) implicit none
118)
119) type (simulation_aux_type),pointer :: aux
120) VecScatter :: vscat
121) PetscInt :: vscat_index
122)
123) PetscErrorCode :: ierr
124)
125) select case (vscat_index)
126) case(SURF_TO_SUBSURF)
127) call VecScatterCopy(vscat, aux%surf_to_subsurf, ierr);CHKERRQ(ierr)
128) case(SUBSURF_TO_SURF)
129) call VecScatterCopy(vscat, aux%subsurf_to_surf, ierr);CHKERRQ(ierr)
130) case(SUBSURF_TO_HYDROGEOPHY)
131) call VecScatterCopy(vscat, aux%subsurf_to_hydrogeophyics, &
132) ierr);CHKERRQ(ierr)
133) case(SUBSURF_TO_GEOMECHANICS)
134) call VecScatterCopy(vscat, aux%subsurf_to_geomechanics, &
135) ierr);CHKERRQ(ierr)
136) case(GEOMECHANICS_TO_SUBSURF)
137) call VecScatterCopy(vscat, aux%geomechanics_to_subsurf, &
138) ierr);CHKERRQ(ierr)
139) end select
140)
141) end subroutine SimAuxCopyVecScatter
142)
143) ! ************************************************************************** !
144)
145) subroutine SimAuxCopySubsurfVec(aux, subsurf_vec)
146) !
147) ! This routine creates 3D vectors related with subsurface-flow.
148) !
149) ! Author: Gautam Bisht,LBNL
150) ! Date: 10/02/13
151) !
152)
153) implicit none
154)
155) type (simulation_aux_type),pointer :: aux
156) Vec :: subsurf_vec
157)
158) PetscErrorCode :: ierr
159)
160) call VecDuplicate(subsurf_vec,aux%subsurf_pres,ierr);CHKERRQ(ierr)
161) call VecDuplicate(subsurf_vec,aux%subsurf_temp,ierr);CHKERRQ(ierr)
162) call VecDuplicate(subsurf_vec,aux%subsurf_sat,ierr);CHKERRQ(ierr)
163) call VecDuplicate(subsurf_vec,aux%subsurf_den,ierr);CHKERRQ(ierr)
164) call VecDuplicate(subsurf_vec,aux%subsurf_por0,ierr);CHKERRQ(ierr)
165) call VecDuplicate(subsurf_vec,aux%subsurf_por,ierr);CHKERRQ(ierr)
166)
167) end subroutine SimAuxCopySubsurfVec
168)
169) ! ************************************************************************** !
170)
171) subroutine SimAuxCopySubsurfTopBCVec(aux, subsurf_top_bc_vec)
172) !
173) ! This routine creates vectors associated with surface of subsurface domain
174) ! related with subsurface-flow.
175) !
176) ! Author: Gautam Bisht,LBNL
177) ! Date: 10/02/13
178) !
179)
180) implicit none
181)
182) type (simulation_aux_type),pointer :: aux
183) Vec :: subsurf_top_bc_vec
184)
185) PetscErrorCode :: ierr
186)
187) call VecDuplicate(subsurf_top_bc_vec,aux%subsurf_pres_top_bc, &
188) ierr);CHKERRQ(ierr)
189) call VecDuplicate(subsurf_top_bc_vec,aux%subsurf_temp_top_bc, &
190) ierr);CHKERRQ(ierr)
191) call VecDuplicate(subsurf_top_bc_vec,aux%subsurf_mflux_exchange_with_surf, &
192) ierr);CHKERRQ(ierr)
193) call VecDuplicate(subsurf_top_bc_vec,aux%subsurf_hflux_exchange_with_surf, &
194) ierr);CHKERRQ(ierr)
195)
196) end subroutine SimAuxCopySubsurfTopBCVec
197)
198) ! ************************************************************************** !
199)
200) subroutine SimAuxCopySurfVec(aux, surf_head_vec)
201) !
202) ! This routine creates vectors associated with surface-flow.
203) !
204) ! Author: Gautam Bisht,LBNL
205) ! Date: 10/02/13
206) !
207)
208) implicit none
209)
210) type (simulation_aux_type),pointer :: aux
211) Vec :: surf_head_vec
212)
213) PetscErrorCode :: ierr
214)
215) call VecDuplicate(surf_head_vec,aux%surf_head,ierr);CHKERRQ(ierr)
216) call VecDuplicate(surf_head_vec,aux%surf_temp,ierr);CHKERRQ(ierr)
217) call VecDuplicate(surf_head_vec,aux%surf_mflux_exchange_with_subsurf, &
218) ierr);CHKERRQ(ierr)
219) call VecDuplicate(surf_head_vec,aux%surf_hflux_exchange_with_subsurf, &
220) ierr);CHKERRQ(ierr)
221)
222) end subroutine SimAuxCopySurfVec
223)
224) ! ************************************************************************** !
225)
226) subroutine SimAuxCopySubsurfGeomechVec(aux, subsurf_geomech_vec)
227) !
228) ! This routine creates vectors associated with geomechanics.
229) !
230) ! Author: Gautam Bisht,LBNL
231) ! Date: 10/02/13
232) !
233) implicit none
234)
235) type (simulation_aux_type),pointer :: aux
236) Vec :: subsurf_geomech_vec
237)
238) PetscErrorCode :: ierr
239)
240) call VecDuplicate(subsurf_geomech_vec, aux%subsurf_stress, &
241) ierr);CHKERRQ(ierr)
242) call VecDuplicate(subsurf_geomech_vec, aux%subsurf_strain, &
243) ierr);CHKERRQ(ierr)
244)
245) end subroutine SimAuxCopySubsurfGeomechVec
246)
247) ! ************************************************************************** !
248)
249) subroutine SimAuxDestroy(aux)
250) !
251) ! This routine deallocates auxillary object.
252) !
253) ! Author: Gautam Bisht,LBNL
254) ! Date: 08/20/13
255) !
256)
257) implicit none
258)
259) type(simulation_aux_type), pointer :: aux
260)
261) PetscErrorCode :: ierr
262)
263) if (.not.associated(aux)) return
264)
265) if (aux%subsurf_pres /= 0) then
266) call VecDestroy(aux%subsurf_pres,ierr);CHKERRQ(ierr)
267) endif
268) if (aux%subsurf_temp /= 0) then
269) call VecDestroy(aux%subsurf_temp,ierr);CHKERRQ(ierr)
270) endif
271) if (aux%subsurf_sat /= 0) then
272) call VecDestroy(aux%subsurf_sat,ierr);CHKERRQ(ierr)
273) endif
274) if (aux%subsurf_den /= 0) then
275) call VecDestroy(aux%subsurf_den,ierr);CHKERRQ(ierr)
276) endif
277) if (aux%subsurf_por0 /= 0) then
278) call VecDestroy(aux%subsurf_por0,ierr);CHKERRQ(ierr)
279) endif
280) if (aux%subsurf_por /= 0) then
281) call VecDestroy(aux%subsurf_por,ierr);CHKERRQ(ierr)
282) endif
283) if (aux%subsurf_stress /= 0) then
284) call VecDestroy(aux%subsurf_stress,ierr);CHKERRQ(ierr)
285) endif
286) if (aux%subsurf_strain /= 0) then
287) call VecDestroy(aux%subsurf_strain,ierr);CHKERRQ(ierr)
288) endif
289)
290) if (aux%subsurf_pres_top_bc /= 0) then
291) call VecDestroy(aux%subsurf_pres_top_bc,ierr);CHKERRQ(ierr)
292) endif
293) if (aux%subsurf_temp_top_bc /= 0) then
294) call VecDestroy(aux%subsurf_temp_top_bc,ierr);CHKERRQ(ierr)
295) endif
296) if (aux%subsurf_mflux_exchange_with_surf /= 0) then
297) call VecDestroy(aux%subsurf_mflux_exchange_with_surf,ierr);CHKERRQ(ierr)
298) endif
299) if (aux%subsurf_hflux_exchange_with_surf /= 0) then
300) call VecDestroy(aux%subsurf_hflux_exchange_with_surf,ierr);CHKERRQ(ierr)
301) endif
302)
303) if (aux%surf_head /= 0) then
304) call VecDestroy(aux%surf_head,ierr);CHKERRQ(ierr)
305) endif
306) if (aux%surf_temp /= 0) then
307) call VecDestroy(aux%surf_temp,ierr);CHKERRQ(ierr)
308) endif
309) if (aux%surf_mflux_exchange_with_subsurf /= 0) then
310) call VecDestroy(aux%surf_mflux_exchange_with_subsurf,ierr);CHKERRQ(ierr)
311) endif
312) if (aux%surf_hflux_exchange_with_subsurf /= 0) then
313) call VecDestroy(aux%surf_hflux_exchange_with_subsurf,ierr);CHKERRQ(ierr)
314) endif
315)
316) if (aux%surf_to_subsurf /= 0) then
317) call VecScatterDestroy(aux%surf_to_subsurf,ierr);CHKERRQ(ierr)
318) endif
319) if (aux%subsurf_to_surf /= 0) then
320) call VecScatterDestroy(aux%subsurf_to_surf,ierr);CHKERRQ(ierr)
321) endif
322) if (aux%subsurf_to_hydrogeophyics /= 0) then
323) call VecScatterDestroy(aux%subsurf_to_hydrogeophyics,ierr);CHKERRQ(ierr)
324) endif
325) if (aux%subsurf_to_geomechanics /= 0) then
326) call VecScatterDestroy(aux%subsurf_to_geomechanics, ierr);CHKERRQ(ierr)
327) endif
328) if (aux%geomechanics_to_subsurf /= 0) then
329) call VecScatterDestroy(aux%geomechanics_to_subsurf, ierr);CHKERRQ(ierr)
330) endif
331)
332) deallocate(aux)
333) nullify(aux)
334)
335) end subroutine SimAuxDestroy
336)
337) end module Simulation_Aux_module