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

generated by
Intel(R) C++/Fortran Compiler code-coverage tool
Web-Page Owner: Nobody