LCOV - code coverage report
Current view: top level - star/private - set_flags.f90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 0.0 % 373 0
Test Date: 2025-05-08 18:23:42 Functions: 0.0 % 29 0

            Line data    Source code
       1              : ! ***********************************************************************
       2              : !
       3              : !   Copyright (C) 2010-2019  The MESA Team
       4              : !
       5              : !   This program is free software: you can redistribute it and/or modify
       6              : !   it under the terms of the GNU Lesser General Public License
       7              : !   as published by the Free Software Foundation,
       8              : !   either version 3 of the License, or (at your option) any later version.
       9              : !
      10              : !   This program is distributed in the hope that it will be useful,
      11              : !   but WITHOUT ANY WARRANTY; without even the implied warranty of
      12              : !   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
      13              : !   See the GNU Lesser General Public License for more details.
      14              : !
      15              : !   You should have received a copy of the GNU Lesser General Public License
      16              : !   along with this program. If not, see <https://www.gnu.org/licenses/>.
      17              : !
      18              : ! ***********************************************************************
      19              : 
      20              :       module set_flags
      21              : 
      22              :       use star_private_def
      23              :       use const_def, only: dp
      24              :       use utils_lib, only: is_bad
      25              :       use alloc
      26              : 
      27              :       implicit none
      28              : 
      29              :       contains
      30              : 
      31            0 :       subroutine set_v_flag(id, v_flag, ierr)
      32              :          integer, intent(in) :: id
      33              :          logical, intent(in) :: v_flag
      34              :          integer, intent(out) :: ierr
      35              :          type (star_info), pointer :: s
      36              :          integer :: nvar_hydro_old, k, nz, i_v, i_u
      37              :          logical, parameter :: dbg = .false.
      38              : 
      39              :          include 'formats'
      40              : 
      41              :          ierr = 0
      42            0 :          call get_star_ptr(id, s, ierr)
      43            0 :          if (ierr /= 0) return
      44              : 
      45            0 :          if (s% v_flag .eqv. v_flag) return
      46              : 
      47            0 :          nz = s% nz
      48            0 :          s% v_flag = v_flag
      49            0 :          nvar_hydro_old = s% nvar_hydro
      50              : 
      51            0 :          if (.not. v_flag) then  ! remove i_v's
      52            0 :             call del(s% xh)
      53            0 :             call del(s% xh_start)
      54            0 :             if (associated(s% xh_old) .and. s% generations > 1) call del(s% xh_old)
      55              :          end if
      56              : 
      57            0 :          call set_var_info(s, ierr)
      58            0 :          if (ierr /= 0) return
      59              : 
      60            0 :          call update_nvar_allocs(s, nvar_hydro_old, s% nvar_chem, ierr)
      61            0 :          if (ierr /= 0) return
      62              : 
      63            0 :          call check_sizes(s, ierr)
      64            0 :          if (ierr /= 0) return
      65              : 
      66            0 :          if (v_flag) then  ! insert i_v's
      67            0 :             i_v = s% i_v
      68            0 :             s% v_center = 0d0
      69            0 :             call insert(s% xh)
      70            0 :             call insert(s% xh_start)
      71            0 :             if (s% u_flag) then
      72            0 :                i_u = s% i_u
      73            0 :                do k=2,nz
      74            0 :                   s% xh(i_v,k) = 0.5d0*(s% xh(i_u,k-1) + s% xh(i_u,k))
      75              :                end do
      76            0 :                s% xh(i_v,1) = s% xh(i_u,1)
      77            0 :             else if (s% RSP_flag) then
      78            0 :                s% xh(i_v,1:nz) = 0d0
      79            0 :                s% v(1:nz) = 0d0
      80              :             else
      81            0 :                do k=1,nz
      82            0 :                   s% xh(i_v,k) = 0d0
      83              :                   if (is_bad(s% xh(i_v,k))) s% xh(i_v,k) = 0d0
      84            0 :                   s% v(k) = s% xh(i_v,k)
      85              :                end do
      86              :             end if
      87            0 :             if (associated(s% xh_old) .and. s% generations > 1) call insert(s% xh_old)
      88              :          end if
      89              : 
      90            0 :          call set_chem_names(s)
      91              : 
      92            0 :          if (v_flag .and. s% u_flag) then  ! turn off u_flag when turn on v_flag
      93            0 :             call set_u_flag(id, .false., ierr)
      94              :          end if
      95              : 
      96              :          contains
      97              : 
      98            0 :          subroutine del(xs)
      99              :             real(dp) :: xs(:,:)
     100              :             integer :: j, i_v
     101            0 :             if (size(xs,dim=2) < nz) return
     102            0 :             i_v = s% i_v
     103            0 :             do j = i_v+1, nvar_hydro_old
     104            0 :                xs(j-1,1:nz) = xs(j,1:nz)
     105              :             end do
     106              :          end subroutine del
     107              : 
     108            0 :          subroutine insert(xs)
     109              :             real(dp) :: xs(:,:)
     110              :             integer :: j, i_v
     111            0 :             if (size(xs,dim=2) < nz) return
     112            0 :             i_v = s% i_v
     113            0 :             do j = s% nvar_hydro, i_v+1, -1
     114            0 :                xs(j,1:nz) = xs(j-1,1:nz)
     115              :             end do
     116            0 :             xs(i_v,1:nz) = 0
     117              :          end subroutine insert
     118              : 
     119              :       end subroutine set_v_flag
     120              : 
     121              : 
     122            0 :       subroutine set_u_flag(id, u_flag, ierr)
     123              :          integer, intent(in) :: id
     124              :          logical, intent(in) :: u_flag
     125              :          integer, intent(out) :: ierr
     126              :          type (star_info), pointer :: s
     127              :          integer :: nvar_hydro_old, k, nz, i_u, i_v
     128              :          logical, parameter :: dbg = .false.
     129              : 
     130              :          integer :: num_u_vars
     131              : 
     132              :          include 'formats'
     133              : 
     134              :          ierr = 0
     135            0 :          call get_star_ptr(id, s, ierr)
     136            0 :          if (ierr /= 0) return
     137              : 
     138            0 :          if (s% u_flag .eqv. u_flag) return
     139              : 
     140            0 :          nz = s% nz
     141            0 :          s% u_flag = u_flag
     142            0 :          nvar_hydro_old = s% nvar_hydro
     143              : 
     144            0 :          num_u_vars = 1
     145              : 
     146            0 :          if (.not. u_flag) then  ! remove
     147            0 :             call del(s% xh)
     148            0 :             call del(s% xh_start)
     149            0 :             if (associated(s% xh_old) .and. s% generations > 1) call del(s% xh_old)
     150              :          end if
     151              : 
     152            0 :          call set_var_info(s, ierr)
     153            0 :          if (ierr /= 0) return
     154              : 
     155            0 :          call update_nvar_allocs(s, nvar_hydro_old, s% nvar_chem, ierr)
     156            0 :          if (ierr /= 0) return
     157              : 
     158            0 :          call check_sizes(s, ierr)
     159            0 :          if (ierr /= 0) return
     160              : 
     161            0 :          if (u_flag) then  ! insert
     162            0 :             i_u = s% i_u
     163            0 :             call insert(s% xh)
     164            0 :             call insert(s% xh_start)
     165            0 :             if (s% v_flag) then  ! use v to initialize u
     166            0 :                i_v = s% i_v
     167            0 :                do k=1,nz-1
     168            0 :                   s% xh(i_u,k) = 0.5d0*(s% xh(i_v,k) + s% xh(i_v,k+1))
     169              :                end do
     170            0 :                k = nz
     171            0 :                s% xh(i_u,k) = 0.5d0*(s% xh(i_v,k) + s% v_center)
     172              :             else
     173            0 :                do k=1,nz
     174            0 :                   s% xh(i_u,k) = 0d0
     175              :                end do
     176              :             end if
     177            0 :             if (associated(s% xh_old) .and. s% generations > 1) call insert(s% xh_old)
     178            0 :             call fill_ad_with_zeros(s% u_face_ad,1,-1)
     179            0 :             call fill_ad_with_zeros(s% P_face_ad,1,-1)
     180              :          end if
     181              : 
     182            0 :          call set_chem_names(s)
     183              : 
     184            0 :          if (u_flag .and. s% v_flag) then  ! turn off v_flag when turn on u_flag
     185            0 :             call set_v_flag(id, .false., ierr)
     186              :          end if
     187              : 
     188              :          contains
     189              : 
     190            0 :          subroutine del(xs)
     191              :             real(dp) :: xs(:,:)
     192              :             integer :: k, j, i_u
     193            0 :             if (size(xs,dim=2) < nz) return
     194            0 :             i_u = s% i_u
     195            0 :             do k = 1, nz
     196            0 :                do j = i_u + num_u_vars, nvar_hydro_old
     197            0 :                   xs(j-num_u_vars,k) = xs(j,k)
     198              :                end do
     199              :             end do
     200              :          end subroutine del
     201              : 
     202            0 :          subroutine insert(xs)
     203              :             real(dp) :: xs(:,:)
     204              :             integer :: k, j, i_u
     205            0 :             if (size(xs,dim=2) < nz) return
     206            0 :             i_u = s% i_u
     207            0 :             do k = 1, nz
     208            0 :                do j = s% nvar_hydro, i_u + num_u_vars, -1
     209            0 :                   xs(j,k) = xs(j-num_u_vars,k)
     210              :                end do
     211            0 :                do j = i_u, i_u + num_u_vars - 1
     212            0 :                   xs(j,k) = 0
     213              :                end do
     214              :             end do
     215              : 
     216              :          end subroutine insert
     217              : 
     218              :       end subroutine set_u_flag
     219              : 
     220              : 
     221            0 :       subroutine set_RTI_flag(id, RTI_flag, ierr)
     222              :          integer, intent(in) :: id
     223              :          logical, intent(in) :: RTI_flag
     224              :          integer, intent(out) :: ierr
     225              :          type (star_info), pointer :: s
     226              :          integer :: nvar_hydro_old, nz
     227              :          logical, parameter :: dbg = .false.
     228              : 
     229              :          include 'formats'
     230              : 
     231              :          ierr = 0
     232            0 :          call get_star_ptr(id, s, ierr)
     233            0 :          if (ierr /= 0) return
     234            0 :          if (s% RTI_flag .eqv. RTI_flag) return
     235              : 
     236            0 :          nz = s% nz
     237            0 :          s% RTI_flag = RTI_flag
     238            0 :          nvar_hydro_old = s% nvar_hydro
     239              : 
     240            0 :          if (.not. RTI_flag) then  ! remove i_alpha_RTI's
     241            0 :             call del(s% xh)
     242            0 :             call del(s% xh_start)
     243            0 :             if (associated(s% xh_old) .and. s% generations > 1) call del(s% xh_old)
     244              :          end if
     245              : 
     246            0 :          call set_var_info(s, ierr)
     247            0 :          if (ierr /= 0) return
     248              : 
     249            0 :          call update_nvar_allocs(s, nvar_hydro_old, s% nvar_chem, ierr)
     250            0 :          if (ierr /= 0) return
     251              : 
     252            0 :          call check_sizes(s, ierr)
     253            0 :          if (ierr /= 0) return
     254              : 
     255            0 :          if (RTI_flag) then  ! insert i_alpha_RTI's
     256            0 :             call insert(s% xh)
     257            0 :             call insert(s% xh_start)
     258            0 :             s% xh(s% i_alpha_RTI,1:nz) = 0d0
     259            0 :             if (associated(s% xh_old) .and. s% generations > 1) call insert(s% xh_old)
     260              :          end if
     261              : 
     262            0 :          call set_chem_names(s)
     263              : 
     264              :          contains
     265              : 
     266            0 :          subroutine del(xs)
     267              :             real(dp) :: xs(:,:)
     268              :             integer :: j, i_alpha_RTI
     269            0 :             if (size(xs,dim=2) < nz) return
     270            0 :             i_alpha_RTI = s% i_alpha_RTI
     271            0 :             do j = i_alpha_RTI+1, nvar_hydro_old
     272            0 :                xs(j-1,1:nz) = xs(j,1:nz)
     273              :             end do
     274              :          end subroutine del
     275              : 
     276            0 :          subroutine insert(xs)
     277              :             real(dp) :: xs(:,:)
     278              :             integer :: j, i_alpha_RTI
     279            0 :             if (size(xs,dim=2) < nz) return
     280            0 :             i_alpha_RTI = s% i_alpha_RTI
     281            0 :             do j = s% nvar_hydro, i_alpha_RTI+1, -1
     282            0 :                xs(j,1:nz) = xs(j-1,1:nz)
     283              :             end do
     284            0 :             xs(i_alpha_RTI,1:nz) = 0
     285              :          end subroutine insert
     286              : 
     287              :       end subroutine set_RTI_flag
     288              : 
     289              : 
     290            0 :       subroutine set_RSP2_flag(id, RSP2_flag, ierr)
     291              :          use const_def, only: sqrt_2_div_3
     292              :          use hydro_vars, only: set_vars
     293              :          use hydro_rsp2, only: set_RSP2_vars
     294              :          use hydro_rsp2_support, only: remesh_for_RSP2
     295              :          use star_utils, only: set_m_and_dm, set_dm_bar, set_qs
     296              :          integer, intent(in) :: id
     297              :          logical, intent(in) :: RSP2_flag
     298              :          integer, intent(out) :: ierr
     299              :          type (star_info), pointer :: s
     300              :          integer :: nvar_hydro_old, i, k, nz
     301              :          logical, parameter :: dbg = .false.
     302              : 
     303              :          include 'formats'
     304              : 
     305              :          ierr = 0
     306            0 :          call get_star_ptr(id, s, ierr)
     307            0 :          if (ierr /= 0) return
     308              : 
     309              :          !write(*,*) 'set_RSP2_flag previous s% RSP2_flag', s% RSP2_flag
     310              :          !write(*,*) 'set_RSP2_flag new RSP2_flag', RSP2_flag
     311            0 :          if (s% RSP2_flag .eqv. RSP2_flag) return
     312              : 
     313            0 :          nz = s% nz
     314              : 
     315            0 :          s% RSP2_flag = RSP2_flag
     316            0 :          nvar_hydro_old = s% nvar_hydro
     317              : 
     318            0 :          if (.not. RSP2_flag) then
     319            0 :             call remove1(s% i_w)
     320            0 :             call remove1(s% i_Hp)
     321              :          end if
     322              : 
     323            0 :          call set_var_info(s, ierr)
     324            0 :          if (ierr /= 0) return
     325              : 
     326            0 :          write(*,*) 'set_RSP2 variables and equations'
     327              :          if (.false.) then
     328              :             do i=1,s% nvar_hydro
     329              :                write(*,'(i3,2a20)') i, trim(s% nameofequ(i)), trim(s% nameofvar(i))
     330              :             end do
     331              :          end if
     332              : 
     333            0 :          call update_nvar_allocs(s, nvar_hydro_old, s% nvar_chem, ierr)
     334            0 :          if (ierr /= 0) return
     335              : 
     336            0 :          call check_sizes(s, ierr)
     337            0 :          if (ierr /= 0) return
     338              : 
     339            0 :          if (RSP2_flag) then
     340            0 :             call insert1(s% i_w)
     341            0 :             if (s% RSP_flag) then
     342            0 :                do k=1,nz
     343            0 :                   s% xh(s% i_w,k) = sqrt(max(0d0,s% xh(s% i_Et_RSP,k)))
     344              :                end do
     345            0 :             else if (s% have_mlt_vc) then
     346            0 :                do k=1,nz-1
     347            0 :                   s% xh(s% i_w,k) = 0.5d0*(s% mlt_vc(k) + s% mlt_vc(k+1))/sqrt_2_div_3
     348              :                end do
     349            0 :                s% xh(s% i_w,nz) = 0.5d0*s% mlt_vc(nz)/sqrt_2_div_3
     350              :             else
     351            0 :                write(*,*) 'set_rsp2_flag true requires mlt_vc'
     352            0 :                ierr = -1
     353            0 :                return
     354              :             end if
     355            0 :             call insert1(s% i_Hp)  ! will be initialized by set_RSP2_vars
     356              :          end if
     357              : 
     358            0 :          call set_chem_names(s)
     359              : 
     360            0 :          if (.not. RSP2_flag) return
     361              : 
     362            0 :          if (s% RSP_flag) then  ! turn off RSP_flag when turn on RSP2_flag
     363            0 :             call set_RSP_flag(id, .false., ierr)
     364            0 :             if (ierr /= 0) return
     365              :          end if
     366              : 
     367            0 :          call set_v_flag(s% id, .true., ierr)
     368            0 :          if (ierr /= 0) return
     369              : 
     370            0 :          call set_vars(s, s% dt, ierr)
     371            0 :          if (ierr /= 0) return
     372              : 
     373            0 :          call set_RSP2_vars(s,ierr)
     374            0 :          if (ierr /= 0) return
     375              : 
     376            0 :          if (s% RSP2_remesh_when_load) then
     377            0 :             write(*,*) 'doing automatic remesh for RSP2'
     378            0 :             call remesh_for_RSP2(s,ierr)
     379            0 :             if (ierr /= 0) return
     380            0 :             call set_qs(s, nz, s% q, s% dq, ierr)
     381            0 :             if (ierr /= 0) return
     382            0 :             call set_m_and_dm(s)
     383            0 :             call set_dm_bar(s, nz, s% dm, s% dm_bar)
     384            0 :             call set_vars(s, s% dt, ierr)  ! redo after remesh_for_RSP2
     385            0 :             if (ierr /= 0) return
     386              :          end if
     387              : 
     388              : 
     389              : 
     390              :          contains
     391              : 
     392            0 :          subroutine insert1(i_var)
     393              :             integer, intent(in) :: i_var
     394              :             include 'formats'
     395            0 :             call insert(s% xh,i_var)
     396            0 :             call insert(s% xh_start,i_var)
     397            0 :             do k=1,nz
     398            0 :                s% xh(i_var,k) = 0d0
     399              :             end do
     400            0 :             if (associated(s% xh_old) .and. s% generations > 1) then
     401            0 :                call insert(s% xh_old,i_var)
     402              :             end if
     403            0 :          end subroutine insert1
     404              : 
     405            0 :          subroutine remove1(i_remove)
     406              :             integer, intent(in) :: i_remove
     407            0 :             call del(s% xh,i_remove)
     408            0 :             call del(s% xh_start,i_remove)
     409            0 :             if (associated(s% xh_old) .and. s% generations > 1) then
     410            0 :                call del(s% xh_old,i_remove)
     411              :             end if
     412            0 :          end subroutine remove1
     413              : 
     414            0 :          subroutine del(xs,i_var)
     415              :             real(dp) :: xs(:,:)
     416              :             integer, intent(in) :: i_var
     417              :             integer :: j, k
     418            0 :             if (size(xs,dim=2) < nz) return
     419            0 :             do j = i_var+1, nvar_hydro_old
     420            0 :                do k=1,nz
     421            0 :                   xs(j-1,k) = xs(j,k)
     422              :                end do
     423              :             end do
     424              :          end subroutine del
     425              : 
     426            0 :          subroutine insert(xs,i_var)
     427              :             real(dp) :: xs(:,:)
     428              :             integer, intent(in) :: i_var
     429              :             integer :: j, k
     430            0 :             if (size(xs,dim=2) < nz) return
     431            0 :             do j = s% nvar_hydro, i_var+1, -1
     432            0 :                do k=1,nz
     433            0 :                   xs(j,k) = xs(j-1,k)
     434              :                end do
     435              :             end do
     436            0 :             xs(i_var,1:nz) = 0d0
     437              :          end subroutine insert
     438              : 
     439              :       end subroutine set_RSP2_flag
     440              : 
     441              : 
     442            0 :       subroutine set_RSP_flag(id, RSP_flag, ierr)
     443              :          integer, intent(in) :: id
     444              :          logical, intent(in) :: RSP_flag
     445              :          integer, intent(out) :: ierr
     446              :          type (star_info), pointer :: s
     447              :          integer :: nvar_hydro_old, k, nz
     448              :          logical, parameter :: dbg = .false.
     449              : 
     450              :          include 'formats'
     451              : 
     452              :          ierr = 0
     453            0 :          call get_star_ptr(id, s, ierr)
     454            0 :          if (ierr /= 0) return
     455            0 :          if (s% RSP_flag .eqv. RSP_flag) return
     456              : 
     457            0 :          nz = s% nz
     458            0 :          s% RSP_flag = RSP_flag
     459            0 :          nvar_hydro_old = s% nvar_hydro
     460              : 
     461            0 :          if (.not. RSP_flag) then
     462            0 :             call remove1(s% i_Fr_RSP)
     463            0 :             call remove1(s% i_erad_RSP)
     464            0 :             call remove1(s% i_Et_RSP)
     465            0 :          else if (s% i_lum /= 0) then
     466            0 :             call remove1(s% i_lum)
     467              :          end if
     468              : 
     469            0 :          call set_var_info(s, ierr)
     470            0 :          if (ierr /= 0) return
     471              : 
     472            0 :          call update_nvar_allocs(s, nvar_hydro_old, s% nvar_chem, ierr)
     473            0 :          if (ierr /= 0) return
     474              : 
     475            0 :          call check_sizes(s, ierr)
     476            0 :          if (ierr /= 0) return
     477              : 
     478            0 :          if (RSP_flag) then
     479            0 :             call insert1(s% i_Et_RSP)
     480            0 :             call insert1(s% i_erad_RSP)
     481            0 :             call insert1(s% i_Fr_RSP)
     482              :          else
     483            0 :             call insert1(s% i_lum)
     484            0 :             do k=1,nz
     485            0 :                s% xh(s% i_lum,k) = s% L(k)
     486              :             end do
     487              :          end if
     488              : 
     489            0 :          call set_chem_names(s)
     490              : 
     491            0 :          if (RSP_flag) call set_v_flag(s% id, .true., ierr)
     492              : 
     493              :          contains
     494              : 
     495            0 :          subroutine insert1(i_var)
     496              :             integer, intent(in) :: i_var
     497            0 :             call insert(s% xh,i_var)
     498            0 :             call insert(s% xh_start,i_var)
     499            0 :             do k=1,nz
     500            0 :                s% xh(i_var,k) = 0d0
     501              :             end do
     502            0 :             if (associated(s% xh_old) .and. s% generations > 1) then
     503            0 :                call insert(s% xh_old,i_var)
     504              :             end if
     505            0 :          end subroutine insert1
     506              : 
     507            0 :          subroutine remove1(i_remove)
     508              :             integer, intent(in) :: i_remove
     509            0 :             call del(s% xh,i_remove)
     510            0 :             call del(s% xh_start,i_remove)
     511            0 :             if (associated(s% xh_old) .and. s% generations > 1) then
     512            0 :                call del(s% xh_old,i_remove)
     513              :             end if
     514            0 :          end subroutine remove1
     515              : 
     516            0 :          subroutine del(xs,i_var)
     517              :             real(dp) :: xs(:,:)
     518              :             integer, intent(in) :: i_var
     519              :             integer :: j, k
     520            0 :             if (size(xs,dim=2) < nz) return
     521            0 :             do j = i_var+1, nvar_hydro_old
     522            0 :                do k=1,nz
     523            0 :                   xs(j-1,k) = xs(j,k)
     524              :                end do
     525              :             end do
     526              :          end subroutine del
     527              : 
     528            0 :          subroutine insert(xs,i_var)
     529              :             real(dp) :: xs(:,:)
     530              :             integer, intent(in) :: i_var
     531              :             integer :: j, k
     532            0 :             if (size(xs,dim=2) < nz) return
     533            0 :             do j = s% nvar_hydro, i_var+1, -1
     534            0 :                do k=1,nz
     535            0 :                   xs(j,k) = xs(j-1,k)
     536              :                end do
     537              :             end do
     538            0 :             xs(i_var,1:nz) = 0
     539              :          end subroutine insert
     540              : 
     541              :       end subroutine set_RSP_flag
     542              : 
     543              : 
     544            0 :       subroutine set_w_div_wc_flag(id, w_div_wc_flag, ierr)
     545              :          integer, intent(in) :: id
     546              :          logical, intent(in) :: w_div_wc_flag
     547              :          integer, intent(out) :: ierr
     548              :          type (star_info), pointer :: s
     549              :          integer :: nvar_hydro_old, nz
     550              :          logical, parameter :: dbg = .false.
     551              : 
     552              :          include 'formats'
     553              : 
     554              :          ierr = 0
     555            0 :          call get_star_ptr(id, s, ierr)
     556            0 :          if (ierr /= 0) return
     557              : 
     558            0 :          if (s% w_div_wc_flag .eqv. w_div_wc_flag) return
     559              : 
     560            0 :          nz = s% nz
     561            0 :          s% w_div_wc_flag = w_div_wc_flag
     562            0 :          nvar_hydro_old = s% nvar_hydro
     563              : 
     564            0 :          if (.not. w_div_wc_flag) then  ! remove i_w_div_wc's
     565            0 :             call del(s% xh)
     566            0 :             call del(s% xh_start)
     567            0 :             if (associated(s% xh_old) .and. s% generations > 1) call del(s% xh_old)
     568              :          end if
     569              : 
     570            0 :          call set_var_info(s, ierr)
     571            0 :          if (ierr /= 0) return
     572              : 
     573            0 :          call update_nvar_allocs(s, nvar_hydro_old, s% nvar_chem, ierr)
     574            0 :          if (ierr /= 0) return
     575              : 
     576            0 :          call check_sizes(s, ierr)
     577            0 :          if (ierr /= 0) return
     578              : 
     579            0 :          if (w_div_wc_flag) then  ! insert i_w_div_w's
     580            0 :             call insert(s% xh)
     581            0 :             call insert(s% xh_start)
     582            0 :             s% xh(s% i_w_div_wc,1:nz) = 0d0
     583            0 :             if (associated(s% xh_old) .and. s% generations > 1) call insert(s% xh_old)
     584              :          end if
     585              : 
     586            0 :          call set_chem_names(s)
     587              : 
     588              :          contains
     589              : 
     590            0 :          subroutine del(xs)
     591              :             real(dp) :: xs(:,:)
     592              :             integer :: j, i_w_div_wc
     593            0 :             if (size(xs,dim=2) < nz) return
     594            0 :             i_w_div_wc = s% i_w_div_wc
     595            0 :             do j = i_w_div_wc+1, nvar_hydro_old
     596            0 :                xs(j-1,1:nz) = xs(j,1:nz)
     597              :             end do
     598              :          end subroutine del
     599              : 
     600            0 :          subroutine insert(xs)
     601              :             real(dp) :: xs(:,:)
     602              :             integer :: j, i_w_div_wc
     603            0 :             if (size(xs,dim=2) < nz) return
     604            0 :             i_w_div_wc = s% i_w_div_wc
     605            0 :             do j = s% nvar_hydro, i_w_div_wc+1, -1
     606            0 :                xs(j,1:nz) = xs(j-1,1:nz)
     607              :             end do
     608            0 :             xs(i_w_div_wc,1:nz) = 0
     609              :          end subroutine insert
     610              : 
     611              :       end subroutine set_w_div_wc_flag
     612              : 
     613              : 
     614            0 :       subroutine set_j_rot_flag(id, j_rot_flag, ierr)
     615              :          integer, intent(in) :: id
     616              :          logical, intent(in) :: j_rot_flag
     617              :          integer, intent(out) :: ierr
     618              :          type (star_info), pointer :: s
     619              :          integer :: nvar_hydro_old, nz
     620              :          logical, parameter :: dbg = .false.
     621              : 
     622              :          include 'formats'
     623              : 
     624              :          ierr = 0
     625            0 :          call get_star_ptr(id, s, ierr)
     626            0 :          if (ierr /= 0) return
     627              : 
     628            0 :          if (s% j_rot_flag .eqv. j_rot_flag) return
     629              : 
     630            0 :          nz = s% nz
     631            0 :          s% j_rot_flag = j_rot_flag
     632            0 :          nvar_hydro_old = s% nvar_hydro
     633              : 
     634            0 :          if (.not. j_rot_flag) then  ! remove i_j_rot's
     635            0 :             call del(s% xh)
     636            0 :             call del(s% xh_start)
     637            0 :             if (associated(s% xh_old) .and. s% generations > 1) call del(s% xh_old)
     638              :          end if
     639              : 
     640            0 :          call set_var_info(s, ierr)
     641            0 :          if (ierr /= 0) return
     642              : 
     643            0 :          call update_nvar_allocs(s, nvar_hydro_old, s% nvar_chem, ierr)
     644            0 :          if (ierr /= 0) return
     645              : 
     646            0 :          call check_sizes(s, ierr)
     647            0 :          if (ierr /= 0) return
     648              : 
     649            0 :          if (j_rot_flag) then  ! insert i_j_rot's
     650            0 :             call insert(s% xh)
     651            0 :             call insert(s% xh_start)
     652            0 :             s% xh(s% i_j_rot,1:nz) = 0d0
     653            0 :             if (associated(s% xh_old) .and. s% generations > 1) call insert(s% xh_old)
     654              :          end if
     655              : 
     656            0 :          call set_chem_names(s)
     657              : 
     658              :          contains
     659              : 
     660            0 :          subroutine del(xs)
     661              :             real(dp) :: xs(:,:)
     662              :             integer :: j, i_j_rot
     663            0 :             if (size(xs,dim=2) < nz) return
     664            0 :             i_j_rot = s% i_j_rot
     665            0 :             do j = i_j_rot+1, nvar_hydro_old
     666            0 :                xs(j-1,1:nz) = xs(j,1:nz)
     667              :             end do
     668              :          end subroutine del
     669              : 
     670            0 :          subroutine insert(xs)
     671              :             real(dp) :: xs(:,:)
     672              :             integer :: j, i_j_rot
     673            0 :             if (size(xs,dim=2) < nz) return
     674            0 :             i_j_rot = s% i_j_rot
     675            0 :             do j = s% nvar_hydro, i_j_rot+1, -1
     676            0 :                xs(j,1:nz) = xs(j-1,1:nz)
     677              :             end do
     678            0 :             xs(i_j_rot,1:nz) = 0
     679              :          end subroutine insert
     680              : 
     681              :       end subroutine set_j_rot_flag
     682              : 
     683              : 
     684            0 :       subroutine set_D_omega_flag(id, D_omega_flag, ierr)
     685              :          integer, intent(in) :: id
     686              :          logical, intent(in) :: D_omega_flag
     687              :          integer, intent(out) :: ierr
     688              :          type (star_info), pointer :: s
     689              :          include 'formats'
     690              :          ierr = 0
     691            0 :          call get_star_ptr(id, s, ierr)
     692            0 :          if (ierr /= 0) return
     693            0 :          if (s% D_omega_flag .eqv. D_omega_flag) return
     694            0 :          s% D_omega_flag = D_omega_flag
     695            0 :          s% D_omega(1:s% nz) = 0
     696              :       end subroutine set_D_omega_flag
     697              : 
     698              : 
     699            0 :       subroutine set_am_nu_rot_flag(id, am_nu_rot_flag, ierr)
     700              :          integer, intent(in) :: id
     701              :          logical, intent(in) :: am_nu_rot_flag
     702              :          integer, intent(out) :: ierr
     703              :          type (star_info), pointer :: s
     704              :          include 'formats'
     705              :          ierr = 0
     706            0 :          call get_star_ptr(id, s, ierr)
     707            0 :          if (ierr /= 0) return
     708            0 :          if (s% am_nu_rot_flag .eqv. am_nu_rot_flag) return
     709            0 :          s% am_nu_rot_flag = am_nu_rot_flag
     710            0 :          s% am_nu_rot(1:s% nz) = 0
     711              :       end subroutine set_am_nu_rot_flag
     712              : 
     713              : 
     714            0 :       subroutine set_rotation_flag(id, rotation_flag, ierr)
     715              :          integer, intent(in) :: id
     716              :          logical, intent(in) :: rotation_flag
     717              :          integer, intent(out) :: ierr
     718              :          type (star_info), pointer :: s
     719              : 
     720              :          include 'formats'
     721              : 
     722              :          ierr = 0
     723            0 :          call get_star_ptr(id, s, ierr)
     724            0 :          if (ierr /= 0) return
     725            0 :          if (s% rotation_flag .eqv. rotation_flag) return
     726              : 
     727            0 :          s% rotation_flag = rotation_flag
     728            0 :          s% omega(1:s% nz) = 0
     729            0 :          s% j_rot(1:s% nz) = 0
     730            0 :          s% D_omega(1:s% nz) = 0
     731            0 :          s% am_nu_rot(1:s% nz) = 0
     732              : 
     733            0 :          if (.not. rotation_flag) then
     734            0 :             call set_w_div_wc_flag(id, .false., ierr)
     735            0 :             if (ierr /= 0) return
     736            0 :             call set_j_rot_flag(id, .false., ierr)
     737              :             if (ierr /= 0) return
     738            0 :             return
     739              :          end if
     740              : 
     741            0 :          if (s% job% use_w_div_wc_flag_with_rotation) then
     742            0 :             call set_w_div_wc_flag(id, .true., ierr)
     743            0 :             if (ierr /= 0) return
     744            0 :             if (s% job% use_j_rot_flag_with_rotation) then
     745            0 :                call set_j_rot_flag(id, .true., ierr)
     746            0 :                if (ierr /= 0) return
     747              :             end if
     748              :          end if
     749              : 
     750            0 :          call zero_array(s% nu_ST)
     751            0 :          call zero_array(s% D_ST)
     752            0 :          call zero_array(s% D_DSI)
     753            0 :          call zero_array(s% D_SH)
     754            0 :          call zero_array(s% D_SSI)
     755            0 :          call zero_array(s% D_ES)
     756            0 :          call zero_array(s% D_GSF)
     757              : 
     758            0 :          call zero_array(s% prev_mesh_omega)
     759            0 :          call zero_array(s% prev_mesh_j_rot)
     760              : 
     761              : 
     762              :          contains
     763              : 
     764            0 :          subroutine zero_array(d)
     765              :             real(dp), pointer :: d(:)
     766            0 :             if (.not. associated(d)) return
     767            0 :             d(:) = 0
     768              :          end subroutine zero_array
     769              : 
     770              :       end subroutine set_rotation_flag
     771              : 
     772              :       end module set_flags
        

Generated by: LCOV version 2.0-1