/*@@ @file GRHydro_Startup.F90 @date Sun Feb 10 00:02:52 2002 @author Ian Hawke @desc Startup banner. @enddesc @@*/ #include "cctk.h" #include "cctk_Parameters.h" #include "cctk_Functions.h" #include "util_ErrorCodes.h" #include "util_Table.h" /*@@ @routine GRHydro_Startup @date Sun Feb 10 00:03:09 2002 @author Ian Hawke @desc Startup banner. @enddesc @calls @calledby @history @endhistory @@*/ integer function GRHydro_Startup() USE GRHydro_Scalars implicit none DECLARE_CCTK_PARAMETERS DECLARE_CCTK_FUNCTIONS CCTK_INT :: ierr, flags, table_handle, var, strlen, strend, n_base_indep_gfs CCTK_INT, dimension(:), allocatable :: indep_gfs CCTK_INT, dimension(4) :: dep_gfs character(len=256) :: eos_name_param, var_names_param, var_names, var_gfs call CCTK_RegisterBanner(ierr, "GRHydro: relativistic hydrodynamics, no ice.") !!$ The number of independent variables is different in the polytropic or general case if (CCTK_EQUALS(GRHydro_eos_type, "Polytype")) then n_base_indep_gfs = 1 else n_base_indep_gfs = 2 end if allocate(indep_gfs(n_base_indep_gfs + eosgeneral_n_indeps)) !!$ Set up EOS calls. if (use_eosgeneral .ne. 0) then !!$ First, set up the minimum pressure eosgeneral_pmin = 1.d-28 !!$ First, "Plus" boundary extended flags = UTIL_TABLE_FLAGS_CASE_INSENSITIVE call Util_TableCreate(table_handle, flags) call CCTK_FortranString(strlen, eosgeneral_name, eos_name_param) eos_name_param = trim(eos_name_param) call Util_TableSetString(ierr, table_handle, & eos_name_param, "EOS Name") call CCTK_FortranString(strlen, eosgeneral_indep_names, & var_names_param) if (CCTK_EQUALS(GRHydro_eos_type, "Polytype")) then var_names = "Rho "//var_names_param(1:strlen) else var_names = "Rho SpecificInternalEnergy "//var_names_param(1:strlen) end if var_names = trim(var_names) call Util_TableSetString(ierr, table_handle, & var_names, "Independent variable names") call Util_TableSetString(ierr, table_handle, & "Pressure DPressureDSpecificInternalEnergy c_s^2", & "Dependent variable names") if (CCTK_EQUALS(GRHydro_eos_type, "Polytype")) then call Util_TableSetInt(ierr, table_handle, & 1 + eosgeneral_n_indeps, "N independent variables") else call Util_TableSetInt(ierr, table_handle, & 2 + eosgeneral_n_indeps, "N independent variables") end if call Util_TableSetInt(ierr, table_handle, & 3, "N dependent variables") if (CCTK_EQUALS(GRHydro_eos_type, "Polytype")) then call CCTK_VarIndex(indep_gfs(1), "GRHydro::rhoplus") else call CCTK_VarIndex(indep_gfs(1), "GRHydro::rhoplus") call CCTK_VarIndex(indep_gfs(2), "GRHydro::epsplus") end if call CCTK_VarIndex(dep_gfs(1), "GRHydro::pressplus") call CCTK_VarIndex(dep_gfs(2), "GRHydro::eos_dpdeps_p") call CCTK_VarIndex(dep_gfs(3), "GRHydro::eos_cs2_p") call CCTK_FortranString(strlen, eosgeneral_indep_plus_gfs, var_gfs) var_gfs = trim(var_gfs) strend = 1 do var = 1, eosgeneral_n_indeps strend = scan(var_gfs, " ") if (strend > 0) then call CCTK_VarIndex( indep_gfs(n_base_indep_gfs+var), var_gfs(1:strend) ) var_gfs = var_gfs(strend+1:) else if (var .ne. eosgeneral_n_indeps) then call CCTK_WARN(0, "Something wrong in the eos string") end if call CCTK_VarIndex( indep_gfs(n_base_indep_gfs+var), var_gfs ) end if end do if (CCTK_EQUALS(GRHydro_eos_type, "Polytype")) then call Util_TableSetIntArray(ierr, table_handle, 1 + eosgeneral_n_indeps, & indep_gfs(1:1 + eosgeneral_n_indeps), "Independent GFs") else call Util_TableSetIntArray(ierr, table_handle, 2 + eosgeneral_n_indeps, & indep_gfs(1:2 + eosgeneral_n_indeps), "Independent GFs") end if call Util_TableSetIntArray(ierr, table_handle, 3, dep_gfs, & "Dependent GFs") EOS_RiemannCallPlus = EOS_SetupCall(table_handle) !!$ Second, "Minus" boundary extended !!$ Many of the table entries are the same if (CCTK_EQUALS(GRHydro_eos_type, "Polytype")) then call CCTK_VarIndex(indep_gfs(1), "GRHydro::rhominus") else call CCTK_VarIndex(indep_gfs(1), "GRHydro::rhominus") call CCTK_VarIndex(indep_gfs(2), "GRHydro::epsminus") end if call CCTK_VarIndex(dep_gfs(1), "GRHydro::pressminus") call CCTK_VarIndex(dep_gfs(2), "GRHydro::eos_dpdeps_m") call CCTK_VarIndex(dep_gfs(3), "GRHydro::eos_cs2_m") call CCTK_FortranString(strlen, eosgeneral_indep_minus_gfs, var_gfs) var_gfs = trim(var_gfs) strend = 1 do var = 1, eosgeneral_n_indeps strend = scan(var_gfs, " ") if (strend > 0) then call CCTK_VarIndex( indep_gfs(n_base_indep_gfs+var), var_gfs(1:strend) ) var_gfs = var_gfs(strend+1:) else if (var .ne. eosgeneral_n_indeps) then call CCTK_WARN(0, "Something wrong in the eos string") end if call CCTK_VarIndex( indep_gfs(n_base_indep_gfs+var), var_gfs ) end if end do if (CCTK_EQUALS(GRHydro_eos_type, "Polytype")) then call Util_TableSetIntArray(ierr, table_handle, 1 + eosgeneral_n_indeps, & indep_gfs(1:1 + eosgeneral_n_indeps), "Independent GFs") else call Util_TableSetIntArray(ierr, table_handle, 2 + eosgeneral_n_indeps, & indep_gfs(1:2 + eosgeneral_n_indeps), "Independent GFs") end if call Util_TableSetIntArray(ierr, table_handle, 3, dep_gfs, & "Dependent GFs") EOS_RiemannCallMinus = EOS_SetupCall(table_handle) !!$ Third, the "Average" state for the Roe solver if (CCTK_EQUALS(GRHydro_eos_type, "Polytype")) then call CCTK_VarIndex(indep_gfs(1), "GRHydro::rho_ave") else call CCTK_VarIndex(indep_gfs(1), "GRHydro::rho_ave") call CCTK_VarIndex(indep_gfs(2), "GRHydro::eps_ave") end if call CCTK_VarIndex(dep_gfs(1), "GRHydro::press_ave") call CCTK_VarIndex(dep_gfs(2), "GRHydro::eos_dpdeps_ave") call CCTK_VarIndex(dep_gfs(3), "GRHydro::eos_cs2_ave") call CCTK_FortranString(strlen, eosgeneral_indep_gfs, var_gfs) var_gfs = trim(var_gfs) strend = 1 do var = 1, eosgeneral_n_indeps strend = scan(var_gfs, " ") if (strend > 0) then call CCTK_VarIndex( indep_gfs(n_base_indep_gfs+var), var_gfs(1:strend) ) var_gfs = var_gfs(strend+1:) else if (var .ne. eosgeneral_n_indeps) then call CCTK_WARN(0, "Something wrong in the eos string") end if call CCTK_VarIndex( indep_gfs(n_base_indep_gfs+var), var_gfs ) end if end do if (CCTK_EQUALS(GRHydro_eos_type, "Polytype")) then call Util_TableSetIntArray(ierr, table_handle, 1 + eosgeneral_n_indeps, & indep_gfs(1:1 + eosgeneral_n_indeps), "Independent GFs") else call Util_TableSetIntArray(ierr, table_handle, 2 + eosgeneral_n_indeps, & indep_gfs(1:2 + eosgeneral_n_indeps), "Independent GFs") end if call Util_TableSetIntArray(ierr, table_handle, 3, dep_gfs, & "Dependent GFs") EOS_RoeAverageCall = EOS_SetupCall(table_handle) !!$ Fourth, the "Con2Prim" call. !!$ This sets different variables. if (CCTK_EQUALS(GRHydro_eos_type, "Polytype")) then call CCTK_VarIndex(indep_gfs(1), "HydroBase::rho") call Util_TableSetString(ierr, table_handle, & "Pressure DPressureDSpecificInternalEnergy DPressureDRho SpecificInternalEnergy", & "Dependent variable names") call CCTK_VarIndex(dep_gfs(1), "HydroBase::press") call CCTK_VarIndex(dep_gfs(2), "GRHydro::eos_dpdeps_temp") call CCTK_VarIndex(dep_gfs(3), "GRHydro::eos_dpdrho_temp") call CCTK_VarIndex(dep_gfs(4), "HydroBase::eps") else call CCTK_VarIndex(indep_gfs(1), "HydroBase::rho") call CCTK_VarIndex(indep_gfs(2), "HydroBase::eps") call Util_TableSetString(ierr, table_handle, & "Pressure DPressureDSpecificInternalEnergy DPressureDRho", & "Dependent variable names") call CCTK_VarIndex(dep_gfs(1), "HydroBase::press") call CCTK_VarIndex(dep_gfs(2), "GRHydro::eos_dpdeps_temp") call CCTK_VarIndex(dep_gfs(3), "GRHydro::eos_dpdrho_temp") end if if (CCTK_EQUALS(GRHydro_eos_type, "Polytype")) then call Util_TableSetIntArray(ierr, table_handle, 1 + eosgeneral_n_indeps, & indep_gfs(1:1 + eosgeneral_n_indeps), "Independent GFs") call Util_TableSetIntArray(ierr, table_handle, 4, dep_gfs, & "Dependent GFs") else call Util_TableSetIntArray(ierr, table_handle, 2 + eosgeneral_n_indeps, & indep_gfs(1:2 + eosgeneral_n_indeps), "Independent GFs") call Util_TableSetIntArray(ierr, table_handle, 3, dep_gfs, & "Dependent GFs") end if EOS_Con2PrimCall = EOS_SetupCall(table_handle) !!$ Fifth, the "Prim2Con" (boundary) calls. !!$ Again, different variables are set. if (CCTK_EQUALS(GRHydro_eos_type, "Polytype")) then call CCTK_VarIndex(indep_gfs(1), "GRHydro::rhominus") call Util_TableSetString(ierr, table_handle, & "Pressure SpecificInternalEnergy", & "Dependent variable names") call CCTK_VarIndex(dep_gfs(1), "GRHydro::pressminus") call CCTK_VarIndex(dep_gfs(2), "GRHydro::epsminus") else call CCTK_VarIndex(indep_gfs(1), "GRHydro::rhominus") call CCTK_VarIndex(indep_gfs(2), "GRHydro::epsminus") call Util_TableSetString(ierr, table_handle, & "Pressure", & "Dependent variable names") call CCTK_VarIndex(dep_gfs(1), "GRHydro::pressminus") end if call CCTK_FortranString(strlen, eosgeneral_indep_minus_gfs, var_gfs) var_gfs = trim(var_gfs) strend = 1 do var = 1, eosgeneral_n_indeps strend = scan(var_gfs, " ") if (strend > 0) then call CCTK_VarIndex( indep_gfs(n_base_indep_gfs+var), var_gfs(1:strend) ) var_gfs = var_gfs(strend+1:) else if (var .ne. eosgeneral_n_indeps) then call CCTK_WARN(0, "Something wrong in the eos string") end if call CCTK_VarIndex( indep_gfs(n_base_indep_gfs+var), var_gfs ) end if end do if (CCTK_EQUALS(GRHydro_eos_type, "Polytype")) then call Util_TableSetIntArray(ierr, table_handle, 1 + eosgeneral_n_indeps, & indep_gfs(1:1 + eosgeneral_n_indeps), "Independent GFs") call Util_TableSetIntArray(ierr, table_handle, 2, dep_gfs, & "Dependent GFs") else call Util_TableSetIntArray(ierr, table_handle, 2 + eosgeneral_n_indeps, & indep_gfs(1:2 + eosgeneral_n_indeps), "Independent GFs") call Util_TableSetIntArray(ierr, table_handle, 1, dep_gfs, & "Dependent GFs") end if EOS_Prim2ConBndCallMinus = EOS_SetupCall(table_handle) if (CCTK_EQUALS(GRHydro_eos_type, "Polytype")) then call CCTK_VarIndex(indep_gfs(1), "GRHydro::rhoplus") call Util_TableSetString(ierr, table_handle, & "Pressure SpecificInternalEnergy", & "Dependent variable names") call CCTK_VarIndex(dep_gfs(1), "GRHydro::pressplus") call CCTK_VarIndex(dep_gfs(2), "GRHydro::epsplus") else call CCTK_VarIndex(indep_gfs(1), "GRHydro::rhoplus") call CCTK_VarIndex(indep_gfs(2), "GRHydro::epsplus") call Util_TableSetString(ierr, table_handle, & "Pressure", & "Dependent variable names") call CCTK_VarIndex(dep_gfs(1), "GRHydro::pressplus") end if call CCTK_FortranString(strlen, eosgeneral_indep_plus_gfs, var_gfs) var_gfs = trim(var_gfs) strend = 1 do var = 1, eosgeneral_n_indeps strend = scan(var_gfs, " ") if (strend > 0) then call CCTK_VarIndex( indep_gfs(n_base_indep_gfs+var), var_gfs(1:strend) ) var_gfs = var_gfs(strend+1:) else if (var .ne. eosgeneral_n_indeps) then call CCTK_WARN(0, "Something wrong in the eos string") end if call CCTK_VarIndex( indep_gfs(n_base_indep_gfs+var), var_gfs ) end if end do if (CCTK_EQUALS(GRHydro_eos_type, "Polytype")) then call Util_TableSetIntArray(ierr, table_handle, 1 + eosgeneral_n_indeps, & indep_gfs(1:1 + eosgeneral_n_indeps), "Independent GFs") call Util_TableSetIntArray(ierr, table_handle, 2, dep_gfs, & "Dependent GFs") else call Util_TableSetIntArray(ierr, table_handle, 2 + eosgeneral_n_indeps, & indep_gfs(1:2 + eosgeneral_n_indeps), "Independent GFs") call Util_TableSetIntArray(ierr, table_handle, 1, dep_gfs, & "Dependent GFs") end if EOS_Prim2ConBndCallPlus = EOS_SetupCall(table_handle) !!$ Sixth, the Prim2Con (cell centre) calls if (CCTK_EQUALS(GRHydro_eos_type, "Polytype")) then call CCTK_VarIndex(indep_gfs(1), "HydroBase::rho") call Util_TableSetString(ierr, table_handle, & "Pressure SpecificInternalEnergy", & "Dependent variable names") call CCTK_VarIndex(dep_gfs(1), "HydroBase::press") call CCTK_VarIndex(dep_gfs(2), "HydroBase::eps") else call CCTK_VarIndex(indep_gfs(1), "HydroBase::rho") call CCTK_VarIndex(indep_gfs(2), "HydroBase::eps") call Util_TableSetString(ierr, table_handle, & "Pressure", & "Dependent variable names") call CCTK_VarIndex(dep_gfs(1), "HydroBase::press") end if call CCTK_FortranString(strlen, eosgeneral_indep_gfs, var_gfs) var_gfs = trim(var_gfs) strend = 1 do var = 1, eosgeneral_n_indeps strend = scan(var_gfs, " ") if (strend > 0) then call CCTK_VarIndex( indep_gfs(n_base_indep_gfs+var), var_gfs(1:strend) ) var_gfs = var_gfs(strend+1:) else if (var .ne. eosgeneral_n_indeps) then call CCTK_WARN(0, "Something wrong in the eos string") end if call CCTK_VarIndex( indep_gfs(n_base_indep_gfs+var), var_gfs ) end if end do if (CCTK_EQUALS(GRHydro_eos_type, "Polytype")) then call Util_TableSetIntArray(ierr, table_handle, 1 + eosgeneral_n_indeps, & indep_gfs(1:1 + eosgeneral_n_indeps), "Independent GFs") call Util_TableSetIntArray(ierr, table_handle, 2, dep_gfs, & "Dependent GFs") else call Util_TableSetIntArray(ierr, table_handle, 2 + eosgeneral_n_indeps, & indep_gfs(1:2 + eosgeneral_n_indeps), "Independent GFs") call Util_TableSetIntArray(ierr, table_handle, 1, dep_gfs, & "Dependent GFs") end if EOS_Prim2ConCellsCall = EOS_SetupCall(table_handle) end if deallocate(indep_gfs) GRHydro_Startup = 0 end function GRHydro_Startup