LCOV - code coverage report
Current view: top level - star/private - adjust_mesh.f90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 52.6 % 352 185
Test Date: 2025-05-08 18:23:42 Functions: 100.0 % 11 11

            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 adjust_mesh
      21              : 
      22              :       use star_private_def
      23              :       use const_def, only: dp, lsun
      24              :       use adjust_mesh_support
      25              : 
      26              :       implicit none
      27              : 
      28              :       private
      29              :       public :: remesh
      30              : 
      31              :       logical, parameter :: dbg_remesh = .false.
      32              : 
      33              :       contains
      34              : 
      35              :       ! makes new mesh and sets new values for xh and xa.
      36           10 :       integer function remesh(s)
      37              :          use alloc
      38              :          use mesh_functions, only: max_allowed_gvals
      39              :          use mesh_plan, only: do_mesh_plan
      40              :          use mesh_adjust, only: do_mesh_adjust
      41              :          use rates_def, only: i_rate
      42              :          use net_lib, only: clean_up_fractions
      43              :          use utils_lib
      44              :          use star_utils
      45              :          use chem_def
      46              :          use chem_lib, only: chem_get_iso_id
      47              : 
      48              :          type (star_info), pointer :: s
      49              : 
      50              :          integer :: alloc_level, i, k, ierr, species, nvar, nz, nz_new, nz_old, &
      51              :             num_gvals, j, cid, cid_max, unchanged, split, merged, revised
      52          980 :          type (star_info), target :: copy_info
      53              :          type (star_info), pointer :: c, prv
      54           10 :          real(dp) :: delta_coeff, sum_L_other, sum_L_other_limit, A_max, &
      55           10 :             mesh_max_allowed_ratio, tmp, J_tot1, J_tot2, center_logT, alfa, beta, &
      56           10 :             d_dlnR00, d_dlnRp1, d_dv00, d_dvp1
      57              :          real(dp), pointer, dimension(:) :: &
      58           10 :             delta_gval_max, specific_PE, specific_KE, &
      59           10 :             xq_old, xq_new, dq_new
      60           10 :          real(dp), pointer :: gvals(:,:), gvals1(:)
      61           10 :          integer, pointer :: which_gval(:) , comes_from(:), cell_type(:)
      62           10 :          logical, pointer :: do_not_split(:)
      63              :          character (len=32) :: gval_names(max_allowed_gvals)
      64              :          logical, dimension(max_allowed_gvals) :: &
      65              :             gval_is_xa_function, gval_is_logT_function
      66              :          logical, parameter :: dbg = .false.
      67              : 
      68              :          real(dp), parameter :: max_sum_abs = 10d0
      69              :          real(dp), parameter :: xsum_tol = 1d-2
      70              :          real(dp), parameter :: h_cntr_limit = 0.5d0  ! for pre-MS decision
      71              : 
      72              :          include 'formats'
      73              : 
      74           10 :          ierr = 0
      75           10 :          remesh = keep_going
      76           10 :          alloc_level = 0
      77              : 
      78           10 :          s% mesh_adjust_KE_conservation = 0
      79           10 :          s% mesh_adjust_IE_conservation = 0
      80           10 :          s% mesh_adjust_PE_conservation = 0
      81              : 
      82              :          if (dbg_remesh) write(*,*) 'enter adjust mesh'
      83              : 
      84           10 :          if (.not. s% okay_to_remesh) then
      85              :             if (dbg_remesh) write(*,*) 's% okay_to_remesh', s% okay_to_remesh
      86              :             return
      87              :          end if
      88              : 
      89           10 :          if (s% remesh_max_allowed_logT < 1d2) then  ! check it
      90            0 :             if (maxval(s% lnT(1:s% nz))/ln10 > s% remesh_max_allowed_logT) then
      91              :                if (dbg_remesh) write(*,2) &
      92              :                   's% remesh_max_allowed_logT', s% model_number, s% remesh_max_allowed_logT
      93              :                return
      94              :             end if
      95              :          end if
      96              : 
      97              :          call nullify_work_ptrs
      98              : 
      99           10 :          if (s% dt < s% remesh_dt_limit) then
     100              :             if (dbg_remesh) write(*,*) 's% dt < s% remesh_dt_limit'
     101              :             return
     102              :          end if
     103              : 
     104           10 :          species = s% species
     105           10 :          nz_old = s% nz
     106           10 :          nz = nz_old
     107              : 
     108           10 :          J_tot1 = total_angular_momentum(s)
     109           10 :          call clean_up_fractions(1, nz, species, nz, s% xa, max_sum_abs, xsum_tol, ierr)
     110           10 :          if (ierr /= 0) then
     111              :             if (dbg_remesh) write(*,*) 'clean_up_fractions failed during adjust mesh'
     112            0 :             s% result_reason = adjust_mesh_failed
     113            0 :             s% retry_message = 'clean_up_fractions failed during adjust mesh'
     114            0 :             remesh = retry
     115            0 :             return
     116              :          end if
     117              : 
     118              :          call do_alloc1(ierr)
     119           10 :          if (ierr /= 0) then
     120              :             if (dbg_remesh) write(*,*) 'do_alloc1 failed for adjust mesh'
     121            0 :             s% result_reason = adjust_mesh_failed
     122            0 :             s% termination_code = t_adjust_mesh_failed
     123            0 :             remesh = terminate
     124            0 :             call dealloc
     125            0 :             return
     126              :          end if
     127              : 
     128        12105 :          do k=1,nz
     129        12095 :             specific_PE(k) = cell_specific_PE(s,k,d_dlnR00,d_dlnRp1)
     130        12105 :             specific_KE(k) = cell_specific_KE(s,k,d_dv00,d_dvp1)
     131              :          end do
     132              : 
     133           10 :          s% mesh_call_number = s% mesh_call_number + 1
     134              : 
     135           10 :          sum_L_other = 0
     136           10 :          sum_L_other_limit = Lsun
     137           10 :          do j=1,num_categories
     138              :             if (j == ipp .or. j == icno .or. j == i3alf .or. j == iphoto) cycle
     139              :             sum_L_other = sum_L_other + dot_product(s% dq(1:nz), s% eps_nuc_categories(j,1:nz))
     140              :             if (sum_L_other > sum_L_other_limit) exit
     141              :          end do
     142              : 
     143           10 :          center_logT = s% lnT(s% nz)/ln10
     144           10 :          if (center_logT <= s% logT_max_for_standard_mesh_delta_coeff) then
     145           10 :             delta_coeff = s% mesh_delta_coeff
     146            0 :          else if (center_logT >= s% logT_min_for_highT_mesh_delta_coeff) then
     147            0 :             delta_coeff = s% mesh_delta_coeff_for_highT
     148              :          else
     149              :             alfa = (center_logT - s% logT_max_for_standard_mesh_delta_coeff)/ &
     150            0 :                (s% logT_min_for_highT_mesh_delta_coeff - s% logT_max_for_standard_mesh_delta_coeff)
     151            0 :             beta = 1d0 - alfa
     152            0 :             delta_coeff = alfa*s% mesh_delta_coeff_for_highT + beta*s% mesh_delta_coeff
     153              :          end if
     154              : 
     155           10 :          mesh_max_allowed_ratio = s% mesh_max_allowed_ratio
     156           10 :          if (mesh_max_allowed_ratio < 2.5d0) then
     157            0 :             write(*,*) 'WARNING: increasing mesh_max_allowed_ratio to 2.5'
     158            0 :             s% mesh_max_allowed_ratio = 2.5d0
     159              :          end if
     160              : 
     161              :          ! find the heaviest species in the current net
     162           10 :          cid_max = 0; A_max = 0
     163              : 
     164           90 :          do i = 1, s% species
     165           80 :             cid = s% chem_id(i)
     166           90 :             if (chem_isos% W(cid) > A_max) then
     167           80 :                A_max = chem_isos% W(cid); cid_max = cid
     168              :             end if
     169              :          end do
     170              : 
     171          100 :          do j = 1, num_xa_function
     172           90 :             if (s% xa_mesh_delta_coeff(j) == 1) cycle
     173            0 :             if (len_trim(s% xa_function_species(j)) == 0) cycle
     174            0 :             cid = chem_get_iso_id(s% xa_function_species(j))
     175            0 :             if (cid <= 0) cycle
     176            0 :             if (s% net_iso(cid) == 0) cycle
     177            0 :             if (chem_isos% W(cid) /= A_max) cycle
     178          100 :             delta_coeff = delta_coeff*s% xa_mesh_delta_coeff(j)
     179              :          end do
     180              : 
     181              :          call check_validity(s, ierr)
     182           10 :          if (ierr /= 0) then
     183            0 :             write(*,*) 'check_validity failed at entry to adjust mesh'
     184            0 :             s% termination_code = t_adjust_mesh_failed
     185            0 :             remesh = terminate
     186            0 :             s% result_reason = adjust_mesh_failed
     187            0 :             call dealloc
     188            0 :             return
     189              :          end if
     190              : 
     191           10 :          call get_num_gvals
     192           10 :          if (num_gvals == 0) then
     193            0 :             s% termination_code = t_adjust_mesh_failed
     194            0 :             remesh = terminate
     195            0 :             write(*,*) 'must have at least 1 mesh gradient function with nonzero weight'
     196            0 :             s% result_reason = adjust_mesh_failed
     197            0 :             call dealloc
     198            0 :             return
     199              :          end if
     200              : 
     201              :          call do_alloc2(ierr)
     202           10 :          if (ierr /= 0) then
     203              :             if (dbg_remesh) write(*,*) 'do_alloc2 failed for adjust mesh'
     204            0 :             s% termination_code = t_adjust_mesh_failed
     205            0 :             remesh = terminate
     206            0 :             s% result_reason = adjust_mesh_failed
     207            0 :             call dealloc
     208            0 :             return
     209              :          end if
     210              : 
     211              :          if (dbg_remesh) write(*,*) 'call mesh_plan'
     212              : 
     213           10 :          if (s% show_mesh_changes) then
     214            0 :             write(*,*) 'doing mesh_call_number', s% mesh_call_number
     215            0 :             write(*,*) '      mesh_plan nz_old', nz_old
     216              :          end if
     217              : 
     218              :          call get_gval_info( &
     219              :                s, delta_gval_max, gvals1, nz, &
     220              :                num_gvals, gval_names, &
     221              :                gval_is_xa_function, gval_is_logT_function, ierr)
     222           10 :          if (ierr /= 0) then
     223            0 :             s% termination_code = t_adjust_mesh_failed
     224            0 :             remesh = terminate
     225              :             if (dbg_remesh) write(*,*) 'get_gval_info failed for adjust mesh'
     226            0 :             s% result_reason = adjust_mesh_failed
     227            0 :             call dealloc
     228            0 :             return
     229              :          end if
     230              : 
     231        12095 :          do k=1,nz-1
     232              :             do_not_split(k) = &
     233              :                (s% lnR(k) - s% lnR(k+1) < 2*s% mesh_min_dlnR) .or. &
     234        12095 :                (s% r(k) - s% r(k+1) < 2*s% mesh_min_dr_div_cs*s% csound(k))
     235              :          end do
     236              :          do_not_split(nz) = &
     237           10 :             (s% r(nz) - s% R_center < 2*s% mesh_min_dr_div_cs*s% csound(nz))
     238              : 
     239              :          if (dbg_remesh) write(*,*) 'call do_mesh_plan'
     240              : 
     241              :          if (dbg) write(*,1) 'sum(s% dq(1:nz))', sum(s% dq(1:nz))
     242              :          if (dbg) write(*,1) 's% dq(nz)', s% dq(nz)
     243              :          if (dbg) write(*,1) 'sum(s% dq(1:nz-1))', sum(s% dq(1:nz-1))
     244           10 :          tmp = s% dq(nz)
     245        12095 :          s% dq(nz) = 1d0 - sum(s% dq(1:nz-1))
     246           10 :          if (s% dq(nz) <= 0) then
     247              :             if (dbg) write(*,1) 'fix starting s% dq(nz) <= 0', s% dq(nz), sum(s% dq(1:nz))
     248            0 :             s% dq(nz) = tmp
     249            0 :             s% dq(1:nz) = s% dq(1:nz)/sum(s% dq(1:nz))
     250            0 :             s% dq(nz) = 1d0 - sum(s% dq(1:nz-1))
     251            0 :             if (s% dq(nz) <= 0) then
     252            0 :                ierr = -1
     253              :                if (dbg) write(*,*) 's% dq(nz) <= 0'
     254              :                if (dbg) call mesa_error(__FILE__,__LINE__,'debug adjust mesh')
     255            0 :                s% result_reason = adjust_mesh_failed
     256            0 :                s% termination_code = t_adjust_mesh_failed
     257            0 :                remesh = terminate
     258            0 :                call dealloc
     259            0 :                return
     260              :             end if
     261              :          end if
     262              : 
     263           10 :          call set_xqs(nz, xq_old, s% dq, ierr)
     264           10 :          if (ierr /= 0) then
     265              :             if (dbg) write(*,*) 'set_xqs ierr for xq_old in adjust mesh'
     266            0 :             s% result_reason = adjust_mesh_failed
     267            0 :             s% termination_code = t_adjust_mesh_failed
     268            0 :             remesh = terminate
     269            0 :             call dealloc
     270            0 :             return
     271              :          end if
     272              : 
     273        12105 :          do k=1,nz
     274        12105 :             delta_gval_max(k) = delta_gval_max(k)*delta_coeff
     275              :          end do
     276              : 
     277              :          call do_mesh_plan( &
     278              :             s, nz, s% max_allowed_nz, s% mesh_ok_to_merge, s% D_mix, &
     279              :             s% mesh_max_k_old_for_split, s% mesh_min_k_old_for_split, xq_old, s% dq, &
     280              :             s% min_dq, s% max_dq*s% mesh_delta_coeff, s% min_dq_for_split, mesh_max_allowed_ratio, &
     281              :             do_not_split, num_gvals, gval_names, &
     282              :             gval_is_xa_function, gval_is_logT_function, gvals, delta_gval_max, &
     283              :             s% max_center_cell_dq*s% mesh_delta_coeff, s% max_surface_cell_dq*s% mesh_delta_coeff, &
     284              :             s% max_num_subcells, s% max_num_merge_cells, &
     285           10 :             nz_new, xq_new, dq_new, which_gval, comes_from, ierr)
     286              : 
     287              :          if (dbg_remesh .or. dbg) write(*,*) 'back from mesh_plan'
     288              : 
     289           10 :          if (ierr /= 0) then
     290            0 :             write(*,'(A)')
     291            0 :             write(*,*) 'mesh_plan problem'
     292            0 :             write(*,*) 'doing mesh_call_number', s% mesh_call_number
     293            0 :             write(*,*) 's% model_number', s% model_number
     294            0 :             write(*,'(A)')
     295            0 :             s% termination_code = t_adjust_mesh_failed
     296            0 :             remesh = terminate
     297            0 :             s% result_reason = adjust_mesh_failed
     298            0 :             call dealloc
     299            0 :             return
     300              :          end if
     301              : 
     302           10 :          nz = nz_new
     303           10 :          s% nz = nz
     304           10 :          nvar = s% nvar_total
     305              : 
     306           10 :          if (.not. associated(s% other_star_info)) then
     307           98 :             allocate(s% other_star_info)
     308            1 :             prv => s% other_star_info
     309            1 :             c => null()
     310              :          else
     311            9 :             prv => s% other_star_info
     312            9 :             c => copy_info
     313            9 :             c = prv
     314              :          end if
     315              : 
     316           10 :          prv = s  ! this makes copies of pointers and scalars
     317              : 
     318              :          if (dbg_remesh .or. dbg) write(*,*) 'call resize_star_info_arrays'
     319              :          call resize_star_info_arrays(s, c, ierr)
     320           10 :          if (ierr /= 0) then
     321              :             if (dbg) write(*,*) 'resize_star_info_arrays ierr'
     322            0 :             s% result_reason = adjust_mesh_failed
     323            0 :             s% termination_code = t_adjust_mesh_failed
     324            0 :             remesh = terminate
     325            0 :             call dealloc
     326            0 :             return
     327              :          end if
     328              : 
     329              :          if (dbg_remesh .or. dbg) write(*,*) 'call do_alloc3'
     330              :          call do_alloc3(ierr)
     331           10 :          if (ierr /= 0) then
     332              :             if (dbg) write(*,*) 'do_alloc3 failed for adjust mesh'
     333            0 :             s% result_reason = adjust_mesh_failed
     334            0 :             s% termination_code = t_adjust_mesh_failed
     335            0 :             remesh = terminate
     336            0 :             call dealloc
     337            0 :             return
     338              :          end if
     339              : 
     340              :          if (dbg_remesh .or. dbg) write(*,*) 'call set_types_of_new_cells'
     341              :          call set_types_of_new_cells(cell_type, ierr)
     342           10 :          if (ierr /= 0) then
     343              :             if (dbg) write(*,*) 'set_types_of_new_cells ierr'
     344            0 :             s% result_reason = adjust_mesh_failed
     345            0 :             s% termination_code = t_adjust_mesh_failed
     346            0 :             remesh = terminate
     347            0 :             call dealloc
     348            0 :             return
     349              :          end if
     350              : 
     351        10633 :          do k=1,nz
     352        10633 :             s% dq(k) = dq_new(k)
     353              :          end do
     354        10623 :          s% dq(nz) = 1d0 - sum(s% dq(1:nz-1))
     355           10 :          if (s% dq(nz) <= 0) then
     356            0 :             write(*,1) 'fix s% dq(nz) <= 0', s% dq(nz), sum(s% dq(1:nz))
     357            0 :             s% dq(nz) = dq_new(nz)
     358            0 :             s% dq(1:nz) = s% dq(1:nz)/sum(s% dq(1:nz))
     359            0 :             s% dq(nz) = 1d0 - sum(s% dq(1:nz-1))
     360            0 :             if (s% dq(nz) <= 0) then
     361            0 :                ierr = -1
     362              :                if (dbg) write(*,*) 's% dq(nz) <= 0 in adjust mesh'
     363            0 :                s% result_reason = adjust_mesh_failed
     364            0 :                s% termination_code = t_adjust_mesh_failed
     365            0 :                remesh = terminate
     366            0 :                call dealloc
     367            0 :                return
     368              :             end if
     369              :          end if
     370              : 
     371           10 :          call set_qs(s, nz, s% q, s% dq, ierr)
     372           10 :          if (ierr /= 0) then
     373              :             if (dbg) write(*,*) 'set_qs ierr in adjust mesh'
     374            0 :             s% result_reason = adjust_mesh_failed
     375            0 :             s% termination_code = t_adjust_mesh_failed
     376            0 :             remesh = terminate
     377            0 :             call dealloc
     378            0 :             return
     379              :          end if
     380           10 :          call set_xqs(nz, xq_new, s% dq, ierr)
     381           10 :          if (ierr /= 0) then
     382              :             if (dbg) write(*,*) 'set_qs ierr in adjust mesh'
     383            0 :             s% result_reason = adjust_mesh_failed
     384            0 :             s% termination_code = t_adjust_mesh_failed
     385            0 :             remesh = terminate
     386            0 :             call dealloc
     387            0 :             return
     388              :          end if
     389              : 
     390              :          ! testing -- check for q strictly decreasing
     391        10623 :          do k = 2, nz
     392        10623 :             if (xq_new(k) <= xq_new(k-1)) then
     393            0 :                write(*,3) 'bad xq_new before call do_mesh_adjust', &
     394            0 :                   k, nz, xq_new(k), xq_new(k-1), dq_new(k-1), xq_new(k-1) + dq_new(k-1)
     395            0 :                ierr = -1
     396            0 :                call dealloc
     397            0 :                return
     398              :                call mesa_error(__FILE__,__LINE__,'debug adjust mesh')
     399              :             end if
     400              :          end do
     401              : 
     402           10 :          call set_m_and_dm(s)
     403           10 :          call set_dm_bar(s, s% nz, s% dm, s% dm_bar)
     404              : 
     405              :          if (dbg_remesh) write(*,*) 'call do_mesh_adjust'
     406              : 
     407              :          call do_mesh_adjust( &
     408              :             s, nz, nz_old, prv% xh, prv% xa, &
     409              :             prv% energy, prv% eta, prv% lnd, prv% lnPgas, &
     410              :             prv% j_rot, prv% i_rot, prv% omega, prv% D_omega, &
     411              :             prv% mlt_vc, prv% lnT, prv% w, specific_PE, specific_KE, &
     412              :             prv% m, prv% r, prv% rho, prv% dPdr_dRhodr_info, prv% D_mix, &
     413           10 :             cell_type, comes_from, prv% dq, xq_old, s% xh, s% xa, s% dq, xq_new, ierr)
     414           10 :          if (ierr /= 0) then
     415            0 :             s% retry_message = 'do_mesh_adjust failed in mesh_adjust'
     416            0 :             if (s% report_ierr) write(*, *) s% retry_message
     417            0 :             s% termination_code = t_adjust_mesh_failed
     418            0 :             remesh = terminate
     419            0 :             call dealloc
     420            0 :             return
     421              :          end if
     422              :          if (dbg_remesh) write(*,*) 'back from do_mesh_adjust'
     423              : 
     424              :          ! restore prev_mesh info
     425        12105 :          do k=1, s% prev_mesh_nz
     426       205615 :             s% prev_mesh_xa(:,k) = prv% prev_mesh_xa(:,k)
     427       108855 :             s% prev_mesh_xh(:,k) = prv% prev_mesh_xh(:,k)
     428        12095 :             s% prev_mesh_j_rot(k) = prv% prev_mesh_j_rot(k)
     429        12095 :             s% prev_mesh_omega(k) = prv% prev_mesh_omega(k)
     430        12095 :             s% prev_mesh_dq(k) = prv% prev_mesh_dq(k)
     431        12105 :             s% prev_mesh_mlt_vc(k) = prv% prev_mesh_mlt_vc(k)
     432              :          end do
     433              : 
     434              :          ! restore ST info (for time smoothing)
     435        12105 :          do k=1, s% prev_mesh_nz
     436        12095 :             s% prev_mesh_D_ST_start(k) = prv% prev_mesh_D_ST_start(k)
     437        12105 :             s% prev_mesh_nu_ST_start(k) = prv% prev_mesh_nu_ST_start(k)
     438              :          end do
     439              : 
     440           10 :          if (s% show_mesh_changes) then
     441              :             ! note: do_mesh_adjust can change cell_type from unchanged to revised
     442              :             ! so need to recount
     443            0 :             unchanged=0; split=0; merged=0; revised=0
     444            0 :             do k=1,nz
     445            0 :                select case(cell_type(k))
     446              :                case (unchanged_type)
     447            0 :                   unchanged = unchanged + 1
     448              :                case (split_type)
     449            0 :                   split = split + 1
     450              :                case (merged_type)
     451            0 :                   merged = merged + 1
     452              :                case (revised_type)
     453            0 :                   revised = revised + 1
     454              :                case default
     455            0 :                   write(*,3) 'bad value for cell_type(k)', k, cell_type(k)
     456            0 :                   call mesa_error(__FILE__,__LINE__,'adjust_mesh')
     457              :                end select
     458              :             end do
     459            0 :             write(*,*) '      mesh_plan nz_new', nz_new
     460            0 :             write(*,*) '             unchanged', unchanged
     461            0 :             write(*,*) '                 split', split
     462            0 :             write(*,*) '                merged', merged
     463            0 :             write(*,*) '               revised', revised
     464            0 :             write(*,'(A)')
     465              : 
     466              :          end if
     467              : 
     468              :          ! testing
     469        10623 :          do k = 2, nz
     470        10623 :             if (xq_new(k) <= xq_new(k-1)) then
     471            0 :                write(*,3) 'bad xq_new after call do_mesh_adjust', k, nz, xq_new(k), xq_new(k-1)
     472            0 :                ierr = -1
     473            0 :                call dealloc
     474            0 :                return
     475              :                call mesa_error(__FILE__,__LINE__,'debug: adjust mesh')
     476              :             end if
     477              :          end do
     478              : 
     479           10 :          if (ierr /= 0 .and. s% report_ierr) then
     480            0 :             write(*,*) 'mesh_adjust problem'
     481            0 :             write(*,*) 'doing mesh_call_number', s% mesh_call_number
     482            0 :             write(*,*) 's% model_number', s% model_number
     483            0 :             write(*,*) 's% nz', s% nz
     484            0 :             write(*,*) 's% num_retries', s% num_retries
     485            0 :             write(*,'(A)')
     486              :          end if
     487              : 
     488              :          if (remesh /= keep_going) then
     489              :             s% result_reason = adjust_mesh_failed
     490              :             s% retry_message = 'mesh_adjust failed'
     491              :             if (s% report_ierr) write(*, *) s% retry_message
     492              :             call dealloc
     493              :             return
     494              :          end if
     495              : 
     496           10 :          if (s% rotation_flag) then
     497            0 :             J_tot2 = total_angular_momentum(s)
     498            0 :             if (abs(J_tot2 - J_tot1) > 1d-2*max(J_tot1,J_tot2)) then
     499            0 :                s% retry_message = 'adjust_mesh failed'
     500            0 :                if (s% report_ierr) then
     501            0 :                   write(*,2) 'adjust_mesh J_tot', &
     502            0 :                      s% model_number, (J_tot2 - J_tot1)/J_tot2, J_tot2, J_tot1
     503            0 :                   write(*,*) 'failure to conserve angular momentum in adjust_mesh'
     504            0 :                   write(*,'(A)')
     505              :                end if
     506            0 :                ierr = -1
     507            0 :                call dealloc
     508            0 :                return
     509              :                !call mesa_error(__FILE__,__LINE__,'adjust_mesh J_tot conservation error')
     510              :             end if
     511              :          end if
     512              : 
     513           10 :          call dealloc
     514              : 
     515           20 :          if (dbg_remesh .or. dbg) write(*,*) 'finished adjust mesh'
     516              : 
     517              :          contains
     518              : 
     519           10 :          subroutine set_types_of_new_cells(cell_type, ierr)
     520              :             integer, pointer :: cell_type(:)
     521              :             integer, intent(out) :: ierr
     522              :             integer :: k, k_old, new_type
     523              : 
     524              :             include 'formats'
     525           10 :             ierr = 0
     526           10 :             unchanged=0; split=0; merged=0; revised=0
     527              : 
     528        10633 :             do k=1,nz_new
     529        10623 :                k_old = comes_from(k)
     530        10623 :                new_type = -111
     531        10623 :                if (xq_new(k) < xq_old(k_old)) then
     532            0 :                   write(*,*) 'xq_new(k) < xq_old(k_old)'
     533            0 :                   write(*,2) 'xq_new(k)', k, xq_new(k)
     534            0 :                   write(*,2) 'xq_old(k_old)', k_old, xq_old(k_old)
     535            0 :                   write(*,*) 'adjust mesh set_types_of_new_cells'
     536            0 :                   ierr = -1
     537            0 :                   return
     538        10623 :                else if (xq_new(k) > xq_old(k_old)) then
     539              :                   new_type = split_type
     540        10623 :                else if (k_old == nz_old) then
     541           10 :                   if (k == nz_new) then
     542              :                      new_type = unchanged_type
     543              :                   else
     544            0 :                      new_type = split_type
     545              :                   end if
     546        10613 :                else if (k == nz_new) then
     547              :                   new_type = split_type
     548              :                else  ! k_old < nz_old .and. k < nz .and. xq_new(k) == xq_old(k_old)
     549        10613 :                   if (xq_new(k+1) == xq_old(k_old+1)) then
     550              :                      new_type = unchanged_type
     551         1472 :                   else if (xq_new(k+1) > xq_old(k_old+1)) then
     552              :                      new_type = merged_type
     553              :                   else
     554            0 :                      new_type = split_type
     555              :                   end if
     556              :                end if
     557        10623 :                cell_type(k) = new_type
     558           10 :                select case (new_type)
     559              :                   case (split_type)
     560            0 :                      split = split + 1
     561              :                   case (unchanged_type)
     562         9151 :                      unchanged = unchanged + 1
     563              :                   case (merged_type)
     564         1472 :                      merged = merged + 1
     565              :                   case default
     566              :                      write(*,*) 'failed to set new_type in adjust mesh set_types_of_new_cells'
     567              :                      ierr = -1
     568        10623 :                      return
     569              :                end select
     570              :             end do
     571              : 
     572           10 :             if (unchanged + split + merged /= nz_new) then
     573            0 :                write(*,2) 'unchanged + split + merged', unchanged + split + merged
     574            0 :                write(*,2) 'nz_new', nz_new
     575            0 :                ierr = -1
     576            0 :                return
     577              :             end if
     578              : 
     579           10 :          end subroutine set_types_of_new_cells
     580              : 
     581              : 
     582           10 :          subroutine nullify_work_ptrs
     583              :             nullify( &
     584           10 :                which_gval, xq_old, xq_new, dq_new, comes_from, &
     585           10 :                delta_gval_max, do_not_split, gvals, cell_type)
     586              :          end subroutine nullify_work_ptrs
     587              : 
     588              : 
     589           10 :          subroutine do_alloc1(ierr)
     590              :             integer, intent(out) :: ierr
     591              :             ierr = 0
     592           10 :             call get_integer_work_array(s, comes_from, nz, nz_alloc_extra, ierr)
     593           10 :             if (ierr /= 0) return
     594           10 :             call get_integer_work_array(s, which_gval, nz, nz_alloc_extra, ierr)
     595           10 :             if (ierr /= 0) return
     596           10 :             call do_work_arrays1(.true., ierr)
     597           10 :             alloc_level = 1
     598              :          end subroutine do_alloc1
     599              : 
     600              : 
     601           10 :          subroutine do_dealloc1
     602           10 :             call return_integer_work_array(s, comes_from)
     603           10 :             call return_integer_work_array(s, which_gval)
     604           10 :             call do_work_arrays1(.false., ierr)
     605           10 :          end subroutine do_dealloc1
     606              : 
     607              : 
     608           20 :          subroutine do_work_arrays1(alloc_flag, ierr)
     609              :             logical, intent(in) :: alloc_flag
     610              :             integer, intent(out) :: ierr
     611              :             logical, parameter :: crit = .false.
     612              :             ierr = 0
     613              :             call work_array(s, alloc_flag, crit, &
     614           20 :                specific_PE, nz, nz_alloc_extra, 'adjust_mesh', ierr)
     615           20 :             if (ierr /= 0) return
     616              :             call work_array(s, alloc_flag, crit, &
     617           20 :                specific_KE, nz, nz_alloc_extra, 'adjust_mesh', ierr)
     618           20 :             if (ierr /= 0) return
     619              :             call work_array(s, alloc_flag, crit, &
     620           20 :                xq_old, nz, nz_alloc_extra, 'adjust_mesh', ierr)
     621           20 :             if (ierr /= 0) return
     622              :             call work_array(s, alloc_flag, crit, &
     623           20 :                xq_new, nz, nz_alloc_extra, 'adjust_mesh', ierr)
     624           20 :             if (ierr /= 0) return
     625              :             call work_array(s, alloc_flag, crit, &
     626           20 :                dq_new, nz, nz_alloc_extra, 'adjust_mesh', ierr)
     627              :             if (ierr /= 0) return
     628              :          end subroutine do_work_arrays1
     629              : 
     630              : 
     631           10 :          subroutine do_alloc2(ierr)
     632              :             integer, intent(out) :: ierr
     633              :             ierr = 0
     634           10 :             call do_work_arrays2(.true., ierr)
     635           10 :             if (ierr /= 0) return
     636           10 :             call get_logical_work_array(s, do_not_split, nz, nz_alloc_extra, ierr)
     637           10 :             if (ierr /= 0) return
     638           10 :             gvals(1:nz,1:num_gvals) => gvals1(1:nz*num_gvals)
     639           10 :             alloc_level = 2
     640              :          end subroutine do_alloc2
     641              : 
     642              : 
     643           10 :          subroutine do_dealloc2
     644           10 :             call do_work_arrays2(.false., ierr)
     645           10 :             if (ierr /= 0) return
     646           10 :             call return_logical_work_array(s, do_not_split)
     647              :          end subroutine do_dealloc2
     648              : 
     649              : 
     650           20 :          subroutine do_work_arrays2(alloc_flag, ierr)
     651              :             logical, intent(in) :: alloc_flag
     652              :             integer, intent(out) :: ierr
     653              :             logical, parameter :: crit = .false.
     654              :             ierr = 0
     655              :             call work_array(s, alloc_flag, crit, &
     656           20 :                delta_gval_max, nz, nz_alloc_extra, 'adjust_mesh', ierr)
     657           20 :             if (ierr /= 0) return
     658              :             call work_array(s, alloc_flag, crit, &
     659           20 :                gvals1, nz*num_gvals, nz_alloc_extra, 'adjust_mesh', ierr)
     660              :             if (ierr /= 0) return
     661              :          end subroutine do_work_arrays2
     662              : 
     663              : 
     664           10 :          subroutine do_alloc3(ierr)
     665              :             integer, intent(out) :: ierr
     666              :             ierr = 0
     667           10 :             call get_integer_work_array(s, cell_type, nz, nz_alloc_extra, ierr)
     668           10 :             alloc_level = 3
     669           10 :          end subroutine do_alloc3
     670              : 
     671              : 
     672           10 :          subroutine do_dealloc3
     673           10 :             call return_integer_work_array(s, cell_type)
     674           10 :          end subroutine do_dealloc3
     675              : 
     676              : 
     677           10 :          subroutine dealloc
     678           10 :             if (alloc_level >= 3) call do_dealloc3
     679           10 :             if (alloc_level >= 2) call do_dealloc2
     680           10 :             if (alloc_level >= 1) call do_dealloc1
     681           10 :          end subroutine dealloc
     682              : 
     683              : 
     684           10 :          subroutine get_num_gvals
     685              :             use mesh_functions, only: num_mesh_functions
     686           10 :             num_gvals = num_mesh_functions(s)
     687           10 :          end subroutine get_num_gvals
     688              : 
     689              : 
     690              :          subroutine end_dump
     691              :             write(*,*) '      model_num', s% model_number
     692              :             write(*,*) '         nz_old', nz_old
     693              :             write(*,*) '         nz_new', nz_new
     694              :             write(*,*) 'finished dump_mesh'
     695              :             call mesa_error(__FILE__,__LINE__,'debugging: end_dump remesh')
     696           10 :          end subroutine end_dump
     697              : 
     698              :       end function remesh
     699              : 
     700              :       end module adjust_mesh
        

Generated by: LCOV version 2.0-1