reaction_solid_solution.F90 coverage: 0.00 %func 0.00 %block
1) module Reaction_Solid_Solution_module
2)
3) use Reaction_Mineral_Aux_module
4) use Reaction_Aux_module
5) use Reaction_Solid_Soln_Aux_module
6)
7) use PFLOTRAN_Constants_module
8)
9) implicit none
10)
11) private
12)
13) #include "petsc/finclude/petscsys.h"
14)
15) public :: SolidSolutionReadFromInputFile, &
16) SolidSolutionLinkNamesToIDs
17)
18) contains
19)
20) ! ************************************************************************** !
21)
22) subroutine SolidSolutionReadFromInputFile(solid_solution_list,input, &
23) option)
24) !
25) ! Reads solid solution from the input file
26) !
27) ! Author: Glenn Hammond
28) ! Date: 08/16/12
29) !
30)
31) use Option_module
32) use String_module
33) use Input_Aux_module
34) use Utility_module
35)
36) implicit none
37)
38) type(solid_solution_type), pointer :: solid_solution_list
39) type(input_type), pointer :: input
40) type(option_type) :: option
41)
42) character(len=MAXSTRINGLENGTH) :: string
43) character(len=MAXWORDLENGTH) :: word
44) character(len=MAXWORDLENGTH) :: name
45) character(len=MAXWORDLENGTH) :: card
46) PetscInt, parameter :: max_stoich_solid_names = 200
47) PetscInt :: stoich_solid_count
48) character(len=MAXWORDLENGTH) :: stoich_solid_names(max_stoich_solid_names)
49) type(solid_solution_type), pointer :: solid_solution, prev_solid_solution
50)
51) nullify(prev_solid_solution)
52) do
53) call InputReadPflotranString(input,option)
54) if (InputError(input)) exit
55) if (InputCheckExit(input,option)) exit
56)
57) ! name of solid solution
58) solid_solution => SolidSolutionCreate()
59) if (associated(prev_solid_solution)) then
60) prev_solid_solution%next => solid_solution
61) prev_solid_solution => solid_solution
62) else
63) solid_solution_list => solid_solution
64) endif
65)
66) call InputReadWord(input,option,solid_solution%name,PETSC_TRUE)
67) call InputErrorMsg(input,option,'Solid Solution Name', &
68) 'CHEMISTRY,SOLID_SOLUTIONS')
69)
70) stoich_solid_count = 0
71) stoich_solid_names = ''
72) do
73) call InputReadPflotranString(input,option)
74) if (InputError(input)) exit
75) if (InputCheckExit(input,option)) exit
76)
77) stoich_solid_count = stoich_solid_count + 1
78)
79) if (stoich_solid_count > max_stoich_solid_names) then
80) write(string,*) max_stoich_solid_names
81) option%io_buffer = '# stoichmetric solids exceeds max (' // &
82) trim(adjustl(string)) // '). ' // &
83) 'Increase variable "max_stoich_solid_names" in ' // &
84) 'SolidSolutionReadFromInputFile.'
85) call printErrMsg(option)
86) endif
87) call InputReadWord(input,option, &
88) stoich_solid_names(stoich_solid_count), &
89) PETSC_TRUE)
90) call InputErrorMsg(input,option,'Stoichiometric Solid Name', &
91) 'CHEMISTRY,SOLID_SOLUTIONS')
92) enddo
93)
94) allocate(solid_solution%stoich_solid_ids(stoich_solid_count))
95) solid_solution%stoich_solid_ids = 0
96) allocate(solid_solution%stoich_solid_names(stoich_solid_count))
97) solid_solution%stoich_solid_names(1:stoich_solid_count) = &
98) stoich_solid_names(1:stoich_solid_count)
99) solid_solution%num_stoich_solid = stoich_solid_count
100)
101) #if 0
102) string = input%buf
103) call InputReadWord(input,option,card,PETSC_TRUE)
104) call InputErrorMsg(input,option,'keyword','CHEMISTRY,SOLID_SOLUTIONS')
105) call StringToUpper(card)
106) select case(card)
107) case('DATABASE')
108) call InputReadNChars(string, &
109) solid_solution_rxn%database_filename, &
110) MAXSTRINGLENGTH,PETSC_TRUE,input%ierr)
111) call InputErrorMsg(input,option,'keyword', &
112) 'CHEMISTRY,SOLID_SOLUTIONS,DATABASE FILENAME')
113) case default
114) solid_solution => SolidSolutionCreate()
115) call InputReadWord(input,option,solid_solution%name,PETSC_TRUE)
116) call InputErrorMsg(input,option,'keyword','CHEMISTRY,SOLID_SOLUTIONS')
117) if (.not.associated(solid_solution_rxn%list)) then
118) solid_solution_rxn%list => solid_solution
119) endif
120) if (associated(prev_solid_solution)) then
121) prev_solid_solution%next => solid_solution
122) endif
123) prev_solid_solution => solid_solution
124) nullify(solid_solution)
125) end select
126) #endif
127) enddo
128)
129) end subroutine SolidSolutionReadFromInputFile
130)
131) ! ************************************************************************** !
132)
133) subroutine SolidSolutionLinkNamesToIDs(solid_solution_list, &
134) mineral_reaction, &
135) option)
136) !
137) ! SolidSolutionReadFromDatabase: Reads solid solution from the database
138) !
139) ! Author: Glenn Hammond
140) ! Date: 08/20/12
141) !
142) use Option_module
143) use String_module
144) use Reaction_Mineral_Aux_module
145)
146) implicit none
147)
148) type(solid_solution_type), pointer :: solid_solution_list
149) type(mineral_type), pointer :: mineral_reaction
150) type(option_type) :: option
151)
152) type(solid_solution_type), pointer :: cur_solid_soln
153) PetscInt :: istoich_solid
154) PetscInt :: ikinmnrl
155)
156) cur_solid_soln => solid_solution_list
157) do
158) if (.not.associated(cur_solid_soln)) exit
159) do istoich_solid = 1, cur_solid_soln%num_stoich_solid
160) do ikinmnrl = 1, mineral_reaction%nkinmnrl
161) if (StringCompareIgnoreCase( &
162) mineral_reaction%kinmnrl_names(ikinmnrl), &
163) cur_solid_soln%stoich_solid_names(istoich_solid))) then
164) cur_solid_soln%stoich_solid_ids(istoich_solid) = ikinmnrl
165) exit
166) endif
167) enddo
168) enddo
169) cur_solid_soln => cur_solid_soln%next
170) enddo
171)
172) end subroutine SolidSolutionLinkNamesToIDs
173)
174) #if 0
175)
176) ! ************************************************************************** !
177)
178) subroutine SolidSolutionReadFromDatabase(solid_solution_rxn,option)
179) !
180) ! Reads solid solution from the database
181) !
182) ! Author: Glenn Hammond
183) ! Date: 08/20/12
184) !
185)
186) use Option_module
187) use String_module
188) use Input_Aux_module
189) use Utility_module
190) use Reaction_Mineral_module
191)
192) implicit none
193)
194) type(solid_solution_rxn_type) :: solid_solution_rxn
195) type(option_type) :: option
196)
197) character(len=MAXSTRINGLENGTH) :: string
198) character(len=MAXWORDLENGTH) :: word
199) character(len=MAXWORDLENGTH) :: name
200) character(len=MAXWORDLENGTH) :: card
201) type(input_type), pointer :: input
202) type(solid_solution_type), pointer :: solid_solution, prev_solid_solution
203) type(stoichiometric_solid_type), pointer :: stoich_solid, prev_stoich_solid
204) type(mineral_rxn_type), pointer :: mineral, prev_end_member
205) PetscInt :: itemp
206) PetscBool :: found
207)
208) if (len_trim(solid_solution_rxn%database_filename) < 2) then
209) option%io_buffer = 'Database filename not included in input deck.'
210) call printErrMsg(option)
211) endif
212) input => InputCreate(IUNIT_TEMP,solid_solution_rxn%database_filename,option)
213)
214) do ! loop over every entry in the database
215) call InputReadPflotranString(input,option)
216) call InputReadStringErrorMsg(input,option,'SolidSolutionReadFromDatabase')
217)
218) call InputReadWord(input,option,card,PETSC_TRUE)
219) call InputErrorMsg(input,option,'keyword','CHEMISTRY,SOLID_SOLUTIONS')
220) call StringToUpper(card)
221)
222) select case(card)
223) case('SOLID_SOLUTION')
224)
225) if (solid_solution_rxn%num_dbase_temperatures == 0) then
226) option%io_buffer = 'Temperatures must be defined prior to ' // &
227) 'reading solid solution.'
228) call printErrMsg(option)
229) endif
230)
231) call InputReadWord(input,option,name,PETSC_TRUE)
232) call InputErrorMsg(input,option,'SOLID_SOLUTION Name', &
233) 'CHEMISTRY,SOLID_SOLUTIONS')
234) solid_solution => solid_solution_rxn%list
235) found = PETSC_FALSE
236) do
237) if (.not.associated(solid_solution)) exit
238) if (StringCompare(name,solid_solution%name,MAXWORDLENGTH)) then
239) found = PETSC_TRUE
240) exit
241) endif
242) solid_solution => solid_solution%next
243) enddo
244) ! if solid solution not in list, skip to end of solid solution
245) if (.not.found) then
246) call InputSkipToEND(input,option,card)
247) endif
248) nullify(prev_stoich_solid)
249) nullify(prev_end_member)
250) case('STOICHIOMETRIC_SOLID','END_MEMBER')
251) mineral => MineralRxnCreate()
252) call InputReadWord(input,option,mineral%name,PETSC_TRUE)
253) call InputErrorMsg(input,option,'keyword','CHEMISTRY,MINERALS')
254) call MineralReadFromDatabase(mineral, &
255) solid_solution_rxn%num_dbase_temperatures, &
256) input,option)
257) ! assign mineral to stoichiometric solid or end member list
258) select case(card)
259) case('STOICHIOMETRIC_SOLID')
260) solid_solution%num_stoich_solid = &
261) solid_solution%num_stoich_solid + 1
262) stoich_solid => StoichiometricSolidCreate()
263) stoich_solid%mineral => mineral
264) if (associated(prev_stoich_solid)) then
265) prev_stoich_solid%next => stoich_solid
266) else
267) solid_solution%stoich_solid => stoich_solid
268) prev_stoich_solid => stoich_solid
269) endif
270) nullify(prev_end_member)
271) case('END_MEMBER')
272) solid_solution%num_end_member = &
273) solid_solution%num_end_member + 1
274) if (associated(prev_end_member)) then
275) prev_end_member%next => mineral
276) else
277) stoich_solid%end_members => mineral
278) prev_end_member => mineral
279) endif
280) end select
281) nullify(mineral)
282) case('TEMPERATURES')
283) string = 'Temperatures in SolidSolutionReadFromDatabase'
284) call UtilityReadRealArray(solid_solution_rxn%dbase_temperatures, &
285) ZERO_INTEGER,string,input,option)
286) solid_solution_rxn%num_dbase_temperatures = &
287) size(solid_solution_rxn%dbase_temperatures)
288) case default
289) call InputKeywordUnrecognized(word, &
290) 'SOLID SOLUTION,DATABASE',option)
291) end select
292) enddo
293)
294) end subroutine SolidSolutionReadFromDatabase
295) #endif
296)
297) end module Reaction_Solid_Solution_module