[Commits] [svn:einsteintoolkit] GRHydro/trunk/ (Rev. 214)
cott at tapir.caltech.edu
cott at tapir.caltech.edu
Sun Feb 6 10:22:28 CST 2011
User: cott
Date: 2011/02/06 10:22 AM
Modified:
/trunk/
param.ccl
/trunk/src/
GRHydro_Con2Prim.F90
Log:
* update to hot c2p routine: allow for a failsafe mode
that handles off-the-table issues with tabulated
EOS.
File Changes:
Directory: /trunk/src/
======================
File [modified]: GRHydro_Con2Prim.F90
Delta lines: +101 -6
===================================================================
--- trunk/src/GRHydro_Con2Prim.F90 2011-02-05 16:59:37 UTC (rev 213)
+++ trunk/src/GRHydro_Con2Prim.F90 2011-02-06 16:22:28 UTC (rev 214)
@@ -522,8 +522,10 @@
! begin EOS Omni vars
integer :: n,keytemp,anyerr,keyerr(1)
real*8 :: xpress,temp0
+ integer :: nfudgemax,nf
n=1;keytemp=0;anyerr=0;keyerr(1)=0
temp0 = 0.0d0;xpress = 0.0d0
+ nf=0;nfudgemax=10
! end EOS Omni vars
failinfomode = 1
@@ -567,8 +569,39 @@
write(warnline,"(A7,i8)") "code: ",keyerr(1)
call CCTK_WARN(failinfomode,warnline)
write(warnline,"(A10,i5)") "reflevel: ", GRHydro_reflevel
- call CCTK_WARN(failinfomode,warnline)
- call CCTK_WARN(failwarnmode,"Aborting!!!")
+ if(keyerr(1).eq.667.and.GRHydro_eos_hot_eps_fix.ne.0) then
+ ! Handling of the case when no new temperature can be
+ ! found for a given epsilon. The amount of times
+ ! we get to this place should be monitored, as this
+ ! 'failsafe' mode creates artificial heat.
+ nf = 0
+ do while(anyerr.ne.0.and.nf.le.nfudgemax)
+ anyerr = 0
+ epsilon = epsilon + abs(epsilon)*0.05d0
+ call EOS_Omni_press(handle,keytemp,GRHydro_eos_rf_prec,n,&
+ rho,epsilon,temp,ye,xpress,keyerr,anyerr)
+ nf = nf + 1
+ enddo
+ write(warnline,"(A30,i5)") "Iterations of heat injection: ",nf
+ call CCTK_WARN(failinfomode,warnline)
+ write(warnline,"(3i5,1P10E15.6)") ii,jj,kk,x,y,z
+ call CCTK_WARN(failinfomode,warnline)
+ if(nf.gt.nfudgemax) then
+ call CCTK_WARN(failinfomode,"EOS error in c2p 1: injected heat too many times")
+ write(warnline,"(3i5,1P10E15.6)") ii,jj,kk,x,y,z
+ call CCTK_WARN(failinfomode,warnline)
+ write(warnline,"(1P10E15.6)") rho,epsilon,temp,ye
+ call CCTK_WARN(failinfomode,warnline)
+ write(warnline,"(A7,i8)") "code: ",keyerr(1)
+ call CCTK_WARN(failinfomode,warnline)
+ write(warnline,"(A10,i5)") "reflevel: ", GRHydro_reflevel
+ call CCTK_WARN(failinfomode,warnline)
+ call CCTK_WARN(failwarnmode,"Aborting!!!")
+ endif
+ else
+ call CCTK_WARN(failinfomode,warnline)
+ call CCTK_WARN(failwarnmode,"Aborting!!!")
+ endif
endif
endif
@@ -611,8 +644,39 @@
write(warnline,"(A7,i8)") "code: ",keyerr(1)
call CCTK_WARN(failinfomode,warnline)
write(warnline,"(A10,i5)") "reflevel: ", GRHydro_reflevel
- call CCTK_WARN(failinfomode,warnline)
- call CCTK_WARN(failwarnmode,"Aborting!!!")
+ if(keyerr(1).eq.667.and.GRHydro_eos_hot_eps_fix.ne.0) then
+ ! Handling of the case when no new temperature can be
+ ! found for a given epsilon. The amount of times
+ ! we get to this place should be monitored, as this
+ ! 'failsafe' mode creates artificial heat.
+ nf = 0
+ do while(anyerr.ne.0.and.nf.le.nfudgemax)
+ anyerr = 0
+ epsilon = epsilon + abs(epsilon)*0.05d0
+ call EOS_Omni_press(handle,keytemp,GRHydro_eos_rf_prec,n,&
+ rho,epsilon,temp,ye,xpress,keyerr,anyerr)
+ nf = nf + 1
+ enddo
+ write(warnline,"(A30,i5)") "Iterations of heat injection: ",nf
+ call CCTK_WARN(failinfomode,warnline)
+ write(warnline,"(3i5,1P10E15.6)") ii,jj,kk,x,y,z
+ call CCTK_WARN(failinfomode,warnline)
+ if(nf.gt.nfudgemax) then
+ call CCTK_WARN(failinfomode,"EOS error in c2p 1: injected heat too many times")
+ write(warnline,"(3i5,1P10E15.6)") ii,jj,kk,x,y,z
+ call CCTK_WARN(failinfomode,warnline)
+ write(warnline,"(1P10E15.6)") rho,epsilon,temp,ye
+ call CCTK_WARN(failinfomode,warnline)
+ write(warnline,"(A7,i8)") "code: ",keyerr(1)
+ call CCTK_WARN(failinfomode,warnline)
+ write(warnline,"(A10,i5)") "reflevel: ", GRHydro_reflevel
+ call CCTK_WARN(failinfomode,warnline)
+ call CCTK_WARN(failwarnmode,"Aborting!!!")
+ endif
+ else
+ call CCTK_WARN(failinfomode,warnline)
+ call CCTK_WARN(failwarnmode,"Aborting!!!")
+ endif
endif
endif
f = pold - xpress
@@ -673,8 +737,39 @@
write(warnline,"(A7,i8)") "code: ",keyerr(1)
call CCTK_WARN(failinfomode,warnline)
write(warnline,"(A10,i5)") "reflevel: ", GRHydro_reflevel
- call CCTK_WARN(failinfomode,warnline)
- call CCTK_WARN(failwarnmode,"Aborting!!!")
+ if(keyerr(1).eq.667.and.GRHydro_eos_hot_eps_fix.ne.0) then
+ ! Handling of the case when no new temperature can be
+ ! found for a given epsilon. The amount of times
+ ! we get to this place should be monitored, as this
+ ! 'failsafe' mode creates artificial heat.
+ nf = 0
+ do while(anyerr.ne.0.and.nf.le.nfudgemax)
+ anyerr = 0
+ epsilon = epsilon + abs(epsilon)*0.05d0
+ call EOS_Omni_press(handle,keytemp,GRHydro_eos_rf_prec,n,&
+ rho,epsilon,temp,ye,xpress,keyerr,anyerr)
+ nf = nf + 1
+ enddo
+ write(warnline,"(A30,i5)") "Iterations of heat injection: ",nf
+ call CCTK_WARN(failinfomode,warnline)
+ write(warnline,"(3i5,1P10E15.6)") ii,jj,kk,x,y,z
+ call CCTK_WARN(failinfomode,warnline)
+ if(nf.gt.nfudgemax) then
+ call CCTK_WARN(failinfomode,"EOS error in c2p 1: injected heat too many times")
+ write(warnline,"(3i5,1P10E15.6)") ii,jj,kk,x,y,z
+ call CCTK_WARN(failinfomode,warnline)
+ write(warnline,"(1P10E15.6)") rho,epsilon,temp,ye
+ call CCTK_WARN(failinfomode,warnline)
+ write(warnline,"(A7,i8)") "code: ",keyerr(1)
+ call CCTK_WARN(failinfomode,warnline)
+ write(warnline,"(A10,i5)") "reflevel: ", GRHydro_reflevel
+ call CCTK_WARN(failinfomode,warnline)
+ call CCTK_WARN(failwarnmode,"Aborting!!!")
+ endif
+ else
+ call CCTK_WARN(failinfomode,warnline)
+ call CCTK_WARN(failwarnmode,"Aborting!!!")
+ endif
endif
endif
Directory: /trunk/
==================
File [modified]: param.ccl
Delta lines: +15 -3
===================================================================
--- trunk/param.ccl 2011-02-05 16:59:37 UTC (rev 213)
+++ trunk/param.ccl 2011-02-06 16:22:28 UTC (rev 214)
@@ -251,11 +251,23 @@
} "Ideal_Fluid"
-real GRHydro_eos_rf_prec "Precision to which root finding should be carried out"
+real GRHydro_eos_rf_prec "Precision to which root finding should be carried out" STEERABLE=ALWAYS
{
(0.0:* :: "anything larger than 0 goes"
} 1.0e-8
+# cott at tapir.caltech.edu:
+# The below parameter controls the handling of EOS_Omni keyerr=667
+# failures. In these failures, no new temperature can be found for the
+# eps it was called with. This may happen, for example, when a strong
+# shock appears for the first time. Code checking this parameter will,
+# if it is set to true, locally inject heat to fix the problem.
+# This normally happens only very rarely, but one must monitor total energy
+# conservation to check that this does ruin energy conservation.
+boolean GRHydro_eos_hot_eps_fix "Activate quasi-failsafe mode for hot EOSs" STEERABLE=ALWAYS
+{
+} "no"
+
####################### Other Parameters ##############################
#Parameters controlling conservative <-> primitive change.
@@ -279,12 +291,12 @@
0: :: "Positive"
} 1.e-10
-real GRHydro_perc_ptol "Tolerance for primitive variable solve (percent)"
+real GRHydro_perc_ptol "Tolerance for primitive variable solve (percent)" STEERABLE=ALWAYS
{
0: :: "Do we really want both tolerances?"
} 1.e-8
-real GRHydro_del_ptol "Tolerance for primitive variable solve (absolute)"
+real GRHydro_del_ptol "Tolerance for primitive variable solve (absolute)" STEERABLE=ALWAYS
{
0: :: "Do we really want both tolerances?"
} 1.e-18
More information about the Commits
mailing list