diff --git a/include/HDF5_Typedef.h b/include/HDF5_Typedef.h index 8b60e10636..93eff6b539 100644 --- a/include/HDF5_Typedef.h +++ b/include/HDF5_Typedef.h @@ -2,11 +2,6 @@ #define __HDF5_TYPEDEF_H__ -/*=========================================================================== -Data structures defined here are mainly used for creating the compound -datatypes in the HDF5 format -===========================================================================*/ - #include "hdf5.h" #include "Macro.h" #include "CUFLU.h" @@ -40,905 +35,6 @@ datatypes in the HDF5 format - -//------------------------------------------------------------------------------------------------------- -// Structure : KeyInfo_t -// Description : Data structure for outputting the key simulation information -// -// Note : 1. Some variables have different names from their internal names in the code -// --> Make the output file more readable -// 2. In general, this data structure stores simulation information that cannot be determined -// from the input parameter files (i.e., Input__* files) -// --> Therefore, this data structure is crucial for the restart process -//------------------------------------------------------------------------------------------------------- -struct KeyInfo_t -{ - - int FormatVersion; - int Model; - int Float8; - int Gravity; - int Particle; - int NLevel; - int NCompFluid; // NCOMP_FLUID - int NCompPassive; // NCOMP_PASSIVE - int PatchSize; - int DumpID; - int NX0 [3]; - int BoxScale[3]; - int NPatch [NLEVEL]; - int CellScale[NLEVEL]; // amr->scale[lv] -# if ( MODEL == HYDRO ) - int Magnetohydrodynamics; - int SRHydrodynamics; - int CosmicRay; -# endif - - long Step; - long AdvanceCounter[NLEVEL]; - int NFieldStored; // number of grid fields to be stored (excluding B field) - int NMagStored; // NCOMP_MAG (declare it even when MHD is off) -# ifdef PARTICLE - long Par_NPar; // amr->Par->NPar_Active_AllRank - int Par_NAttFltStored; // PAR_NATT_FLT_STORED - int Par_NAttIntStored; // PAR_NATT_INT_STORED - int Float8_Par; - int Int8_Par; -# endif -# ifdef COSMIC_RAY - int CR_Diffusion; -# endif - - double BoxSize[3]; - double Time [NLEVEL]; - double CellSize [NLEVEL]; // amr->dh[lv] - double dTime_AllLv[NLEVEL]; -# ifdef GRAVITY - double AveDens_Init; // AveDensity_Init -# endif -# if ( ELBDM_SCHEME == ELBDM_HYBRID ) - int UseWaveScheme[NLEVEL]; // AMR levels where wave solver is used -# endif - - char *CodeVersion; - char *DumpWallTime; - char *GitBranch; - char *GitCommit; - long UniqueDataID; - -// conserved variables - double ConRef[1+NCONREF_MAX]; - -}; // struct KeyInfo_t - - - -//------------------------------------------------------------------------------------------------------- -// Structure : Makefile_t -// Description : Data structure for outputting the Makefile options -// -// Note : 1. Some options are output only when necessary -//------------------------------------------------------------------------------------------------------- -struct Makefile_t -{ - - int Model; - int Gravity; - int Comoving; - int Particle; - int NLevel; - int MaxPatch; - - int UseGPU; - int GAMER_Debug; - int BitwiseReproducibility; - int Timing; - int TimingSolver; - int Float8; - int Serial; - int LoadBalance; - int OverlapMPI; - int OpenMP; - int GPU_Arch; - int Laohu; - int SupportHDF5; - int SupportGSL; - int SupportSpectralInt; - int SupportFFTW; - int SupportLibYT; -# ifdef SUPPORT_LIBYT - int LibYTUsePatchGroup; - int LibYTInteractive; - int LibYTReload; - int LibYTJupyter; -# endif - int SupportGrackle; - int RandomNumber; - -# ifdef GRAVITY - int PotScheme; - int StorePotGhost; - int UnsplitGravity; -# endif - -# if ( MODEL == HYDRO ) - int FluScheme; -# ifdef LR_SCHEME - int LRScheme; -# endif -# ifdef RSOLVER - int RSolver; -# endif - int DualEnergy; - int Magnetohydrodynamics; - int SRHydrodynamics; - int CosmicRay; - int EoS; - int BarotropicEoS; - -# elif ( MODEL == ELBDM ) - int ELBDMScheme; - int WaveScheme; - int ConserveMass; - int Laplacian4th; - int SelfInteraction4; - -# else -# error : unsupported MODEL !! -# endif // MODEL - -# ifdef PARTICLE - int MassiveParticles; - int Tracer; - int StoreParAcc; - int StarFormation; - int Feedback; - int Par_NAttFltUser; - int Par_NAttIntUser; - int Float8_Par; - int Int8_Par; -# endif - -# ifdef COSMIC_RAY - int CR_Diffusion; -# endif - -}; // struct Makefile_t - - - -//------------------------------------------------------------------------------------------------------- -// Structure : SymConst_t -// Description : Data structure for outputting the symbolic constants -// -// Note : 1. Symbolic constants are defined in "Macro.h, CUFLU.h, CUPOT.h, Particle.h" -//------------------------------------------------------------------------------------------------------- -struct SymConst_t -{ - - int NCompFluid; - int NCompPassive; - int PatchSize; - int Flu_NIn; - int Flu_NOut; - int Flu_NIn_T; - int Flu_NIn_S; - int Flu_NOut_S; - int NFluxFluid; - int NFluxPassive; - int Flu_GhostSize; - int Flu_Nxt; - int Debug_HDF5; - int SibOffsetNonperiodic; - -# ifdef LOAD_BALANCE - int SonOffsetLB; -# endif - - double TinyNumber; - double HugeNumber; - double MaxError; - - -# ifdef GRAVITY - int Gra_NIn; - int Pot_GhostSize; - int Gra_GhostSize; - int Rho_GhostSize; - int Pot_Nxt; - int Gra_Nxt; - int Rho_Nxt; - -# ifdef UNSPLIT_GRAVITY - int USG_GhostSizeF; - int USG_GhostSizeG; - int USG_NxtF; - int USG_NxtG; -# endif - - int ExtPot_BlockSize; - int Gra_BlockSize; - int ExtPotNAuxMax; - int ExtAccNAuxMax; - int ExtPotNGeneMax; - -# if ( POT_SCHEME == SOR ) - int Pot_BlockSize_z; - int SOR_RhoShared; - int SOR_CPotShared; - int SOR_UseShuffle; - int SOR_UsePadding; - int SOR_ModReduction; -# elif ( POT_SCHEME == MG ) - int Pot_BlockSize_x; -# endif - -# endif // #ifdef GRAVITY - - -# ifdef PARTICLE - int Par_NAttFltStored; - int Par_NAttIntStored; - int Par_NType; -# ifdef GRAVITY - int RhoExt_GhostSize; -# endif - int Debug_Particle; - - double ParList_GrowthFactor; - double ParList_ReduceFactor; -# endif - - - int BitRep_Flux; -# ifdef MHD - int BitRep_Electric; -# endif - - int InterpMask; - int FB_SepFluOut; - - -# if ( MODEL == HYDRO ) - int Flu_BlockSize_x; - int Flu_BlockSize_y; - int CheckUnphyInFluid; - int CharReconstruction; - int LR_Eint; - int CheckIntermediate; - int RSolverRescue; - int HLL_NoRefState; - int HLL_IncludeAllWaves; - int HLLC_WaveSpeed; - int HLLE_WaveSpeed; -# ifdef MHD - int HLLD_WaveSpeed; -# endif -# ifdef N_FC_VAR - int N_FC_Var; -# endif -# ifdef N_SLOPE_PPM - int N_Slope_PPM; -# endif -# ifdef MHD - int EulerY; -# endif - int MHM_CheckPredict; - int EoSNAuxMax; - int EoSNTableMax; - -# elif ( MODEL == ELBDM ) - int Flu_BlockSize_x; - int Flu_BlockSize_y; -# if ( ELBDM_SCHEME == ELBDM_HYBRID ) - int Flu_HJ_BlockSize_y; -# endif -# if ( WAVE_SCHEME == WAVE_GRAMFE ) - int GramFEScheme; - int GramFEGamma; - int GramFEG; - int GramFENDelta; - int GramFEOrder; - int GramFEND; - int GramFEFluNxt; -# endif - -# else -# error : ERROR : unsupported MODEL !! -# endif // MODEL - - - int dt_Flu_BlockSize; - int dt_Flu_UseShuffle; -# ifdef GRAVITY - int dt_Gra_BlockSize; - int dt_Gra_UseShuffle; -# endif - - int Src_BlockSize; - int Src_GhostSize; - int Src_Nxt; -# if ( MODEL == HYDRO ) - int Src_NAuxDlep; - int Src_DlepProfNVar; - int Src_DlepProfNBinMax; -# endif - int Src_NAuxUser; - - int Der_GhostSize; - int Der_Nxt; - int Der_NOut_Max; - -# ifdef FEEDBACK - int FB_GhostSize; - int FB_Nxt; -# endif - - int NFieldStoredMax; - - int NConRefMax; - -}; // struct SymConst_t - - - - -//------------------------------------------------------------------------------------------------------- -// Structure : InputPara_t -// Description : Data structure for outputting the run-time parameters -// -// Note : 1. All run-time parameters are loaded from the files "Input__XXX" -//------------------------------------------------------------------------------------------------------- -struct InputPara_t -{ - -// simulation scale - double BoxSize; - int NX0_Tot[3]; - int MPI_NRank; - int MPI_NRank_X[3]; - int OMP_NThread; - double EndT; - long EndStep; - -// test problems - int TestProb_ID; - -// code units - int Opt__Unit; - double Unit_L; - double Unit_M; - double Unit_T; - double Unit_V; - double Unit_D; - double Unit_E; - double Unit_P; -# ifdef MHD - double Unit_B; -# endif - -// boundary condition - int Opt__BC_Flu[6]; -# ifdef GRAVITY - int Opt__BC_Pot; - double GFunc_Coeff0; -# endif - -// particle -# ifdef PARTICLE - int Par_Init; - int Par_ICFormat; - double Par_ICMass; - int Par_ICType; - int Par_ICFloat8; - int Par_ICInt8; - int Par_Interp; - int Par_InterpTracer; - int Par_Integ; - int Par_IntegTracer; - int Par_ImproveAcc; - int Par_PredictPos; - double Par_RemoveCell; - int Opt__FreezePar; - int Par_GhostSize; - int Par_GhostSizeTracer; - int Par_TracerVelCorr; - int Opt__ParInitCheck; - char *ParAttFltLabel[PAR_NATT_FLT_TOTAL]; - char *ParAttIntLabel[PAR_NATT_INT_TOTAL]; -# endif - -// cosmology -# ifdef COMOVING - double A_Init; - double OmegaM0; - double Hubble0; -# endif - -// time-step determination - double Dt__Max; - double Dt__Fluid; - double Dt__FluidInit; -# ifdef GRAVITY - double Dt__Gravity; -# endif -# if ( MODEL == ELBDM ) - double Dt__Phase; -# if ( ELBDM_SCHEME == ELBDM_HYBRID ) - double Dt__HybridCFL; - double Dt__HybridCFLInit; - double Dt__HybridVelocity; - double Dt__HybridVelocityInit; -# endif -# endif // #if ( MODEL == ELBDM ) -# ifdef PARTICLE - double Dt__ParVel; - double Dt__ParVelMax; - double Dt__ParAcc; -# endif -# ifdef CR_DIFFUSION - double Dt__CR_Diffusion; -# endif -# ifdef COMOVING - double Dt__MaxDeltaA; -# endif -# ifdef SRHD - int Dt__SpeedOfLight; -# endif - double Dt__SyncParentLv; - double Dt__SyncChildrenLv; - int Opt__DtUser; - int Opt__DtLevel; - int Opt__RecordDt; - int AutoReduceDt; - double AutoReduceDtFactor; - double AutoReduceDtFactorMin; -# if ( MODEL == HYDRO ) - double AutoReduceMinModFactor; - double AutoReduceMinModMin; -# endif - double AutoReduceIntMonoFactor; - double AutoReduceIntMonoMin; - -// domain refinement - int RegridCount; - int RefineNLevel; - int FlagBufferSize; - int FlagBufferSizeMaxM1Lv; - int FlagBufferSizeMaxM2Lv; - int MaxLevel; - int Opt__Flag_Rho; - int Opt__Flag_RhoGradient; - int Opt__Flag_Angular; - double FlagAngular_CenX; - double FlagAngular_CenY; - double FlagAngular_CenZ; - int Opt__Flag_Radial; - double FlagRadial_CenX; - double FlagRadial_CenY; - double FlagRadial_CenZ; -# if ( MODEL == HYDRO ) - int Opt__Flag_PresGradient; - int Opt__Flag_Vorticity; - int Opt__Flag_Jeans; -# ifdef MHD - int Opt__Flag_Current; -# endif -# ifdef SRHD - int Opt__Flag_LrtzGradient; -# endif -# ifdef COSMIC_RAY - int Opt__Flag_CRay; -# endif -# endif // #if ( MODEL == HYDRO ) -# if ( MODEL == ELBDM ) - int Opt__Flag_EngyDensity; - int Opt__Flag_Spectral; - int Opt__Flag_Spectral_N; -# if ( ELBDM_SCHEME == ELBDM_HYBRID ) - int Opt__Flag_Interference; -# endif -# endif // #if ( MODEL == ELBDM ) - int Opt__Flag_LohnerDens; -# if ( MODEL == HYDRO ) - int Opt__Flag_LohnerEngy; - int Opt__Flag_LohnerPres; - int Opt__Flag_LohnerTemp; - int Opt__Flag_LohnerEntr; -# ifdef COSMIC_RAY - int Opt__Flag_LohnerCRay; -# endif -# endif - int Opt__Flag_LohnerForm; - int Opt__Flag_User; - int Opt__Flag_User_Num; - int Opt__Flag_Region; -# ifdef PARTICLE - int Opt__Flag_NParPatch; - int Opt__Flag_NParCell; - int Opt__Flag_ParMassCell; -# endif - int Opt__NoFlagNearBoundary; - int Opt__PatchCount; -# ifdef PARTICLE - int Opt__ParticleCount; -# endif - int Opt__ReuseMemory; - int Opt__MemoryPool; - -// load balance -# ifdef LOAD_BALANCE - double LB_WLI_Max; -# ifdef PARTICLE - double LB_Par_Weight; -# endif - int Opt__RecordLoadBalance; - int Opt__LB_ExchangeFather; -# endif - int Opt__MinimizeMPIBarrier; - -// fluid solvers in HYDRO -# if ( MODEL == HYDRO ) - double Gamma; - double MolecularWeight; - double MuNorm; - double IsoTemp; - double MinMod_Coeff; - int MinMod_MaxIter; - int Opt__LR_Limiter; - int Opt__1stFluxCorr; - int Opt__1stFluxCorrScheme; -# ifdef DUAL_ENERGY - double DualEnergySwitch; -# endif -# ifdef MHD - int Opt__SameInterfaceB; -# endif -# endif // HYDRO - -// ELBDM solvers -# if ( MODEL == ELBDM ) - double ELBDM_Mass; - double ELBDM_PlanckConst; -# ifdef QUARTIC_SELF_INTERACTION - double ELBDM_Lambda; -# endif - double ELBDM_Taylor3_Coeff; - int ELBDM_Taylor3_Auto; - int ELBDM_RemoveMotionCM; - int ELBDM_BaseSpectral; -# if ( ELBDM_SCHEME == ELBDM_HYBRID ) - int ELBDM_FirstWaveLevel; -# endif -# endif // ELBDM - -// fluid solvers in different models - int Flu_GPU_NPGroup; - int GPU_NStream; - int Opt__FixUp_Flux; - long FixUpFlux_Var; -# ifdef MHD - int Opt__FixUp_Electric; -# endif - int Opt__FixUp_Restrict; - long FixUpRestrict_Var; - int Opt__CorrAfterAllSync; - int Opt__NormalizePassive; - int NormalizePassive_NVar; - int NormalizePassive_VarIdx[NCOMP_PASSIVE]; - int Opt__IntFracPassive_LR; - int IntFracPassive_NVar; - int IntFracPassive_VarIdx[NCOMP_PASSIVE]; - char *FieldLabel[NFIELD_STORED_MAX]; -# ifdef MHD - char *MagLabel[NCOMP_MAG]; -# endif - int Opt__OverlapMPI; - int Opt__ResetFluid; - int Opt__ResetFluidInit; - int Opt__FreezeFluid; -# if ( MODEL == HYDRO || MODEL == ELBDM ) - double MinDens; -# endif -# if ( MODEL == HYDRO ) - double MinPres; - double MinEint; - double MinTemp; - double MinEntr; - int Opt__CheckPresAfterFlu; - int Opt__LastResortFloor; - int JeansMinPres; - int JeansMinPres_Level; - int JeansMinPres_NCell; -# endif - -// gravity -# ifdef GRAVITY - double NewtonG; -# if ( POT_SCHEME == SOR ) - double SOR_Omega; - int SOR_MaxIter; - int SOR_MinIter; -# elif ( POT_SCHEME == MG ) - int MG_MaxIter; - int MG_NPreSmooth; - int MG_NPostSmooth; - double MG_ToleratedError; -# endif - int Pot_GPU_NPGroup; - int Opt__GraP5Gradient; - int Opt__SelfGravity; - int Opt__ExtAcc; - int Opt__ExtPot; - char *ExtPotTable_Name; - int ExtPotTable_NPoint[3]; - double ExtPotTable_dh[3]; - double ExtPotTable_EdgeL[3]; - int ExtPotTable_Float8; - int Opt__GravityExtraMass; -# endif // #ifdef GRAVITY - -// source terms - int Src_Deleptonization; - int Src_User; - int Src_GPU_NPGroup; - -// Grackle -# ifdef SUPPORT_GRACKLE - int Grackle_Activate; - int Grackle_Verbose; - int Grackle_Cooling; - int Grackle_Primordial; - int Grackle_Metal; - int Grackle_UV; - int Grackle_CMB_Floor; - int Grackle_PE_Heating; - double Grackle_PE_HeatingRate; - char *Grackle_CloudyTable; - int Grackle_ThreeBodyRate; - int Grackle_CIE_Cooling; - int Grackle_H2_OpaApprox; - int Che_GPU_NPGroup; -# endif - -// star formation -# ifdef STAR_FORMATION - int SF_CreateStar_Scheme; - int SF_CreateStar_RSeed; - int SF_CreateStar_DetRandom; - int SF_CreateStar_MinLevel; - double SF_CreateStar_MinGasDens; - double SF_CreateStar_MassEff; - double SF_CreateStar_MinStarMass; - double SF_CreateStar_MaxStarMFrac; -# endif - -// feedback -# ifdef FEEDBACK - int FB_Level; - int FB_RSeed; - int FB_SNe; - int FB_User; -# endif - -// cosmic ray -# ifdef COSMIC_RAY - double CR_Gamma; -# endif - -// microphysics -# ifdef CR_DIFFUSION - double CR_Diffusion_ParaCoeff; - double CR_Diffusion_PerpCoeff; - double CR_Diffusion_MinB; -# endif - -// initialization - int Opt__Init; - int RestartLoadNRank; - int Opt__RestartReset; - int Opt__UM_IC_Level; - int Opt__UM_IC_NLevel; - int Opt__UM_IC_NVar; - int Opt__UM_IC_Format; - int Opt__UM_IC_Float8; - int Opt__UM_IC_Downgrade; - int Opt__UM_IC_Refine; - int Opt__UM_IC_LoadNRank; - int UM_IC_RefineRegion[NLEVEL-1][6]; - int Opt__InitRestrict; - int Opt__InitGridWithOMP; - int Opt__GPUID_Select; - int Init_Subsampling_NCell; -# ifdef MHD - int Opt__InitBFieldByVecPot; -# endif -# ifdef SUPPORT_FFTW - int Opt__FFTW_Startup; -# endif - -// interpolation schemes - int Opt__Int_Time; -# if ( MODEL == HYDRO ) - int Opt__Int_Prim; -# endif -# if ( MODEL == ELBDM ) - int Opt__Int_Phase; - int Opt__Res_Phase; -# if ( ELBDM_SCHEME == ELBDM_HYBRID ) - int Opt__Hybrid_Match_Phase; -# endif -# endif // #if ( MODEL == ELBDM ) - int Opt__Flu_IntScheme; - int Opt__RefFlu_IntScheme; -# ifdef MHD - int Opt__Mag_IntScheme; - int Opt__RefMag_IntScheme; -# endif -# ifdef GRAVITY - int Opt__Pot_IntScheme; - int Opt__Rho_IntScheme; - int Opt__Gra_IntScheme; - int Opt__RefPot_IntScheme; -# endif - double IntMonoCoeff; -# ifdef MHD - double IntMonoCoeffB; -# endif - int Mono_MaxIter; - int IntOppSign0thOrder; -# ifdef SUPPORT_SPECTRAL_INT - char *SpecInt_TablePath; - int SpecInt_GhostBoundary; -# if ( MODEL == ELBDM ) - int SpecInt_XY_Instead_DePha; - double SpecInt_VortexThreshold; -# endif -# endif - -// data dump - int Opt__Output_Total; - int Opt__Output_Part; - int Opt__Output_User; -# ifdef PARTICLE - int Opt__Output_Par_Mode; - int Opt__Output_Par_Mesh; -# endif - int Opt__Output_BasePS; - int Opt__Output_Base; -# ifdef MHD - int Opt__Output_CC_Mag; -# endif -# ifdef GRAVITY - int Opt__Output_Pot; -# endif -# ifdef PARTICLE - int Opt__Output_ParDens; -# endif -# if ( MODEL == HYDRO ) - int Opt__Output_Pres; - int Opt__Output_Temp; - int Opt__Output_Entr; - int Opt__Output_Cs; - int Opt__Output_DivVel; - int Opt__Output_Mach; -# ifdef MHD - int Opt__Output_DivMag; -# endif -# ifdef SRHD - int Opt__Output_Lorentz; - int Opt__Output_3Velocity; - int Opt__Output_Enthalpy; -# endif -# endif // #if ( MODEL == HYDRO ) - int Opt__Output_UserField; - int Opt__Output_Mode; - int Opt__Output_Restart; - int Opt__Output_Step; - double Opt__Output_Dt; - char *Opt__Output_Text_Format_Flt; - int Opt__Output_Text_Length_Int; - double Output_PartX; - double Output_PartY; - double Output_PartZ; - int InitDumpID; - -// libyt jupyter interface -# if ( defined(SUPPORT_LIBYT) && defined(LIBYT_JUPYTER) ) - int Yt_JupyterUseConnectionFile; -# endif - -// miscellaneous - int Opt__Verbose; - int Opt__TimingBarrier; - int Opt__TimingBalance; - int Opt__TimingMPI; - int Opt__RecordNote; - int Opt__RecordUnphy; - int Opt__RecordMemory; - int Opt__RecordPerformance; - int Opt__ManualControl; - int Opt__RecordCenter; - double COM_CenX; - double COM_CenY; - double COM_CenZ; - double COM_MaxR; - double COM_MinRho; - double COM_TolErrR; - int COM_MaxIter; - int Opt__RecordUser; - int Opt__OptimizeAggressive; - int Opt__SortPatchByLBIdx; - -// simulation checks - int Opt__Ck_Refine; - int Opt__Ck_ProperNesting; - int Opt__Ck_Conservation; - double AngMom_OriginX; - double AngMom_OriginY; - double AngMom_OriginZ; - int Opt__Ck_NormPassive; - int Opt__Ck_Restrict; - int Opt__Ck_Finite; - int Opt__Ck_PatchAllocate; - int Opt__Ck_FluxAllocate; -# if ( MODEL == HYDRO ) - int Opt__Ck_Negative; -# endif - double Opt__Ck_MemFree; -# ifdef PARTICLE - int Opt__Ck_Particle; -# endif -# ifdef MHD - int Opt__Ck_InterfaceB; - int Opt__Ck_DivergenceB; -# endif - int Opt__Ck_InputFluid; - -// flag tables - double FlagTable_Rho [NLEVEL-1]; - double FlagTable_RhoGradient [NLEVEL-1]; - double FlagTable_Lohner [NLEVEL-1][5]; - double FlagTable_Angular [NLEVEL-1][3]; - double FlagTable_Radial [NLEVEL-1]; - hvl_t FlagTable_User [NLEVEL-1]; -# if ( MODEL == HYDRO ) - double FlagTable_PresGradient[NLEVEL-1]; - double FlagTable_Vorticity [NLEVEL-1]; - double FlagTable_Jeans [NLEVEL-1]; -# ifdef MHD - double FlagTable_Current [NLEVEL-1]; -# endif -# ifdef SRHD - double FlagTable_LrtzGradient[NLEVEL-1]; -# endif -# ifdef COSMIC_RAY - double FlagTable_CRay [NLEVEL-1]; -# endif -# elif ( MODEL == ELBDM ) - double FlagTable_EngyDensity [NLEVEL-1][2]; - double FlagTable_Spectral [NLEVEL-1][2]; -# if ( ELBDM_SCHEME == ELBDM_HYBRID ) - double FlagTable_Interference[NLEVEL-1][4]; -# endif -# endif // MODEL -# ifdef PARTICLE - int FlagTable_NParPatch [NLEVEL-1]; - int FlagTable_NParCell [NLEVEL-1]; - double FlagTable_ParMassCell [NLEVEL-1]; -# endif - -// user-defined derived fields -// --> always allocate DER_NOUT_MAX labels and units but only record UserDerField_Num of them in HDF5 -// --> more convenient since storing dynamic arrays such as (*UserDerField_Label)[MAX_STRING] in HDF5 can be tricky - int UserDerField_Num; - char *UserDerField_Label[DER_NOUT_MAX]; - char *UserDerField_Unit [DER_NOUT_MAX]; - -}; // struct InputPara_t - - - //------------------------------------------------------------------------------------------------------- // Function : SyncHDF5File // Description : Force NFS to synchronize (dump data to the disk before return) @@ -962,8 +58,7 @@ inline void SyncHDF5File( const char *FileName ) -// TYPE_* must align with the hard-coded values in Output_DumpData_Total_HDF5.cpp: GetCompound_General() and H5_write_compound() -#define NPARA_MAX 1000 // maximum number of parameters +#define NFIELD_MAX 1000 // maximum number of parameters #define TYPE_INT 1 // various data types #define TYPE_LONG 2 #define TYPE_UINT 3 @@ -977,31 +72,57 @@ inline void SyncHDF5File( const char *FileName ) //------------------------------------------------------------------------------------------------------- // Structure : HDF5_Output_t -// Description : Data structure for outputting user-defined run-time parameters +// Description : Data structure for outputting fields as compound dataset in HDF5 snapshot // -// Note : 1. Run-time parameters are stored using Output_HDF5_UserPara_Ptr() or Output_HDF5_InputTest_Ptr() +// Note : 1. Boolean is stored as integer in the HDF5 snapshot +// 2. For the non-array field, `ArrDim` must be `0` and `ArrLen` must be `NULL` +// 3. The string size MUST be `MAX_STRING` +// 4. The structure can NOT be empty when writing the HDF5 snapshot // -// Data Member : NPara : Total number of parameters -// TotalSize : Size of the structure -// Key : Parameter names -// Ptr : Pointer to the parameter variables -// Type : Parameter data types -// TypeSize : Size of parameter data type +// Data Member : NField : Total number of fields +// TotalSize : Size of the structure +// Key : Parameter names +// Ptr : Pointer to the field variables +// ArrSize : The total number of elements in the array +// ArrDim : The array dimension +// ArrLen : The array length in each dimension +// Type : Parameter data types +// TypeSize : Size of field data type +// RS_Compare : Whether or not to do the comparision during restart +// RS_FatalNonexist : Whether or not the nonexistence of the target field is fatal +// RS_FatalCompare : Whether or not the comparison result is fatal +// H5_TypeID_VarStr : String type in HDF5 // -// Method : HDF5_Output_t : Constructor -// ~HDF5_Output_t : Destructor -// Add : Add a new parameter +// Method : HDF5_Output_t : Constructor +// ~HDF5_Output_t : Destructor +// Add : Add a new field +// CheckAndSetType : Check the input data type and record it +// GetH5Type : Get the HDF5 type +// Write2CompoundDataset : Write the data to HDF5 compund dataset +// Copy2Dataset : Copy the data in the structure to the dataset +// GetCompound : Get the HDF5 compound dataset of this structure +// Compare2File : Compare the data with the given restart file +// GetIndexByname : Get the field array index in the structure +// CheckNewKey : Varify the new key name //------------------------------------------------------------------------------------------------------- struct HDF5_Output_t { // data members - int NPara; - size_t TotalSize; - char (*Key)[MAX_STRING]; - void **Ptr; - int *Type; - size_t *TypeSize; +// =================================================================================== + int NField; + size_t TotalSize; + char (*Key)[MAX_STRING]; + void **Ptr; + size_t *ArrSize; + int *ArrDim; + hsize_t **ArrLen; + int *Type; + size_t *TypeSize; + bool *RS_Compare; + bool *RS_FatalNonexist; + bool *RS_FatalCompare; + hid_t H5_TypeID_VarStr; //=================================================================================== // Constructor : HDF5_Output_t @@ -1012,15 +133,26 @@ struct HDF5_Output_t HDF5_Output_t() { - NPara = 0; - TotalSize = 0; - Key = new char [NPARA_MAX][MAX_STRING]; - Ptr = new void* [NPARA_MAX]; - Type = new int [NPARA_MAX]; - TypeSize = new size_t [NPARA_MAX]; + NField = 0; + TotalSize = (size_t)0; + Key = new char [NFIELD_MAX][MAX_STRING]; + Ptr = new void* [NFIELD_MAX]; + ArrSize = new size_t [NFIELD_MAX]; + ArrDim = new int [NFIELD_MAX]; + ArrLen = new hsize_t* [NFIELD_MAX]; + Type = new int [NFIELD_MAX]; + TypeSize = new size_t [NFIELD_MAX]; + RS_Compare = new bool [NFIELD_MAX]; + RS_FatalNonexist = new bool [NFIELD_MAX]; + RS_FatalCompare = new bool [NFIELD_MAX]; + + H5_TypeID_VarStr = H5Tcopy( H5T_C_S1 ); + H5Tset_size( H5_TypeID_VarStr, MAX_STRING ); // H5T_VARIABLE will cause segmentation fault } // METHOD : HDF5_Output_t + + //=================================================================================== // Constructor : ~HDF5_Output_t // Description : Destructor of the structure "HDF5_Output_t" @@ -1031,82 +163,588 @@ struct HDF5_Output_t { delete [] Key; + for (int i=0; i true : terminate the program if the target key cannot be found + // false : display a warning message if the target key cannot be found + // Fatal_Compr : Whether or not the comparison result is fatal + // --> true : terminate the program if the values are different + // false : display a warning message if the values are different + //=================================================================================== + template + void Add( const char NewKey[], T* NewPtr, const int Dim, int *Len, const bool Compare, + const bool Fatal_Nonexist, const bool Fatal_Compr ) + { + +// check + if ( NField >= NFIELD_MAX ) Aux_Error( ERROR_INFO, "exceed the maximum number of fields (%d) !!\n", NFIELD_MAX ); + + if ( Dim >= __INT_MAX__ || Dim < 0 ) Aux_Error( ERROR_INFO, "invalid array dimension (%d) of \"%s\"!!\n", Dim, NewKey ); + + if ( Len != NULL && Dim == 0 ) Aux_Error( ERROR_INFO, "key \"%s\" Len must be NULL for single field !!\n", NewKey ); + if ( Len == NULL && Dim != 0 ) Aux_Error( ERROR_INFO, "key \"%s\" Len is NULL for non-single field !!\n", NewKey ); + + for (int d=0; d= __INT_MAX__ || Len[d] <= 0 ) Aux_Error( ERROR_INFO, "invalid array length (%d) of \"%s\"!!\n", Len[d], NewKey ); + + CheckNewKey( NewKey ); + + if ( !CheckAndSetType( typeid(T), Type[NField], TypeSize[NField] ) ) + Aux_Error( ERROR_INFO, "unsupported data type %s for \"%s\"(float*, double*, int*, long*, uint*, ulong*, bool*, and char* only) !!\n", + typeid(T).name(), NewKey ); + +// field name + strncpy( Key[NField], NewKey, MAX_STRING ); + + RS_Compare [NField] = Compare; + RS_FatalNonexist[NField] = Fatal_Nonexist; + RS_FatalCompare [NField] = Fatal_Compr; + ArrSize [NField] = (size_t)1; + ArrDim [NField] = Dim; + + if ( Dim == 0 ) ArrLen[NField] = NULL; // must be NULL to avoid segmentation fault when freeing + else ArrLen[NField] = new hsize_t [ Dim ]; + + for (int d=0; d true : terminate the program if the target key cannot be found + // false : display a warning message if the target key cannot be found + // Fatal_Compr : Whether or not the comparison result is fatal + // --> true : terminate the program if the values are different + // false : display a warning message if the values are different //=================================================================================== template - void Add( const char NewKey[], T* NewPtr ) + void Add( const char NewKey[], const T KeyVal, const int Dim, int *Len, const bool Compare, + const bool Fatal_Nonexist, const bool Fatal_Compr ) { - if ( NPara >= NPARA_MAX ) Aux_Error( ERROR_INFO, "exceed the maximum number of parameters (%d) !!\n", NPARA_MAX ); +// check + if ( NField >= NFIELD_MAX ) Aux_Error( ERROR_INFO, "exceed the maximum number of fields (%d) !!\n", NFIELD_MAX ); + + if ( Dim != 0 || Len != NULL ) Aux_Error( ERROR_INFO, "Len must be NULL and Dim must be zero for the single constant field \"%s\"!!\n", NewKey ); -// parameter name - strncpy( Key[NPara], NewKey, MAX_STRING ); + CheckNewKey( NewKey ); -// parameter address - Ptr[NPara] = NewPtr; + if ( !CheckAndSetType( typeid(T), Type[NField], TypeSize[NField] ) ) + Aux_Error( ERROR_INFO, "unsupported data type %s for \"%s\"(float, double, int, long, uint, ulong, bool, and char only) !!\n", + typeid(T).name(), NewKey ); -// parameter data type and size - if ( typeid(T) == typeid(int ) ) { Type[NPara] = TYPE_INT; TypeSize[NPara] = sizeof(int ); } - else if ( typeid(T) == typeid(long ) ) { Type[NPara] = TYPE_LONG; TypeSize[NPara] = sizeof(long ); } - else if ( typeid(T) == typeid(uint ) ) { Type[NPara] = TYPE_UINT; TypeSize[NPara] = sizeof(uint ); } - else if ( typeid(T) == typeid(ulong ) ) { Type[NPara] = TYPE_ULONG; TypeSize[NPara] = sizeof(ulong ); } - else if ( typeid(T) == typeid(bool ) ) { Type[NPara] = TYPE_BOOL; TypeSize[NPara] = sizeof(int ); } // bool is stored as int - else if ( typeid(T) == typeid(float ) ) { Type[NPara] = TYPE_FLOAT; TypeSize[NPara] = sizeof(float ); } - else if ( typeid(T) == typeid(double) ) { Type[NPara] = TYPE_DOUBLE; TypeSize[NPara] = sizeof(double); } - else - Aux_Error( ERROR_INFO, "unsupported data type for \"%s\" (float*, double*, int*, long*, unit*, ulong*, bool* only) !!\n", - NewKey ); + if ( typeid(T) == typeid(char) ) + Aux_Error( ERROR_INFO, "passing a constant char value is not supported !!\n" ); - TotalSize += TypeSize[NPara]; - NPara++; +// field name + strncpy( Key[NField], NewKey, MAX_STRING ); + + RS_Compare [NField] = Compare; + RS_FatalNonexist[NField] = Fatal_Nonexist; + RS_FatalCompare [NField] = Fatal_Compr; + ArrSize [NField] = (size_t)1; + ArrDim [NField] = Dim; + ArrLen [NField] = NULL; + +// copy field value + Ptr[NField] = new T [ (int)ArrSize[NField] ]; + memcpy( Ptr[NField], &KeyVal, ArrSize[NField] * TypeSize[NField] ); + + TotalSize += ArrSize[NField] * TypeSize[NField]; + NField++; } // METHOD : Add + + + //=================================================================================== + // Constructor : CheckAndSetType + // Description : Check if the input data type is valid and set the corresponding type fields + // + // Note : 1. Support int, long, uint, ulong, bool, float, double, and string data types + // 2. Call-by-reference + // 3. Boolean is stored as integer, so the type size is `sizeof(int)` + // 4. String size is always assigned as `MAX_STRING` + // + // Parameter : type_info : `typeid()` of the input data type + // type : Data member `Type` of the field + // type_size : Data member `TypeSize` of the field + // + // Return : "true " if data type is supported + // "false" if data type is NOT supported + //=================================================================================== + bool CheckAndSetType( const std::type_info &type_info, int &type, size_t &type_size ) + { + + if ( type_info == typeid(int ) ) { type = TYPE_INT; type_size = sizeof(int ); } + else if ( type_info == typeid(long ) ) { type = TYPE_LONG; type_size = sizeof(long ); } + else if ( type_info == typeid(uint ) ) { type = TYPE_UINT; type_size = sizeof(uint ); } + else if ( type_info == typeid(ulong ) ) { type = TYPE_ULONG; type_size = sizeof(ulong ); } + else if ( type_info == typeid(bool ) ) { type = TYPE_BOOL; type_size = sizeof(int ); } + else if ( type_info == typeid(float ) ) { type = TYPE_FLOAT; type_size = sizeof(float ); } + else if ( type_info == typeid(double) ) { type = TYPE_DOUBLE; type_size = sizeof(double); } + else if ( type_info == typeid(char ) ) { type = TYPE_STRING; type_size = (size_t)MAX_STRING; } + else return false; + + return true; + + } // METHOD : CheckAndSetType + + + //=================================================================================== - // Constructor : Add (string) - // Description : Add a new string parameter to be written later + // Constructor : GetH5Type + // Description : Get the HDF5 type ID // - // Note : 1. Overloaded function for strings + // Note : 1. Call-by-reference + // 2. Boolean type is stored as integer type + // + // Parameter : type : The type macro of the field + // H5_Type : HDF5 type ID for storing the field //=================================================================================== - void Add( const char NewKey[], char* NewPtr ) + void GetH5Type( const int type, hid_t &H5_Type ) { - if ( NPara >= NPARA_MAX ) Aux_Error( ERROR_INFO, "exceed the maximum number of parameters (%d) !!\n", NPARA_MAX ); + switch ( type ) + { + case TYPE_INT: H5_Type = H5T_NATIVE_INT; break; + case TYPE_LONG: H5_Type = H5T_NATIVE_LONG; break; + case TYPE_UINT: H5_Type = H5T_NATIVE_UINT; break; + case TYPE_ULONG: H5_Type = H5T_NATIVE_ULONG; break; + case TYPE_BOOL: H5_Type = H5T_NATIVE_INT; break; + case TYPE_FLOAT: H5_Type = H5T_NATIVE_FLOAT; break; + case TYPE_DOUBLE: H5_Type = H5T_NATIVE_DOUBLE; break; + case TYPE_STRING: H5_Type = H5_TypeID_VarStr; break; + default: Aux_Error( ERROR_INFO, "unrecognized type: %d !!\n", type ); break; + } // switch ( type ) + + } // METHOD : GetH5Type + -// parameter name - strncpy( Key[NPara], NewKey, MAX_STRING ); -// parameter address - Ptr[NPara] = NewPtr; + //=================================================================================== + // Constructor : Write2CompoundDataset + // Description : Write all fields in HDF5_Output to an HDF5 compound dataset + // + // Note : 1. Should be called only on master rank + // + // Parameter : H5_SetID : HDF5 dataset ID + // H5_TypeID : HDF5 compound type ID associated with HDF5_Output + // + // Return : H5_Status_write : Status of the write operation + //=================================================================================== + herr_t Write2CompoundDataset( const hid_t H5_SetID, const hid_t H5_TypeID ) + { + + if ( TotalSize == 0 ) Aux_Error( ERROR_INFO, "TotalSize can not be zero !!\n" ); + if ( MPI_Rank != 0 ) Aux_Message( stderr, "WARNING : H5Dwrite might not work correctly on multiple ranks !!\n"); + + herr_t H5_Status; + char *dataset = new char [ TotalSize ]; + + Copy2Dataset( dataset ); + + H5_Status = H5Dwrite( H5_SetID, H5_TypeID, H5S_ALL, H5S_ALL, H5P_DEFAULT, dataset ); + + delete [] dataset; + + return H5_Status; + + } // METHOD : Write2CompoundDataset + + + + //=================================================================================== + // Constructor : Copy2Dataset + // Description : Copy all the data in the structure to the dataset pointer + // + // Note : 1. The size of the dataset MUST be consistent with `TotalSize` + // + // Parameter : dataset : the dataset pointer to be stored + // + // Return : dataset + //=================================================================================== + void Copy2Dataset( char *dataset ) + { + + size_t offset = (size_t)0; + + for (int i=0; i true : terminate the program if the target key cannot be found + // false : display a warning message if the target key cannot be found + // Fatal_Compr : Whether or not the comparison result is fatal + // --> true : terminate the program if the values are different + // false : display a warning message if the values are different + // + // Return : Success/fail <-> 0/<0 + //=================================================================================== + herr_t Compare2File( const char *KeyName, const hid_t H5_SetID_Target, const hid_t H5_TypeID_Target, + const bool Fatal_Nonexist, const bool Fatal_Compr ) + { + +// get field index in structure + int FieldIdx = GetFieldIdxByKey( KeyName ); + if ( FieldIdx < 0 ) + { + if ( Fatal_Nonexist ) + Aux_Error( ERROR_INFO, "key \"%s\" does not exist in HDF5_Output_t structure !!\n", KeyName ); + else if ( MPI_Rank == 0 ) + Aux_Message( stderr, "WARNING : key \"%s\" does not exist in the HDF5_Output_t structure !!\n", KeyName ); + + return -4; + } + + bool Check_Pass = true; + int H5_FieldIdx; + size_t H5_FieldSize, MinSize; + hid_t H5_TypeID_Field; // datatype ID of the target field in the compound variable + hid_t H5_TypeID_Load; // datatype ID for loading the target field + herr_t H5_Status; + char *FieldPtr; + +// get field index in file + H5_FieldIdx = H5Tget_member_index( H5_TypeID_Target, KeyName ); + + if ( H5_FieldIdx < 0 ) + { + if ( Fatal_Nonexist ) + Aux_Error( ERROR_INFO, "target key \"%s\" does not exist in the restart file !!\n", KeyName ); + + else if ( MPI_Rank == 0 ) + Aux_Message( stderr, "WARNING : target key \"%s\" does not exist in the restart file !!\n", KeyName ); + + return -1; + } // if ( H5_FieldIdx < 0 ) + +// load + H5_TypeID_Field = H5Tget_member_type( H5_TypeID_Target, H5_FieldIdx ); + H5_FieldSize = H5Tget_size( H5_TypeID_Field ); + FieldPtr = new char [ H5_FieldSize ]; // assuming the data type is the same + MinSize = MIN( H5_FieldSize, ArrSize[FieldIdx] * TypeSize[FieldIdx] ); + + H5_TypeID_Load = H5Tcreate( H5T_COMPOUND, H5_FieldSize ); + H5_Status = H5Tinsert( H5_TypeID_Load, KeyName, 0, H5_TypeID_Field ); + + H5_Status = H5Dread( H5_SetID_Target, H5_TypeID_Load, H5S_ALL, H5S_ALL, H5P_DEFAULT, (void *)FieldPtr ); + if ( H5_Status < 0 ) Aux_Error( ERROR_INFO, "failed to load the field \"%s\" !!\n", KeyName ); + + H5_Status = H5Tclose( H5_TypeID_Field ); + H5_Status = H5Tclose( H5_TypeID_Load ); + +// check size + if ( H5_FieldSize != ArrSize[FieldIdx] * TypeSize[FieldIdx] && MPI_Rank == 0 ) + Aux_Message( stdout, "\"%s\" comparison might be incomplete due to the size mismatch (RS: %zu Bytes != RT: %zu Bytes)!!\n", + KeyName, H5_FieldSize, ArrSize[FieldIdx] * TypeSize[FieldIdx] ); + +// comparison + char KeyNameWithIdx[MAX_STRING]; + for (int offset=0; offset<(int)ArrSize[FieldIdx]; offset++) + { + if ( offset*TypeSize[FieldIdx] >= MinSize ) + { + if ( Fatal_Compr ) + { + Aux_Error( ERROR_INFO, "offset reaches the minimum size (%zu Bytes), " + "not comparing the rest of the field \"%s\" !!\n", + MinSize, KeyName ); + return -5; + } + else + { + if ( MPI_Rank == 0 ) + Aux_Message( stdout, "WARNING : offset reaches the minimum size (%zu Bytes), " + "not comparing the rest of the field \"%s\" !!\n", + MinSize, KeyName ); + break; + } + } // if ( offset*TypeSize[FieldIdx] >= MinSize ) + + sprintf( KeyNameWithIdx, "%s", KeyName ); + int skip = (int)ArrSize[FieldIdx]; + for (int d=0; d 0/<0 + //=================================================================================== + void Compare2File_All( const hid_t H5_SetID_Target, const hid_t H5_TypeID_Target ) + { + + for (int i=0; i + void Add( const char NewKey[], T* NewPtr, const int Dim, int *Len, const bool Compare, + const bool Fatal_Nonexist, const bool Fatal_Compr ) + { + } + template + void Add( const char NewKey[], const T KeyVal, const int Dim, int *Len, const bool Compare, + const bool Fatal_Nonexist, const bool Fatal_Compr ) { } }; @@ -18,12 +25,12 @@ struct HDF5_Output_t // common macro -# define LOAD_PARA( load_mode, para_name, para_ptr, ... ) \ - { \ - if ( load_mode == LOAD_HDF5_OUTPUT ) HDF5_InputTest->Add( para_name, para_ptr ); \ - else if ( load_mode == LOAD_READPARA ) ReadPara->Add( para_name, para_ptr, __VA_ARGS__ ); \ - else Aux_Error( ERROR_INFO, "unsupported load_mode (%d) !!\n", load_mode ); \ - } +#define LOAD_PARA( load_mode, para_name, para_ptr, ... ) \ + { \ + if ( load_mode == LOAD_HDF5_OUTPUT ) HDF5_InputTest->Add( para_name, para_ptr, 0, NULL, false, false, false );\ + else if ( load_mode == LOAD_READPARA ) ReadPara->Add( para_name, para_ptr, __VA_ARGS__ ); \ + else Aux_Error( ERROR_INFO, "unsupported load_mode (%d) !!\n", load_mode ); \ + } // common function prototypes diff --git a/src/Init/Init_ByRestart_HDF5.cpp b/src/Init/Init_ByRestart_HDF5.cpp index f3e5efa4e5..06f4c362c4 100644 --- a/src/Init/Init_ByRestart_HDF5.cpp +++ b/src/Init/Init_ByRestart_HDF5.cpp @@ -4,14 +4,16 @@ #include "HDF5_Typedef.h" #include -void FillIn_Makefile ( Makefile_t &Makefile ); -void FillIn_SymConst ( SymConst_t &SymConst ); -void FillIn_InputPara( InputPara_t &InputPara, const int NFieldStored, char FieldLabelOut[][MAX_STRING] ); +void FillIn_HDF5_KeyInfo ( HDF5_Output_t *HDF5_KeyInfo, int NFieldStored, const bool Load_RS, + const int RS_FormatVersion, const bool ReenablePar ); +void FillIn_HDF5_Makefile ( HDF5_Output_t *HDF5_Makefile, const int RS_FormatVersion ); +void FillIn_HDF5_SymConst ( HDF5_Output_t *HDF5_SymConst, const int RS_FormatVersion ); +void FillIn_HDF5_InputPara( HDF5_Output_t *HDF5_InputPara, const int NFieldStored, char FieldLabelOut[][MAX_STRING], + const bool Load_RS ); template -static herr_t LoadField( const char *FieldName, void *FieldPtr, const hid_t H5_SetID_Target, - const hid_t H5_TypeID_Target, const bool Fatal_Nonexist, - const T *ComprPtr, const int NCompr, const bool Fatal_Compr ); +size_t GetFieldData( const char *FieldName, const hid_t H5_SetID_Target, const hid_t H5_TypeID_Target, + T *Ptr, const bool Allocate ); static void LoadOnePatch( const hid_t H5_FileID, const int lv, const int GID, const bool Recursive, const int *SonList, const int (*CrList)[3], const hid_t *H5_SetID_Field, const hid_t H5_SpaceID_Field, const hid_t H5_MemID_Field, @@ -20,11 +22,6 @@ static void LoadOnePatch( const hid_t H5_FileID, const int lv, const int GID, co const hid_t *H5_SetID_ParFltData, const hid_t *H5_SetID_ParIntData, const hid_t H5_SpaceID_ParData, const long *GParID_Offset, const long NParThisRank, const int FormatVersion ); -static void Check_Makefile ( const char *FileName, const int FormatVersion ); -static void Check_SymConst ( const char *FileName, const int FormatVersion ); -static void Check_InputPara( const char *FileName, const int FormatVersion ); -static void ResetParameter( const char *FileName, double *EndT, long *EndStep ); - @@ -66,46 +63,8 @@ void Init_ByRestart_HDF5( const char *FileName ) const bool Fatal = true; const bool NonFatal = false; - const int Model = MODEL; - const int NCompFluid = NCOMP_FLUID; - const int NCompPassive = NCOMP_PASSIVE; - const int PatchSize = PS1; -# ifdef GRAVITY - const int Gravity = 1; -# else - const int Gravity = 0; -# endif -# ifdef PARTICLE - const int Particle = 1; - const int Par_NAttFltStored = PAR_NATT_FLT_STORED; - const int Par_NAttIntStored = PAR_NATT_INT_STORED; -# else - const int Particle = 0; -# endif -# if ( MODEL == HYDRO ) -# ifdef MHD - const int Magnetohydrodynamics = 1; -# else - const int Magnetohydrodynamics = 0; -# endif -# ifdef SRHD - const int SRHydrodynamics = 1; -# else - const int SRHydrodynamics = 0; -# endif -# ifdef COSMIC_RAY - const int CosmicRay = 1; -# ifdef CR_DIFFUSION - const int CR_Diffusion = 1; -# else - const int CR_Diffusion = 0; -# endif -# else // #ifdef COSMIC_RAY - const int CosmicRay = 0; -# endif // #ifdef COSMIC_RAY ... else ... -# endif // #if ( MODEL == HYDRO ) - - KeyInfo_t KeyInfo; + const bool NotAllocate = false; + const bool Load_RS_Yes = true; hid_t H5_FileID, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, H5_SetID_Cr; # ifdef LOAD_BALANCE @@ -115,7 +74,6 @@ void Init_ByRestart_HDF5( const char *FileName ) # endif herr_t H5_Status; int NLvRescale, NPatchAllLv, GID_LvStart[NLEVEL]; - int *NullPtr = NULL; bool ReenablePar = false; @@ -135,32 +93,36 @@ void Init_ByRestart_HDF5( const char *FileName ) Aux_Error( ERROR_INFO, "failed to open the datatype of \"%s\" !!\n", "Info/KeyInfo" ); -// 1-3. load all target fields in KeyInfo one-by-one (by all ranks) - LoadField( "FormatVersion", &KeyInfo.FormatVersion, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, Fatal, NullPtr, -1, NonFatal ); +// storing restart parameters for later usage + int FormatVersion_RS, Particle_RS, NLevel_RS, DumpID_RS; + GetFieldData( "FormatVersion", H5_SetID_KeyInfo, H5_TypeID_KeyInfo, &FormatVersion_RS, NotAllocate ); + GetFieldData( "Particle", H5_SetID_KeyInfo, H5_TypeID_KeyInfo, &Particle_RS, NotAllocate ); + GetFieldData( "NLevel", H5_SetID_KeyInfo, H5_TypeID_KeyInfo, &NLevel_RS, NotAllocate ); + GetFieldData( "DumpID", H5_SetID_KeyInfo, H5_TypeID_KeyInfo, &DumpID_RS, NotAllocate ); // format version for HDF5 output if ( MPI_Rank == 0 ) { - Aux_Message( stdout, " The format version of the HDF5 RESTART file = %ld\n", KeyInfo.FormatVersion ); + Aux_Message( stdout, " The format version of the HDF5 RESTART file = %ld\n", FormatVersion_RS ); - if ( KeyInfo.FormatVersion < 2100 ) + if ( FormatVersion_RS < 2100 ) Aux_Error( ERROR_INFO, "unsupported data format version (only support version >= 2100) !!\n" ); # ifdef PARTICLE - if ( KeyInfo.FormatVersion < 2200 ) + if ( FormatVersion_RS < 2200 ) Aux_Error( ERROR_INFO, "unsupported data format version for PARTICLE (only support version >= 2200) !!\n" ); # endif - if ( KeyInfo.FormatVersion < 2300 ) + if ( FormatVersion_RS < 2300 ) Aux_Message( stderr, "WARNING : loading user-defined fields or particle attributes from version < 2300 will likely fail !!\n" ); # ifdef MHD - if ( KeyInfo.FormatVersion < 2400 ) + if ( FormatVersion_RS < 2400 ) Aux_Error( ERROR_INFO, "unsupported data format version for MHD (only support version >= 2400) !!\n" ); # endif # ifdef SRHD - if ( KeyInfo.FormatVersion < 2473 ) + if ( FormatVersion_RS < 2473 ) Aux_Error( ERROR_INFO, "unsupported data format version for SRHD (only support version >= 2473) !!\n" ); # endif @@ -168,28 +130,21 @@ void Init_ByRestart_HDF5( const char *FileName ) MPI_Barrier( MPI_COMM_WORLD ); - LoadField( "Model", &KeyInfo.Model, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, Fatal, &Model, 1, Fatal ); - LoadField( "Gravity", &KeyInfo.Gravity, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, Fatal, &Gravity, 1, Fatal ); - LoadField( "Particle", &KeyInfo.Particle, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, Fatal, &Particle, 1, NonFatal ); - LoadField( "NLevel", &KeyInfo.NLevel, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, Fatal, NullPtr, -1, NonFatal ); - LoadField( "NCompFluid", &KeyInfo.NCompFluid, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, NonFatal, &NCompFluid, 1, Fatal ); - LoadField( "NCompPassive", &KeyInfo.NCompPassive, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, NonFatal, &NCompPassive, 1, Fatal ); - LoadField( "PatchSize", &KeyInfo.PatchSize, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, Fatal, &PatchSize, 1, Fatal ); - // support re-enabling PARTICLE from a snapshot without particles, but not vice-versa - if ( Particle && ! KeyInfo.Particle ) - ReenablePar = true; - - else if ( ! Particle && KeyInfo.Particle ) +# ifdef PARTICLE + if ( ! Particle_RS ) ReenablePar = true; +# else + if ( Particle_RS ) Aux_Error( ERROR_INFO, "cannot disable PARTICLE when restarting from a snapshot with particles !!\n" ); +# endif // runtime NLEVEL must be >= loaded NLEVEL - if ( KeyInfo.NLevel > NLEVEL ) + if ( NLevel_RS > NLEVEL ) Aux_Error( ERROR_INFO, "%s : RESTART file (%d) > runtime (%d) !!\n", - "NLEVEL", KeyInfo.NLevel, NLEVEL ); + "NLEVEL", NLevel_RS, NLEVEL ); else { - NLvRescale = 1 << ( NLEVEL - KeyInfo.NLevel ); + NLvRescale = 1 << ( NLEVEL - NLevel_RS ); if ( MPI_Rank == 0 && NLvRescale != 1 ) Aux_Message( stderr, "WARNING : the NLEVEL rescale factor is set to %d\n", NLvRescale ); @@ -197,127 +152,58 @@ void Init_ByRestart_HDF5( const char *FileName ) MPI_Barrier( MPI_COMM_WORLD ); - LoadField( "DumpID", &KeyInfo.DumpID, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, Fatal, NullPtr, -1, NonFatal ); - LoadField( "NX0", KeyInfo.NX0, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, Fatal, NX0_TOT, 3, Fatal ); - LoadField( "BoxScale", KeyInfo.BoxScale, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, Fatal, NullPtr, -1, NonFatal ); - LoadField( "NPatch", KeyInfo.NPatch, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, Fatal, NullPtr, -1, NonFatal ); - LoadField( "CellScale", KeyInfo.CellScale, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, Fatal, NullPtr, -1, NonFatal ); -# if ( MODEL == HYDRO ) - if ( KeyInfo.FormatVersion >= 2400 ) - LoadField( "Magnetohydrodynamics", &KeyInfo.Magnetohydrodynamics, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, Fatal, &Magnetohydrodynamics, 1, Fatal ); - - if ( KeyInfo.FormatVersion >= 2473 ) - LoadField( "SRHydrodynamics", &KeyInfo.SRHydrodynamics, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, Fatal, &SRHydrodynamics, 1, Fatal ); - - if ( KeyInfo.FormatVersion >= 2421 ) - LoadField( "CosmicRay", &KeyInfo.CosmicRay, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, Fatal, &CosmicRay, 1, Fatal ); -# endif - - LoadField( "Step", &KeyInfo.Step, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, Fatal, NullPtr, -1, NonFatal ); - LoadField( "AdvanceCounter", KeyInfo.AdvanceCounter, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, Fatal, NullPtr, -1, NonFatal ); -# ifdef PARTICLE - if ( ReenablePar ) { - KeyInfo.Par_NPar = 0; - KeyInfo.Par_NAttFltStored = 0; - KeyInfo.Par_NAttIntStored = 0; - } +// 1-3. compare runtime parameters with the file one-by-one (by all ranks) + HDF5_Output_t HDF5_KeyInfo_RT; + FillIn_HDF5_KeyInfo( &HDF5_KeyInfo_RT, NULL_INT, Load_RS_Yes, FormatVersion_RS, ReenablePar ); + HDF5_KeyInfo_RT.Compare2File_All( H5_SetID_KeyInfo, H5_TypeID_KeyInfo ); - else { - LoadField( "Par_NPar", &KeyInfo.Par_NPar, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, Fatal, NullPtr, -1, NonFatal ); - if ( KeyInfo.FormatVersion >= 2300 ) - LoadField( "Par_NAttFltStored", &KeyInfo.Par_NAttFltStored, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, NonFatal, &Par_NAttFltStored, 1, Fatal ); - else - LoadField( "Par_NAttFltStored", &KeyInfo.Par_NAttFltStored, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, NonFatal, &Par_NAttFltStored, 1, NonFatal ); - if ( KeyInfo.FormatVersion >= 2500 ) - LoadField( "Par_NAttIntStored", &KeyInfo.Par_NAttIntStored, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, NonFatal, &Par_NAttIntStored, 1, Fatal ); - else - LoadField( "Par_NAttIntStored", &KeyInfo.Par_NAttIntStored, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, NonFatal, &Par_NAttIntStored, 1, NonFatal ); - } // if ( ReenablePar ) ... else ... -# endif -# ifdef COSMIC_RAY - LoadField( "CR_Diffusion", &KeyInfo.CR_Diffusion, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, Fatal, &CR_Diffusion, -1, NonFatal ); -# endif +// 1-4. reset +// --> set internal parameters +// 1. parameters must be reset +// 2. parameters reset only when OPT__RESTART_RESET is disabled - LoadField( "BoxSize", KeyInfo.BoxSize, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, Fatal, amr->BoxSize, 3, Fatal ); - LoadField( "Time", KeyInfo.Time, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, Fatal, NullPtr, -1, NonFatal ); - LoadField( "CellSize", KeyInfo.CellSize, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, Fatal, NullPtr, -1, NonFatal ); - LoadField( "dTime_AllLv", KeyInfo.dTime_AllLv, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, NonFatal, NullPtr, -1, NonFatal ); -# ifdef GRAVITY - LoadField( "AveDens_Init", &KeyInfo.AveDens_Init, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, Fatal, NullPtr, -1, NonFatal ); -# endif # if ( ELBDM_SCHEME == ELBDM_HYBRID ) - LoadField( "UseWaveScheme", KeyInfo.UseWaveScheme, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, Fatal, NullPtr, -1, NonFatal ); + GetFieldData( "UseWaveScheme", H5_SetID_KeyInfo, H5_TypeID_KeyInfo, &amr->use_wave_flag[0], NotAllocate ); # endif + GetFieldData( "NPatch", H5_SetID_KeyInfo, H5_TypeID_KeyInfo, &NPatchTotal[0], NotAllocate ); -// must initialize all char* pointers as NULL so that we can safely free them later -// --> in case they do not exist in the restart file - KeyInfo.CodeVersion = NULL; - KeyInfo.DumpWallTime = NULL; - KeyInfo.GitBranch = NULL; - KeyInfo.GitCommit = NULL; - - LoadField( "CodeVersion", &KeyInfo.CodeVersion, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, NonFatal, VERSION, 1, NonFatal ); - LoadField( "DumpWallTime", &KeyInfo.DumpWallTime, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, NonFatal, NullPtr, -1, NonFatal ); - LoadField( "GitBranch", &KeyInfo.GitBranch, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, NonFatal, EXPAND_AND_QUOTE(GIT_BRANCH), 1, NonFatal ); - LoadField( "GitCommit", &KeyInfo.GitCommit, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, NonFatal, EXPAND_AND_QUOTE(GIT_COMMIT), 1, NonFatal ); - - if ( KeyInfo.FormatVersion >= 2502 ) - { - LoadField( "ConRef", ConRef, H5_SetID_KeyInfo, H5_TypeID_KeyInfo, Fatal, NullPtr, -1, NonFatal ); - ConRefInitialized = true; - } - - -// 1-4. close all objects - H5_Status = H5Tclose( H5_TypeID_KeyInfo ); - H5_Status = H5Dclose( H5_SetID_KeyInfo ); - H5_Status = H5Fclose( H5_FileID ); - - -// 1-5. set internal parameters -// 1-5-1. parameters must be reset - for (int lv=0; lv= 2502 ) { - NPatchTotal [lv] = KeyInfo.NPatch [lv]; -# if ( ELBDM_SCHEME == ELBDM_HYBRID ) - amr->use_wave_flag[lv] = KeyInfo.UseWaveScheme[lv]; -# endif + GetFieldData( "ConRef", H5_SetID_KeyInfo, H5_TypeID_KeyInfo, &ConRef[0], NotAllocate ); + ConRefInitialized = true; } -# ifdef PARTICLE - amr->Par->NPar_Active_AllRank = KeyInfo.Par_NPar; -# endif - -// 1-5-2. parameters reset only when OPT__RESTART_RESET is disabled if ( ! OPT__RESTART_RESET ) { - for (int lv=0; lv= 2250 ) - dTime_AllLv [lv] = KeyInfo.dTime_AllLv [lv]; - } - - Step = KeyInfo.Step; + GetFieldData( "Time", H5_SetID_KeyInfo, H5_TypeID_KeyInfo, &Time[0], NotAllocate ); + GetFieldData( "Step", H5_SetID_KeyInfo, H5_TypeID_KeyInfo, &Step, NotAllocate ); + GetFieldData( "AdvanceCounter", H5_SetID_KeyInfo, H5_TypeID_KeyInfo, &AdvanceCounter[0], NotAllocate ); + if ( FormatVersion_RS >= 2250 ) + GetFieldData( "dTime_AllLv", H5_SetID_KeyInfo, H5_TypeID_KeyInfo, &dTime_AllLv[0], NotAllocate ); # ifdef GRAVITY - AveDensity_Init = KeyInfo.AveDens_Init; + GetFieldData( "AveDens_Init", H5_SetID_KeyInfo, H5_TypeID_KeyInfo, &AveDensity_Init, NotAllocate ); # endif } +// 1-5. close all objects + H5_Status = H5Tclose( H5_TypeID_KeyInfo ); + H5_Status = H5Dclose( H5_SetID_KeyInfo ); + H5_Status = H5Fclose( H5_FileID ); + + // 1-6. set parameters in levels that do not exist in the input file // --> assuming dTime_AllLv[] has been initialized as 0.0 properly - for (int lv=KeyInfo.NLevel; lvuse_wave_flag[lv] = KeyInfo.UseWaveScheme[ KeyInfo.NLevel - 1 ]; + amr->use_wave_flag[lv] = amr->use_wave_flag[ NLevel_RS - 1 ]; # endif } @@ -337,21 +223,59 @@ void Init_ByRestart_HDF5( const char *FileName ) // 1-8. set the next dump ID if ( INIT_DUMPID < 0 ) - DumpID = ( OPT__RESTART_RESET ) ? 0 : KeyInfo.DumpID + 1; + DumpID = ( OPT__RESTART_RESET ) ? 0 : DumpID_RS + 1; else DumpID = INIT_DUMPID; -// 1-9. reset parameters from the restart file - if ( ! OPT__RESTART_RESET ) ResetParameter( FileName, &END_T, &END_STEP ); - - // 1-10. check all other simulation information (by rank 0 only) if ( MPI_Rank == 0 ) { - Check_Makefile ( FileName, KeyInfo.FormatVersion ); - Check_SymConst ( FileName, KeyInfo.FormatVersion ); - Check_InputPara( FileName, KeyInfo.FormatVersion ); + hid_t FID; // file ID + hid_t SID_Makefile, SID_SymConst, SID_InputPara; // dataset ID + hid_t TID_Makefile, TID_SymConst, TID_InputPara; // datatype ID + HDF5_Output_t HDF5_Makefile_RT, HDF5_SymConst_RT, HDF5_InputPara_RT; // RT = RunTime + +// 1-10-1. fill in the runtime parameters + FillIn_HDF5_Makefile ( &HDF5_Makefile_RT, FormatVersion_RS ); + FillIn_HDF5_SymConst ( &HDF5_SymConst_RT, FormatVersion_RS ); + FillIn_HDF5_InputPara( &HDF5_InputPara_RT, NCOMP_TOTAL, FieldLabel, Load_RS_Yes ); // no need to include all output fields here + +// 1-10-2. open the HDF5 file + FID = H5Fopen( FileName, H5F_ACC_RDONLY, H5P_DEFAULT ); + + if ( FID < 0 ) + Aux_Error( ERROR_INFO, "failed to open the restart HDF5 file \"%s\" !!\n", FileName ); + +// 1-10-3. load the dataset and datatype + SID_Makefile = H5Dopen( FID, "Info/Makefile", H5P_DEFAULT ); + if ( SID_Makefile < 0 ) + Aux_Error( ERROR_INFO, "failed to open the dataset \"%s\" !!\n", "Info/Makefile" ); + TID_Makefile = H5Dget_type( SID_Makefile ); + + SID_SymConst = H5Dopen( FID, "Info/SymConst", H5P_DEFAULT ); + if ( SID_SymConst < 0 ) + Aux_Error( ERROR_INFO, "failed to open the dataset \"%s\" !!\n", "Info/SymConst" ); + TID_SymConst = H5Dget_type( SID_SymConst ); + + SID_InputPara = H5Dopen( FID, "Info/InputPara", H5P_DEFAULT ); + if ( SID_InputPara < 0 ) + Aux_Error( ERROR_INFO, "failed to open the dataset \"%s\" !!\n", "Info/InputPara" ); + TID_InputPara = H5Dget_type( SID_InputPara ); + +// 1-10-4. compare all target fields one-by-one + HDF5_Makefile_RT.Compare2File_All ( SID_Makefile , TID_Makefile ); + HDF5_SymConst_RT.Compare2File_All ( SID_SymConst , TID_SymConst ); + HDF5_InputPara_RT.Compare2File_All( SID_InputPara, TID_InputPara ); + +// 1-10-5. close all objects + H5_Status = H5Tclose( TID_Makefile ); + H5_Status = H5Tclose( TID_SymConst ); + H5_Status = H5Tclose( TID_InputPara ); + H5_Status = H5Dclose( SID_Makefile ); + H5_Status = H5Dclose( SID_SymConst ); + H5_Status = H5Dclose( SID_InputPara ); + H5_Status = H5Fclose( FID ); } @@ -388,7 +312,7 @@ void Init_ByRestart_HDF5( const char *FileName ) H5_Status = H5Dread( H5_SetID_Cr, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, CrList_AllLv ); H5_Status = H5Dclose( H5_SetID_Cr ); -// rescale the loaded corner (necessary when KeyInfo.NLevel != NLEVEL) +// rescale the loaded corner (necessary when NLevel_RS != NLEVEL) if ( NLvRescale != 1 ) for (int GID=0; GIDscale[0]; } -// loop over the corners of all root-level patches (rescale in advance if KeyInfo.NLevel != NLEVEL) +// loop over the corners of all root-level patches (rescale in advance if NLevel_RS != NLEVEL) const int TenPercent = MAX( NPatchTotal[0]/10, 1 ); for (int GID=0; GIDnum, NLoadPatch, KeyInfo.NLevel, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD ); + int NLoadPatch[NLevel_RS]; + MPI_Reduce( amr->num, NLoadPatch, NLevel_RS, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD ); if ( MPI_Rank == 0 ) - for (int lv=0; lv 0") -// --> Please make sure that "FieldPtr" and "ComprPtr" point to the same type since we -// use the type of "ComprPtr" to typecast "FieldPtr" -// -// Parameter : FieldName : Name of the target field -// FieldPtr : Pointer to store the retrieved data -// H5_SetID_Target : HDF5 dataset ID of the target compound variable -// H5_TypeID_Target : HDF5 datatype ID of the target compound variable -// Fatal_Nonexist : Whether or not the nonexistence of the target field is fatal -// --> true : terminate the program if the target field cannot be found -// false : display a warning message if the target field cannot be found -// ComprPtr : Pointer to store the reference values for comparison -// NCompr : Number of elements to be compared -// Fatal_Compr : Whether or not the comparison result is fatal -// --> true : terminate the program if "FieldPtr[X] != ComprPtr[X]" -// false : display a warning message if "FieldPtr[X] != ComprPtr[X]" -// -// Return : Success/fail <-> 0/<0 -//------------------------------------------------------------------------------------------------------- -template -herr_t LoadField( const char *FieldName, void *FieldPtr, const hid_t H5_SetID_Target, - const hid_t H5_TypeID_Target, const bool Fatal_Nonexist, - const T *ComprPtr, const int NCompr, const bool Fatal_Compr ) -{ - -// nothing to do if NCompr == 0 (note that in certain circumstances some variables can have zero size) - if ( NCompr == 0 ) return 0; - - -# ifdef DEBUG_HDF5 - if ( NCompr > 0 && ComprPtr == NULL ) - Aux_Error( ERROR_INFO, "ComprPtr == NULL for NCompr = %d > 0 !!\n", NCompr ); -# endif - - - bool Check_Pass = true; - int H5_FieldIdx; - size_t H5_FieldSize; - hid_t H5_TypeID_Field; // datatype ID of the target field in the compound variable - hid_t H5_TypeID_Load; // datatype ID for loading the target field - herr_t H5_Status; - - -// load - H5_FieldIdx = H5Tget_member_index( H5_TypeID_Target, FieldName ); - - if ( H5_FieldIdx >= 0 ) - { - H5_TypeID_Field = H5Tget_member_type( H5_TypeID_Target, H5_FieldIdx ); - H5_FieldSize = H5Tget_size( H5_TypeID_Field ); - - H5_TypeID_Load = H5Tcreate( H5T_COMPOUND, H5_FieldSize ); - H5_Status = H5Tinsert( H5_TypeID_Load, FieldName, 0, H5_TypeID_Field ); - - H5_Status = H5Dread( H5_SetID_Target, H5_TypeID_Load, H5S_ALL, H5S_ALL, H5P_DEFAULT, FieldPtr ); - if ( H5_Status < 0 ) Aux_Error( ERROR_INFO, "failed to load the field \"%s\" !!\n", FieldName ); - - H5_Status = H5Tclose( H5_TypeID_Field ); - H5_Status = H5Tclose( H5_TypeID_Load ); - } // if ( H5_FieldIdx >= 0 ) - - else - { - if ( Fatal_Nonexist ) - Aux_Error( ERROR_INFO, "target field \"%s\" does not exist in the restart file !!\n", FieldName ); - - else if ( MPI_Rank == 0 ) - Aux_Message( stderr, "WARNING : target field \"%s\" does not exist in the restart file !!\n", FieldName ); - - return -1; - } // if ( H5_FieldIdx >= 0 ) ... else ... - - -// comparison - char ArrayIdx[MAX_STRING]; - -// compare strings - if ( NCompr > 0 && typeid(T) == typeid(char) ) - { - if ( strcmp( *(char**)FieldPtr, (char*)ComprPtr ) != 0 ) - { - if ( Fatal_Compr ) - { - Aux_Error( ERROR_INFO, "\"%s\" : RESTART file (%s) != runtime (%s) !!\n", - FieldName, *(char**)FieldPtr, (char*)ComprPtr ); - return -2; - } - - else - { - if ( MPI_Rank == 0 ) - Aux_Message( stderr, "WARNING : \"%s\" : RESTART file (%s) != runtime (%s) !!\n", - FieldName, *(char**)FieldPtr, (char*)ComprPtr ); - Check_Pass = false; - } - } - } - -// compare other data types - else - for (int t=0; t= 2300 ) - LoadField( "Par_NAttFltUser", &RS.Par_NAttFltUser, SID, TID, NonFatal, &RT.Par_NAttFltUser, 1, Fatal ); - else - LoadField( "Par_NAttFltUser", &RS.Par_NAttFltUser, SID, TID, NonFatal, &RT.Par_NAttFltUser, 1, NonFatal ); - if ( FormatVersion >= 2500 ) - LoadField( "Par_NAttIntUser", &RS.Par_NAttIntUser, SID, TID, NonFatal, &RT.Par_NAttIntUser, 1, Fatal ); - else - LoadField( "Par_NAttIntUser", &RS.Par_NAttIntUser, SID, TID, NonFatal, &RT.Par_NAttIntUser, 1, NonFatal ); - LoadField( "Float8_Par", &RS.Float8_Par, SID, TID, NonFatal, &RT.Float8_Par, 1, NonFatal ); - LoadField( "Int8_Par", &RS.Int8_Par, SID, TID, NonFatal, &RT.Int8_Par, 1, NonFatal ); -# endif - -# ifdef COSMIC_RAY - LoadField( "CR_Diffusion", &RS.CR_Diffusion, SID, TID, NonFatal, &RT.CR_Diffusion, 1, NonFatal ); -# endif // #ifdef COSMIC_RAY - - -// 5. close all objects - Status = H5Tclose( TID ); - Status = H5Dclose( SID ); - Status = H5Fclose( FID ); - -} // FUNCTION : Check_Makefile - - - -//------------------------------------------------------------------------------------------------------- -// Function : Check_SymConst -// Description : Load and compare the SymConst_t structure (runtime vs. restart file) +// Function : GetFieldData +// Description : Get the target field data from the restart file // -// Note : 1. Unnecessary comparisons are avoided -// 2. Program may be terminated if any fatal difference is found +// Note : 1. The memory size of `Ptr` must not smaller than the data size in the restart file +// 2. `Ptr` must be NULL to allocate the memory +// 3. The allocated memory must be closed manually // -// Parameter : FileName : Restart file name -// FormatVersion : File format ID -//------------------------------------------------------------------------------------------------------- -void Check_SymConst( const char *FileName, const int FormatVersion ) -{ - - const bool Fatal = true; - const bool NonFatal = false; - - herr_t Status; - - -// 1. fill in the runtime parameters - SymConst_t RT; // RT = RunTime - FillIn_SymConst( RT ); - - -// 2. open the HDF5 file - const hid_t FID = H5Fopen( FileName, H5F_ACC_RDONLY, H5P_DEFAULT ); // file ID - - if ( FID < 0 ) - Aux_Error( ERROR_INFO, "failed to open the restart HDF5 file \"%s\" !!\n", FileName ); - - -// 3. load the SymConst dataset and datatype - const hid_t SID = H5Dopen( FID, "Info/SymConst", H5P_DEFAULT ); // dataset ID - - if ( SID < 0 ) - Aux_Error( ERROR_INFO, "failed to open the dataset \"%s\" !!\n", "Info/SymConst" ); - - const hid_t TID = H5Dget_type( SID ); // datatype ID - - -// 4. load and compare all target fields one-by-one - SymConst_t RS; // RS = ReStart - - - LoadField( "NCompFluid", &RS.NCompFluid, SID, TID, NonFatal, &RT.NCompFluid, 1, Fatal ); - LoadField( "NCompPassive", &RS.NCompPassive, SID, TID, NonFatal, &RT.NCompPassive, 1, Fatal ); - LoadField( "PatchSize", &RS.PatchSize, SID, TID, NonFatal, &RT.PatchSize, 1, Fatal ); - LoadField( "Flu_NIn", &RS.Flu_NIn, SID, TID, NonFatal, &RT.Flu_NIn, 1, NonFatal ); - LoadField( "Flu_NOut", &RS.Flu_NOut, SID, TID, NonFatal, &RT.Flu_NOut, 1, NonFatal ); - LoadField( "Flu_NIn_T", &RS.Flu_NIn_T, SID, TID, NonFatal, &RT.Flu_NIn_T, 1, NonFatal ); - LoadField( "Flu_NIn_S", &RS.Flu_NIn_S, SID, TID, NonFatal, &RT.Flu_NIn_S, 1, NonFatal ); - LoadField( "Flu_NOut_S", &RS.Flu_NOut_S, SID, TID, NonFatal, &RT.Flu_NOut_S, 1, NonFatal ); - LoadField( "NFluxFluid", &RS.NFluxFluid, SID, TID, NonFatal, &RT.NFluxFluid, 1, NonFatal ); - LoadField( "NFluxPassive", &RS.NFluxPassive, SID, TID, NonFatal, &RT.NFluxPassive, 1, NonFatal ); - LoadField( "Flu_GhostSize", &RS.Flu_GhostSize, SID, TID, NonFatal, &RT.Flu_GhostSize, 1, NonFatal ); - LoadField( "Flu_Nxt", &RS.Flu_Nxt, SID, TID, NonFatal, &RT.Flu_Nxt, 1, NonFatal ); - LoadField( "Debug_HDF5", &RS.Debug_HDF5, SID, TID, NonFatal, &RT.Debug_HDF5, 1, NonFatal ); - LoadField( "SibOffsetNonperiodic", &RS.SibOffsetNonperiodic, SID, TID, NonFatal, &RT.SibOffsetNonperiodic, 1, NonFatal ); -# ifdef LOAD_BALANCE - LoadField( "SonOffsetLB", &RS.SonOffsetLB, SID, TID, NonFatal, &RT.SonOffsetLB, 1, NonFatal ); -# endif - LoadField( "TinyNumber", &RS.TinyNumber, SID, TID, NonFatal, &RT.TinyNumber, 1, NonFatal ); - LoadField( "HugeNumber", &RS.HugeNumber, SID, TID, NonFatal, &RT.HugeNumber, 1, NonFatal ); - LoadField( "MaxError", &RS.MaxError, SID, TID, NonFatal, &RT.MaxError, 1, NonFatal ); - -# ifdef GRAVITY - LoadField( "Gra_NIn", &RS.Gra_NIn, SID, TID, NonFatal, &RT.Gra_NIn, 1, NonFatal ); - LoadField( "Pot_GhostSize", &RS.Pot_GhostSize, SID, TID, NonFatal, &RT.Pot_GhostSize, 1, NonFatal ); - LoadField( "Gra_GhostSize", &RS.Gra_GhostSize, SID, TID, NonFatal, &RT.Gra_GhostSize, 1, NonFatal ); - LoadField( "Rho_GhostSize", &RS.Rho_GhostSize, SID, TID, NonFatal, &RT.Rho_GhostSize, 1, NonFatal ); - LoadField( "Pot_Nxt", &RS.Pot_Nxt, SID, TID, NonFatal, &RT.Pot_Nxt, 1, NonFatal ); - LoadField( "Gra_Nxt", &RS.Gra_Nxt, SID, TID, NonFatal, &RT.Gra_Nxt, 1, NonFatal ); - LoadField( "Rho_Nxt", &RS.Rho_Nxt, SID, TID, NonFatal, &RT.Rho_Nxt, 1, NonFatal ); -# ifdef UNSPLIT_GRAVITY - LoadField( "USG_GhostSizeF", &RS.USG_GhostSizeF, SID, TID, NonFatal, &RT.USG_GhostSizeF, 1, NonFatal ); - LoadField( "USG_GhostSizeG", &RS.USG_GhostSizeG, SID, TID, NonFatal, &RT.USG_GhostSizeG, 1, NonFatal ); - LoadField( "USG_NxtF", &RS.USG_NxtF, SID, TID, NonFatal, &RT.USG_NxtF, 1, NonFatal ); - LoadField( "USG_NxtG", &RS.USG_NxtG, SID, TID, NonFatal, &RT.USG_NxtG, 1, NonFatal ); -# endif - LoadField( "ExtPot_BlockSize", &RS.ExtPot_BlockSize, SID, TID, NonFatal, &RT.ExtPot_BlockSize, 1, NonFatal ); - LoadField( "Gra_BlockSize", &RS.Gra_BlockSize, SID, TID, NonFatal, &RT.Gra_BlockSize, 1, NonFatal ); - LoadField( "ExtPotNAuxMax", &RS.ExtPotNAuxMax, SID, TID, NonFatal, &RT.ExtPotNAuxMax, 1, NonFatal ); - LoadField( "ExtAccNAuxMax", &RS.ExtAccNAuxMax, SID, TID, NonFatal, &RT.ExtAccNAuxMax, 1, NonFatal ); - LoadField( "ExtPotNGeneMax", &RS.ExtPotNGeneMax, SID, TID, NonFatal, &RT.ExtPotNGeneMax, 1, NonFatal ); -# if ( POT_SCHEME == SOR ) - LoadField( "Pot_BlockSize_z", &RS.Pot_BlockSize_z, SID, TID, NonFatal, &RT.Pot_BlockSize_z, 1, NonFatal ); - LoadField( "SOR_RhoShared", &RS.SOR_RhoShared, SID, TID, NonFatal, &RT.SOR_RhoShared, 1, NonFatal ); - LoadField( "SOR_CPotShared", &RS.SOR_CPotShared, SID, TID, NonFatal, &RT.SOR_CPotShared, 1, NonFatal ); - LoadField( "SOR_UseShuffle", &RS.SOR_UseShuffle, SID, TID, NonFatal, &RT.SOR_UseShuffle, 1, NonFatal ); - LoadField( "SOR_UsePadding", &RS.SOR_UsePadding, SID, TID, NonFatal, &RT.SOR_UsePadding, 1, NonFatal ); - LoadField( "SOR_ModReduction", &RS.SOR_ModReduction, SID, TID, NonFatal, &RT.SOR_ModReduction, 1, NonFatal ); -# elif ( POT_SCHEME == MG ) - LoadField( "Pot_BlockSize_x", &RS.Pot_BlockSize_x, SID, TID, NonFatal, &RT.Pot_BlockSize_x, 1, NonFatal ); -# endif -# endif // #ifdef GRAVITY - -# ifdef PARTICLE - if ( FormatVersion >= 2300 ) - LoadField( "Par_NAttFltStored", &RS.Par_NAttFltStored, SID, TID, NonFatal, &RT.Par_NAttFltStored, 1, Fatal ); - else - LoadField( "Par_NAttFltStored", &RS.Par_NAttFltStored, SID, TID, NonFatal, &RT.Par_NAttFltStored, 1, NonFatal ); - if ( FormatVersion >= 2500 ) - LoadField( "Par_NAttIntStored", &RS.Par_NAttIntStored, SID, TID, NonFatal, &RT.Par_NAttIntStored, 1, Fatal ); - else - LoadField( "Par_NAttIntStored", &RS.Par_NAttIntStored, SID, TID, NonFatal, &RT.Par_NAttIntStored, 1, NonFatal ); - LoadField( "Par_NType", &RS.Par_NType, SID, TID, NonFatal, &RT.Par_NType, 1, NonFatal ); -# ifdef GRAVITY - LoadField( "RhoExt_GhostSize", &RS.RhoExt_GhostSize, SID, TID, NonFatal, &RT.RhoExt_GhostSize, 1, NonFatal ); -# endif - LoadField( "Debug_Particle", &RS.Debug_Particle, SID, TID, NonFatal, &RT.Debug_Particle, 1, NonFatal ); - LoadField( "ParList_GrowthFactor", &RS.ParList_GrowthFactor, SID, TID, NonFatal, &RT.ParList_GrowthFactor, 1, NonFatal ); - LoadField( "ParList_ReduceFactor", &RS.ParList_ReduceFactor, SID, TID, NonFatal, &RT.ParList_ReduceFactor, 1, NonFatal ); -# endif // #ifdef PARTICLE - - LoadField( "BitRep_Flux", &RS.BitRep_Flux, SID, TID, NonFatal, &RT.BitRep_Flux, 1, NonFatal ); -# ifdef MHD - LoadField( "BitRep_Electric", &RS.BitRep_Electric, SID, TID, NonFatal, &RT.BitRep_Electric, 1, NonFatal ); -# endif - LoadField( "InterpMask", &RS.InterpMask, SID, TID, NonFatal, &RT.InterpMask, 1, NonFatal ); - LoadField( "FB_SepFluOut", &RS.FB_SepFluOut, SID, TID, NonFatal, &RT.FB_SepFluOut, 1, NonFatal ); - -# if ( MODEL == HYDRO ) - LoadField( "Flu_BlockSize_x", &RS.Flu_BlockSize_x, SID, TID, NonFatal, &RT.Flu_BlockSize_x, 1, NonFatal ); - LoadField( "Flu_BlockSize_y", &RS.Flu_BlockSize_y, SID, TID, NonFatal, &RT.Flu_BlockSize_y, 1, NonFatal ); - LoadField( "CheckUnphyInFluid", &RS.CheckUnphyInFluid, SID, TID, NonFatal, &RT.CheckUnphyInFluid, 1, NonFatal ); - LoadField( "CharReconstruction", &RS.CharReconstruction, SID, TID, NonFatal, &RT.CharReconstruction, 1, NonFatal ); - LoadField( "LR_Eint", &RS.LR_Eint, SID, TID, NonFatal, &RT.LR_Eint, 1, NonFatal ); - LoadField( "CheckIntermediate", &RS.CheckIntermediate, SID, TID, NonFatal, &RT.CheckIntermediate, 1, NonFatal ); - LoadField( "RSolverRescue", &RS.RSolverRescue, SID, TID, NonFatal, &RT.RSolverRescue, 1, NonFatal ); - LoadField( "HLL_NoRefState", &RS.HLL_NoRefState, SID, TID, NonFatal, &RT.HLL_NoRefState, 1, NonFatal ); - LoadField( "HLL_IncludeAllWaves", &RS.HLL_IncludeAllWaves, SID, TID, NonFatal, &RT.HLL_IncludeAllWaves, 1, NonFatal ); - LoadField( "HLLC_WaveSpeed", &RS.HLLC_WaveSpeed, SID, TID, NonFatal, &RT.HLLC_WaveSpeed, 1, NonFatal ); - LoadField( "HLLE_WaveSpeed", &RS.HLLE_WaveSpeed, SID, TID, NonFatal, &RT.HLLE_WaveSpeed, 1, NonFatal ); -# ifdef MHD - LoadField( "HLLD_WaveSpeed", &RS.HLLD_WaveSpeed, SID, TID, NonFatal, &RT.HLLD_WaveSpeed, 1, NonFatal ); -# endif -# ifdef N_FC_VAR - LoadField( "N_FC_Var", &RS.N_FC_Var, SID, TID, NonFatal, &RT.N_FC_Var, 1, NonFatal ); -# endif -# ifdef N_SLOPE_PPM - LoadField( "N_Slope_PPM", &RS.N_Slope_PPM, SID, TID, NonFatal, &RT.N_Slope_PPM, 1, NonFatal ); -# endif -# ifdef MHD - LoadField( "EulerY", &RS.EulerY, SID, TID, NonFatal, &RT.EulerY, 1, NonFatal ); -# endif - LoadField( "MHM_CheckPredict", &RS.MHM_CheckPredict, SID, TID, NonFatal, &RT.MHM_CheckPredict, 1, NonFatal ); - LoadField( "EoSNAuxMax", &RS.EoSNAuxMax, SID, TID, NonFatal, &RT.EoSNAuxMax, 1, NonFatal ); - LoadField( "EoSNTableMax", &RS.EoSNTableMax, SID, TID, NonFatal, &RT.EoSNTableMax, 1, NonFatal ); - -# elif ( MODEL == ELBDM ) - LoadField( "Flu_BlockSize_x", &RS.Flu_BlockSize_x, SID, TID, NonFatal, &RT.Flu_BlockSize_x, 1, NonFatal ); - LoadField( "Flu_BlockSize_y", &RS.Flu_BlockSize_y, SID, TID, NonFatal, &RT.Flu_BlockSize_y, 1, NonFatal ); -# if ( ELBDM_SCHEME == ELBDM_HYBRID ) - LoadField( "Flu_HJ_BlockSize_y", &RS.Flu_HJ_BlockSize_y, SID, TID, NonFatal, &RT.Flu_HJ_BlockSize_y, 1, NonFatal ); -# endif - -# if ( WAVE_SCHEME == WAVE_GRAMFE ) - LoadField( "GramFEScheme", &RS.GramFEScheme, SID, TID, NonFatal, &RT.GramFEScheme, 1, NonFatal ); - LoadField( "GramFEGamma", &RS.GramFEGamma, SID, TID, NonFatal, &RT.GramFEGamma, 1, NonFatal ); - LoadField( "GramFEG", &RS.GramFEG, SID, TID, NonFatal, &RT.GramFEG, 1, NonFatal ); - LoadField( "GramFENDelta", &RS.GramFENDelta, SID, TID, NonFatal, &RT.GramFENDelta, 1, NonFatal ); - LoadField( "GramFEOrder", &RS.GramFEOrder, SID, TID, NonFatal, &RT.GramFEOrder, 1, NonFatal ); - LoadField( "GramFEND", &RS.GramFEND, SID, TID, NonFatal, &RT.GramFEND, 1, NonFatal ); - LoadField( "GramFEFluNxt", &RS.GramFEFluNxt, SID, TID, NonFatal, &RT.GramFEFluNxt, 1, NonFatal ); -# endif -# else -# error : ERROR : unsupported MODEL !! -# endif // MODEL - - LoadField( "dt_Flu_BlockSize", &RS.dt_Flu_BlockSize, SID, TID, NonFatal, &RT.dt_Flu_BlockSize, 1, NonFatal ); - LoadField( "dt_Flu_UseShuffle", &RS.dt_Flu_UseShuffle, SID, TID, NonFatal, &RT.dt_Flu_UseShuffle, 1, NonFatal ); -# ifdef GRAVITY - LoadField( "dt_Gra_BlockSize", &RS.dt_Gra_BlockSize, SID, TID, NonFatal, &RT.dt_Gra_BlockSize, 1, NonFatal ); - LoadField( "dt_Gra_UseShuffle", &RS.dt_Gra_UseShuffle, SID, TID, NonFatal, &RT.dt_Gra_UseShuffle, 1, NonFatal ); -# endif - - LoadField( "Src_BlockSize", &RS.Src_BlockSize, SID, TID, NonFatal, &RT.Src_BlockSize, 1, NonFatal ); - LoadField( "Src_GhostSize", &RS.Src_GhostSize, SID, TID, NonFatal, &RT.Src_GhostSize, 1, NonFatal ); - LoadField( "Src_Nxt", &RS.Src_Nxt, SID, TID, NonFatal, &RT.Src_Nxt, 1, NonFatal ); -# if ( MODEL == HYDRO ) - LoadField( "Src_NAuxDlep", &RS.Src_NAuxDlep, SID, TID, NonFatal, &RT.Src_NAuxDlep, 1, NonFatal ); - LoadField( "Src_DlepProfNVar", &RS.Src_DlepProfNVar, SID, TID, NonFatal, &RT.Src_DlepProfNVar, 1, NonFatal ); - LoadField( "Src_DlepProfNBinMax", &RS.Src_DlepProfNBinMax, SID, TID, NonFatal, &RT.Src_DlepProfNBinMax, 1, NonFatal ); -# endif - LoadField( "Src_NAuxUser", &RS.Src_NAuxUser, SID, TID, NonFatal, &RT.Src_NAuxUser, 1, NonFatal ); - - LoadField( "Der_GhostSize", &RS.Der_GhostSize, SID, TID, NonFatal, &RT.Der_GhostSize, 1, NonFatal ); - LoadField( "Der_Nxt", &RS.Der_Nxt, SID, TID, NonFatal, &RT.Der_Nxt, 1, NonFatal ); - LoadField( "Der_NOut_Max", &RS.Der_NOut_Max, SID, TID, NonFatal, &RT.Der_NOut_Max, 1, NonFatal ); - -# ifdef FEEDBACK - LoadField( "FB_GhostSize", &RS.FB_GhostSize, SID, TID, NonFatal, &RT.FB_GhostSize, 1, NonFatal ); - LoadField( "FB_Nxt", &RS.FB_Nxt, SID, TID, NonFatal, &RT.FB_Nxt, 1, NonFatal ); -# endif - - LoadField( "NFieldStoredMax", &RS.NFieldStoredMax, SID, TID, NonFatal, &RT.NFieldStoredMax, 1, NonFatal ); - - LoadField( "NConRefMax", &RS.NConRefMax, SID, TID, NonFatal, &RT.NConRefMax, 1, NonFatal ); - - -// 5. close all objects - Status = H5Tclose( TID ); - Status = H5Dclose( SID ); - Status = H5Fclose( FID ); - -} // FUNCTION : Check_SymConst - - - -//------------------------------------------------------------------------------------------------------- -// Function : Check_InputPara -// Description : Load and compare the InputPara_t structure (runtime vs. restart file) -// -// Note : 1. Unnecessary comparisons are avoided -// 2. Program may be terminated if any fatal difference is found -// -// Parameter : FileName : Restart file name -// FormatVersion : File format ID -//------------------------------------------------------------------------------------------------------- -void Check_InputPara( const char *FileName, const int FormatVersion ) -{ - - const bool Fatal = true; - const bool NonFatal = false; - const int N1 = MAX_LEVEL; - const int NP = NCOMP_PASSIVE; - const int *NullPtr = NULL; - - herr_t Status; - - -// 1. fill in the runtime parameters - InputPara_t RT; // RT = RunTime - FillIn_InputPara( RT, NCOMP_TOTAL, FieldLabel ); // no need to include all output fields here - - -// 2. open the HDF5 file - const hid_t FID = H5Fopen( FileName, H5F_ACC_RDONLY, H5P_DEFAULT ); // file ID - - if ( FID < 0 ) - Aux_Error( ERROR_INFO, "failed to open the restart HDF5 file \"%s\" !!\n", FileName ); - - -// 3. load the InputPara dataset and datatype - const hid_t SID = H5Dopen( FID, "Info/InputPara", H5P_DEFAULT ); // dataset ID - - if ( SID < 0 ) - Aux_Error( ERROR_INFO, "failed to open the dataset \"%s\" !!\n", "Info/InputPara" ); - - const hid_t TID = H5Dget_type( SID ); // datatype ID - - -// 4. load and compare all target fields one-by-one - InputPara_t RS; // RS = ReStart - -// simulation scale - LoadField( "BoxSize", &RS.BoxSize, SID, TID, NonFatal, &RT.BoxSize, 1, Fatal ); - LoadField( "NX0_Tot", RS.NX0_Tot, SID, TID, NonFatal, RT.NX0_Tot, 3, Fatal ); - LoadField( "MPI_NRank", &RS.MPI_NRank, SID, TID, NonFatal, &RT.MPI_NRank, 1, NonFatal ); - LoadField( "MPI_NRank_X", RS.MPI_NRank_X, SID, TID, NonFatal, RT.MPI_NRank_X, 3, NonFatal ); - LoadField( "OMP_NThread", &RS.OMP_NThread, SID, TID, NonFatal, &RT.OMP_NThread, 1, NonFatal ); - LoadField( "EndT", &RS.EndT, SID, TID, NonFatal, &RT.EndT, 1, NonFatal ); - LoadField( "EndStep", &RS.EndStep, SID, TID, NonFatal, &RT.EndStep, 1, NonFatal ); - -// test problems - LoadField( "TestProb_ID", &RS.TestProb_ID, SID, TID, NonFatal, &RT.TestProb_ID, 1, NonFatal ); - -// code units - LoadField( "Opt__Unit", &RS.Opt__Unit, SID, TID, NonFatal, &RT.Opt__Unit, 1, NonFatal ); - LoadField( "Unit_L", &RS.Unit_L, SID, TID, NonFatal, &RT.Unit_L, 1, NonFatal ); - LoadField( "Unit_M", &RS.Unit_M, SID, TID, NonFatal, &RT.Unit_M, 1, NonFatal ); - LoadField( "Unit_T", &RS.Unit_T, SID, TID, NonFatal, &RT.Unit_T, 1, NonFatal ); - LoadField( "Unit_V", &RS.Unit_V, SID, TID, NonFatal, &RT.Unit_V, 1, NonFatal ); - LoadField( "Unit_D", &RS.Unit_D, SID, TID, NonFatal, &RT.Unit_D, 1, NonFatal ); - LoadField( "Unit_E", &RS.Unit_E, SID, TID, NonFatal, &RT.Unit_E, 1, NonFatal ); - LoadField( "Unit_P", &RS.Unit_P, SID, TID, NonFatal, &RT.Unit_P, 1, NonFatal ); -# ifdef MHD - LoadField( "Unit_B", &RS.Unit_B, SID, TID, NonFatal, &RT.Unit_B, 1, NonFatal ); -# endif - -// boundary condition - LoadField( "Opt__BC_Flu", RS.Opt__BC_Flu, SID, TID, NonFatal, RT.Opt__BC_Flu, 6, NonFatal ); -# ifdef GRAVITY - LoadField( "Opt__BC_Pot", &RS.Opt__BC_Pot, SID, TID, NonFatal, &RT.Opt__BC_Pot, 1, NonFatal ); - LoadField( "GFunc_Coeff0", &RS.GFunc_Coeff0, SID, TID, NonFatal, &RT.GFunc_Coeff0, 1, NonFatal ); -# endif - -// particle -# ifdef PARTICLE - LoadField( "Par_Init", &RS.Par_Init, SID, TID, NonFatal, &RT.Par_Init, 1, NonFatal ); - LoadField( "Par_ICFormat", &RS.Par_ICFormat, SID, TID, NonFatal, &RT.Par_ICFormat, 1, NonFatal ); - LoadField( "Par_ICMass", &RS.Par_ICMass, SID, TID, NonFatal, &RT.Par_ICMass, 1, NonFatal ); - LoadField( "Par_ICType", &RS.Par_ICType, SID, TID, NonFatal, &RT.Par_ICType, 1, NonFatal ); - LoadField( "Par_ICFloat8", &RS.Par_ICFloat8, SID, TID, NonFatal, &RT.Par_ICFloat8, 1, NonFatal ); - LoadField( "Par_Interp", &RS.Par_Interp, SID, TID, NonFatal, &RT.Par_Interp, 1, NonFatal ); - LoadField( "Par_InterpTracer", &RS.Par_InterpTracer, SID, TID, NonFatal, &RT.Par_InterpTracer, 1, NonFatal ); - LoadField( "Par_Integ", &RS.Par_Integ, SID, TID, NonFatal, &RT.Par_Integ, 1, NonFatal ); - LoadField( "Par_IntegTracer", &RS.Par_IntegTracer, SID, TID, NonFatal, &RT.Par_IntegTracer, 1, NonFatal ); - LoadField( "Par_ImproveAcc", &RS.Par_ImproveAcc, SID, TID, NonFatal, &RT.Par_ImproveAcc, 1, NonFatal ); - LoadField( "Par_PredictPos", &RS.Par_PredictPos, SID, TID, NonFatal, &RT.Par_PredictPos, 1, NonFatal ); - LoadField( "Par_RemoveCell", &RS.Par_RemoveCell, SID, TID, NonFatal, &RT.Par_RemoveCell, 1, NonFatal ); - LoadField( "Opt__FreezePar", &RS.Opt__FreezePar, SID, TID, NonFatal, &RT.Opt__FreezePar, 1, NonFatal ); - LoadField( "Par_GhostSize", &RS.Par_GhostSize, SID, TID, NonFatal, &RT.Par_GhostSize, 1, NonFatal ); - LoadField( "Par_GhostSizeTracer", &RS.Par_GhostSizeTracer, SID, TID, NonFatal, &RT.Par_GhostSizeTracer, 1, NonFatal ); - LoadField( "Par_TracerVelCorr", &RS.Par_TracerVelCorr, SID, TID, NonFatal, &RT.Par_TracerVelCorr, 1, NonFatal ); - LoadField( "Opt__ParInitCheck", &RS.Opt__ParInitCheck, SID, TID, NonFatal, &RT.Opt__ParInitCheck, 1, NonFatal ); -# endif - -// cosmology -# ifdef COMOVING - LoadField( "A_Init", &RS.A_Init, SID, TID, NonFatal, &RT.A_Init, 1, NonFatal ); - LoadField( "OmegaM0", &RS.OmegaM0, SID, TID, NonFatal, &RT.OmegaM0, 1, NonFatal ); - LoadField( "Hubble0", &RS.Hubble0, SID, TID, NonFatal, &RT.Hubble0, 1, NonFatal ); -# endif - -// time-step determination - LoadField( "Dt__Max", &RS.Dt__Max, SID, TID, NonFatal, &RT.Dt__Max, 1, NonFatal ); - LoadField( "Dt__Fluid", &RS.Dt__Fluid, SID, TID, NonFatal, &RT.Dt__Fluid, 1, NonFatal ); - LoadField( "Dt__FluidInit", &RS.Dt__FluidInit, SID, TID, NonFatal, &RT.Dt__FluidInit, 1, NonFatal ); -# ifdef GRAVITY - LoadField( "Dt__Gravity", &RS.Dt__Gravity, SID, TID, NonFatal, &RT.Dt__Gravity, 1, NonFatal ); -# endif -# if ( MODEL == ELBDM ) - LoadField( "Dt__Phase", &RS.Dt__Phase, SID, TID, NonFatal, &RT.Dt__Phase, 1, NonFatal ); -# if ( ELBDM_SCHEME == ELBDM_HYBRID ) - LoadField( "Dt__HybridCFL", &RS.Dt__HybridCFL, SID, TID, NonFatal, &RT.Dt__HybridCFL, 1, NonFatal ); - LoadField( "Dt__HybridCFLInit", &RS.Dt__HybridCFLInit, SID, TID, NonFatal, &RT.Dt__HybridCFLInit, 1, NonFatal ); - LoadField( "Dt__HybridVelocity", &RS.Dt__HybridVelocity, SID, TID, NonFatal, &RT.Dt__HybridVelocity, 1, NonFatal ); - LoadField( "Dt__HybridVelocityInit", &RS.Dt__HybridVelocityInit, SID, TID, NonFatal, &RT.Dt__HybridVelocityInit, 1, NonFatal ); -# endif -# endif // #if ( MODEL == ELBDM ) -# ifdef PARTICLE - LoadField( "Dt__ParVel", &RS.Dt__ParVel, SID, TID, NonFatal, &RT.Dt__ParVel, 1, NonFatal ); - LoadField( "Dt__ParVelMax", &RS.Dt__ParVelMax, SID, TID, NonFatal, &RT.Dt__ParVelMax, 1, NonFatal ); - LoadField( "Dt__ParAcc", &RS.Dt__ParAcc, SID, TID, NonFatal, &RT.Dt__ParAcc, 1, NonFatal ); -# endif -# ifdef CR_DIFFUSION - LoadField( "Dt__CR_Diffusion", &RS.Dt__CR_Diffusion, SID, TID, NonFatal, &RT.Dt__CR_Diffusion, 1, NonFatal ); -# endif -# ifdef COMOVING - LoadField( "Dt__MaxDeltaA", &RS.Dt__MaxDeltaA, SID, TID, NonFatal, &RT.Dt__MaxDeltaA, 1, NonFatal ); -# endif - LoadField( "Dt__SyncParentLv", &RS.Dt__SyncParentLv, SID, TID, NonFatal, &RT.Dt__SyncParentLv, 1, NonFatal ); - LoadField( "Dt__SyncChildrenLv", &RS.Dt__SyncChildrenLv, SID, TID, NonFatal, &RT.Dt__SyncChildrenLv, 1, NonFatal ); - LoadField( "Opt__DtUser", &RS.Opt__DtUser, SID, TID, NonFatal, &RT.Opt__DtUser, 1, NonFatal ); - LoadField( "Opt__DtLevel", &RS.Opt__DtLevel, SID, TID, NonFatal, &RT.Opt__DtLevel, 1, NonFatal ); - LoadField( "Opt__RecordDt", &RS.Opt__RecordDt, SID, TID, NonFatal, &RT.Opt__RecordDt, 1, NonFatal ); - LoadField( "AutoReduceDt", &RS.AutoReduceDt, SID, TID, NonFatal, &RT.AutoReduceDt, 1, NonFatal ); - LoadField( "AutoReduceDtFactor", &RS.AutoReduceDtFactor, SID, TID, NonFatal, &RT.AutoReduceDtFactor, 1, NonFatal ); - LoadField( "AutoReduceDtFactorMin", &RS.AutoReduceDtFactorMin, SID, TID, NonFatal, &RT.AutoReduceDtFactorMin, 1, NonFatal ); -# if ( MODEL == HYDRO ) - LoadField( "AutoReduceMinModFactor", &RS.AutoReduceMinModFactor, SID, TID, NonFatal, &RT.AutoReduceMinModFactor, 1, NonFatal ); - LoadField( "AutoReduceMinModMin", &RS.AutoReduceMinModMin, SID, TID, NonFatal, &RT.AutoReduceMinModMin, 1, NonFatal ); -# endif - LoadField( "AutoReduceIntMonoFactor", &RS.AutoReduceIntMonoFactor, SID, TID, NonFatal, &RT.AutoReduceIntMonoFactor, 1, NonFatal ); - LoadField( "AutoReduceIntMonoMin", &RS.AutoReduceIntMonoMin, SID, TID, NonFatal, &RT.AutoReduceIntMonoMin, 1, NonFatal ); - - -// domain refinement - LoadField( "RegridCount", &RS.RegridCount, SID, TID, NonFatal, &RT.RegridCount, 1, NonFatal ); - LoadField( "RefineNLevel", &RS.RefineNLevel, SID, TID, NonFatal, &RT.RefineNLevel, 1, NonFatal ); - LoadField( "FlagBufferSize", &RS.FlagBufferSize, SID, TID, NonFatal, &RT.FlagBufferSize, 1, NonFatal ); - LoadField( "FlagBufferSizeMaxM1Lv", &RS.FlagBufferSizeMaxM1Lv, SID, TID, NonFatal, &RT.FlagBufferSizeMaxM1Lv, 1, NonFatal ); - LoadField( "FlagBufferSizeMaxM2Lv", &RS.FlagBufferSizeMaxM2Lv, SID, TID, NonFatal, &RT.FlagBufferSizeMaxM2Lv, 1, NonFatal ); - LoadField( "MaxLevel", &RS.MaxLevel, SID, TID, NonFatal, &RT.MaxLevel, 1, NonFatal ); - LoadField( "Opt__Flag_Rho", &RS.Opt__Flag_Rho, SID, TID, NonFatal, &RT.Opt__Flag_Rho, 1, NonFatal ); - LoadField( "Opt__Flag_RhoGradient", &RS.Opt__Flag_RhoGradient, SID, TID, NonFatal, &RT.Opt__Flag_RhoGradient, 1, NonFatal ); - LoadField( "Opt__Flag_Angular", &RS.Opt__Flag_Angular, SID, TID, NonFatal, &RT.Opt__Flag_Angular, 1, NonFatal ); - LoadField( "Opt__Flag_Radial", &RS.Opt__Flag_Radial, SID, TID, NonFatal, &RT.Opt__Flag_Radial, 1, NonFatal ); -# if ( MODEL == HYDRO ) - LoadField( "Opt__Flag_PresGradient", &RS.Opt__Flag_PresGradient, SID, TID, NonFatal, &RT.Opt__Flag_PresGradient, 1, NonFatal ); - LoadField( "Opt__Flag_Vorticity", &RS.Opt__Flag_Vorticity, SID, TID, NonFatal, &RT.Opt__Flag_Vorticity, 1, NonFatal ); - LoadField( "Opt__Flag_Jeans", &RS.Opt__Flag_Jeans, SID, TID, NonFatal, &RT.Opt__Flag_Jeans, 1, NonFatal ); -# ifdef MHD - LoadField( "Opt__Flag_Current", &RS.Opt__Flag_Current, SID, TID, NonFatal, &RT.Opt__Flag_Current, 1, NonFatal ); -# endif -# ifdef SRHD - LoadField( "Opt__Flag_LrtzGradient", &RS.Opt__Flag_LrtzGradient, SID, TID, NonFatal, &RT.Opt__Flag_LrtzGradient, 1, NonFatal ); -# endif -# ifdef COSMIC_RAY - LoadField( "Opt__Flag_CRay", &RS.Opt__Flag_CRay, SID, TID, NonFatal, &RT.Opt__Flag_CRay, 1, NonFatal ); -# endif -# endif -# if ( MODEL == ELBDM ) - LoadField( "Opt__Flag_EngyDensity", &RS.Opt__Flag_EngyDensity, SID, TID, NonFatal, &RT.Opt__Flag_EngyDensity, 1, NonFatal ); - LoadField( "Opt__Flag_Spectral", &RS.Opt__Flag_Spectral, SID, TID, NonFatal, &RT.Opt__Flag_Spectral, 1, NonFatal ); - LoadField( "Opt__Flag_Spectral_N", &RS.Opt__Flag_Spectral_N, SID, TID, NonFatal, &RT.Opt__Flag_Spectral_N, 1, NonFatal ); -# if ( ELBDM_SCHEME == ELBDM_HYBRID ) - LoadField( "Opt__Flag_Interference", &RS.Opt__Flag_Interference, SID, TID, NonFatal, &RT.Opt__Flag_Interference, 1, NonFatal ); -# endif -# endif // #if ( MODEL == ELBDM ) - LoadField( "Opt__Flag_LohnerDens", &RS.Opt__Flag_LohnerDens, SID, TID, NonFatal, &RT.Opt__Flag_LohnerDens, 1, NonFatal ); -# if ( MODEL == HYDRO ) - LoadField( "Opt__Flag_LohnerEngy", &RS.Opt__Flag_LohnerEngy, SID, TID, NonFatal, &RT.Opt__Flag_LohnerEngy, 1, NonFatal ); - LoadField( "Opt__Flag_LohnerPres", &RS.Opt__Flag_LohnerPres, SID, TID, NonFatal, &RT.Opt__Flag_LohnerPres, 1, NonFatal ); - LoadField( "Opt__Flag_LohnerTemp", &RS.Opt__Flag_LohnerTemp, SID, TID, NonFatal, &RT.Opt__Flag_LohnerTemp, 1, NonFatal ); - LoadField( "Opt__Flag_LohnerEntr", &RS.Opt__Flag_LohnerEntr, SID, TID, NonFatal, &RT.Opt__Flag_LohnerEntr, 1, NonFatal ); -# ifdef COSMIC_RAY - LoadField( "Opt__Flag_LohnerCRay", &RS.Opt__Flag_LohnerCRay, SID, TID, NonFatal, &RT.Opt__Flag_LohnerCRay, 1, NonFatal ); -# endif -# endif - LoadField( "Opt__Flag_LohnerForm", &RS.Opt__Flag_LohnerForm, SID, TID, NonFatal, &RT.Opt__Flag_LohnerForm, 1, NonFatal ); - LoadField( "Opt__Flag_User", &RS.Opt__Flag_User, SID, TID, NonFatal, &RT.Opt__Flag_User, 1, NonFatal ); - LoadField( "Opt__Flag_User_Num", &RS.Opt__Flag_User_Num, SID, TID, NonFatal, &RT.Opt__Flag_User_Num, 1, NonFatal ); - LoadField( "Opt__Flag_Region", &RS.Opt__Flag_Region, SID, TID, NonFatal, &RT.Opt__Flag_Region, 1, NonFatal ); -# ifdef PARTICLE - LoadField( "Opt__Flag_NParPatch", &RS.Opt__Flag_NParPatch, SID, TID, NonFatal, &RT.Opt__Flag_NParPatch, 1, NonFatal ); - LoadField( "Opt__Flag_NParCell", &RS.Opt__Flag_NParCell, SID, TID, NonFatal, &RT.Opt__Flag_NParCell, 1, NonFatal ); - LoadField( "Opt__Flag_ParMassCell", &RS.Opt__Flag_ParMassCell, SID, TID, NonFatal, &RT.Opt__Flag_ParMassCell, 1, NonFatal ); -# endif - LoadField( "Opt__NoFlagNearBoundary", &RS.Opt__NoFlagNearBoundary, SID, TID, NonFatal, &RT.Opt__NoFlagNearBoundary, 1, NonFatal ); - LoadField( "Opt__PatchCount", &RS.Opt__PatchCount, SID, TID, NonFatal, &RT.Opt__PatchCount, 1, NonFatal ); -# ifdef PARTICLE - LoadField( "Opt__ParticleCount", &RS.Opt__ParticleCount, SID, TID, NonFatal, &RT.Opt__ParticleCount, 1, NonFatal ); -# endif - LoadField( "Opt__ReuseMemory", &RS.Opt__ReuseMemory, SID, TID, NonFatal, &RT.Opt__ReuseMemory, 1, NonFatal ); - LoadField( "Opt__MemoryPool", &RS.Opt__MemoryPool, SID, TID, NonFatal, &RT.Opt__MemoryPool, 1, NonFatal ); - -// load balance -# ifdef LOAD_BALANCE - LoadField( "LB_WLI_Max", &RS.LB_WLI_Max, SID, TID, NonFatal, &RT.LB_WLI_Max, 1, NonFatal ); -# ifdef PARTICLE - LoadField( "LB_Par_Weight", &RS.LB_Par_Weight, SID, TID, NonFatal, &RT.LB_Par_Weight, 1, NonFatal ); -# endif - LoadField( "Opt__RecordLoadBalance", &RS.Opt__RecordLoadBalance, SID, TID, NonFatal, &RT.Opt__RecordLoadBalance, 1, NonFatal ); - LoadField( "Opt__LB_ExchangeFather", &RS.Opt__LB_ExchangeFather, SID, TID, NonFatal, &RT.Opt__LB_ExchangeFather, 1, NonFatal ); -# endif // #ifdef LOAD_BALANCE - LoadField( "Opt__MinimizeMPIBarrier", &RS.Opt__MinimizeMPIBarrier, SID, TID, NonFatal, &RT.Opt__MinimizeMPIBarrier, 1, NonFatal ); - -// fluid solvers in HYDRO -# if ( MODEL == HYDRO ) - LoadField( "Gamma", &RS.Gamma, SID, TID, NonFatal, &RT.Gamma, 1, NonFatal ); - LoadField( "MolecularWeight", &RS.MolecularWeight, SID, TID, NonFatal, &RT.MolecularWeight, 1, NonFatal ); - LoadField( "MuNorm", &RS.MuNorm, SID, TID, NonFatal, &RT.MuNorm, 1, NonFatal ); - LoadField( "IsoTemp", &RS.IsoTemp, SID, TID, NonFatal, &RT.IsoTemp, 1, NonFatal ); - LoadField( "MinMod_Coeff", &RS.MinMod_Coeff, SID, TID, NonFatal, &RT.MinMod_Coeff, 1, NonFatal ); - LoadField( "MinMod_MaxIter", &RS.MinMod_MaxIter, SID, TID, NonFatal, &RT.MinMod_MaxIter, 1, NonFatal ); - LoadField( "Opt__LR_Limiter", &RS.Opt__LR_Limiter, SID, TID, NonFatal, &RT.Opt__LR_Limiter, 1, NonFatal ); - LoadField( "Opt__1stFluxCorr", &RS.Opt__1stFluxCorr, SID, TID, NonFatal, &RT.Opt__1stFluxCorr, 1, NonFatal ); - LoadField( "Opt__1stFluxCorrScheme", &RS.Opt__1stFluxCorrScheme, SID, TID, NonFatal, &RT.Opt__1stFluxCorrScheme, 1, NonFatal ); -# ifdef DUAL_ENERGY - LoadField( "DualEnergySwitch", &RS.DualEnergySwitch, SID, TID, NonFatal, &RT.DualEnergySwitch, 1, NonFatal ); -# endif -# ifdef MHD - LoadField( "Opt__SameInterfaceB", &RS.Opt__SameInterfaceB, SID, TID, NonFatal, &RT.Opt__SameInterfaceB, 1, NonFatal ); -# endif -# endif // HYDRO - -// ELBDM solvers -# if ( MODEL == ELBDM ) - LoadField( "ELBDM_Mass", &RS.ELBDM_Mass, SID, TID, NonFatal, &RT.ELBDM_Mass, 1, NonFatal ); - LoadField( "ELBDM_PlanckConst", &RS.ELBDM_PlanckConst, SID, TID, NonFatal, &RT.ELBDM_PlanckConst, 1, NonFatal ); -# ifdef QUARTIC_SELF_INTERACTION - LoadField( "ELBDM_Lambda", &RS.ELBDM_Lambda, SID, TID, NonFatal, &RT.ELBDM_Lambda, 1, NonFatal ); -# endif - LoadField( "ELBDM_Taylor3_Coeff", &RS.ELBDM_Taylor3_Coeff, SID, TID, NonFatal, &RT.ELBDM_Taylor3_Coeff, 1, NonFatal ); - LoadField( "ELBDM_Taylor3_Auto", &RS.ELBDM_Taylor3_Auto, SID, TID, NonFatal, &RT.ELBDM_Taylor3_Auto, 1, NonFatal ); - LoadField( "ELBDM_RemoveMotionCM", &RS.ELBDM_RemoveMotionCM, SID, TID, NonFatal, &RT.ELBDM_RemoveMotionCM, 1, NonFatal ); - LoadField( "ELBDM_BaseSpectral", &RS.ELBDM_BaseSpectral, SID, TID, NonFatal, &RT.ELBDM_BaseSpectral, 1, NonFatal ); -# if ( ELBDM_SCHEME == ELBDM_HYBRID ) -// ELBDM_FIRST_WAVE_LEVEL currently cannot be changed upon restart because the code cannot robustly handle the conversion -// from Re/Im to Dens/Phase due to the phase ambiguity introduced by vortices - LoadField( "ELBDM_FirstWaveLevel", &RS.ELBDM_FirstWaveLevel, SID, TID, NonFatal, &RT.ELBDM_FirstWaveLevel, 1, Fatal ); -# endif -# endif // ELBDM - -// fluid solvers in both HYDRO/ELBDM - LoadField( "Flu_GPU_NPGroup", &RS.Flu_GPU_NPGroup, SID, TID, NonFatal, &RT.Flu_GPU_NPGroup, 1, NonFatal ); - LoadField( "GPU_NStream", &RS.GPU_NStream, SID, TID, NonFatal, &RT.GPU_NStream, 1, NonFatal ); - LoadField( "Opt__FixUp_Flux", &RS.Opt__FixUp_Flux, SID, TID, NonFatal, &RT.Opt__FixUp_Flux, 1, NonFatal ); - LoadField( "FixUpFlux_Var", &RS.FixUpFlux_Var, SID, TID, NonFatal, &RT.FixUpFlux_Var, 1, NonFatal ); -# ifdef MHD - LoadField( "Opt__FixUp_Electric", &RS.Opt__FixUp_Electric, SID, TID, NonFatal, &RT.Opt__FixUp_Electric, 1, NonFatal ); -# endif - LoadField( "Opt__FixUp_Restrict", &RS.Opt__FixUp_Restrict, SID, TID, NonFatal, &RT.Opt__FixUp_Restrict, 1, NonFatal ); - LoadField( "FixUpRestrict_Var", &RS.FixUpRestrict_Var, SID, TID, NonFatal, &RT.FixUpRestrict_Var, 1, NonFatal ); - LoadField( "Opt__CorrAfterAllSync", &RS.Opt__CorrAfterAllSync, SID, TID, NonFatal, &RT.Opt__CorrAfterAllSync, 1, NonFatal ); - LoadField( "Opt__NormalizePassive", &RS.Opt__NormalizePassive, SID, TID, NonFatal, &RT.Opt__NormalizePassive, 1, NonFatal ); - LoadField( "NormalizePassive_NVar", &RS.NormalizePassive_NVar, SID, TID, NonFatal, &RT.NormalizePassive_NVar, 1, NonFatal ); - LoadField( "NormalizePassive_VarIdx", RS.NormalizePassive_VarIdx, SID, TID, NonFatal, RT.NormalizePassive_VarIdx, NP, NonFatal ); - LoadField( "Opt__IntFracPassive_LR", &RS.Opt__IntFracPassive_LR, SID, TID, NonFatal, &RT.Opt__IntFracPassive_LR, 1, NonFatal ); - LoadField( "IntFracPassive_NVar", &RS.IntFracPassive_NVar, SID, TID, NonFatal, &RT.IntFracPassive_NVar, 1, NonFatal ); - LoadField( "IntFracPassive_VarIdx", RS.IntFracPassive_VarIdx, SID, TID, NonFatal, RT.IntFracPassive_VarIdx, NP, NonFatal ); - LoadField( "Opt__OverlapMPI", &RS.Opt__OverlapMPI, SID, TID, NonFatal, &RT.Opt__OverlapMPI, 1, NonFatal ); - LoadField( "Opt__ResetFluid", &RS.Opt__ResetFluid, SID, TID, NonFatal, &RT.Opt__ResetFluid, 1, NonFatal ); - LoadField( "Opt__ResetFluidInit", &RS.Opt__ResetFluidInit, SID, TID, NonFatal, &RT.Opt__ResetFluidInit, 1, NonFatal ); - LoadField( "Opt__FreezeFluid", &RS.Opt__FreezeFluid, SID, TID, NonFatal, &RT.Opt__FreezeFluid, 1, NonFatal ); -# if ( MODEL == HYDRO || MODEL == ELBDM ) - LoadField( "MinDens", &RS.MinDens, SID, TID, NonFatal, &RT.MinDens, 1, NonFatal ); -# endif -# if ( MODEL == HYDRO ) - LoadField( "MinPres", &RS.MinPres, SID, TID, NonFatal, &RT.MinPres, 1, NonFatal ); - LoadField( "MinEint", &RS.MinEint, SID, TID, NonFatal, &RT.MinEint, 1, NonFatal ); - LoadField( "MinTemp", &RS.MinTemp, SID, TID, NonFatal, &RT.MinTemp, 1, NonFatal ); - LoadField( "MinEntr", &RS.MinEntr, SID, TID, NonFatal, &RT.MinEntr, 1, NonFatal ); - LoadField( "Opt__CheckPresAfterFlu", &RS.Opt__CheckPresAfterFlu, SID, TID, NonFatal, &RT.Opt__CheckPresAfterFlu, 1, NonFatal ); - LoadField( "Opt__LastResortFloor", &RS.Opt__LastResortFloor, SID, TID, NonFatal, &RT.Opt__LastResortFloor, 1, NonFatal ); - LoadField( "JeansMinPres", &RS.JeansMinPres, SID, TID, NonFatal, &RT.JeansMinPres, 1, NonFatal ); - LoadField( "JeansMinPres_Level", &RS.JeansMinPres_Level, SID, TID, NonFatal, &RT.JeansMinPres_Level, 1, NonFatal ); - LoadField( "JeansMinPres_NCell", &RS.JeansMinPres_NCell, SID, TID, NonFatal, &RT.JeansMinPres_NCell, 1, NonFatal ); -# endif - -// self-gravity -# ifdef GRAVITY - LoadField( "NewtonG", &RS.NewtonG, SID, TID, NonFatal, &RT.NewtonG, 1, NonFatal ); -# if ( POT_SCHEME == SOR ) - LoadField( "SOR_Omega", &RS.SOR_Omega, SID, TID, NonFatal, &RT.SOR_Omega, 1, NonFatal ); - LoadField( "SOR_MaxIter", &RS.SOR_MaxIter, SID, TID, NonFatal, &RT.SOR_MaxIter, 1, NonFatal ); - LoadField( "SOR_MinIter", &RS.SOR_MinIter, SID, TID, NonFatal, &RT.SOR_MinIter, 1, NonFatal ); -# elif ( POT_SCHEME == MG ) - LoadField( "MG_MaxIter", &RS.MG_MaxIter, SID, TID, NonFatal, &RT.MG_MaxIter, 1, NonFatal ); - LoadField( "MG_NPreSmooth", &RS.MG_NPreSmooth, SID, TID, NonFatal, &RT.MG_NPreSmooth, 1, NonFatal ); - LoadField( "MG_NPostSmooth", &RS.MG_NPostSmooth, SID, TID, NonFatal, &RT.MG_NPostSmooth, 1, NonFatal ); - LoadField( "MG_ToleratedError", &RS.MG_ToleratedError, SID, TID, NonFatal, &RT.MG_ToleratedError, 1, NonFatal ); -# endif - LoadField( "Pot_GPU_NPGroup", &RS.Pot_GPU_NPGroup, SID, TID, NonFatal, &RT.Pot_GPU_NPGroup, 1, NonFatal ); - LoadField( "Opt__GraP5Gradient", &RS.Opt__GraP5Gradient, SID, TID, NonFatal, &RT.Opt__GraP5Gradient, 1, NonFatal ); - LoadField( "Opt__SelfGravity", &RS.Opt__SelfGravity, SID, TID, NonFatal, &RT.Opt__SelfGravity, 1, NonFatal ); - LoadField( "Opt__ExtAcc", &RS.Opt__ExtAcc, SID, TID, NonFatal, &RT.Opt__ExtAcc, 1, NonFatal ); - LoadField( "Opt__ExtPot", &RS.Opt__ExtPot, SID, TID, NonFatal, &RT.Opt__ExtPot, 1, NonFatal ); - LoadField( "ExtPotTable_Name", &RS.ExtPotTable_Name, SID, TID, NonFatal, RT.ExtPotTable_Name, 1, NonFatal ); - LoadField( "ExtPotTable_NPoint", RS.ExtPotTable_NPoint, SID, TID, NonFatal, RT.ExtPotTable_NPoint, 3, NonFatal ); - LoadField( "ExtPotTable_dh", RS.ExtPotTable_dh, SID, TID, NonFatal, RT.ExtPotTable_dh, 3, NonFatal ); - LoadField( "ExtPotTable_EdgeL", RS.ExtPotTable_EdgeL, SID, TID, NonFatal, RT.ExtPotTable_EdgeL, 3, NonFatal ); - LoadField( "ExtPotTable_Float8", &RS.ExtPotTable_Float8, SID, TID, NonFatal, &RT.ExtPotTable_Float8, 1, NonFatal ); - LoadField( "Opt__GravityExtraMass", &RS.Opt__GravityExtraMass, SID, TID, NonFatal, &RT.Opt__GravityExtraMass, 1, NonFatal ); -# endif - -// source terms - LoadField( "Src_Deleptonization", &RS.Src_Deleptonization, SID, TID, NonFatal, &RT.Src_Deleptonization, 1, NonFatal ); - LoadField( "Src_User", &RS.Src_User, SID, TID, NonFatal, &RT.Src_User, 1, NonFatal ); - LoadField( "Src_GPU_NPGroup", &RS.Src_GPU_NPGroup, SID, TID, NonFatal, &RT.Src_GPU_NPGroup, 1, NonFatal ); - -// Grackle -# ifdef SUPPORT_GRACKLE - LoadField( "Grackle_Activate", &RS.Grackle_Activate, SID, TID, NonFatal, &RT.Grackle_Activate, 1, NonFatal ); - LoadField( "Grackle_Verbose", &RS.Grackle_Verbose, SID, TID, NonFatal, &RT.Grackle_Verbose, 1, NonFatal ); - LoadField( "Grackle_Cooling", &RS.Grackle_Cooling, SID, TID, NonFatal, &RT.Grackle_Cooling, 1, NonFatal ); - LoadField( "Grackle_Primordial", &RS.Grackle_Primordial, SID, TID, NonFatal, &RT.Grackle_Primordial, 1, NonFatal ); - LoadField( "Grackle_Metal", &RS.Grackle_Metal, SID, TID, NonFatal, &RT.Grackle_Metal, 1, NonFatal ); - LoadField( "Grackle_UV", &RS.Grackle_UV, SID, TID, NonFatal, &RT.Grackle_UV, 1, NonFatal ); - LoadField( "Grackle_CMB_Floor", &RS.Grackle_CMB_Floor, SID, TID, NonFatal, &RT.Grackle_CMB_Floor, 1, NonFatal ); - LoadField( "Grackle_PE_Heating", &RS.Grackle_PE_Heating, SID, TID, NonFatal, &RT.Grackle_PE_Heating, 1, NonFatal ); - LoadField( "Grackle_PE_HeatingRate", &RS.Grackle_PE_HeatingRate, SID, TID, NonFatal, &RT.Grackle_PE_HeatingRate, 1, NonFatal ); - LoadField( "Grackle_CloudyTable", &RS.Grackle_CloudyTable, SID, TID, NonFatal, RT.Grackle_CloudyTable, 1, NonFatal ); - LoadField( "Grackle_ThreeBodyRate", &RS.Grackle_ThreeBodyRate, SID, TID, NonFatal, &RT.Grackle_ThreeBodyRate, 1, NonFatal ); - LoadField( "Grackle_CIE_Cooling", &RS.Grackle_CIE_Cooling, SID, TID, NonFatal, &RT.Grackle_CIE_Cooling, 1, NonFatal ); - LoadField( "Grackle_H2_OpaApprox", &RS.Grackle_H2_OpaApprox, SID, TID, NonFatal, &RT.Grackle_H2_OpaApprox, 1, NonFatal ); - LoadField( "Che_GPU_NPGroup", &RS.Che_GPU_NPGroup, SID, TID, NonFatal, &RT.Che_GPU_NPGroup, 1, NonFatal ); -# endif - -// star formation -# ifdef STAR_FORMATION - LoadField( "SF_CreateStar_Scheme", &RS.SF_CreateStar_Scheme, SID, TID, NonFatal, &RT.SF_CreateStar_Scheme, 1, NonFatal ); - LoadField( "SF_CreateStar_RSeed", &RS.SF_CreateStar_RSeed, SID, TID, NonFatal, &RT.SF_CreateStar_RSeed, 1, NonFatal ); - LoadField( "SF_CreateStar_DetRandom", &RS.SF_CreateStar_DetRandom, SID, TID, NonFatal, &RT.SF_CreateStar_DetRandom, 1, NonFatal ); - LoadField( "SF_CreateStar_MinLevel", &RS.SF_CreateStar_MinLevel, SID, TID, NonFatal, &RT.SF_CreateStar_MinLevel, 1, NonFatal ); - LoadField( "SF_CreateStar_MinGasDens", &RS.SF_CreateStar_MinGasDens, SID, TID, NonFatal, &RT.SF_CreateStar_MinGasDens, 1, NonFatal ); - LoadField( "SF_CreateStar_MassEff", &RS.SF_CreateStar_MassEff, SID, TID, NonFatal, &RT.SF_CreateStar_MassEff, 1, NonFatal ); - LoadField( "SF_CreateStar_MinStarMass", &RS.SF_CreateStar_MinStarMass, SID, TID, NonFatal, &RT.SF_CreateStar_MinStarMass, 1, NonFatal ); - LoadField( "SF_CreateStar_MaxStarMFrac", &RS.SF_CreateStar_MaxStarMFrac, SID, TID, NonFatal, &RT.SF_CreateStar_MaxStarMFrac, 1, NonFatal ); -# endif - -// feedback -# ifdef FEEDBACK - LoadField( "FB_Level", &RS.FB_Level, SID, TID, NonFatal, &RT.FB_Level, 1, NonFatal ); - LoadField( "FB_RSeed", &RS.FB_RSeed, SID, TID, NonFatal, &RT.FB_RSeed, 1, NonFatal ); - LoadField( "FB_SNe", &RS.FB_SNe, SID, TID, NonFatal, &RT.FB_SNe, 1, NonFatal ); - LoadField( "FB_User", &RS.FB_User, SID, TID, NonFatal, &RT.FB_User, 1, NonFatal ); -# endif - -// cosmic rays -# ifdef COSMIC_RAY - LoadField( "CR_Gamma", &RS.CR_Gamma, SID, TID, NonFatal, &RT.CR_Gamma, 1, NonFatal ); -# ifdef CR_DIFFUSION - LoadField( "CR_Diffusion_ParaCoeff", &RS.CR_Diffusion_ParaCoeff, SID, TID, NonFatal, &RT.CR_Diffusion_ParaCoeff, 1, NonFatal ); - LoadField( "CR_Diffusion_PerpCoeff", &RS.CR_Diffusion_PerpCoeff, SID, TID, NonFatal, &RT.CR_Diffusion_PerpCoeff, 1, NonFatal ); - LoadField( "CR_Diffusion_MinB", &RS.CR_Diffusion_MinB, SID, TID, NonFatal, &RT.CR_Diffusion_MinB, 1, NonFatal ); -# endif -# endif // #ifdef COSMIC_RAY - -// initialization - LoadField( "Opt__Init", &RS.Opt__Init, SID, TID, NonFatal, &RT.Opt__Init, 1, NonFatal ); - LoadField( "RestartLoadNRank", &RS.RestartLoadNRank, SID, TID, NonFatal, &RT.RestartLoadNRank, 1, NonFatal ); - LoadField( "Opt__RestartReset", &RS.Opt__RestartReset, SID, TID, NonFatal, &RT.Opt__RestartReset, 1, NonFatal ); - LoadField( "Opt__UM_IC_Level", &RS.Opt__UM_IC_Level, SID, TID, NonFatal, &RT.Opt__UM_IC_Level, 1, NonFatal ); - LoadField( "Opt__UM_IC_NLevel", &RS.Opt__UM_IC_NLevel, SID, TID, NonFatal, &RT.Opt__UM_IC_NLevel, 1, NonFatal ); - LoadField( "Opt__UM_IC_NVar", &RS.Opt__UM_IC_NVar, SID, TID, NonFatal, &RT.Opt__UM_IC_NVar, 1, NonFatal ); - LoadField( "Opt__UM_IC_Format", &RS.Opt__UM_IC_Format, SID, TID, NonFatal, &RT.Opt__UM_IC_Format, 1, NonFatal ); - LoadField( "Opt__UM_IC_Float8", &RS.Opt__UM_IC_Float8, SID, TID, NonFatal, &RT.Opt__UM_IC_Float8, 1, NonFatal ); - LoadField( "Opt__UM_IC_Downgrade", &RS.Opt__UM_IC_Downgrade, SID, TID, NonFatal, &RT.Opt__UM_IC_Downgrade, 1, NonFatal ); - LoadField( "Opt__UM_IC_Refine", &RS.Opt__UM_IC_Refine, SID, TID, NonFatal, &RT.Opt__UM_IC_Refine, 1, NonFatal ); - LoadField( "Opt__UM_IC_LoadNRank", &RS.Opt__UM_IC_LoadNRank, SID, TID, NonFatal, &RT.Opt__UM_IC_LoadNRank, 1, NonFatal ); - LoadField( "Opt__InitRestrict", &RS.Opt__InitRestrict, SID, TID, NonFatal, &RT.Opt__InitRestrict, 1, NonFatal ); - LoadField( "Opt__InitGridWithOMP", &RS.Opt__InitGridWithOMP, SID, TID, NonFatal, &RT.Opt__InitGridWithOMP, 1, NonFatal ); - LoadField( "Opt__GPUID_Select", &RS.Opt__GPUID_Select, SID, TID, NonFatal, &RT.Opt__GPUID_Select, 1, NonFatal ); - LoadField( "Init_Subsampling_NCell", &RS.Init_Subsampling_NCell, SID, TID, NonFatal, &RT.Init_Subsampling_NCell, 1, NonFatal ); -# ifdef MHD - LoadField( "Opt__InitBFieldByVecPot", &RS.Opt__InitBFieldByVecPot, SID, TID, NonFatal, &RT.Opt__InitBFieldByVecPot, 1, NonFatal ); -# endif -# ifdef SUPPORT_FFTW - LoadField( "Opt__FFTW_Startup", &RS.Opt__FFTW_Startup, SID, TID, NonFatal, &RT.Opt__FFTW_Startup, 1, NonFatal ); -# endif - -// interpolation schemes - LoadField( "Opt__Int_Time", &RS.Opt__Int_Time, SID, TID, NonFatal, &RT.Opt__Int_Time, 1, NonFatal ); -# if ( MODEL == HYDRO ) - LoadField( "Opt__Int_Prim", &RS.Opt__Int_Prim, SID, TID, NonFatal, &RT.Opt__Int_Prim, 1, NonFatal ); -# endif -# if ( MODEL == ELBDM ) - LoadField( "Opt__Int_Phase", &RS.Opt__Int_Phase, SID, TID, NonFatal, &RT.Opt__Int_Phase, 1, NonFatal ); - LoadField( "Opt__Res_Phase", &RS.Opt__Res_Phase, SID, TID, NonFatal, &RT.Opt__Res_Phase, 1, NonFatal ); -# if ( ELBDM_SCHEME == ELBDM_HYBRID ) - LoadField( "Opt__Hybrid_Match_Phase", &RS.Opt__Hybrid_Match_Phase, SID, TID, NonFatal, &RT.Opt__Hybrid_Match_Phase, 1, NonFatal ); -# endif -# endif - LoadField( "Opt__Flu_IntScheme", &RS.Opt__Flu_IntScheme, SID, TID, NonFatal, &RT.Opt__Flu_IntScheme, 1, NonFatal ); - LoadField( "Opt__RefFlu_IntScheme", &RS.Opt__RefFlu_IntScheme, SID, TID, NonFatal, &RT.Opt__RefFlu_IntScheme, 1, NonFatal ); -# ifdef MHD - LoadField( "Opt__Mag_IntScheme", &RS.Opt__Mag_IntScheme, SID, TID, NonFatal, &RT.Opt__Mag_IntScheme, 1, NonFatal ); - LoadField( "Opt__RefMag_IntScheme", &RS.Opt__RefMag_IntScheme, SID, TID, NonFatal, &RT.Opt__RefMag_IntScheme, 1, NonFatal ); -# endif -# ifdef GRAVITY - LoadField( "Opt__Pot_IntScheme", &RS.Opt__Pot_IntScheme, SID, TID, NonFatal, &RT.Opt__Pot_IntScheme, 1, NonFatal ); - LoadField( "Opt__Rho_IntScheme", &RS.Opt__Rho_IntScheme, SID, TID, NonFatal, &RT.Opt__Rho_IntScheme, 1, NonFatal ); - LoadField( "Opt__Gra_IntScheme", &RS.Opt__Gra_IntScheme, SID, TID, NonFatal, &RT.Opt__Gra_IntScheme, 1, NonFatal ); - LoadField( "Opt__RefPot_IntScheme", &RS.Opt__RefPot_IntScheme, SID, TID, NonFatal, &RT.Opt__RefPot_IntScheme, 1, NonFatal ); -# endif - LoadField( "IntMonoCoeff", &RS.IntMonoCoeff, SID, TID, NonFatal, &RT.IntMonoCoeff, 1, NonFatal ); -# ifdef MHD - LoadField( "IntMonoCoeffB", &RS.IntMonoCoeffB, SID, TID, NonFatal, &RT.IntMonoCoeffB, 1, NonFatal ); -# endif - LoadField( "Mono_MaxIter", &RS.Mono_MaxIter, SID, TID, NonFatal, &RT.Mono_MaxIter, 1, NonFatal ); - LoadField( "IntOppSign0thOrder", &RS.IntOppSign0thOrder, SID, TID, NonFatal, &RT.IntOppSign0thOrder, 1, NonFatal ); -# ifdef SUPPORT_SPECTRAL_INT - LoadField( "SpecInt_TablePath", &RS.SpecInt_TablePath, SID, TID, NonFatal, RT.SpecInt_TablePath, 1, NonFatal ); - LoadField( "SpecInt_GhostBoundary", &RS.SpecInt_GhostBoundary, SID, TID, NonFatal, &RT.SpecInt_GhostBoundary, 1, NonFatal ); -# if ( MODEL == ELBDM ) - LoadField( "SpecInt_XY_Instead_DePha",&RS.SpecInt_XY_Instead_DePha,SID, TID, NonFatal, &RT.SpecInt_XY_Instead_DePha, 1, NonFatal ); - LoadField( "SpecInt_VortexThreshold", &RS.SpecInt_VortexThreshold, SID, TID, NonFatal, &RT.SpecInt_VortexThreshold, 1, NonFatal ); -# endif -# endif // #ifdef SUPPORT_SPECTRAL_INT - -// data dump - LoadField( "Opt__Output_Total", &RS.Opt__Output_Total, SID, TID, NonFatal, &RT.Opt__Output_Total, 1, NonFatal ); - LoadField( "Opt__Output_Part", &RS.Opt__Output_Part, SID, TID, NonFatal, &RT.Opt__Output_Part, 1, NonFatal ); - LoadField( "Opt__Output_User", &RS.Opt__Output_User, SID, TID, NonFatal, &RT.Opt__Output_User, 1, NonFatal ); -# ifdef PARTICLE - LoadField( "Opt__Output_Par_Mode", &RS.Opt__Output_Par_Mode, SID, TID, NonFatal, &RT.Opt__Output_Par_Mode, 1, NonFatal ); - LoadField( "Opt__Output_Par_Mesh", &RS.Opt__Output_Par_Mesh, SID, TID, NonFatal, &RT.Opt__Output_Par_Mesh, 1, NonFatal ); -# endif - LoadField( "Opt__Output_BasePS", &RS.Opt__Output_BasePS, SID, TID, NonFatal, &RT.Opt__Output_BasePS, 1, NonFatal ); - if ( OPT__OUTPUT_PART ) - LoadField( "Opt__Output_Base", &RS.Opt__Output_Base, SID, TID, NonFatal, &RT.Opt__Output_Base, 1, NonFatal ); -# ifdef GRAVITY - LoadField( "Opt__Output_Pot", &RS.Opt__Output_Pot, SID, TID, NonFatal, &RT.Opt__Output_Pot, 1, NonFatal ); -# endif -# ifdef PARTICLE - LoadField( "Opt__Output_ParDens", &RS.Opt__Output_ParDens, SID, TID, NonFatal, &RT.Opt__Output_ParDens, 1, NonFatal ); -# endif -# ifdef MHD - LoadField( "Opt__Output_CC_Mag", &RS.Opt__Output_CC_Mag, SID, TID, NonFatal, &RT.Opt__Output_CC_Mag, 1, NonFatal ); -# endif -# if ( MODEL == HYDRO ) - LoadField( "Opt__Output_Pres", &RS.Opt__Output_Pres, SID, TID, NonFatal, &RT.Opt__Output_Pres, 1, NonFatal ); - LoadField( "Opt__Output_Temp", &RS.Opt__Output_Temp, SID, TID, NonFatal, &RT.Opt__Output_Temp, 1, NonFatal ); - LoadField( "Opt__Output_Entr", &RS.Opt__Output_Entr, SID, TID, NonFatal, &RT.Opt__Output_Entr, 1, NonFatal ); - LoadField( "Opt__Output_Cs", &RS.Opt__Output_Cs, SID, TID, NonFatal, &RT.Opt__Output_Cs, 1, NonFatal ); - LoadField( "Opt__Output_DivVel", &RS.Opt__Output_DivVel, SID, TID, NonFatal, &RT.Opt__Output_DivVel, 1, NonFatal ); - LoadField( "Opt__Output_Mach", &RS.Opt__Output_Mach, SID, TID, NonFatal, &RT.Opt__Output_Mach, 1, NonFatal ); -# ifdef MHD - LoadField( "Opt__Output_DivMag", &RS.Opt__Output_DivMag, SID, TID, NonFatal, &RT.Opt__Output_DivMag, 1, NonFatal ); -# endif -# ifdef SRHD - LoadField( "Opt__Output_Lorentz", &RS.Opt__Output_Lorentz, SID, TID, NonFatal, &RT.Opt__Output_Lorentz, 1, NonFatal ); - LoadField( "Opt__Output_3Velocity", &RS.Opt__Output_3Velocity, SID, TID, NonFatal, &RT.Opt__Output_3Velocity, 1, NonFatal ); - LoadField( "Opt__Output_Enthalpy", &RS.Opt__Output_Enthalpy, SID, TID, NonFatal, &RT.Opt__Output_Enthalpy, 1, NonFatal ); -# endif -# endif // #if ( MODEL == HYDRO ) - LoadField( "Opt__Output_UserField", &RS.Opt__Output_UserField, SID, TID, NonFatal, &RT.Opt__Output_UserField, 1, NonFatal ); -# ifdef PARTICLE - if ( OPT__OUTPUT_TOTAL || OPT__OUTPUT_PART || OPT__OUTPUT_USER || OPT__OUTPUT_BASEPS || OPT__OUTPUT_PAR_MODE ) { -# else - if ( OPT__OUTPUT_TOTAL || OPT__OUTPUT_PART || OPT__OUTPUT_USER || OPT__OUTPUT_BASEPS ) { -# endif - LoadField( "Opt__Output_Mode", &RS.Opt__Output_Mode, SID, TID, NonFatal, &RT.Opt__Output_Mode, 1, NonFatal ); - LoadField( "Opt__Output_Restart", &RS.Opt__Output_Restart, SID, TID, NonFatal, &RT.Opt__Output_Restart, 1, NonFatal ); - LoadField( "Opt__Output_Step", &RS.Opt__Output_Step, SID, TID, NonFatal, &RT.Opt__Output_Step, 1, NonFatal ); - LoadField( "Opt__Output_Dt", &RS.Opt__Output_Dt, SID, TID, NonFatal, &RT.Opt__Output_Dt, 1, NonFatal ); - LoadField( "Opt__Output_Text_Format_Flt", &RS.Opt__Output_Text_Format_Flt, SID, TID, NonFatal, RT.Opt__Output_Text_Format_Flt, 1, NonFatal ); - LoadField( "Opt__Output_Text_Length_Int", &RS.Opt__Output_Text_Length_Int, SID, TID, NonFatal, &RT.Opt__Output_Text_Length_Int, 1, NonFatal ); - } - if ( OPT__OUTPUT_PART ) { - LoadField( "Output_PartX", &RS.Output_PartX, SID, TID, NonFatal, &RT.Output_PartX, 1, NonFatal ); - LoadField( "Output_PartY", &RS.Output_PartY, SID, TID, NonFatal, &RT.Output_PartY, 1, NonFatal ); - LoadField( "Output_PartZ", &RS.Output_PartZ, SID, TID, NonFatal, &RT.Output_PartZ, 1, NonFatal ); - } - LoadField( "InitDumpID", &RS.InitDumpID, SID, TID, NonFatal, &RT.InitDumpID, 1, NonFatal ); - -// libyt jupyter -# if ( defined(SUPPORT_LIBYT) && defined(LIBYT_JUPYTER) ) - LoadField( "Yt_JupyterUseConnectionFile", &RS.Yt_JupyterUseConnectionFile, SID, TID, NonFatal, &RT.Yt_JupyterUseConnectionFile, 1, NonFatal ); -# endif - -// miscellaneous - LoadField( "Opt__Verbose", &RS.Opt__Verbose, SID, TID, NonFatal, &RT.Opt__Verbose, 1, NonFatal ); - LoadField( "Opt__TimingBarrier", &RS.Opt__TimingBarrier, SID, TID, NonFatal, &RT.Opt__TimingBarrier, 1, NonFatal ); - LoadField( "Opt__TimingBalance", &RS.Opt__TimingBalance, SID, TID, NonFatal, &RT.Opt__TimingBalance, 1, NonFatal ); - LoadField( "Opt__TimingMPI", &RS.Opt__TimingMPI, SID, TID, NonFatal, &RT.Opt__TimingMPI, 1, NonFatal ); - LoadField( "Opt__RecordNote", &RS.Opt__RecordNote, SID, TID, NonFatal, &RT.Opt__RecordNote, 1, NonFatal ); - LoadField( "Opt__RecordUnphy", &RS.Opt__RecordUnphy, SID, TID, NonFatal, &RT.Opt__RecordUnphy, 1, NonFatal ); - LoadField( "Opt__RecordMemory", &RS.Opt__RecordMemory, SID, TID, NonFatal, &RT.Opt__RecordMemory, 1, NonFatal ); - LoadField( "Opt__RecordPerformance", &RS.Opt__RecordPerformance, SID, TID, NonFatal, &RT.Opt__RecordPerformance, 1, NonFatal ); - LoadField( "Opt__ManualControl", &RS.Opt__ManualControl, SID, TID, NonFatal, &RT.Opt__ManualControl, 1, NonFatal ); - LoadField( "Opt__RecordCenter", &RS.Opt__RecordCenter, SID, TID, NonFatal, &RT.Opt__RecordCenter, 1, NonFatal ); - LoadField( "COM_CenX", &RS.COM_CenX, SID, TID, NonFatal, &RT.COM_CenX, 1, NonFatal ); - LoadField( "COM_CenY", &RS.COM_CenY, SID, TID, NonFatal, &RT.COM_CenY, 1, NonFatal ); - LoadField( "COM_CenZ", &RS.COM_CenZ, SID, TID, NonFatal, &RT.COM_CenZ, 1, NonFatal ); - LoadField( "COM_MaxR", &RS.COM_MaxR, SID, TID, NonFatal, &RT.COM_MaxR, 1, NonFatal ); - LoadField( "COM_MinRho", &RS.COM_MinRho, SID, TID, NonFatal, &RT.COM_MinRho, 1, NonFatal ); - LoadField( "COM_TolErrR", &RS.COM_TolErrR, SID, TID, NonFatal, &RT.COM_TolErrR, 1, NonFatal ); - LoadField( "COM_MaxIter", &RS.COM_MaxIter, SID, TID, NonFatal, &RT.COM_MaxIter, 1, NonFatal ); - LoadField( "Opt__RecordUser", &RS.Opt__RecordUser, SID, TID, NonFatal, &RT.Opt__RecordUser, 1, NonFatal ); - LoadField( "Opt__OptimizeAggressive", &RS.Opt__OptimizeAggressive, SID, TID, NonFatal, &RT.Opt__OptimizeAggressive, 1, NonFatal ); - LoadField( "Opt__SortPatchByLBIdx", &RS.Opt__SortPatchByLBIdx, SID, TID, NonFatal, &RT.Opt__SortPatchByLBIdx, 1, NonFatal ); - -// simulation checks - LoadField( "Opt__Ck_Refine", &RS.Opt__Ck_Refine, SID, TID, NonFatal, &RT.Opt__Ck_Refine, 1, NonFatal ); - LoadField( "Opt__Ck_ProperNesting", &RS.Opt__Ck_ProperNesting, SID, TID, NonFatal, &RT.Opt__Ck_ProperNesting, 1, NonFatal ); - LoadField( "Opt__Ck_Conservation", &RS.Opt__Ck_Conservation, SID, TID, NonFatal, &RT.Opt__Ck_Conservation, 1, NonFatal ); - LoadField( "AngMom_OriginX", &RS.AngMom_OriginX, SID, TID, NonFatal, &RT.AngMom_OriginX, 1, NonFatal ); - LoadField( "AngMom_OriginY", &RS.AngMom_OriginY, SID, TID, NonFatal, &RT.AngMom_OriginY, 1, NonFatal ); - LoadField( "AngMom_OriginZ", &RS.AngMom_OriginZ, SID, TID, NonFatal, &RT.AngMom_OriginZ, 1, NonFatal ); - LoadField( "Opt__Ck_NormPassive", &RS.Opt__Ck_NormPassive, SID, TID, NonFatal, &RT.Opt__Ck_NormPassive, 1, NonFatal ); - LoadField( "Opt__Ck_Restrict", &RS.Opt__Ck_Restrict, SID, TID, NonFatal, &RT.Opt__Ck_Restrict, 1, NonFatal ); - LoadField( "Opt__Ck_Finite", &RS.Opt__Ck_Finite, SID, TID, NonFatal, &RT.Opt__Ck_Finite, 1, NonFatal ); - LoadField( "Opt__Ck_PatchAllocate", &RS.Opt__Ck_PatchAllocate, SID, TID, NonFatal, &RT.Opt__Ck_PatchAllocate, 1, NonFatal ); - LoadField( "Opt__Ck_FluxAllocate", &RS.Opt__Ck_FluxAllocate, SID, TID, NonFatal, &RT.Opt__Ck_FluxAllocate, 1, NonFatal ); -# if ( MODEL == HYDRO ) - LoadField( "Opt__Ck_Negative", &RS.Opt__Ck_Negative, SID, TID, NonFatal, &RT.Opt__Ck_Negative, 1, NonFatal ); -# endif - LoadField( "Opt__Ck_MemFree", &RS.Opt__Ck_MemFree, SID, TID, NonFatal, &RT.Opt__Ck_MemFree, 1, NonFatal ); -# ifdef PARTICLE - LoadField( "Opt__Ck_Particle", &RS.Opt__Ck_Particle, SID, TID, NonFatal, &RT.Opt__Ck_Particle, 1, NonFatal ); -# endif -# ifdef MHD - LoadField( "Opt__Ck_InterfaceB", &RS.Opt__Ck_InterfaceB, SID, TID, NonFatal, &RT.Opt__Ck_InterfaceB, 1, NonFatal ); - LoadField( "Opt__Ck_DivergenceB", &RS.Opt__Ck_DivergenceB, SID, TID, NonFatal, &RT.Opt__Ck_DivergenceB, 1, NonFatal ); -# endif - LoadField( "Opt__Ck_InputFluid", &RS.Opt__Ck_InputFluid, SID, TID, NonFatal, &RT.Opt__Ck_InputFluid, 1, NonFatal ); - - -// flag tables -# if ( MODEL == HYDRO ) -# ifndef COSMIC_RAY - const bool OPT__FLAG_LOHNER_CRAY = false; -# endif - const bool Opt__FlagLohner = ( OPT__FLAG_LOHNER_DENS || OPT__FLAG_LOHNER_ENGY || OPT__FLAG_LOHNER_PRES || - OPT__FLAG_LOHNER_TEMP || OPT__FLAG_LOHNER_ENTR || OPT__FLAG_LOHNER_CRAY ); -# elif ( MODEL == ELBDM ) - const bool Opt__FlagLohner = OPT__FLAG_LOHNER_DENS; -# else -# error : ERROR : unsupported MODEL !! -# endif - -// initialize as -1 (to work with NLvRestart < NLEVEL) - for (int lv=0; lv +size_t GetFieldData( const char *FieldName, const hid_t H5_SetID_Target, const hid_t H5_TypeID_Target, + T *Ptr, const bool Allocate ) { - const bool Fatal = true; - const bool NonFatal = false; - const int *NullPtr = NULL; - - herr_t Status; - - -// 1. open the HDF5 file - const hid_t FID = H5Fopen( FileName, H5F_ACC_RDONLY, H5P_DEFAULT ); // file ID - - if ( FID < 0 ) - Aux_Error( ERROR_INFO, "failed to open the restart HDF5 file \"%s\" !!\n", FileName ); + if ( Ptr != NULL && Allocate ) + Aux_Error( ERROR_INFO, "Pointer must be NULL to allocate memory !!\n" ); + int H5_FieldIdx; + size_t H5_FieldSize; + hid_t H5_TypeID_Field; // datatype ID of the target field in the compound variable + hid_t H5_TypeID_Load; // datatype ID for loading the target field + herr_t H5_Status; -// 2. load the InputPar dataset and datatype - const hid_t SID = H5Dopen( FID, "Info/InputPara", H5P_DEFAULT ); // dataset ID - - if ( SID < 0 ) - Aux_Error( ERROR_INFO, "failed to open the dataset \"%s\" !!\n", "Info/InputPara" ); - - const hid_t TID = H5Dget_type( SID ); // datatype ID +// get field index in file + H5_FieldIdx = H5Tget_member_index( H5_TypeID_Target, FieldName ); + if ( H5_FieldIdx < 0 ) + Aux_Error( ERROR_INFO, "target field \"%s\" does not exist in the restart file !!\n", FieldName ); -// 3. reset the runtime parameters if required - InputPara_t RS; // RS = ReStart +// load + H5_TypeID_Field = H5Tget_member_type( H5_TypeID_Target, H5_FieldIdx ); + H5_FieldSize = H5Tget_size( H5_TypeID_Field ); - if ( *EndT < 0.0 ) - { - LoadField( "EndT", EndT, SID, TID, Fatal, NullPtr, -1, NonFatal ); +// allocate + if ( Allocate ) Ptr = new T [ (int)H5_FieldSize ]; - if ( MPI_Rank == 0 ) Aux_Message( stdout, " NOTE : parameter %s is reset to %14.7e\n", "END_T", *EndT ); - } + H5_TypeID_Load = H5Tcreate( H5T_COMPOUND, H5_FieldSize ); + H5_Status = H5Tinsert( H5_TypeID_Load, FieldName, 0, H5_TypeID_Field ); - if ( *EndStep < 0 ) - { - LoadField( "EndStep", EndStep, SID, TID, Fatal, NullPtr, -1, NonFatal ); + H5_Status = H5Dread( H5_SetID_Target, H5_TypeID_Load, H5S_ALL, H5S_ALL, H5P_DEFAULT, (void *)Ptr ); + if ( H5_Status < 0 ) Aux_Error( ERROR_INFO, "failed to load the field \"%s\" !!\n", FieldName ); - if ( MPI_Rank == 0 ) Aux_Message( stdout, " NOTE : parameter %s is reset to %ld\n", "END_STEP", *EndStep ); - } + H5_Status = H5Tclose( H5_TypeID_Field ); + H5_Status = H5Tclose( H5_TypeID_Load ); -// 4. close all objects - Status = H5Tclose( TID ); - Status = H5Dclose( SID ); - Status = H5Fclose( FID ); + return H5_FieldSize; -} // FUNCTION : ResetParameter +} // FUNCTION : GetFieldData diff --git a/src/Output/Output_DumpData_Total_HDF5.cpp b/src/Output/Output_DumpData_Total_HDF5.cpp index 8e7a9f1430..5553cdccfd 100644 --- a/src/Output/Output_DumpData_Total_HDF5.cpp +++ b/src/Output/Output_DumpData_Total_HDF5.cpp @@ -4,23 +4,21 @@ #include "HDF5_Typedef.h" #include -void FillIn_KeyInfo ( KeyInfo_t &KeyInfo, const int NFieldStored ); -void FillIn_Makefile ( Makefile_t &Makefile ); -void FillIn_SymConst ( SymConst_t &SymConst ); -void FillIn_InputPara( InputPara_t &InputPara, const int NFieldStored, char FieldLabelOut[][MAX_STRING] ); - -static void GetCompound_KeyInfo ( hid_t &H5_TypeID ); -static void GetCompound_Makefile ( hid_t &H5_TypeID ); -static void GetCompound_SymConst ( hid_t &H5_TypeID ); -static void GetCompound_InputPara( hid_t &H5_TypeID, const int NFieldStored ); -static void GetCompound_General ( hid_t &H5_TypeID, const HDF5_Output_t *HDF5_Output ); +void FillIn_HDF5_KeyInfo ( HDF5_Output_t *HDF5_KeyInfo, int NFieldStored, const bool Load_RS, + const int RS_FormatVersion, const bool ReenablePar ); +void FillIn_HDF5_Makefile ( HDF5_Output_t *HDF5_Makefile, const int RS_FormatVersion ); +void FillIn_HDF5_SymConst ( HDF5_Output_t *HDF5_SymConst, const int RS_FormatVersion ); +void FillIn_HDF5_InputPara( HDF5_Output_t *HDF5_InputPara, const int NFieldStored, char FieldLabelOut[][MAX_STRING], + const bool Load_RS ); void (*Output_HDF5_InputTest_Ptr)( const LoadParaMode_t load_mode, ReadPara_t *ReadPara, HDF5_Output_t *HDF5_InputTest ) = NULL; void (*Output_HDF5_UserPara_Ptr)( HDF5_Output_t *HDF5_UserPara ) = NULL; -static herr_t H5_write_compound( const hid_t H5_SetID, const hid_t H5_Type_ID, const HDF5_Output_t *HDF5_Output ); static void Output_HDF5_UserPara_Template( HDF5_Output_t *HDF5_UserPara ); +static int H5_Arr_3[1] = { 3 }; +static int H5_Arr_6[1] = { 6 }; + /*====================================================================================================== @@ -68,11 +66,8 @@ h5py usage (with python 2): /*====================================================================================================== Procedure for outputting new variables: -1. Add the new variable into one of the data structures (XXX) defined in "HDF5_Typedef.h" -2. Edit "GetCompound_XXX" to insert the new variables into the compound datatype -3. Edit "FillIn_XXX" to fill in the new variables -4. Edit "Check_XXX" in "Init_ByRestart_HDF5.cpp" to load and compare the new variables -5. Update FormatVersion +1. Edit "FillIn_XXX" to fill in the new variables +2. Update FormatVersion ======================================================================================================*/ @@ -462,29 +457,26 @@ void Output_DumpData_Total_HDF5( const char *FileName ) // 3. output the simulation information if ( MPI_Rank == 0 ) { + const bool Load_RS_No = false; // not loading the restart file + // 3-1. collect all information to be recorded - KeyInfo_t KeyInfo; - Makefile_t Makefile; - SymConst_t SymConst; - InputPara_t InputPara; - HDF5_Output_t HDF5_InputTest; - HDF5_Output_t HDF5_UserPara; - - FillIn_KeyInfo ( KeyInfo, NFieldStored ); - FillIn_Makefile ( Makefile ); - FillIn_SymConst ( SymConst ); - FillIn_InputPara( InputPara, NFieldStored, FieldLabelOut ); + HDF5_Output_t HDF5_KeyInfo, HDF5_Makefile, HDF5_SymConst, HDF5_InputPara, HDF5_InputTest, HDF5_UserPara; + + FillIn_HDF5_KeyInfo ( &HDF5_KeyInfo, NFieldStored, Load_RS_No, NULL_INT, NULL_BOOL ); + FillIn_HDF5_Makefile ( &HDF5_Makefile, NULL_INT ); + FillIn_HDF5_SymConst ( &HDF5_SymConst, NULL_INT ); + FillIn_HDF5_InputPara( &HDF5_InputPara, NFieldStored, FieldLabelOut, Load_RS_No ); if ( Output_HDF5_InputTest_Ptr != NULL ) Output_HDF5_InputTest_Ptr( LOAD_HDF5_OUTPUT, NULL, &HDF5_InputTest ); if ( Output_HDF5_UserPara_Ptr != NULL ) Output_HDF5_UserPara_Ptr( &HDF5_UserPara ); // 3-2. create the "compound" datatype - GetCompound_KeyInfo ( H5_TypeID_Com_KeyInfo ); - GetCompound_Makefile ( H5_TypeID_Com_Makefile ); - GetCompound_SymConst ( H5_TypeID_Com_SymConst ); - GetCompound_InputPara( H5_TypeID_Com_InputPara, NFieldStored ); - if ( Output_HDF5_InputTest_Ptr != NULL ) GetCompound_General( H5_TypeID_Com_InputTest, &HDF5_InputTest ); - if ( Output_HDF5_UserPara_Ptr != NULL ) GetCompound_General( H5_TypeID_Com_UserPara, &HDF5_UserPara ); + HDF5_KeyInfo.GetCompound( H5_TypeID_Com_KeyInfo ); + HDF5_Makefile.GetCompound( H5_TypeID_Com_Makefile ); + HDF5_SymConst.GetCompound( H5_TypeID_Com_SymConst ); + HDF5_InputPara.GetCompound( H5_TypeID_Com_InputPara ); + if ( Output_HDF5_InputTest_Ptr != NULL ) HDF5_InputTest.GetCompound( H5_TypeID_Com_InputTest ); + if ( Output_HDF5_UserPara_Ptr != NULL ) HDF5_UserPara.GetCompound( H5_TypeID_Com_UserPara ); // 3-3. create the HDF5 file (overwrite the existing file) @@ -501,28 +493,28 @@ void Output_DumpData_Total_HDF5( const char *FileName ) H5_SetID_KeyInfo = H5Dcreate( H5_GroupID_Info, "KeyInfo", H5_TypeID_Com_KeyInfo, H5_SpaceID_Scalar, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT ); if ( H5_SetID_KeyInfo < 0 ) Aux_Error( ERROR_INFO, "failed to create the dataset \"%s\" !!\n", "KeyInfo" ); - H5_Status = H5Dwrite( H5_SetID_KeyInfo, H5_TypeID_Com_KeyInfo, H5S_ALL, H5S_ALL, H5P_DEFAULT, &KeyInfo ); + H5_Status = HDF5_KeyInfo.Write2CompoundDataset( H5_SetID_KeyInfo, H5_TypeID_Com_KeyInfo ); H5_Status = H5Dclose( H5_SetID_KeyInfo ); // 3-4-2. Makefile H5_SetID_Makefile = H5Dcreate( H5_GroupID_Info, "Makefile", H5_TypeID_Com_Makefile, H5_SpaceID_Scalar, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT ); if ( H5_SetID_Makefile < 0 ) Aux_Error( ERROR_INFO, "failed to create the dataset \"%s\" !!\n", "Makefile" ); - H5_Status = H5Dwrite( H5_SetID_Makefile, H5_TypeID_Com_Makefile, H5S_ALL, H5S_ALL, H5P_DEFAULT, &Makefile ); + H5_Status = HDF5_Makefile.Write2CompoundDataset( H5_SetID_Makefile, H5_TypeID_Com_Makefile ); H5_Status = H5Dclose( H5_SetID_Makefile ); // 3-4-3. SymConst H5_SetID_SymConst = H5Dcreate( H5_GroupID_Info, "SymConst", H5_TypeID_Com_SymConst, H5_SpaceID_Scalar, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT ); if ( H5_SetID_SymConst < 0 ) Aux_Error( ERROR_INFO, "failed to create the dataset \"%s\" !!\n", "SymConst" ); - H5_Status = H5Dwrite( H5_SetID_SymConst, H5_TypeID_Com_SymConst, H5S_ALL, H5S_ALL, H5P_DEFAULT, &SymConst ); + H5_Status = HDF5_SymConst.Write2CompoundDataset( H5_SetID_SymConst, H5_TypeID_Com_SymConst ); H5_Status = H5Dclose( H5_SetID_SymConst ); // 3-4-4. InputPara H5_SetID_InputPara = H5Dcreate( H5_GroupID_Info, "InputPara", H5_TypeID_Com_InputPara, H5_SpaceID_Scalar, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT ); if ( H5_SetID_InputPara < 0 ) Aux_Error( ERROR_INFO, "failed to create the dataset \"%s\" !!\n", "InputPara" ); - H5_Status = H5Dwrite( H5_SetID_InputPara, H5_TypeID_Com_InputPara, H5S_ALL, H5S_ALL, H5P_DEFAULT, &InputPara ); + H5_Status = HDF5_InputPara.Write2CompoundDataset( H5_SetID_InputPara, H5_TypeID_Com_InputPara ); H5_Status = H5Dclose( H5_SetID_InputPara ); // 3-4-5. InputTest @@ -531,7 +523,7 @@ void Output_DumpData_Total_HDF5( const char *FileName ) H5_SetID_InputTest = H5Dcreate( H5_GroupID_Info, "InputTest", H5_TypeID_Com_InputTest, H5_SpaceID_Scalar, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT ); if ( H5_SetID_InputTest < 0 ) Aux_Error( ERROR_INFO, "failed to create the dataset \"%s\" !!\n", "InputTest" ); - H5_Status = H5_write_compound( H5_SetID_InputTest, H5_TypeID_Com_InputTest, &HDF5_InputTest ); + H5_Status = HDF5_InputTest.Write2CompoundDataset( H5_SetID_InputTest, H5_TypeID_Com_InputTest ); H5_Status = H5Dclose( H5_SetID_InputTest ); } @@ -548,15 +540,12 @@ void Output_DumpData_Total_HDF5( const char *FileName ) H5_SetID_UserPara = H5Dcreate( H5_GroupID_User, "UserPara", H5_TypeID_Com_UserPara, H5_SpaceID_Scalar, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT ); if ( H5_SetID_UserPara < 0 ) Aux_Error( ERROR_INFO, "failed to create the dataset \"%s\" !!\n", "UserPara" ); - H5_Status = H5_write_compound( H5_SetID_UserPara, H5_TypeID_Com_UserPara, &HDF5_UserPara ); + H5_Status = HDF5_UserPara.Write2CompoundDataset( H5_SetID_UserPara, H5_TypeID_Com_UserPara ); H5_Status = H5Dclose( H5_SetID_UserPara ); } // if ( Output_HDF5_UserPara_Ptr != NULL ) H5_Status = H5Gclose( H5_GroupID_User ); H5_Status = H5Fclose( H5_FileID ); - -// 3-6. free memory - for (int lv=0; lvAdd( "FormatVersion", 2504, 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + + +// physics modules +// ---------------------------------------------------------------------------------------------------- + HDF5_KeyInfo->Add( "Model", MODEL, 0, NULL, Compare_Yes, Fatal_Yes, Fatal_Yes ); + HDF5_KeyInfo->Add( "NLevel", NLEVEL, 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_KeyInfo->Add( "NCompFluid", NCOMP_FLUID, 0, NULL, Compare_Yes, Fatal_No, Fatal_Yes ); + HDF5_KeyInfo->Add( "NCompPassive", NCOMP_PASSIVE, 0, NULL, Compare_Yes, Fatal_No, Fatal_Yes ); + HDF5_KeyInfo->Add( "PatchSize", PS1, 0, NULL, Compare_Yes, Fatal_Yes, Fatal_Yes ); + HDF5_KeyInfo->Add( "DumpID", &DumpID, 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_KeyInfo->Add( "Step", &Step, 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); # ifdef GRAVITY - KeyInfo.AveDens_Init = AveDensity_Init; - KeyInfo.Gravity = 1; + HDF5_KeyInfo->Add( "AveDens_Init", &AveDensity_Init, 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_KeyInfo->Add( "Gravity", 1, 0, NULL, Compare_Yes, Fatal_Yes, Fatal_Yes ); # else - KeyInfo.Gravity = 0; + HDF5_KeyInfo->Add( "Gravity", 0, 0, NULL, Compare_Yes, Fatal_Yes, Fatal_Yes ); # endif # ifdef PARTICLE - KeyInfo.Particle = 1; + HDF5_KeyInfo->Add( "Particle", 1, 0, NULL, Compare_Yes, Fatal_Yes, Fatal_No ); # else - KeyInfo.Particle = 0; -# endif // #ifdef PARTICLE ... else ... + HDF5_KeyInfo->Add( "Particle", 0, 0, NULL, Compare_Yes, Fatal_Yes, Fatal_No ); +# endif # ifdef FLOAT8 - KeyInfo.Float8 = 1; + HDF5_KeyInfo->Add( "Float8", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - KeyInfo.Float8 = 0; + HDF5_KeyInfo->Add( "Float8", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - KeyInfo.NFieldStored = NFieldStored; - KeyInfo.NMagStored = NCOMP_MAG; + HDF5_KeyInfo->Add( "NFieldStored", NFieldStored, 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_KeyInfo->Add( "NMagStored", NCOMP_MAG, 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + + +// particle +// ---------------------------------------------------------------------------------------------------- # ifdef PARTICLE - KeyInfo.Par_NPar = amr->Par->NPar_Active_AllRank; - KeyInfo.Par_NAttFltStored = PAR_NATT_FLT_STORED; - KeyInfo.Par_NAttIntStored = PAR_NATT_INT_STORED; + const bool Compare_Par = ( !ReenablePar ) ? Compare_Yes : Compare_No; + const bool Fatal_ParNAttFlt = ( !ReenablePar && RS_FormatVersion >= 2300 ) ? Fatal_Yes : Fatal_No; + const bool Fatal_ParNAttInt = ( !ReenablePar && RS_FormatVersion >= 2500 ) ? Fatal_Yes : Fatal_No; + HDF5_KeyInfo->Add( "Par_NPar", &amr->Par->NPar_Active_AllRank, 0, NULL, Compare_Par, Fatal_No, Fatal_No ); + HDF5_KeyInfo->Add( "Par_NAttFltStored", PAR_NATT_FLT_STORED, 0, NULL, Compare_Par, Fatal_ParNAttFlt, Fatal_No ); + HDF5_KeyInfo->Add( "Par_NAttIntStored", PAR_NATT_INT_STORED, 0, NULL, Compare_Par, Fatal_ParNAttInt, Fatal_No ); # ifdef FLOAT8_PAR - KeyInfo.Float8_Par = 1; + HDF5_KeyInfo->Add( "Float8_Par", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - KeyInfo.Float8_Par = 0; + HDF5_KeyInfo->Add( "Float8_Par", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef INT8_PAR - KeyInfo.Int8_Par = 1; + HDF5_KeyInfo->Add( "Int8_Par", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - KeyInfo.Int8_Par = 0; + HDF5_KeyInfo->Add( "Int8_Par", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # endif // #ifdef PARTICLE + + +// HYDRO physics modules +// ---------------------------------------------------------------------------------------------------- # if ( MODEL == HYDRO ) + const bool Compare_MHD = ( RS_FormatVersion >= 2400 ) ? Compare_Yes : Compare_No; + const bool Compare_SRHD = ( RS_FormatVersion >= 2473 ) ? Compare_Yes : Compare_No; + const bool Compare_CR = ( RS_FormatVersion >= 2421 ) ? Compare_Yes : Compare_No; # ifdef MHD - KeyInfo.Magnetohydrodynamics = 1; + HDF5_KeyInfo->Add( "Magnetohydrodynamics", 1, 0, NULL, Compare_MHD, Fatal_Yes, Fatal_Yes ); # else - KeyInfo.Magnetohydrodynamics = 0; + HDF5_KeyInfo->Add( "Magnetohydrodynamics", 0, 0, NULL, Compare_MHD, Fatal_Yes, Fatal_Yes ); # endif # ifdef SRHD - KeyInfo.SRHydrodynamics = 1; + HDF5_KeyInfo->Add( "SRHydrodynamics", 1, 0, NULL, Compare_SRHD, Fatal_Yes, Fatal_Yes ); # else - KeyInfo.SRHydrodynamics = 0; + HDF5_KeyInfo->Add( "SRHydrodynamics", 0, 0, NULL, Compare_SRHD, Fatal_Yes, Fatal_Yes ); # endif # ifdef COSMIC_RAY - KeyInfo.CosmicRay = 1; + HDF5_KeyInfo->Add( "CosmicRay", 1, 0, NULL, Compare_CR, Fatal_Yes, Fatal_Yes ); # ifdef CR_DIFFUSION - KeyInfo.CR_Diffusion = 1; + HDF5_KeyInfo->Add( "CR_Diffusion", 1, 0, NULL, Compare_Yes, Fatal_Yes, Fatal_No ); # else - KeyInfo.CR_Diffusion = 0; + HDF5_KeyInfo->Add( "CR_Diffusion", 0, 0, NULL, Compare_Yes, Fatal_Yes, Fatal_No ); # endif # else // #ifdef COSMIC_RAY - KeyInfo.CosmicRay = 0; + HDF5_KeyInfo->Add( "CosmicRay", 0, 0, NULL, Compare_CR, Fatal_Yes, Fatal_Yes ); # endif // #ifdef COSMIC_RAY .. else ... # endif // #if ( MODEL == HYDRO ) - for (int d=0; d<3; d++) - { - KeyInfo.NX0 [d] = NX0_TOT [d]; - KeyInfo.BoxScale[d] = amr->BoxScale[d]; - KeyInfo.BoxSize [d] = amr->BoxSize [d]; - } - for (int lv=0; lvdh [lv]; - KeyInfo.CellScale [lv] = amr->scale [lv]; - KeyInfo.NPatch [lv] = NPatchTotal [lv]; - KeyInfo.AdvanceCounter[lv] = AdvanceCounter [lv]; - KeyInfo.dTime_AllLv [lv] = dTime_AllLv [lv]; -# if ( MODEL == ELBDM && ELBDM_SCHEME == ELBDM_HYBRID ) - KeyInfo.UseWaveScheme [lv] = amr->use_wave_flag[lv]; -# endif - } +// simulation +// ---------------------------------------------------------------------------------------------------- + int H5_Arr_NLv[1] = { NLEVEL }; + + HDF5_KeyInfo->Add( "NX0", &NX0_TOT[0], 1, H5_Arr_3, Compare_Yes, Fatal_Yes, Fatal_Yes ); + HDF5_KeyInfo->Add( "BoxScale", &amr->BoxScale[0], 1, H5_Arr_3, Compare_Yes, Fatal_Yes, Fatal_No ); + HDF5_KeyInfo->Add( "BoxSize", &amr->BoxSize[0], 1, H5_Arr_3, Compare_Yes, Fatal_Yes, Fatal_Yes ); + HDF5_KeyInfo->Add( "Time", &Time[0], 1, H5_Arr_NLv, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_KeyInfo->Add( "CellSize", &amr->dh[0], 1, H5_Arr_NLv, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_KeyInfo->Add( "CellScale", &amr->scale[0], 1, H5_Arr_NLv, Compare_Yes, Fatal_Yes, Fatal_No ); + HDF5_KeyInfo->Add( "NPatch", &NPatchTotal[0], 1, H5_Arr_NLv, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_KeyInfo->Add( "AdvanceCounter", &AdvanceCounter[0], 1, H5_Arr_NLv, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_KeyInfo->Add( "dTime_AllLv", &dTime_AllLv[0], 1, H5_Arr_NLv, Compare_No, NULL_BOOL, NULL_BOOL ); +# if ( MODEL == ELBDM && ELBDM_SCHEME == ELBDM_HYBRID ) + HDF5_KeyInfo->Add( "UseWaveScheme", &amr->use_wave_flag[0], 1, H5_Arr_NLv, Compare_No, NULL_BOOL, NULL_BOOL ); +# endif + - KeyInfo.CodeVersion = (char*)VERSION; - KeyInfo.DumpWallTime = ctime( &CalTime ); - KeyInfo.DumpWallTime[ strlen(KeyInfo.DumpWallTime)-1 ] = '\0'; // remove the last character '\n' - KeyInfo.GitBranch = (char*)EXPAND_AND_QUOTE( GIT_BRANCH ); - KeyInfo.GitCommit = (char*)EXPAND_AND_QUOTE( GIT_COMMIT ); +// code information +// ---------------------------------------------------------------------------------------------------- + char *temp; + char CodeVersion[MAX_STRING] = VERSION; + char DumpWalltime[MAX_STRING], GitBranch[MAX_STRING], GitCommit[MAX_STRING]; -//###REVISE: replace rand() by UUID + temp = ctime( &CalTime ); + temp[ strlen(temp)-1 ] = '\0'; // remove the last character '\n' + strncpy( DumpWalltime, temp, MAX_STRING ); + + temp = (char*)EXPAND_AND_QUOTE( GIT_BRANCH ); + strncpy( GitBranch, temp, MAX_STRING ); + + temp = (char*)EXPAND_AND_QUOTE( GIT_COMMIT ); + strncpy( GitCommit, temp, MAX_STRING ); + + //###REVISE: replace rand() by UUID srand( time(NULL) ); - KeyInfo.UniqueDataID = rand(); + long UniqueDataID = rand(); + + HDF5_KeyInfo->Add( "CodeVersion", &CodeVersion[0], 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_KeyInfo->Add( "DumpWallTime", &DumpWalltime[0], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_KeyInfo->Add( "GitBranch", &GitBranch[0], 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_KeyInfo->Add( "GitCommit", &GitCommit[0], 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_KeyInfo->Add( "UniqueDataID", &UniqueDataID, 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); - if ( !ConRefInitialized ) Aux_Error( ERROR_INFO, "Reference values for conserved variables have not been assigned yet !!\n" ); - for (int v=0; v<1+NCONREF_MAX; v++) KeyInfo.ConRef[v] = ConRef[v]; +// conserved variables +// ---------------------------------------------------------------------------------------------------- + int H5_Arr_NCM_P1[1] = { 1+NCONREF_MAX }; -} // FUNCTION : FillIn_KeyInfo + if ( !ConRefInitialized && !Load_RS ) Aux_Error( ERROR_INFO, "Reference values for conserved variables have not been assigned yet !!\n" ); + HDF5_KeyInfo->Add( "ConRef", &ConRef[0], 1, H5_Arr_NCM_P1, Compare_No, NULL_BOOL, NULL_BOOL ); + +} // FUNCTION : FillIn_HDF5_KeyInfo //------------------------------------------------------------------------------------------------------- -// Function : FillIn_Makefile -// Description : Fill in the Makefile_t structure +// Function : FillIn_HDF5_Makefile +// Description : Fill in the HDF5_Output_t structure with the makefile information // // Note : 1. Data structure is defined in "HDF5_Typedef.h" // 2. Call-by-reference // -// Parameter : Makefile : Pointer to be filled in +// Parameter : HDF5_Makefile : Pointer to be filled in +// RS_FormatVersion : The format version of the restart data //------------------------------------------------------------------------------------------------------- -void FillIn_Makefile( Makefile_t &Makefile ) +void FillIn_HDF5_Makefile( HDF5_Output_t *HDF5_Makefile, const int RS_FormatVersion ) { -// model-independent options - Makefile.Model = MODEL; + const bool Compare_Yes = true, Compare_No = false; + const bool Fatal_Yes = true, Fatal_No = false; + + +// physics modules options +// ---------------------------------------------------------------------------------------------------- + HDF5_Makefile->Add( "Model", MODEL, 0, NULL, Compare_Yes, Fatal_No, Fatal_Yes ); # ifdef GRAVITY - Makefile.Gravity = 1; + HDF5_Makefile->Add( "Gravity", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_Yes ); # else - Makefile.Gravity = 0; + HDF5_Makefile->Add( "Gravity", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_Yes ); # endif # ifdef COMOVING - Makefile.Comoving = 1; + HDF5_Makefile->Add( "Comoving", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_Yes ); # else - Makefile.Comoving = 0; + HDF5_Makefile->Add( "Comoving", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_Yes ); # endif # ifdef PARTICLE - Makefile.Particle = 1; + HDF5_Makefile->Add( "Particle", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.Particle = 0; + HDF5_Makefile->Add( "Particle", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef GPU - Makefile.UseGPU = 1; -# else - Makefile.UseGPU = 0; -# endif -# ifdef GAMER_DEBUG - Makefile.GAMER_Debug = 1; -# else - Makefile.GAMER_Debug = 0; +// HYDRO options +// ---------------------------------------------------------------------------------------------------- +# if ( MODEL == HYDRO ) + HDF5_Makefile->Add( "FluScheme", FLU_SCHEME, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + +# ifdef LR_SCHEME + HDF5_Makefile->Add( "LRScheme", LR_SCHEME, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef BITWISE_REPRODUCIBILITY - Makefile.BitwiseReproducibility = 1; -# else - Makefile.BitwiseReproducibility = 0; +# ifdef RSOLVER + HDF5_Makefile->Add( "RSolver", RSOLVER, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef TIMING - Makefile.Timing = 1; +# ifdef DUAL_ENERGY + HDF5_Makefile->Add( "DualEnergy", DUAL_ENERGY, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.Timing = 0; + HDF5_Makefile->Add( "DualEnergy", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef TIMING_SOLVER - Makefile.TimingSolver = 1; +# ifdef MHD + HDF5_Makefile->Add( "Magnetohydrodynamics", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_Yes ); # else - Makefile.TimingSolver = 0; + HDF5_Makefile->Add( "Magnetohydrodynamics", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_Yes ); # endif -# ifdef FLOAT8 - Makefile.Float8 = 1; +# ifdef SRHD + HDF5_Makefile->Add( "SRHydrodynamics", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_Yes ); # else - Makefile.Float8 = 0; + HDF5_Makefile->Add( "SRHydrodynamics", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_Yes ); # endif -# ifdef SERIAL - Makefile.Serial = 1; +# ifdef COSMIC_RAY + HDF5_Makefile->Add( "CosmicRay", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_Yes ); +# ifdef CR_DIFFUSION + HDF5_Makefile->Add( "CR_Diffusion", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.Serial = 0; + HDF5_Makefile->Add( "CR_Diffusion", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif +# else // #ifdef COSMIC_RAY + HDF5_Makefile->Add( "CosmicRay", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_Yes ); +# endif // #ifdef COSMIC_RAY .. else ... -# ifdef LOAD_BALANCE - Makefile.LoadBalance = LOAD_BALANCE; + HDF5_Makefile->Add( "EoS", EOS, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + +# ifdef BAROTROPIC_EOS + HDF5_Makefile->Add( "BarotropicEoS", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.LoadBalance = 0; + HDF5_Makefile->Add( "BarotropicEoS", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef OVERLAP_MPI - Makefile.OverlapMPI = 1; +# endif // #if ( MODEL == HYDRO ) + + +// ELBDM options +// ---------------------------------------------------------------------------------------------------- +# if ( MODEL == ELBDM ) + HDF5_Makefile->Add( "ELBDMScheme", ELBDM_SCHEME, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_Makefile->Add( "WaveScheme", WAVE_SCHEME, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + +# ifdef CONSERVE_MASS + HDF5_Makefile->Add( "ConserveMass", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.OverlapMPI = 0; + HDF5_Makefile->Add( "ConserveMass", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef OPENMP - Makefile.OpenMP = 1; +# ifdef LAPLACIAN_4TH + HDF5_Makefile->Add( "Laplacian4th", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.OpenMP = 0; + HDF5_Makefile->Add( "Laplacian4th", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef GPU - Makefile.GPU_Arch = GPU_ARCH; +# ifdef QUARTIC_SELF_INTERACTION + HDF5_Makefile->Add( "SelfInteraction4", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.GPU_Arch = NULL_INT; + HDF5_Makefile->Add( "SelfInteraction4", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif +# endif // #if ( MODEL == ELBDM ) -# ifdef LAOHU - Makefile.Laohu = 1; + +// gravity options +// ---------------------------------------------------------------------------------------------------- +# ifdef GRAVITY + HDF5_Makefile->Add( "PotScheme", POT_SCHEME, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + +# ifdef STORE_POT_GHOST + HDF5_Makefile->Add( "StorePotGhost", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.Laohu = 0; + HDF5_Makefile->Add( "StorePotGhost", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef SUPPORT_HDF5 - Makefile.SupportHDF5 = 1; +# ifdef UNSPLIT_GRAVITY + HDF5_Makefile->Add( "UnsplitGravity", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.SupportHDF5 = 0; + HDF5_Makefile->Add( "UnsplitGravity", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef SUPPORT_GSL - Makefile.SupportGSL = 1; +# endif // #ifdef GRAVITY + + +// particle options +// ---------------------------------------------------------------------------------------------------- +# ifdef PARTICLE +# ifdef MASSIVE_PARTICLES + HDF5_Makefile->Add( "MassiveParticles", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.SupportGSL = 0; + HDF5_Makefile->Add( "MassiveParticles", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - -# ifdef SUPPORT_SPECTRAL_INT - Makefile.SupportSpectralInt = 1; +# ifdef TRACER + HDF5_Makefile->Add( "Tracer", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.SupportSpectralInt = 0; + HDF5_Makefile->Add( "Tracer", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - -# ifdef SUPPORT_FFTW - Makefile.SupportFFTW = SUPPORT_FFTW; +# ifdef STORE_PAR_ACC + HDF5_Makefile->Add( "StoreParAcc", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.SupportFFTW = 0; + HDF5_Makefile->Add( "StoreParAcc", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef SUPPORT_LIBYT - Makefile.SupportLibYT = 1; - -# ifdef LIBYT_USE_PATCH_GROUP - Makefile.LibYTUsePatchGroup = 1; +# ifdef STAR_FORMATION + HDF5_Makefile->Add( "StarFormation", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.LibYTUsePatchGroup = 0; + HDF5_Makefile->Add( "StarFormation", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef LIBYT_INTERACTIVE - Makefile.LibYTInteractive = 1; +# ifdef FEEDBACK + HDF5_Makefile->Add( "Feedback", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.LibYTInteractive = 0; + HDF5_Makefile->Add( "Feedback", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef LIBYT_RELOAD - Makefile.LibYTReload = 1; + const bool Fatal_ParNAttFlt = ( RS_FormatVersion > 2300 ) ? Fatal_Yes : Fatal_No; + const bool Fatal_ParNAttInt = ( RS_FormatVersion > 2500 ) ? Fatal_Yes : Fatal_No; + HDF5_Makefile->Add( "Par_NAttFltUser", PAR_NATT_FLT_USER, 0, NULL, Compare_Yes, Fatal_No, Fatal_ParNAttFlt ); + HDF5_Makefile->Add( "Par_NAttIntUser", PAR_NATT_INT_USER, 0, NULL, Compare_Yes, Fatal_No, Fatal_ParNAttInt ); + +# ifdef FLOAT8_PAR + HDF5_Makefile->Add( "Float8_Par", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.LibYTReload = 0; + HDF5_Makefile->Add( "Float8_Par", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef LIBYT_JUPYTER - Makefile.LibYTJupyter = 1; +# ifdef INT8_PAR + HDF5_Makefile->Add( "Int8_Par", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.LibYTJupyter = 0; + HDF5_Makefile->Add( "Int8_Par", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif +# endif // #ifdef PARTICLE -# else // #ifdef SUPPORT_LIBYT - Makefile.SupportLibYT = 0; -# endif // #ifdef SUPPORT_LIBYT ... else ... +// GRACKLE options +// ---------------------------------------------------------------------------------------------------- # ifdef SUPPORT_GRACKLE - Makefile.SupportGrackle = 1; + HDF5_Makefile->Add( "SupportGrackle", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.SupportGrackle = 0; + HDF5_Makefile->Add( "SupportGrackle", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - Makefile.RandomNumber = RANDOM_NUMBER; - - Makefile.NLevel = NLEVEL; - Makefile.MaxPatch = MAX_PATCH; +// miscellaneous options +// ---------------------------------------------------------------------------------------------------- + HDF5_Makefile->Add( "NLevel", NLEVEL, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_Makefile->Add( "MaxPatch", MAX_PATCH, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); -// model-dependent options -# ifdef GRAVITY - Makefile.PotScheme = POT_SCHEME; - -# ifdef STORE_POT_GHOST - Makefile.StorePotGhost = 1; +# ifdef GAMER_DEBUG + HDF5_Makefile->Add( "GAMER_Debug", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.StorePotGhost = 0; + HDF5_Makefile->Add( "GAMER_Debug", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef UNSPLIT_GRAVITY - Makefile.UnsplitGravity = 1; +# ifdef BITWISE_REPRODUCIBILITY + HDF5_Makefile->Add( "BitwiseReproducibility", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.UnsplitGravity = 0; + HDF5_Makefile->Add( "BitwiseReproducibility", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# endif // #ifdef GRAVITY - -# if ( MODEL == HYDRO ) - Makefile.FluScheme = FLU_SCHEME; - -# ifdef LR_SCHEME - Makefile.LRScheme = LR_SCHEME; +# ifdef TIMING + HDF5_Makefile->Add( "Timing", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); +# else + HDF5_Makefile->Add( "Timing", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef RSOLVER - Makefile.RSolver = RSOLVER; +# ifdef TIMING_SOLVER + HDF5_Makefile->Add( "TimingSolver", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); +# else + HDF5_Makefile->Add( "TimingSolver", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef DUAL_ENERGY - Makefile.DualEnergy = DUAL_ENERGY; +# ifdef FLOAT8 + HDF5_Makefile->Add( "Float8", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.DualEnergy = 0; + HDF5_Makefile->Add( "Float8", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef MHD - Makefile.Magnetohydrodynamics = 1; +# ifdef LAOHU + HDF5_Makefile->Add( "Laohu", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.Magnetohydrodynamics = 0; + HDF5_Makefile->Add( "Laohu", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef SRHD - Makefile.SRHydrodynamics = 1; +# ifdef SUPPORT_HDF5 + HDF5_Makefile->Add( "SupportHDF5", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.SRHydrodynamics = 0; + HDF5_Makefile->Add( "SupportHDF5", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef COSMIC_RAY - Makefile.CosmicRay = 1; -# ifdef CR_DIFFUSION - Makefile.CR_Diffusion = 1; +# ifdef SUPPORT_GSL + HDF5_Makefile->Add( "SupportGSL", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.CR_Diffusion = 0; + HDF5_Makefile->Add( "SupportGSL", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# else // #ifdef COSMIC_RAY - Makefile.CosmicRay = 0; -# endif // #ifdef COSMIC_RAY .. else ... - Makefile.EoS = EOS; +# ifdef SUPPORT_SPECTRAL_INT + HDF5_Makefile->Add( "SupportSpectralInt", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); +# else + HDF5_Makefile->Add( "SupportSpectralInt", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); +# endif -# ifdef BAROTROPIC_EOS - Makefile.BarotropicEoS = 1; +# ifdef SUPPORT_FFTW + HDF5_Makefile->Add( "SupportFFTW", SUPPORT_FFTW, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.BarotropicEoS = 0; + HDF5_Makefile->Add( "SupportFFTW", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif + HDF5_Makefile->Add( "RandomNumber", RANDOM_NUMBER, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); -# elif ( MODEL == ELBDM ) - Makefile.ELBDMScheme = ELBDM_SCHEME; - Makefile.WaveScheme = WAVE_SCHEME; +// LibYT options +// ---------------------------------------------------------------------------------------------------- +# ifdef SUPPORT_LIBYT + HDF5_Makefile->Add( "SupportLibYT", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); -# ifdef CONSERVE_MASS - Makefile.ConserveMass = 1; +# ifdef LIBYT_USE_PATCH_GROUP + HDF5_Makefile->Add( "LibYTUsePatchGroup", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.ConserveMass = 0; + HDF5_Makefile->Add( "LibYTUsePatchGroup", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef LAPLACIAN_4TH - Makefile.Laplacian4th = 1; +# ifdef LIBYT_INTERACTIVE + HDF5_Makefile->Add( "LibYTInteractive", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.Laplacian4th = 0; + HDF5_Makefile->Add( "LibYTInteractive", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef QUARTIC_SELF_INTERACTION - Makefile.SelfInteraction4 = 1; +# ifdef LIBYT_RELOAD + HDF5_Makefile->Add( "LibYTReload", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.SelfInteraction4 = 0; + HDF5_Makefile->Add( "LibYTReload", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - -# else -# error : unsupported MODEL !! -# endif // MODEL - -# ifdef PARTICLE -# ifdef MASSIVE_PARTICLES - Makefile.MassiveParticles = 1; +# ifdef LIBYT_JUPYTER + HDF5_Makefile->Add( "LibYTJupyter", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.MassiveParticles = 0; + HDF5_Makefile->Add( "LibYTJupyter", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef TRACER - Makefile.Tracer = 1; + +# else // #ifdef SUPPORT_LIBYT + HDF5_Makefile->Add( "SupportLibYT", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); +# endif // #ifdef SUPPORT_LIBYT ... else ... + + +// parallel options +// ---------------------------------------------------------------------------------------------------- +# ifdef SERIAL + HDF5_Makefile->Add( "Serial", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.Tracer = 0; + HDF5_Makefile->Add( "Serial", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef STORE_PAR_ACC - Makefile.StoreParAcc = 1; + +# ifdef LOAD_BALANCE + HDF5_Makefile->Add( "LoadBalance", LOAD_BALANCE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.StoreParAcc = 0; + HDF5_Makefile->Add( "LoadBalance", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef STAR_FORMATION - Makefile.StarFormation = 1; +# ifdef OVERLAP_MPI + HDF5_Makefile->Add( "OverlapMPI", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.StarFormation = 0; + HDF5_Makefile->Add( "OverlapMPI", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef FEEDBACK - Makefile.Feedback = 1; +# ifdef OPENMP + HDF5_Makefile->Add( "OpenMP", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.Feedback = 0; + HDF5_Makefile->Add( "OpenMP", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - Makefile.Par_NAttFltUser = PAR_NATT_FLT_USER; - Makefile.Par_NAttIntUser = PAR_NATT_INT_USER; - -# ifdef FLOAT8_PAR - Makefile.Float8_Par = 1; +# ifdef GPU + HDF5_Makefile->Add( "UseGPU", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.Float8_Par = 0; + HDF5_Makefile->Add( "UseGPU", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# ifdef INT8_PAR - Makefile.Int8_Par = 1; +# ifdef GPU + HDF5_Makefile->Add( "GPU_Arch", GPU_ARCH, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - Makefile.Int8_Par = 0; + HDF5_Makefile->Add( "GPU_Arch", NULL_INT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif -# endif // #ifdef PARTICLE -} // FUNCTION : FillIn_Makefile +} // FUNCTION : FillIn_HDF5_Makefile //------------------------------------------------------------------------------------------------------- -// Function : FillIn_SymConst -// Description : Fill in the SymConst_t structure +// Function : FillIn_HDF5_SymConst +// Description : Fill in the HDF5_Output_t structure with symbolic constants // // Note : 1. Data structure is defined in "HDF5_Typedef.h" // 2. Call-by-reference // -// Parameter : SymConst : Pointer to be filled in +// Parameter : HDF5_SymConst : Pointer to be filled in +// RS_FormatVersion : The format version of the restart data //------------------------------------------------------------------------------------------------------- -void FillIn_SymConst( SymConst_t &SymConst ) +void FillIn_HDF5_SymConst( HDF5_Output_t *HDF5_SymConst, const int RS_FormatVersion ) { + const bool Compare_Yes = true, Compare_No = false; + const bool Fatal_Yes = true, Fatal_No = false; + + // model-independent variables - SymConst.NCompFluid = NCOMP_FLUID; - SymConst.NCompPassive = NCOMP_PASSIVE; - SymConst.PatchSize = PS1; - SymConst.Flu_NIn = FLU_NIN; - SymConst.Flu_NOut = FLU_NOUT; - SymConst.Flu_NIn_T = FLU_NIN_T; - SymConst.Flu_NIn_S = FLU_NIN_S; - SymConst.Flu_NOut_S = FLU_NOUT_S; - SymConst.NFluxFluid = NFLUX_FLUID; - SymConst.NFluxPassive = NFLUX_PASSIVE; - SymConst.Flu_GhostSize = FLU_GHOST_SIZE; - SymConst.Flu_Nxt = FLU_NXT; +// ---------------------------------------------------------------------------------------------------- + HDF5_SymConst->Add( "NCompFluid", NCOMP_FLUID, 0, NULL, Compare_Yes, Fatal_No, Fatal_Yes ); + HDF5_SymConst->Add( "NCompPassive", NCOMP_PASSIVE, 0, NULL, Compare_Yes, Fatal_No, Fatal_Yes ); + HDF5_SymConst->Add( "PatchSize", PS1, 0, NULL, Compare_Yes, Fatal_No, Fatal_Yes ); + HDF5_SymConst->Add( "Flu_NIn", FLU_NIN, 0, NULL, Compare_Yes, Fatal_No, Fatal_Yes ); + HDF5_SymConst->Add( "Flu_NOut", FLU_NOUT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "Flu_NIn_T", FLU_NIN_T, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "Flu_NIn_S", FLU_NIN_S, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "Flu_NOut_S", FLU_NOUT_S, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "NFluxFluid", NFLUX_FLUID, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "NFluxPassive", NFLUX_PASSIVE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "Flu_GhostSize", FLU_GHOST_SIZE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "Flu_Nxt", FLU_NXT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef DEBUG_HDF5 - SymConst.Debug_HDF5 = 1; + HDF5_SymConst->Add( "Debug_HDF5", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - SymConst.Debug_HDF5 = 0; + HDF5_SymConst->Add( "Debug_HDF5", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - SymConst.SibOffsetNonperiodic = SIB_OFFSET_NONPERIODIC; + HDF5_SymConst->Add( "SibOffsetNonperiodic", SIB_OFFSET_NONPERIODIC, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef LOAD_BALANCE - SymConst.SonOffsetLB = SON_OFFSET_LB; + HDF5_SymConst->Add( "SonOffsetLB", SON_OFFSET_LB, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - SymConst.TinyNumber = TINY_NUMBER; - SymConst.HugeNumber = HUGE_NUMBER; - SymConst.MaxError = MAX_ERROR; + HDF5_SymConst->Add( "TinyNumber", TINY_NUMBER, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "HugeNumber", HUGE_NUMBER, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "MaxError", MAX_ERROR, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); -// model-dependent variables +// gravity variables +// ---------------------------------------------------------------------------------------------------- # ifdef GRAVITY - SymConst.Gra_NIn = GRA_NIN; - SymConst.Pot_GhostSize = POT_GHOST_SIZE; - SymConst.Gra_GhostSize = GRA_GHOST_SIZE; - SymConst.Rho_GhostSize = RHO_GHOST_SIZE; - SymConst.Pot_Nxt = POT_NXT; - SymConst.Gra_Nxt = GRA_NXT; - SymConst.Rho_Nxt = RHO_NXT; + HDF5_SymConst->Add( "Gra_NIn", GRA_NIN, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "Pot_GhostSize", POT_GHOST_SIZE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "Gra_GhostSize", GRA_GHOST_SIZE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "Rho_GhostSize", RHO_GHOST_SIZE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "Pot_Nxt", POT_NXT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "Gra_Nxt", GRA_NXT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "Rho_Nxt", RHO_NXT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef UNSPLIT_GRAVITY - SymConst.USG_GhostSizeF = USG_GHOST_SIZE_F; - SymConst.USG_GhostSizeG = USG_GHOST_SIZE_G; - SymConst.USG_NxtF = USG_NXT_F; - SymConst.USG_NxtG = USG_NXT_G; + HDF5_SymConst->Add( "USG_GhostSizeF", USG_GHOST_SIZE_F, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "USG_GhostSizeG", USG_GHOST_SIZE_G, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "USG_NxtF", USG_NXT_F, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "USG_NxtG", USG_NXT_G, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - SymConst.ExtPot_BlockSize = EXTPOT_BLOCK_SIZE; - SymConst.Gra_BlockSize = GRA_BLOCK_SIZE; - SymConst.ExtPotNAuxMax = EXT_POT_NAUX_MAX; - SymConst.ExtAccNAuxMax = EXT_ACC_NAUX_MAX; - SymConst.ExtPotNGeneMax = EXT_POT_NGENE_MAX; + HDF5_SymConst->Add( "ExtPot_BlockSize", EXTPOT_BLOCK_SIZE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "Gra_BlockSize", GRA_BLOCK_SIZE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "ExtPotNAuxMax", EXT_POT_NAUX_MAX, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "ExtAccNAuxMax", EXT_ACC_NAUX_MAX, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "ExtPotNGeneMax", EXT_POT_NGENE_MAX, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # if ( POT_SCHEME == SOR ) - SymConst.Pot_BlockSize_z = POT_BLOCK_SIZE_Z; + HDF5_SymConst->Add( "Pot_BlockSize_z", POT_BLOCK_SIZE_Z, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef SOR_RHO_SHARED - SymConst.SOR_RhoShared = 1; + HDF5_SymConst->Add( "SOR_RhoShared", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - SymConst.SOR_RhoShared = 0; + HDF5_SymConst->Add( "SOR_RhoShared", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef SOR_CPOT_SHARED - SymConst.SOR_CPotShared = 1; + HDF5_SymConst->Add( "SOR_CPotShared", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - SymConst.SOR_CPotShared = 0; + HDF5_SymConst->Add( "SOR_CPotShared", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef SOR_USE_SHUFFLE - SymConst.SOR_UseShuffle = 1; + HDF5_SymConst->Add( "SOR_UseShuffle", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - SymConst.SOR_UseShuffle = 0; + HDF5_SymConst->Add( "SOR_UseShuffle", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef SOR_USE_PADDING - SymConst.SOR_UsePadding = 1; + HDF5_SymConst->Add( "SOR_UsePadding", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - SymConst.SOR_UsePadding = 0; + HDF5_SymConst->Add( "SOR_UsePadding", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - SymConst.SOR_ModReduction = SOR_MOD_REDUCTION; + HDF5_SymConst->Add( "SOR_ModReduction", SOR_MOD_REDUCTION, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # elif ( POT_SCHEME == MG ) - SymConst.Pot_BlockSize_x = POT_BLOCK_SIZE_X; + HDF5_SymConst->Add( "Pot_BlockSize_x", POT_BLOCK_SIZE_X, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif // POT_SCHEME # endif // #ifdef GRAVITY +// particle variables +// ---------------------------------------------------------------------------------------------------- # ifdef PARTICLE - SymConst.Par_NAttFltStored = PAR_NATT_FLT_STORED; - SymConst.Par_NAttIntStored = PAR_NATT_INT_STORED; - SymConst.Par_NType = PAR_NTYPE; + const bool Fatal_ParNAttFlt = ( RS_FormatVersion > 2300 ) ? Fatal_Yes : Fatal_No; + const bool Fatal_ParNAttInt = ( RS_FormatVersion > 2500 ) ? Fatal_Yes : Fatal_No; + HDF5_SymConst->Add( "Par_NAttFltStored", PAR_NATT_FLT_STORED, 0, NULL, Compare_Yes, Fatal_No, Fatal_ParNAttFlt ); + HDF5_SymConst->Add( "Par_NAttIntStored", PAR_NATT_INT_STORED, 0, NULL, Compare_Yes, Fatal_No, Fatal_ParNAttInt ); + HDF5_SymConst->Add( "Par_NType", PAR_NTYPE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef GRAVITY - SymConst.RhoExt_GhostSize = RHOEXT_GHOST_SIZE; + HDF5_SymConst->Add( "RhoExt_GhostSize", RHOEXT_GHOST_SIZE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef DEBUG_PARTICLE - SymConst.Debug_Particle = 1; + HDF5_SymConst->Add( "Debug_Particle", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - SymConst.Debug_Particle = 0; + HDF5_SymConst->Add( "Debug_Particle", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - SymConst.ParList_GrowthFactor = PARLIST_GROWTH_FACTOR; - SymConst.ParList_ReduceFactor = PARLIST_REDUCE_FACTOR; + HDF5_SymConst->Add( "ParList_GrowthFactor", PARLIST_GROWTH_FACTOR, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "ParList_ReduceFactor", PARLIST_REDUCE_FACTOR, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif // #ifdef PARTICLE +// bitwise reproducibility variables +// ---------------------------------------------------------------------------------------------------- # ifdef BIT_REP_FLUX - SymConst.BitRep_Flux = 1; + HDF5_SymConst->Add( "BitRep_Flux", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - SymConst.BitRep_Flux = 0; + HDF5_SymConst->Add( "BitRep_Flux", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef MHD # ifdef BIT_REP_ELECTRIC - SymConst.BitRep_Electric = 1; + HDF5_SymConst->Add( "BitRep_Electric", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - SymConst.BitRep_Electric = 0; + HDF5_SymConst->Add( "BitRep_Electric", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # endif // #ifdef MHD -# ifdef INTERP_MASK - SymConst.InterpMask = 1; -# else - SymConst.InterpMask = 0; -# endif - -# ifdef FB_SEP_FLUOUT - SymConst.FB_SepFluOut = 1; -# else - SymConst.FB_SepFluOut = 0; -# endif - +// HYDRO variables +// ---------------------------------------------------------------------------------------------------- # if ( MODEL == HYDRO ) - SymConst.Flu_BlockSize_x = FLU_BLOCK_SIZE_X; - SymConst.Flu_BlockSize_y = FLU_BLOCK_SIZE_Y; + HDF5_SymConst->Add( "Flu_BlockSize_x", FLU_BLOCK_SIZE_X, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "Flu_BlockSize_y", FLU_BLOCK_SIZE_Y, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef CHECK_UNPHYSICAL_IN_FLUID - SymConst.CheckUnphyInFluid = 1; + HDF5_SymConst->Add( "CheckUnphyInFluid", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - SymConst.CheckUnphyInFluid = 0; + HDF5_SymConst->Add( "CheckUnphyInFluid", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef CHAR_RECONSTRUCTION - SymConst.CharReconstruction = 1; + HDF5_SymConst->Add( "CharReconstruction", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - SymConst.CharReconstruction = 0; + HDF5_SymConst->Add( "CharReconstruction", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef LR_EINT - SymConst.LR_Eint = 1; + HDF5_SymConst->Add( "LR_Eint", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - SymConst.LR_Eint = 0; + HDF5_SymConst->Add( "LR_Eint", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef CHECK_INTERMEDIATE - SymConst.CheckIntermediate = CHECK_INTERMEDIATE; + HDF5_SymConst->Add( "CheckIntermediate", CHECK_INTERMEDIATE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - SymConst.CheckIntermediate = 0; + HDF5_SymConst->Add( "CheckIntermediate", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef RSOLVER_RESCUE - SymConst.RSolverRescue = RSOLVER_RESCUE; + HDF5_SymConst->Add( "RSolverRescue", RSOLVER_RESCUE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - SymConst.RSolverRescue = 0; + HDF5_SymConst->Add( "RSolverRescue", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef HLL_NO_REF_STATE - SymConst.HLL_NoRefState = 1; + HDF5_SymConst->Add( "HLL_NoRefState", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - SymConst.HLL_NoRefState = 0; + HDF5_SymConst->Add( "HLL_NoRefState", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef HLL_INCLUDE_ALL_WAVES - SymConst.HLL_IncludeAllWaves = 1; + HDF5_SymConst->Add( "HLL_IncludeAllWaves", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - SymConst.HLL_IncludeAllWaves = 0; + HDF5_SymConst->Add( "HLL_IncludeAllWaves", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - SymConst.HLLC_WaveSpeed = HLLC_WAVESPEED; - SymConst.HLLE_WaveSpeed = HLLE_WAVESPEED; + HDF5_SymConst->Add( "HLLC_WaveSpeed", HLLC_WAVESPEED, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "HLLE_WaveSpeed", HLLE_WAVESPEED, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef MHD - SymConst.HLLD_WaveSpeed = HLLD_WAVESPEED; + HDF5_SymConst->Add( "HLLD_WaveSpeed", HLLD_WAVESPEED, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef N_FC_VAR - SymConst.N_FC_Var = N_FC_VAR; + HDF5_SymConst->Add( "N_FC_Var", N_FC_VAR, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef N_SLOPE_PPM - SymConst.N_Slope_PPM = N_SLOPE_PPM; + HDF5_SymConst->Add( "N_Slope_PPM", N_SLOPE_PPM, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef MHD # ifdef EULERY - SymConst.EulerY = 1; + HDF5_SymConst->Add( "EulerY", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - SymConst.EulerY = 0; + HDF5_SymConst->Add( "EulerY", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # endif // MHD # ifdef MHM_CHECK_PREDICT - SymConst.MHM_CheckPredict = 1; + HDF5_SymConst->Add( "MHM_CheckPredict", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - SymConst.MHM_CheckPredict = 0; + HDF5_SymConst->Add( "MHM_CheckPredict", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - SymConst.EoSNAuxMax = EOS_NAUX_MAX; - SymConst.EoSNTableMax = EOS_NTABLE_MAX; + HDF5_SymConst->Add( "EoSNAuxMax", EOS_NAUX_MAX, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "EoSNTableMax", EOS_NTABLE_MAX, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + +// ELBDM variables +// ---------------------------------------------------------------------------------------------------- # elif ( MODEL == ELBDM ) - SymConst.Flu_BlockSize_x = FLU_BLOCK_SIZE_X; - SymConst.Flu_BlockSize_y = FLU_BLOCK_SIZE_Y; + HDF5_SymConst->Add( "Flu_BlockSize_x", FLU_BLOCK_SIZE_X, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "Flu_BlockSize_y", FLU_BLOCK_SIZE_Y, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # if ( ELBDM_SCHEME == ELBDM_HYBRID ) - SymConst.Flu_HJ_BlockSize_y = FLU_HJ_BLOCK_SIZE_Y; + HDF5_SymConst->Add( "Flu_HJ_BlockSize_y", FLU_HJ_BLOCK_SIZE_Y, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # if ( WAVE_SCHEME == WAVE_GRAMFE ) - SymConst.GramFEScheme = GRAMFE_SCHEME; - SymConst.GramFEGamma = GRAMFE_GAMMA; - SymConst.GramFEG = GRAMFE_G; - SymConst.GramFENDelta = GRAMFE_NDELTA; - SymConst.GramFEOrder = GRAMFE_ORDER; - SymConst.GramFEND = GRAMFE_ND; - SymConst.GramFEFluNxt = GRAMFE_FLU_NXT; + HDF5_SymConst->Add( "GramFEScheme", GRAMFE_SCHEME, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "GramFEGamma", GRAMFE_GAMMA, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "GramFEG", GRAMFE_G, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "GramFENDelta", GRAMFE_NDELTA, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "GramFEOrder", GRAMFE_ORDER, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "GramFEND", GRAMFE_ND, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "GramFEFluNxt", GRAMFE_FLU_NXT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # else # error : ERROR : unsupported MODEL !! # endif // MODEL - SymConst.dt_Flu_BlockSize = DT_FLU_BLOCK_SIZE; + +// dt variables +// ---------------------------------------------------------------------------------------------------- + HDF5_SymConst->Add( "dt_Flu_BlockSize", DT_FLU_BLOCK_SIZE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef DT_FLU_USE_SHUFFLE - SymConst.dt_Flu_UseShuffle = 1; + HDF5_SymConst->Add( "dt_Flu_UseShuffle", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - SymConst.dt_Flu_UseShuffle = 0; + HDF5_SymConst->Add( "dt_Flu_UseShuffle", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef GRAVITY - SymConst.dt_Gra_BlockSize = DT_GRA_BLOCK_SIZE; + HDF5_SymConst->Add( "dt_Gra_BlockSize", DT_GRA_BLOCK_SIZE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef DT_GRA_USE_SHUFFLE - SymConst.dt_Gra_UseShuffle = 1; + HDF5_SymConst->Add( "dt_Gra_UseShuffle", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # else - SymConst.dt_Gra_UseShuffle = 0; + HDF5_SymConst->Add( "dt_Gra_UseShuffle", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # endif - SymConst.Src_BlockSize = SRC_BLOCK_SIZE; - SymConst.Src_GhostSize = SRC_GHOST_SIZE; - SymConst.Src_Nxt = SRC_NXT; + +// source term variables +// ---------------------------------------------------------------------------------------------------- + HDF5_SymConst->Add( "Src_BlockSize", SRC_BLOCK_SIZE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "Src_GhostSize", SRC_GHOST_SIZE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "Src_Nxt", SRC_NXT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # if ( MODEL == HYDRO ) - SymConst.Src_NAuxDlep = SRC_NAUX_DLEP; - SymConst.Src_DlepProfNVar = SRC_DLEP_PROF_NVAR; - SymConst.Src_DlepProfNBinMax = SRC_DLEP_PROF_NBINMAX; + HDF5_SymConst->Add( "Src_NAuxDlep", SRC_NAUX_DLEP, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "Src_DlepProfNVar", SRC_DLEP_PROF_NVAR, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "Src_DlepProfNBinMax", SRC_DLEP_PROF_NBINMAX, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - SymConst.Src_NAuxUser = SRC_NAUX_USER; + HDF5_SymConst->Add( "Src_NAuxUser", SRC_NAUX_USER, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); - SymConst.Der_GhostSize = DER_GHOST_SIZE; - SymConst.Der_Nxt = DER_NXT; - SymConst.Der_NOut_Max = DER_NOUT_MAX; + HDF5_SymConst->Add( "Der_GhostSize", DER_GHOST_SIZE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "Der_Nxt", DER_NXT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "Der_NOut_Max", DER_NOUT_MAX, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + +// feedback variables +// ---------------------------------------------------------------------------------------------------- # ifdef FEEDBACK - SymConst.FB_GhostSize = FB_GHOST_SIZE; - SymConst.FB_Nxt = FB_NXT; + HDF5_SymConst->Add( "FB_GhostSize", FB_GHOST_SIZE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_SymConst->Add( "FB_Nxt", FB_NXT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); +# endif + +# ifdef FB_SEP_FLUOUT + HDF5_SymConst->Add( "FB_SepFluOut", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); +# else + HDF5_SymConst->Add( "FB_SepFluOut", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); +# endif + + +// interpolate variables +// ---------------------------------------------------------------------------------------------------- +# ifdef INTERP_MASK + HDF5_SymConst->Add( "InterpMask", 1, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); +# else + HDF5_SymConst->Add( "InterpMask", 0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - SymConst.NFieldStoredMax = NFIELD_STORED_MAX; - SymConst.NConRefMax = NCONREF_MAX; +// maximum number variables +// ---------------------------------------------------------------------------------------------------- + HDF5_SymConst->Add( "NFieldStoredMax", NFIELD_STORED_MAX, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); -} // FUNCTION : FillIn_SymConst + HDF5_SymConst->Add( "NConRefMax", NCONREF_MAX, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + +} // FUNCTION : FillIn_HDF5_SymConst //------------------------------------------------------------------------------------------------------- -// Function : FillIn_InputPara -// Description : Fill in the InputPara_t structure +// Function : FillIn_HDF5_InputPara +// Description : Fill in the HDF5_Output_t structure with input parameters // // Note : 1. Data structure is defined in "HDF5_Typedef.h" // 2. Call-by-reference // -// Parameter : InputPara : Pointer to be filled in -// NFieldStored : Number of grid fields to be stored on disk -// FieldLabelOut : Field labels +// Parameter : HDF5_InputPara : Pointer to be filled in +// NFieldStored : Number of grid fields to be stored on disk +// FieldLabelOut : Field labels +// Load_RS : Whether the structure is used for checking the restart data //------------------------------------------------------------------------------------------------------- -void FillIn_InputPara( InputPara_t &InputPara, const int NFieldStored, char FieldLabelOut[][MAX_STRING] ) +void FillIn_HDF5_InputPara( HDF5_Output_t *HDF5_InputPara, const int NFieldStored, + char FieldLabelOut[][MAX_STRING], const bool Load_RS ) { + const bool Compare_Yes = true, Compare_No = false; + const bool Fatal_Yes = true, Fatal_No = false; + + char Key[MAX_STRING]; + + // simulation scale - InputPara.BoxSize = BOX_SIZE; - for (int d=0; d<3; d++) - InputPara.NX0_Tot[d] = NX0_TOT[d]; - InputPara.MPI_NRank = MPI_NRank; - for (int d=0; d<3; d++) - InputPara.MPI_NRank_X[d] = MPI_NRank_X[d]; - InputPara.OMP_NThread = OMP_NTHREAD; - InputPara.EndT = END_T; - InputPara.EndStep = END_STEP; +// ---------------------------------------------------------------------------------------------------- + HDF5_InputPara->Add( "BoxSize", &BOX_SIZE, 0, NULL, Compare_Yes, Fatal_Yes, Fatal_No ); + HDF5_InputPara->Add( "NX0_Tot", &NX0_TOT[0], 1, H5_Arr_3, Compare_Yes, Fatal_Yes, Fatal_No ); + HDF5_InputPara->Add( "MPI_NRank", &MPI_NRank, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "MPI_NRank_X", &MPI_NRank_X[0], 1, H5_Arr_3, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "OMP_NThread", &OMP_NTHREAD, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "EndT", &END_T, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "EndStep", &END_STEP, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + // test problems - InputPara.TestProb_ID = TESTPROB_ID; +// ---------------------------------------------------------------------------------------------------- + HDF5_InputPara->Add( "TestProb_ID", &TESTPROB_ID, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + // code units - InputPara.Opt__Unit = OPT__UNIT; - InputPara.Unit_L = UNIT_L; - InputPara.Unit_M = UNIT_M; - InputPara.Unit_T = UNIT_T; - InputPara.Unit_V = UNIT_V; - InputPara.Unit_D = UNIT_D; - InputPara.Unit_E = UNIT_E; - InputPara.Unit_P = UNIT_P; +// ---------------------------------------------------------------------------------------------------- + HDF5_InputPara->Add( "Opt__Unit", &OPT__UNIT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Unit_L", &UNIT_L, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Unit_M", &UNIT_M, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Unit_T", &UNIT_T, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Unit_V", &UNIT_V, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Unit_D", &UNIT_D, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Unit_E", &UNIT_E, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Unit_P", &UNIT_P, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef MHD - InputPara.Unit_B = UNIT_B; + HDF5_InputPara->Add( "Unit_B", &UNIT_B, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif + // boundary condition - for (int t=0; t<6; t++) - InputPara.Opt__BC_Flu[t] = OPT__BC_FLU[t]; +// ---------------------------------------------------------------------------------------------------- + HDF5_InputPara->Add( "Opt__BC_Flu", &OPT__BC_FLU[0], 1, H5_Arr_6, Compare_Yes, Fatal_No, Fatal_No ); # ifdef GRAVITY - InputPara.Opt__BC_Pot = OPT__BC_POT; - InputPara.GFunc_Coeff0 = GFUNC_COEFF0; + HDF5_InputPara->Add( "Opt__BC_Pot", &OPT__BC_POT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "GFunc_Coeff0", &GFUNC_COEFF0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif + // particle +// ---------------------------------------------------------------------------------------------------- # ifdef PARTICLE - InputPara.Par_Init = amr->Par->Init; - InputPara.Par_ICFormat = amr->Par->ParICFormat; - InputPara.Par_ICMass = amr->Par->ParICMass; - InputPara.Par_ICType = amr->Par->ParICType; - InputPara.Par_ICFloat8 = PAR_IC_FLOAT8; - InputPara.Par_ICInt8 = PAR_IC_INT8; - InputPara.Par_Interp = amr->Par->Interp; - InputPara.Par_InterpTracer = amr->Par->InterpTracer; - InputPara.Par_Integ = amr->Par->Integ; - InputPara.Par_IntegTracer = amr->Par->IntegTracer; - InputPara.Par_ImproveAcc = amr->Par->ImproveAcc; - InputPara.Par_PredictPos = amr->Par->PredictPos; - InputPara.Par_RemoveCell = amr->Par->RemoveCell; - InputPara.Opt__FreezePar = OPT__FREEZE_PAR; - InputPara.Par_GhostSize = amr->Par->GhostSize; - InputPara.Par_GhostSizeTracer = amr->Par->GhostSizeTracer; - InputPara.Par_TracerVelCorr = amr->Par->TracerVelCorr; - InputPara.Opt__ParInitCheck = OPT__PAR_INIT_CHECK; + HDF5_InputPara->Add( "Par_Init", &amr->Par->Init, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Par_ICFormat", &amr->Par->ParICFormat, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Par_ICMass", &amr->Par->ParICMass, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Par_ICType", &amr->Par->ParICType, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Par_ICFloat8", &PAR_IC_FLOAT8, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Par_ICInt8", &PAR_IC_INT8, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Par_Interp", &amr->Par->Interp, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Par_InterpTracer", &amr->Par->InterpTracer, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Par_Integ", &amr->Par->Integ, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Par_IntegTracer", &amr->Par->IntegTracer, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Par_ImproveAcc", &amr->Par->ImproveAcc, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Par_PredictPos", &amr->Par->PredictPos, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Par_RemoveCell", &amr->Par->RemoveCell, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__FreezePar", &OPT__FREEZE_PAR, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Par_GhostSize", &amr->Par->GhostSize, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Par_GhostSizeTracer", &amr->Par->GhostSizeTracer, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Par_TracerVelCorr", &amr->Par->TracerVelCorr, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__ParInitCheck", &OPT__PAR_INIT_CHECK, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); for (int v=0; vAdd( Key, &ParAttFltLabel[v][0], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + } for (int v=0; vAdd( Key, &ParAttIntLabel[v][0], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + } # endif + // cosmology +// ---------------------------------------------------------------------------------------------------- # ifdef COMOVING - InputPara.A_Init = A_INIT; - InputPara.OmegaM0 = OMEGA_M0; - InputPara.Hubble0 = HUBBLE0; + HDF5_InputPara->Add( "A_Init", &A_INIT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "OmegaM0", &OMEGA_M0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Hubble0", &HUBBLE0, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif + // time-step determination - InputPara.Dt__Max = DT__MAX; - InputPara.Dt__Fluid = DT__FLUID; - InputPara.Dt__FluidInit = DT__FLUID_INIT; +// ---------------------------------------------------------------------------------------------------- + HDF5_InputPara->Add( "Dt__Max", &DT__MAX, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Dt__Fluid", &DT__FLUID, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Dt__FluidInit", &DT__FLUID_INIT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef GRAVITY - InputPara.Dt__Gravity = DT__GRAVITY; + HDF5_InputPara->Add( "Dt__Gravity", &DT__GRAVITY, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # if ( MODEL == ELBDM ) - InputPara.Dt__Phase = DT__PHASE; + HDF5_InputPara->Add( "Dt__Phase", &DT__PHASE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # if ( ELBDM_SCHEME == ELBDM_HYBRID ) - InputPara.Dt__HybridCFL = DT__HYBRID_CFL; - InputPara.Dt__HybridCFLInit = DT__HYBRID_CFL_INIT; - InputPara.Dt__HybridVelocity = DT__HYBRID_VELOCITY; - InputPara.Dt__HybridVelocityInit = DT__HYBRID_VELOCITY_INIT; + HDF5_InputPara->Add( "Dt__HybridCFL", &DT__HYBRID_CFL, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Dt__HybridCFLInit", &DT__HYBRID_CFL_INIT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Dt__HybridVelocity", &DT__HYBRID_VELOCITY, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Dt__HybridVelocityInit", &DT__HYBRID_VELOCITY_INIT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # endif // #if ( MODEL == ELBDM ) # ifdef PARTICLE - InputPara.Dt__ParVel = DT__PARVEL; - InputPara.Dt__ParVelMax = DT__PARVEL_MAX; - InputPara.Dt__ParAcc = DT__PARACC; + HDF5_InputPara->Add( "Dt__ParVel", &DT__PARVEL, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Dt__ParVelMax", &DT__PARVEL_MAX, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Dt__ParAcc", &DT__PARACC, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef CR_DIFFUSION - InputPara.Dt__CR_Diffusion = DT__CR_DIFFUSION; + HDF5_InputPara->Add( "Dt__CR_Diffusion", &DT__CR_DIFFUSION, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef COMOVING - InputPara.Dt__MaxDeltaA = DT__MAX_DELTA_A; -# endif - InputPara.Dt__SyncParentLv = DT__SYNC_PARENT_LV; - InputPara.Dt__SyncChildrenLv = DT__SYNC_CHILDREN_LV; - InputPara.Opt__DtUser = OPT__DT_USER; - InputPara.Opt__DtLevel = OPT__DT_LEVEL; - InputPara.Opt__RecordDt = OPT__RECORD_DT; - InputPara.AutoReduceDt = AUTO_REDUCE_DT; - InputPara.AutoReduceDtFactor = AUTO_REDUCE_DT_FACTOR; - InputPara.AutoReduceDtFactorMin = AUTO_REDUCE_DT_FACTOR_MIN; + HDF5_InputPara->Add( "Dt__MaxDeltaA", &DT__MAX_DELTA_A, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); +# endif + HDF5_InputPara->Add( "Dt__SyncParentLv", &DT__SYNC_PARENT_LV, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Dt__SyncChildrenLv", &DT__SYNC_CHILDREN_LV, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__DtUser", &OPT__DT_USER, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__DtLevel", &OPT__DT_LEVEL, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__RecordDt", &OPT__RECORD_DT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "AutoReduceDt", &AUTO_REDUCE_DT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "AutoReduceDtFactor", &AUTO_REDUCE_DT_FACTOR, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "AutoReduceDtFactorMin", &AUTO_REDUCE_DT_FACTOR_MIN, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # if ( MODEL == HYDRO ) - InputPara.AutoReduceMinModFactor = AUTO_REDUCE_MINMOD_FACTOR; - InputPara.AutoReduceMinModMin = AUTO_REDUCE_MINMOD_MIN; + HDF5_InputPara->Add( "AutoReduceMinModFactor", &AUTO_REDUCE_MINMOD_FACTOR, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "AutoReduceMinModMin", &AUTO_REDUCE_MINMOD_MIN, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - InputPara.AutoReduceIntMonoFactor = AUTO_REDUCE_INT_MONO_FACTOR; - InputPara.AutoReduceIntMonoMin = AUTO_REDUCE_INT_MONO_MIN; + HDF5_InputPara->Add( "AutoReduceIntMonoFactor", &AUTO_REDUCE_INT_MONO_FACTOR, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "AutoReduceIntMonoMin", &AUTO_REDUCE_INT_MONO_MIN, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + // domain refinement - InputPara.RegridCount = REGRID_COUNT; - InputPara.RefineNLevel = REFINE_NLEVEL; - InputPara.FlagBufferSize = FLAG_BUFFER_SIZE; - InputPara.FlagBufferSizeMaxM1Lv = FLAG_BUFFER_SIZE_MAXM1_LV; - InputPara.FlagBufferSizeMaxM2Lv = FLAG_BUFFER_SIZE_MAXM2_LV; - InputPara.MaxLevel = MAX_LEVEL; - InputPara.Opt__Flag_Rho = OPT__FLAG_RHO; - InputPara.Opt__Flag_RhoGradient = OPT__FLAG_RHO_GRADIENT; - InputPara.Opt__Flag_Angular = OPT__FLAG_ANGULAR; - InputPara.FlagAngular_CenX = FLAG_ANGULAR_CEN_X; - InputPara.FlagAngular_CenY = FLAG_ANGULAR_CEN_Y; - InputPara.FlagAngular_CenZ = FLAG_ANGULAR_CEN_Z; - InputPara.Opt__Flag_Radial = OPT__FLAG_RADIAL; - InputPara.FlagRadial_CenX = FLAG_RADIAL_CEN_X; - InputPara.FlagRadial_CenY = FLAG_RADIAL_CEN_Y; - InputPara.FlagRadial_CenZ = FLAG_RADIAL_CEN_Z; +// ---------------------------------------------------------------------------------------------------- + HDF5_InputPara->Add( "RegridCount", ®RID_COUNT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "RefineNLevel", &REFINE_NLEVEL, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "FlagBufferSize", &FLAG_BUFFER_SIZE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "FlagBufferSizeMaxM1Lv", &FLAG_BUFFER_SIZE_MAXM1_LV, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "FlagBufferSizeMaxM2Lv", &FLAG_BUFFER_SIZE_MAXM2_LV, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "MaxLevel", &MAX_LEVEL, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Flag_Rho", &OPT__FLAG_RHO, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Flag_RhoGradient", &OPT__FLAG_RHO_GRADIENT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Flag_Angular", &OPT__FLAG_ANGULAR, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Flag_Radial", &OPT__FLAG_RADIAL, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # if ( MODEL == HYDRO ) - InputPara.Opt__Flag_PresGradient = OPT__FLAG_PRES_GRADIENT; - InputPara.Opt__Flag_Vorticity = OPT__FLAG_VORTICITY; - InputPara.Opt__Flag_Jeans = OPT__FLAG_JEANS; + HDF5_InputPara->Add( "Opt__Flag_PresGradient", &OPT__FLAG_PRES_GRADIENT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Flag_Vorticity", &OPT__FLAG_VORTICITY, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Flag_Jeans", &OPT__FLAG_JEANS, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef MHD - InputPara.Opt__Flag_Current = OPT__FLAG_CURRENT; + HDF5_InputPara->Add( "Opt__Flag_Current", &OPT__FLAG_CURRENT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef SRHD - InputPara.Dt__SpeedOfLight = DT__SPEED_OF_LIGHT; - InputPara.Opt__Flag_LrtzGradient = OPT__FLAG_LRTZ_GRADIENT; + HDF5_InputPara->Add( "Dt__SpeedOfLight", &DT__SPEED_OF_LIGHT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Flag_LrtzGradient", &OPT__FLAG_LRTZ_GRADIENT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef COSMIC_RAY - InputPara.Opt__Flag_CRay = OPT__FLAG_CRAY; + HDF5_InputPara->Add( "Opt__Flag_CRay", &OPT__FLAG_CRAY, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # endif # if ( MODEL == ELBDM ) - InputPara.Opt__Flag_EngyDensity = OPT__FLAG_ENGY_DENSITY; - InputPara.Opt__Flag_Spectral = OPT__FLAG_SPECTRAL; - InputPara.Opt__Flag_Spectral_N = OPT__FLAG_SPECTRAL_N; + HDF5_InputPara->Add( "Opt__Flag_EngyDensity", &OPT__FLAG_ENGY_DENSITY, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Flag_Spectral", &OPT__FLAG_SPECTRAL, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Flag_Spectral_N", &OPT__FLAG_SPECTRAL_N, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # if ( ELBDM_SCHEME == ELBDM_HYBRID ) - InputPara.Opt__Flag_Interference = OPT__FLAG_INTERFERENCE; + HDF5_InputPara->Add( "Opt__Flag_Interference", &OPT__FLAG_INTERFERENCE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # endif // #if ( MODEL == ELBDM ) - InputPara.Opt__Flag_LohnerDens = OPT__FLAG_LOHNER_DENS; + HDF5_InputPara->Add( "Opt__Flag_LohnerDens", &OPT__FLAG_LOHNER_DENS, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # if ( MODEL == HYDRO ) - InputPara.Opt__Flag_LohnerEngy = OPT__FLAG_LOHNER_ENGY; - InputPara.Opt__Flag_LohnerPres = OPT__FLAG_LOHNER_PRES; - InputPara.Opt__Flag_LohnerTemp = OPT__FLAG_LOHNER_TEMP; - InputPara.Opt__Flag_LohnerEntr = OPT__FLAG_LOHNER_ENTR; + HDF5_InputPara->Add( "Opt__Flag_LohnerEngy", &OPT__FLAG_LOHNER_ENGY, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Flag_LohnerPres", &OPT__FLAG_LOHNER_PRES, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Flag_LohnerTemp", &OPT__FLAG_LOHNER_TEMP, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Flag_LohnerEntr", &OPT__FLAG_LOHNER_ENTR, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef COSMIC_RAY - InputPara.Opt__Flag_LohnerCRay = OPT__FLAG_LOHNER_CRAY; + HDF5_InputPara->Add( "Opt__Flag_LohnerCRay", &OPT__FLAG_LOHNER_CRAY, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # endif - InputPara.Opt__Flag_LohnerForm = OPT__FLAG_LOHNER_FORM; - InputPara.Opt__Flag_User = OPT__FLAG_USER; - InputPara.Opt__Flag_User_Num = OPT__FLAG_USER_NUM; - InputPara.Opt__Flag_Region = OPT__FLAG_REGION; + HDF5_InputPara->Add( "Opt__Flag_LohnerForm", &OPT__FLAG_LOHNER_FORM, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Flag_User", &OPT__FLAG_USER, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Flag_User_Num", &OPT__FLAG_USER_NUM, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Flag_Region", &OPT__FLAG_REGION, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef PARTICLE - InputPara.Opt__Flag_NParPatch = OPT__FLAG_NPAR_PATCH; - InputPara.Opt__Flag_NParCell = OPT__FLAG_NPAR_CELL; - InputPara.Opt__Flag_ParMassCell = OPT__FLAG_PAR_MASS_CELL; + HDF5_InputPara->Add( "Opt__Flag_NParPatch", &OPT__FLAG_NPAR_PATCH, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Flag_NParCell", &OPT__FLAG_NPAR_CELL, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Flag_ParMassCell", &OPT__FLAG_PAR_MASS_CELL, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - InputPara.Opt__NoFlagNearBoundary = OPT__NO_FLAG_NEAR_BOUNDARY; - InputPara.Opt__PatchCount = OPT__PATCH_COUNT; + HDF5_InputPara->Add( "Opt__NoFlagNearBoundary", &OPT__NO_FLAG_NEAR_BOUNDARY, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__PatchCount", &OPT__PATCH_COUNT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef PARTICLE - InputPara.Opt__ParticleCount = OPT__PARTICLE_COUNT; + HDF5_InputPara->Add( "Opt__ParticleCount", &OPT__PARTICLE_COUNT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - InputPara.Opt__ReuseMemory = OPT__REUSE_MEMORY; - InputPara.Opt__MemoryPool = OPT__MEMORY_POOL; + HDF5_InputPara->Add( "Opt__ReuseMemory", &OPT__REUSE_MEMORY, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__MemoryPool", &OPT__MEMORY_POOL, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + // load balance +// ---------------------------------------------------------------------------------------------------- # ifdef LOAD_BALANCE - InputPara.LB_WLI_Max = amr->LB->WLI_Max; + HDF5_InputPara->Add( "LB_WLI_Max", &amr->LB->WLI_Max, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef PARTICLE - InputPara.LB_Par_Weight = amr->LB->Par_Weight; + HDF5_InputPara->Add( "LB_Par_Weight", &amr->LB->Par_Weight, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - InputPara.Opt__RecordLoadBalance = OPT__RECORD_LOAD_BALANCE; - InputPara.Opt__LB_ExchangeFather = OPT__LB_EXCHANGE_FATHER; + HDF5_InputPara->Add( "Opt__RecordLoadBalance", &OPT__RECORD_LOAD_BALANCE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__LB_ExchangeFather", &OPT__LB_EXCHANGE_FATHER, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - InputPara.Opt__MinimizeMPIBarrier = OPT__MINIMIZE_MPI_BARRIER; + HDF5_InputPara->Add( "Opt__MinimizeMPIBarrier", &OPT__MINIMIZE_MPI_BARRIER, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + // fluid solvers in HYDRO +// ---------------------------------------------------------------------------------------------------- # if ( MODEL == HYDRO ) - InputPara.Gamma = GAMMA; - InputPara.MolecularWeight = MOLECULAR_WEIGHT; - InputPara.MuNorm = MU_NORM; - InputPara.IsoTemp = ISO_TEMP; - InputPara.MinMod_Coeff = MINMOD_COEFF; - InputPara.MinMod_MaxIter = MINMOD_MAX_ITER; - InputPara.Opt__LR_Limiter = OPT__LR_LIMITER; - InputPara.Opt__1stFluxCorr = OPT__1ST_FLUX_CORR; - InputPara.Opt__1stFluxCorrScheme = OPT__1ST_FLUX_CORR_SCHEME; + HDF5_InputPara->Add( "Gamma", &GAMMA, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "MolecularWeight", &MOLECULAR_WEIGHT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "MuNorm", &MU_NORM, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "IsoTemp", &ISO_TEMP, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "MinMod_Coeff", &MINMOD_COEFF, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "MinMod_MaxIter", &MINMOD_MAX_ITER, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__LR_Limiter", &OPT__LR_LIMITER, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__1stFluxCorr", &OPT__1ST_FLUX_CORR, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__1stFluxCorrScheme", &OPT__1ST_FLUX_CORR_SCHEME, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef DUAL_ENERGY - InputPara.DualEnergySwitch = DUAL_ENERGY_SWITCH; + HDF5_InputPara->Add( "DualEnergySwitch", &DUAL_ENERGY_SWITCH, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef MHD - InputPara.Opt__SameInterfaceB = OPT__SAME_INTERFACE_B; + HDF5_InputPara->Add( "Opt__SameInterfaceB", &OPT__SAME_INTERFACE_B, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # endif // HYDRO + // ELBDM solvers +// ---------------------------------------------------------------------------------------------------- # if ( MODEL == ELBDM ) - InputPara.ELBDM_Mass = ELBDM_MASS; - InputPara.ELBDM_PlanckConst = ELBDM_PLANCK_CONST; + HDF5_InputPara->Add( "ELBDM_Mass", &ELBDM_MASS, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "ELBDM_PlanckConst", &ELBDM_PLANCK_CONST, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef QUARTIC_SELF_INTERACTION - InputPara.ELBDM_Lambda = ELBDM_LAMBDA; + HDF5_InputPara->Add( "ELBDM_Lambda", &ELBDM_LAMBDA, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - InputPara.ELBDM_Taylor3_Coeff = ELBDM_TAYLOR3_COEFF; - InputPara.ELBDM_Taylor3_Auto = ELBDM_TAYLOR3_AUTO; - InputPara.ELBDM_RemoveMotionCM = ELBDM_REMOVE_MOTION_CM; - InputPara.ELBDM_BaseSpectral = ELBDM_BASE_SPECTRAL; + HDF5_InputPara->Add( "ELBDM_Taylor3_Coeff", &ELBDM_TAYLOR3_COEFF, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "ELBDM_Taylor3_Auto", &ELBDM_TAYLOR3_AUTO, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "ELBDM_RemoveMotionCM", &ELBDM_REMOVE_MOTION_CM, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "ELBDM_BaseSpectral", &ELBDM_BASE_SPECTRAL, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # if ( ELBDM_SCHEME == ELBDM_HYBRID ) - InputPara.ELBDM_FirstWaveLevel = ELBDM_FIRST_WAVE_LEVEL; +// ELBDM_FIRST_WAVE_LEVEL currently cannot be changed upon restart because the code cannot robustly handle the conversion +// from Re/Im to Dens/Phase due to the phase ambiguity introduced by vortices + HDF5_InputPara->Add( "ELBDM_FirstWaveLevel", &ELBDM_FIRST_WAVE_LEVEL, 0, NULL, Compare_Yes, Fatal_No, Fatal_Yes ); # endif # endif // ELBDM + // fluid solvers in different models - InputPara.Flu_GPU_NPGroup = FLU_GPU_NPGROUP; - InputPara.GPU_NStream = GPU_NSTREAM; - InputPara.Opt__FixUp_Flux = OPT__FIXUP_FLUX; - InputPara.FixUpFlux_Var = FixUpVar_Flux; -# ifdef MHD - InputPara.Opt__FixUp_Electric = OPT__FIXUP_ELECTRIC; +// ---------------------------------------------------------------------------------------------------- +# if ( NCOMP_PASSIVE > 0 ) + int H5_Arr_NP[1] = { NCOMP_PASSIVE }; # endif - InputPara.Opt__FixUp_Restrict = OPT__FIXUP_RESTRICT; - InputPara.FixUpRestrict_Var = FixUpVar_Restrict; - InputPara.Opt__CorrAfterAllSync = OPT__CORR_AFTER_ALL_SYNC; - InputPara.Opt__NormalizePassive = OPT__NORMALIZE_PASSIVE; - - InputPara.NormalizePassive_NVar = PassiveNorm_NVar; - - for (int v=0; vAdd( "Flu_GPU_NPGroup", &FLU_GPU_NPGROUP, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "GPU_NStream", &GPU_NSTREAM, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__FixUp_Flux", &OPT__FIXUP_FLUX, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "FixUpFlux_Var", &FixUpVar_Flux, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); +# ifdef MHD + HDF5_InputPara->Add( "Opt__FixUp_Electric", &OPT__FIXUP_ELECTRIC, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); +# endif + HDF5_InputPara->Add( "Opt__FixUp_Restrict", &OPT__FIXUP_RESTRICT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "FixUpRestrict_Var", &FixUpVar_Restrict, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__CorrAfterAllSync", &OPT__CORR_AFTER_ALL_SYNC, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__NormalizePassive", &OPT__NORMALIZE_PASSIVE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "NormalizePassive_NVar", &PassiveNorm_NVar, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); +# if ( NCOMP_PASSIVE > 0 ) + HDF5_InputPara->Add( "NormalizePassive_VarIdx", &PassiveNorm_VarIdx[0], 1, H5_Arr_NP, Compare_Yes, Fatal_No, Fatal_No ); +# endif + HDF5_InputPara->Add( "Opt__IntFracPassive_LR", &OPT__INT_FRAC_PASSIVE_LR, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "IntFracPassive_NVar", &PassiveIntFrac_NVar, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); +# if ( NCOMP_PASSIVE > 0 ) + HDF5_InputPara->Add( "IntFracPassive_VarIdx", &PassiveIntFrac_VarIdx[0], 1, H5_Arr_NP, Compare_Yes, Fatal_No, Fatal_No ); +# endif for (int v=0; vAdd( Key, &FieldLabelOut[v][0], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + } # ifdef MHD for (int v=0; vAdd( Key, &MagLabel[v][0], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + } # endif - InputPara.Opt__OverlapMPI = OPT__OVERLAP_MPI; - InputPara.Opt__ResetFluid = OPT__RESET_FLUID; - InputPara.Opt__ResetFluidInit = OPT__RESET_FLUID_INIT; - InputPara.Opt__FreezeFluid = OPT__FREEZE_FLUID; + HDF5_InputPara->Add( "Opt__OverlapMPI", &OPT__OVERLAP_MPI, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__ResetFluid", &OPT__RESET_FLUID, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__ResetFluidInit", &OPT__RESET_FLUID_INIT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__FreezeFluid", &OPT__FREEZE_FLUID, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # if ( MODEL == HYDRO || MODEL == ELBDM ) - InputPara.MinDens = MIN_DENS; + HDF5_InputPara->Add( "MinDens", &MIN_DENS, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # if ( MODEL == HYDRO ) - InputPara.MinPres = MIN_PRES; - InputPara.MinEint = MIN_EINT; - InputPara.MinTemp = MIN_TEMP; - InputPara.MinEntr = MIN_ENTR; - InputPara.Opt__CheckPresAfterFlu = OPT__CHECK_PRES_AFTER_FLU, - InputPara.Opt__LastResortFloor = OPT__LAST_RESORT_FLOOR; - InputPara.JeansMinPres = JEANS_MIN_PRES; - InputPara.JeansMinPres_Level = JEANS_MIN_PRES_LEVEL; - InputPara.JeansMinPres_NCell = JEANS_MIN_PRES_NCELL; + HDF5_InputPara->Add( "MinPres", &MIN_PRES, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "MinEint", &MIN_EINT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "MinTemp", &MIN_TEMP, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "MinEntr", &MIN_ENTR, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__CheckPresAfterFlu", &OPT__CHECK_PRES_AFTER_FLU, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__LastResortFloor", &OPT__LAST_RESORT_FLOOR, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "JeansMinPres", &JEANS_MIN_PRES, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "JeansMinPres_Level", &JEANS_MIN_PRES_LEVEL, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "JeansMinPres_NCell", &JEANS_MIN_PRES_NCELL, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif + // self-gravity +// ---------------------------------------------------------------------------------------------------- # ifdef GRAVITY - InputPara.NewtonG = NEWTON_G; + HDF5_InputPara->Add( "NewtonG", &NEWTON_G, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # if ( POT_SCHEME == SOR ) - InputPara.SOR_Omega = SOR_OMEGA; - InputPara.SOR_MaxIter = SOR_MAX_ITER; - InputPara.SOR_MinIter = SOR_MIN_ITER; + HDF5_InputPara->Add( "SOR_Omega", &SOR_OMEGA, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "SOR_MaxIter", &SOR_MAX_ITER, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "SOR_MinIter", &SOR_MIN_ITER, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # elif ( POT_SCHEME == MG ) - InputPara.MG_MaxIter = MG_MAX_ITER; - InputPara.MG_NPreSmooth = MG_NPRE_SMOOTH; - InputPara.MG_NPostSmooth = MG_NPOST_SMOOTH; - InputPara.MG_ToleratedError = MG_TOLERATED_ERROR; -# endif - InputPara.Pot_GPU_NPGroup = POT_GPU_NPGROUP; - InputPara.Opt__GraP5Gradient = OPT__GRA_P5_GRADIENT; - InputPara.Opt__SelfGravity = OPT__SELF_GRAVITY; - InputPara.Opt__ExtAcc = OPT__EXT_ACC; - InputPara.Opt__ExtPot = OPT__EXT_POT; - InputPara.ExtPotTable_Name = EXT_POT_TABLE_NAME; - for (int d=0; d<3; d++) - InputPara.ExtPotTable_NPoint[d] = EXT_POT_TABLE_NPOINT[d]; - for (int d=0; d<3; d++) - InputPara.ExtPotTable_dh[d] = EXT_POT_TABLE_DH[d]; - for (int d=0; d<3; d++) - InputPara.ExtPotTable_EdgeL[d] = EXT_POT_TABLE_EDGEL[d]; - InputPara.ExtPotTable_Float8 = EXT_POT_TABLE_FLOAT8; - InputPara.Opt__GravityExtraMass = OPT__GRAVITY_EXTRA_MASS; + HDF5_InputPara->Add( "MG_MaxIter", &MG_MAX_ITER, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "MG_NPreSmooth", &MG_NPRE_SMOOTH, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "MG_NPostSmooth", &MG_NPOST_SMOOTH, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "MG_ToleratedError", &MG_TOLERATED_ERROR, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); +# endif + HDF5_InputPara->Add( "Pot_GPU_NPGroup", &POT_GPU_NPGROUP, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__GraP5Gradient", &OPT__GRA_P5_GRADIENT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__SelfGravity", &OPT__SELF_GRAVITY, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__ExtAcc", &OPT__EXT_ACC, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__ExtPot", &OPT__EXT_POT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "ExtPotTable_Name", EXT_POT_TABLE_NAME, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "ExtPotTable_NPoint", &EXT_POT_TABLE_NPOINT[0], 1, H5_Arr_3, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "ExtPotTable_dh", &EXT_POT_TABLE_DH[0], 1, H5_Arr_3, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "ExtPotTable_EdgeL", &EXT_POT_TABLE_EDGEL[0], 1, H5_Arr_3, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "ExtPotTable_Float8", &EXT_POT_TABLE_FLOAT8, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__GravityExtraMass", &OPT__GRAVITY_EXTRA_MASS, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif + // source terms - InputPara.Src_Deleptonization = SrcTerms.Deleptonization; - InputPara.Src_User = SrcTerms.User; - InputPara.Src_GPU_NPGroup = SRC_GPU_NPGROUP; +// ---------------------------------------------------------------------------------------------------- + HDF5_InputPara->Add( "Src_Deleptonization", &SrcTerms.Deleptonization, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Src_User", &SrcTerms.User, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Src_GPU_NPGroup", &SRC_GPU_NPGROUP, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + // Grackle +// ---------------------------------------------------------------------------------------------------- # ifdef SUPPORT_GRACKLE - InputPara.Grackle_Activate = GRACKLE_ACTIVATE; - InputPara.Grackle_Verbose = GRACKLE_VERBOSE; - InputPara.Grackle_Cooling = GRACKLE_COOLING; - InputPara.Grackle_Primordial = GRACKLE_PRIMORDIAL; - InputPara.Grackle_Metal = GRACKLE_METAL; - InputPara.Grackle_UV = GRACKLE_UV; - InputPara.Grackle_CMB_Floor = GRACKLE_CMB_FLOOR; - InputPara.Grackle_PE_Heating = GRACKLE_PE_HEATING; - InputPara.Grackle_PE_HeatingRate = GRACKLE_PE_HEATING_RATE; - InputPara.Grackle_CloudyTable = GRACKLE_CLOUDY_TABLE; - InputPara.Grackle_ThreeBodyRate = GRACKLE_THREE_BODY_RATE; - InputPara.Grackle_CIE_Cooling = GRACKLE_CIE_COOLING; - InputPara.Grackle_H2_OpaApprox = GRACKLE_H2_OPA_APPROX; - InputPara.Che_GPU_NPGroup = CHE_GPU_NPGROUP; + HDF5_InputPara->Add( "Grackle_Activate", &GRACKLE_ACTIVATE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Grackle_Verbose", &GRACKLE_VERBOSE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Grackle_Cooling", &GRACKLE_COOLING, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Grackle_Primordial", &GRACKLE_PRIMORDIAL, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Grackle_Metal", &GRACKLE_METAL, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Grackle_UV", &GRACKLE_UV, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Grackle_CMB_Floor", &GRACKLE_CMB_FLOOR, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Grackle_PE_Heating", &GRACKLE_PE_HEATING, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Grackle_PE_HeatingRate", &GRACKLE_PE_HEATING_RATE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Grackle_CloudyTable", &GRACKLE_CLOUDY_TABLE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Grackle_ThreeBodyRate", &GRACKLE_THREE_BODY_RATE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Grackle_CIE_Cooling", &GRACKLE_CIE_COOLING, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Grackle_H2_OpaApprox", &GRACKLE_H2_OPA_APPROX, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Che_GPU_NPGroup", &CHE_GPU_NPGROUP, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif + // star formation +// ---------------------------------------------------------------------------------------------------- # ifdef STAR_FORMATION - InputPara.SF_CreateStar_Scheme = SF_CREATE_STAR_SCHEME; - InputPara.SF_CreateStar_RSeed = SF_CREATE_STAR_RSEED; - InputPara.SF_CreateStar_DetRandom = SF_CREATE_STAR_DET_RANDOM; - InputPara.SF_CreateStar_MinLevel = SF_CREATE_STAR_MIN_LEVEL; - InputPara.SF_CreateStar_MinGasDens = SF_CREATE_STAR_MIN_GAS_DENS; - InputPara.SF_CreateStar_MassEff = SF_CREATE_STAR_MASS_EFF; - InputPara.SF_CreateStar_MinStarMass = SF_CREATE_STAR_MIN_STAR_MASS; - InputPara.SF_CreateStar_MaxStarMFrac = SF_CREATE_STAR_MAX_STAR_MFRAC; + HDF5_InputPara->Add( "SF_CreateStar_Scheme", &SF_CREATE_STAR_SCHEME, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "SF_CreateStar_RSeed", &SF_CREATE_STAR_RSEED, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "SF_CreateStar_DetRandom", &SF_CREATE_STAR_DET_RANDOM, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "SF_CreateStar_MinLevel", &SF_CREATE_STAR_MIN_LEVEL, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "SF_CreateStar_MinGasDens", &SF_CREATE_STAR_MIN_GAS_DENS, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "SF_CreateStar_MassEff", &SF_CREATE_STAR_MASS_EFF, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "SF_CreateStar_MinStarMass", &SF_CREATE_STAR_MIN_STAR_MASS, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "SF_CreateStar_MaxStarMFrac", &SF_CREATE_STAR_MAX_STAR_MFRAC, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif + // feedback +// ---------------------------------------------------------------------------------------------------- # ifdef FEEDBACK - InputPara.FB_Level = FB_LEVEL; - InputPara.FB_RSeed = FB_RSEED; - InputPara.FB_SNe = FB_SNE; - InputPara.FB_User = FB_USER; + HDF5_InputPara->Add( "FB_Level", &FB_LEVEL, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "FB_RSeed", &FB_RSEED, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "FB_SNe", &FB_SNE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "FB_User", &FB_USER, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif + // cosmic ray +// ---------------------------------------------------------------------------------------------------- # ifdef COSMIC_RAY - InputPara.CR_Gamma = GAMMA_CR; + HDF5_InputPara->Add( "CR_Gamma", &GAMMA_CR, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef CR_DIFFUSION - InputPara.CR_Diffusion_ParaCoeff = CR_DIFF_PARA; - InputPara.CR_Diffusion_PerpCoeff = CR_DIFF_PERP; - InputPara.CR_Diffusion_MinB = CR_DIFF_MIN_B; + HDF5_InputPara->Add( "CR_Diffusion_ParaCoeff", &CR_DIFF_PARA, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "CR_Diffusion_PerpCoeff", &CR_DIFF_PERP, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "CR_Diffusion_MinB", &CR_DIFF_MIN_B, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # endif // #ifdef COSMIC_RAY -// initialization - InputPara.Opt__Init = OPT__INIT; - InputPara.RestartLoadNRank = RESTART_LOAD_NRANK; - InputPara.Opt__RestartReset = OPT__RESTART_RESET; - InputPara.Opt__UM_IC_Level = OPT__UM_IC_LEVEL; - InputPara.Opt__UM_IC_NLevel = OPT__UM_IC_NLEVEL; - InputPara.Opt__UM_IC_NVar = OPT__UM_IC_NVAR; - InputPara.Opt__UM_IC_Format = OPT__UM_IC_FORMAT; - InputPara.Opt__UM_IC_Float8 = OPT__UM_IC_FLOAT8; - InputPara.Opt__UM_IC_Downgrade = OPT__UM_IC_DOWNGRADE; - InputPara.Opt__UM_IC_Refine = OPT__UM_IC_REFINE; - InputPara.Opt__UM_IC_LoadNRank = OPT__UM_IC_LOAD_NRANK; +// initialization +// ---------------------------------------------------------------------------------------------------- + int H5_Arr_NLv_M1_6[2] = { NLEVEL-1, 6 }; + int RefineRegion[NLEVEL-1][6]; + for (int t=0; t 1 && UM_IC_RefineRegion != NULL ) { - const int (*RefineRegion)[6] = ( int(*)[6] )UM_IC_RefineRegion; - + const int (*temp)[6] = ( int(*)[6] )UM_IC_RefineRegion; for (int t=0; tAdd( "Opt__Init", &OPT__INIT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "RestartLoadNRank", &RESTART_LOAD_NRANK, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__RestartReset", &OPT__RESTART_RESET, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__UM_IC_Level", &OPT__UM_IC_LEVEL, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__UM_IC_NLevel", &OPT__UM_IC_NLEVEL, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__UM_IC_NVar", &OPT__UM_IC_NVAR, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__UM_IC_Format", &OPT__UM_IC_FORMAT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__UM_IC_Float8", &OPT__UM_IC_FLOAT8, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__UM_IC_Downgrade", &OPT__UM_IC_DOWNGRADE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__UM_IC_Refine", &OPT__UM_IC_REFINE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__UM_IC_LoadNRank", &OPT__UM_IC_LOAD_NRANK, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "UM_IC_RefineRegion", &RefineRegion[0][0], 2, H5_Arr_NLv_M1_6, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_InputPara->Add( "Opt__InitRestrict", &OPT__INIT_RESTRICT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__InitGridWithOMP", &OPT__INIT_GRID_WITH_OMP, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__GPUID_Select", &OPT__GPUID_SELECT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Init_Subsampling_NCell", &INIT_SUBSAMPLING_NCELL, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef MHD - InputPara.Opt__InitBFieldByVecPot = OPT__INIT_BFIELD_BYVECPOT; + HDF5_InputPara->Add( "Opt__InitBFieldByVecPot", &OPT__INIT_BFIELD_BYVECPOT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef SUPPORT_FFTW - InputPara.Opt__FFTW_Startup = OPT__FFTW_STARTUP; + HDF5_InputPara->Add( "Opt__FFTW_Startup", &OPT__FFTW_STARTUP, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif + // interpolation schemes - InputPara.Opt__Int_Time = OPT__INT_TIME; +// ---------------------------------------------------------------------------------------------------- + HDF5_InputPara->Add( "Opt__Int_Time", &OPT__INT_TIME, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # if ( MODEL == HYDRO ) - InputPara.Opt__Int_Prim = OPT__INT_PRIM; + HDF5_InputPara->Add( "Opt__Int_Prim", &OPT__INT_PRIM, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # if ( MODEL == ELBDM ) - InputPara.Opt__Int_Phase = OPT__INT_PHASE; - InputPara.Opt__Res_Phase = OPT__RES_PHASE; + HDF5_InputPara->Add( "Opt__Int_Phase", &OPT__INT_PHASE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Res_Phase", &OPT__RES_PHASE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # if ( ELBDM_SCHEME == ELBDM_HYBRID ) - InputPara.Opt__Hybrid_Match_Phase = ELBDM_MATCH_PHASE; + HDF5_InputPara->Add( "Opt__Hybrid_Match_Phase", &ELBDM_MATCH_PHASE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # endif // ELBDM - InputPara.Opt__Flu_IntScheme = OPT__FLU_INT_SCHEME; - InputPara.Opt__RefFlu_IntScheme = OPT__REF_FLU_INT_SCHEME; + HDF5_InputPara->Add( "Opt__Flu_IntScheme", &OPT__FLU_INT_SCHEME, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__RefFlu_IntScheme", &OPT__REF_FLU_INT_SCHEME, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef MHD - InputPara.Opt__Mag_IntScheme = OPT__MAG_INT_SCHEME; - InputPara.Opt__RefMag_IntScheme = OPT__REF_MAG_INT_SCHEME; + HDF5_InputPara->Add( "Opt__Mag_IntScheme", &OPT__MAG_INT_SCHEME, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__RefMag_IntScheme", &OPT__REF_MAG_INT_SCHEME, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef GRAVITY - InputPara.Opt__Pot_IntScheme = OPT__POT_INT_SCHEME; - InputPara.Opt__Rho_IntScheme = OPT__RHO_INT_SCHEME; - InputPara.Opt__Gra_IntScheme = OPT__GRA_INT_SCHEME; - InputPara.Opt__RefPot_IntScheme = OPT__REF_POT_INT_SCHEME; + HDF5_InputPara->Add( "Opt__Pot_IntScheme", &OPT__POT_INT_SCHEME, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Rho_IntScheme", &OPT__RHO_INT_SCHEME, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Gra_IntScheme", &OPT__GRA_INT_SCHEME, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__RefPot_IntScheme", &OPT__REF_POT_INT_SCHEME, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - InputPara.IntMonoCoeff = INT_MONO_COEFF; + HDF5_InputPara->Add( "IntMonoCoeff", &INT_MONO_COEFF, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef MHD - InputPara.IntMonoCoeffB = INT_MONO_COEFF_B; + HDF5_InputPara->Add( "IntMonoCoeffB", &INT_MONO_COEFF_B, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - InputPara.Mono_MaxIter = MONO_MAX_ITER; - InputPara.IntOppSign0thOrder = INT_OPP_SIGN_0TH_ORDER; + HDF5_InputPara->Add( "Mono_MaxIter", &MONO_MAX_ITER, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "IntOppSign0thOrder", &INT_OPP_SIGN_0TH_ORDER, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef SUPPORT_SPECTRAL_INT - InputPara.SpecInt_TablePath = SPEC_INT_TABLE_PATH; - InputPara.SpecInt_GhostBoundary = SPEC_INT_GHOST_BOUNDARY; + HDF5_InputPara->Add( "SpecInt_TablePath", SPEC_INT_TABLE_PATH, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "SpecInt_GhostBoundary", &SPEC_INT_GHOST_BOUNDARY, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # if ( MODEL == ELBDM ) - InputPara.SpecInt_XY_Instead_DePha = SPEC_INT_XY_INSTEAD_DEPHA; - InputPara.SpecInt_VortexThreshold = SPEC_INT_VORTEX_THRESHOLD; + HDF5_InputPara->Add( "SpecInt_XY_Instead_DePha", &SPEC_INT_XY_INSTEAD_DEPHA, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "SpecInt_VortexThreshold", &SPEC_INT_VORTEX_THRESHOLD, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # endif // #ifdef SUPPORT_SPECTRAL_INT + // data dump - InputPara.Opt__Output_Total = OPT__OUTPUT_TOTAL; - InputPara.Opt__Output_Part = OPT__OUTPUT_PART; - InputPara.Opt__Output_User = OPT__OUTPUT_USER; +// ---------------------------------------------------------------------------------------------------- + const bool Compare_Part = ( OPT__OUTPUT_PART ) ? Compare_Yes : Compare_No; # ifdef PARTICLE - InputPara.Opt__Output_Par_Mode = OPT__OUTPUT_PAR_MODE; - InputPara.Opt__Output_Par_Mesh = OPT__OUTPUT_PAR_MESH; + const bool Compare_Out = ( OPT__OUTPUT_TOTAL || OPT__OUTPUT_PART || OPT__OUTPUT_USER || OPT__OUTPUT_BASEPS || OPT__OUTPUT_PAR_MODE ) ? Compare_Yes : Compare_No; +# else + const bool Compare_Out = ( OPT__OUTPUT_TOTAL || OPT__OUTPUT_PART || OPT__OUTPUT_USER || OPT__OUTPUT_BASEPS ) ? Compare_Yes : Compare_No; +# endif + HDF5_InputPara->Add( "Opt__Output_Total", &OPT__OUTPUT_TOTAL, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Output_Part", &OPT__OUTPUT_PART, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Output_User", &OPT__OUTPUT_USER, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); +# ifdef PARTICLE + HDF5_InputPara->Add( "Opt__Output_Par_Mode", &OPT__OUTPUT_PAR_MODE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Output_Par_Mesh", &OPT__OUTPUT_PAR_MESH, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - InputPara.Opt__Output_BasePS = OPT__OUTPUT_BASEPS; - InputPara.Opt__Output_Base = OPT__OUTPUT_BASE; + HDF5_InputPara->Add( "Opt__Output_BasePS", &OPT__OUTPUT_BASEPS, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Output_Base", &OPT__OUTPUT_BASE, 0, NULL, Compare_Part, Fatal_No, Fatal_No ); # ifdef GRAVITY - InputPara.Opt__Output_Pot = OPT__OUTPUT_POT; + HDF5_InputPara->Add( "Opt__Output_Pot", &OPT__OUTPUT_POT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef PARTICLE - InputPara.Opt__Output_ParDens = OPT__OUTPUT_PAR_DENS; + HDF5_InputPara->Add( "Opt__Output_ParDens", &OPT__OUTPUT_PAR_DENS, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef MHD - InputPara.Opt__Output_CC_Mag = OPT__OUTPUT_CC_MAG; + HDF5_InputPara->Add( "Opt__Output_CC_Mag", &OPT__OUTPUT_CC_MAG, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # if ( MODEL == HYDRO ) - InputPara.Opt__Output_Pres = OPT__OUTPUT_PRES; - InputPara.Opt__Output_Temp = OPT__OUTPUT_TEMP; - InputPara.Opt__Output_Entr = OPT__OUTPUT_ENTR; - InputPara.Opt__Output_Cs = OPT__OUTPUT_CS; - InputPara.Opt__Output_DivVel = OPT__OUTPUT_DIVVEL; - InputPara.Opt__Output_Mach = OPT__OUTPUT_MACH; + HDF5_InputPara->Add( "Opt__Output_Pres", &OPT__OUTPUT_PRES, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Output_Temp", &OPT__OUTPUT_TEMP, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Output_Entr", &OPT__OUTPUT_ENTR, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Output_Cs", &OPT__OUTPUT_CS, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Output_DivVel", &OPT__OUTPUT_DIVVEL, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Output_Mach", &OPT__OUTPUT_MACH, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef MHD - InputPara.Opt__Output_DivMag = OPT__OUTPUT_DIVMAG; + HDF5_InputPara->Add( "Opt__Output_DivMag", &OPT__OUTPUT_DIVMAG, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef SRHD - InputPara.Opt__Output_3Velocity = OPT__OUTPUT_3VELOCITY; - InputPara.Opt__Output_Lorentz = OPT__OUTPUT_LORENTZ; - InputPara.Opt__Output_Enthalpy = OPT__OUTPUT_ENTHALPY; + HDF5_InputPara->Add( "Opt__Output_3Velocity", &OPT__OUTPUT_3VELOCITY, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Output_Lorentz", &OPT__OUTPUT_LORENTZ, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Output_Enthalpy", &OPT__OUTPUT_ENTHALPY, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # endif // #if ( MODEL == HYDRO ) - InputPara.Opt__Output_UserField = OPT__OUTPUT_USER_FIELD; - InputPara.Opt__Output_Mode = OPT__OUTPUT_MODE; - InputPara.Opt__Output_Restart = OPT__OUTPUT_RESTART; - InputPara.Opt__Output_Step = OUTPUT_STEP; - InputPara.Opt__Output_Dt = OUTPUT_DT; - InputPara.Opt__Output_Text_Format_Flt = OPT__OUTPUT_TEXT_FORMAT_FLT; - InputPara.Opt__Output_Text_Length_Int = OPT__OUTPUT_TEXT_LENGTH_INT; - InputPara.Output_PartX = OUTPUT_PART_X; - InputPara.Output_PartY = OUTPUT_PART_Y; - InputPara.Output_PartZ = OUTPUT_PART_Z; - InputPara.InitDumpID = INIT_DUMPID; + HDF5_InputPara->Add( "Opt__Output_UserField", &OPT__OUTPUT_USER_FIELD, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Output_Mode", &OPT__OUTPUT_MODE, 0, NULL, Compare_Out, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Output_Restart", &OPT__OUTPUT_RESTART, 0, NULL, Compare_Out, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Output_Step", &OUTPUT_STEP, 0, NULL, Compare_Out, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Output_Dt", &OUTPUT_DT, 0, NULL, Compare_Out, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Output_Text_Format_Flt", OPT__OUTPUT_TEXT_FORMAT_FLT, 0, NULL, Compare_Out, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Output_Text_Length_Int", &OPT__OUTPUT_TEXT_LENGTH_INT, 0, NULL, Compare_Out, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Output_PartX", &OUTPUT_PART_X, 0, NULL, Compare_Part, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Output_PartY", &OUTPUT_PART_Y, 0, NULL, Compare_Part, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Output_PartZ", &OUTPUT_PART_Z, 0, NULL, Compare_Part, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "InitDumpID", &INIT_DUMPID, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + // libyt jupyter -# if ( defined(SUPPORT_LIBYT) && defined(LIBYT_JUPYTER) ) - InputPara.Yt_JupyterUseConnectionFile = YT_JUPYTER_USE_CONNECTION_FILE; +// ---------------------------------------------------------------------------------------------------- +# if ( defined( SUPPORT_LIBYT ) && defined( LIBYT_JUPYTER ) ) + HDF5_InputPara->Add( "Yt_JupyterUseConnectionFile", &YT_JUPYTER_USE_CONNECTION_FILE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif + // miscellaneous - InputPara.Opt__Verbose = OPT__VERBOSE; - InputPara.Opt__TimingBarrier = OPT__TIMING_BARRIER; - InputPara.Opt__TimingBalance = OPT__TIMING_BALANCE; - InputPara.Opt__TimingMPI = OPT__TIMING_MPI; - InputPara.Opt__RecordNote = OPT__RECORD_NOTE; - InputPara.Opt__RecordUnphy = OPT__RECORD_UNPHY; - InputPara.Opt__RecordMemory = OPT__RECORD_MEMORY; - InputPara.Opt__RecordPerformance = OPT__RECORD_PERFORMANCE; - InputPara.Opt__ManualControl = OPT__MANUAL_CONTROL; - InputPara.Opt__RecordCenter = OPT__RECORD_CENTER; - InputPara.COM_CenX = COM_CEN_X; - InputPara.COM_CenY = COM_CEN_Y; - InputPara.COM_CenZ = COM_CEN_Z; - InputPara.COM_MaxR = COM_MAX_R; - InputPara.COM_MinRho = COM_MIN_RHO; - InputPara.COM_TolErrR = COM_TOLERR_R; - InputPara.COM_MaxIter = COM_MAX_ITER; - InputPara.Opt__RecordUser = OPT__RECORD_USER; - InputPara.Opt__OptimizeAggressive = OPT__OPTIMIZE_AGGRESSIVE; - InputPara.Opt__SortPatchByLBIdx = OPT__SORT_PATCH_BY_LBIDX; +// ---------------------------------------------------------------------------------------------------- + HDF5_InputPara->Add( "Opt__Verbose", &OPT__VERBOSE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__TimingBarrier", &OPT__TIMING_BARRIER, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__TimingBalance", &OPT__TIMING_BALANCE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__TimingMPI", &OPT__TIMING_MPI, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__RecordNote", &OPT__RECORD_NOTE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__RecordUnphy", &OPT__RECORD_UNPHY, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__RecordMemory", &OPT__RECORD_MEMORY, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__RecordPerformance", &OPT__RECORD_PERFORMANCE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__ManualControl", &OPT__MANUAL_CONTROL, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__RecordCenter", &OPT__RECORD_CENTER, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "COM_CenX", &COM_CEN_X, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "COM_CenY", &COM_CEN_Y, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "COM_CenZ", &COM_CEN_Z, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "COM_MaxR", &COM_MAX_R, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "COM_MinRho", &COM_MIN_RHO, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "COM_TolErrR", &COM_TOLERR_R, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "COM_MaxIter", &COM_MAX_ITER, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__RecordUser", &OPT__RECORD_USER, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__OptimizeAggressive", &OPT__OPTIMIZE_AGGRESSIVE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__SortPatchByLBIdx", &OPT__SORT_PATCH_BY_LBIDX, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + // simulation checks - InputPara.Opt__Ck_Refine = OPT__CK_REFINE; - InputPara.Opt__Ck_ProperNesting = OPT__CK_PROPER_NESTING; - InputPara.Opt__Ck_Conservation = OPT__CK_CONSERVATION; - InputPara.AngMom_OriginX = ANGMOM_ORIGIN_X; - InputPara.AngMom_OriginY = ANGMOM_ORIGIN_Y; - InputPara.AngMom_OriginZ = ANGMOM_ORIGIN_Z; - InputPara.Opt__Ck_NormPassive = OPT__CK_NORMALIZE_PASSIVE; - InputPara.Opt__Ck_Restrict = OPT__CK_RESTRICT; - InputPara.Opt__Ck_Finite = OPT__CK_FINITE; - InputPara.Opt__Ck_PatchAllocate = OPT__CK_PATCH_ALLOCATE; - InputPara.Opt__Ck_FluxAllocate = OPT__CK_FLUX_ALLOCATE; +// ---------------------------------------------------------------------------------------------------- + HDF5_InputPara->Add( "Opt__Ck_Refine", &OPT__CK_REFINE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Ck_ProperNesting", &OPT__CK_PROPER_NESTING, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Ck_Conservation", &OPT__CK_CONSERVATION, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "AngMom_OriginX", &ANGMOM_ORIGIN_X, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "AngMom_OriginY", &ANGMOM_ORIGIN_Y, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "AngMom_OriginZ", &ANGMOM_ORIGIN_Z, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Ck_NormPassive", &OPT__CK_NORMALIZE_PASSIVE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Ck_Restrict", &OPT__CK_RESTRICT, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Ck_Finite", &OPT__CK_FINITE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Ck_PatchAllocate", &OPT__CK_PATCH_ALLOCATE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Ck_FluxAllocate", &OPT__CK_FLUX_ALLOCATE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # if ( MODEL == HYDRO ) - InputPara.Opt__Ck_Negative = OPT__CK_NEGATIVE; + HDF5_InputPara->Add( "Opt__Ck_Negative", &OPT__CK_NEGATIVE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - InputPara.Opt__Ck_MemFree = OPT__CK_MEMFREE; + HDF5_InputPara->Add( "Opt__Ck_MemFree", &OPT__CK_MEMFREE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # ifdef PARTICLE - InputPara.Opt__Ck_Particle = OPT__CK_PARTICLE; + HDF5_InputPara->Add( "Opt__Ck_Particle", &OPT__CK_PARTICLE, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif # ifdef MHD - InputPara.Opt__Ck_InterfaceB = OPT__CK_INTERFACE_B; - InputPara.Opt__Ck_DivergenceB = OPT__CK_DIVERGENCE_B; + HDF5_InputPara->Add( "Opt__Ck_InterfaceB", &OPT__CK_INTERFACE_B, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "Opt__Ck_DivergenceB", &OPT__CK_DIVERGENCE_B, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); # endif - InputPara.Opt__Ck_InputFluid = OPT__CK_INPUT_FLUID; - -// flag tables - for (int lv=0; lvAdd( "Opt__Ck_InputFluid", &OPT__CK_INPUT_FLUID, 0, NULL, Compare_Yes, Fatal_No, Fatal_No ); - InputPara.FlagTable_User [lv].p = malloc( OPT__FLAG_USER_NUM*sizeof(double) ); - InputPara.FlagTable_User [lv].len = OPT__FLAG_USER_NUM; - for (int t=0; t 1 ) # if ( MODEL == HYDRO ) - H5Tinsert( H5_TypeID, "FluScheme", HOFFSET(Makefile_t,FluScheme ), H5T_NATIVE_INT ); -# ifdef LR_SCHEME - H5Tinsert( H5_TypeID, "LRScheme", HOFFSET(Makefile_t,LRScheme ), H5T_NATIVE_INT ); +# ifndef COSMIC_RAY + const bool OPT__FLAG_LOHNER_CRAY = false; # endif -# ifdef RSOLVER - H5Tinsert( H5_TypeID, "RSolver", HOFFSET(Makefile_t,RSolver ), H5T_NATIVE_INT ); -# endif - H5Tinsert( H5_TypeID, "DualEnergy", HOFFSET(Makefile_t,DualEnergy ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Magnetohydrodynamics", HOFFSET(Makefile_t,Magnetohydrodynamics ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "SRHydrodynamics", HOFFSET(Makefile_t,SRHydrodynamics ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "CosmicRay", HOFFSET(Makefile_t,CosmicRay ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "EoS", HOFFSET(Makefile_t,EoS ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "BarotropicEoS", HOFFSET(Makefile_t,BarotropicEoS ), H5T_NATIVE_INT ); - + const bool Opt__FlagLohner = ( OPT__FLAG_LOHNER_DENS || OPT__FLAG_LOHNER_ENGY || OPT__FLAG_LOHNER_PRES || + OPT__FLAG_LOHNER_TEMP || OPT__FLAG_LOHNER_ENTR || OPT__FLAG_LOHNER_CRAY ); # elif ( MODEL == ELBDM ) - H5Tinsert( H5_TypeID, "ELBDMScheme", HOFFSET(Makefile_t,ELBDMScheme ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "WaveScheme", HOFFSET(Makefile_t,WaveScheme ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "ConserveMass", HOFFSET(Makefile_t,ConserveMass ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Laplacian4th", HOFFSET(Makefile_t,Laplacian4th ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "SelfInteraction4", HOFFSET(Makefile_t,SelfInteraction4 ), H5T_NATIVE_INT ); - -# else -# error : unsupported MODEL !! -# endif // MODEL - -# ifdef PARTICLE - H5Tinsert( H5_TypeID, "MassiveParticles", HOFFSET(Makefile_t,MassiveParticles ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Tracer", HOFFSET(Makefile_t,Tracer ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "StoreParAcc", HOFFSET(Makefile_t,StoreParAcc ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "StarFormation", HOFFSET(Makefile_t,StarFormation ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Feedback", HOFFSET(Makefile_t,Feedback ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Par_NAttFltUser", HOFFSET(Makefile_t,Par_NAttFltUser ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Par_NAttIntUser", HOFFSET(Makefile_t,Par_NAttIntUser ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Float8_Par", HOFFSET(Makefile_t,Float8_Par ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Int8_Par", HOFFSET(Makefile_t,Int8_Par ), H5T_NATIVE_INT ); -# endif - -# ifdef COSMIC_RAY - H5Tinsert( H5_TypeID, "CR_Diffusion", HOFFSET(Makefile_t,CR_Diffusion ), H5T_NATIVE_INT ); -# endif - -} // FUNCTION : GetCompound_Makefile - - - -//------------------------------------------------------------------------------------------------------- -// Function : GetCompound_SymConst -// Description : Create the HDF5 compound datatype for SymConst -// -// Note : 1. Data structure is defined in "HDF5_Typedef.h" -// 2. The returned H5_TypeID must be closed manually -// 3. Call-by-reference -// -// Parameter : H5_TypeID : HDF5 type ID for storing the compound datatype -//------------------------------------------------------------------------------------------------------- -void GetCompound_SymConst( hid_t &H5_TypeID ) -{ - - H5_TypeID = H5Tcreate( H5T_COMPOUND, sizeof(SymConst_t) ); - - H5Tinsert( H5_TypeID, "NCompFluid", HOFFSET(SymConst_t,NCompFluid ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "NCompPassive", HOFFSET(SymConst_t,NCompPassive ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "PatchSize", HOFFSET(SymConst_t,PatchSize ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Flu_NIn", HOFFSET(SymConst_t,Flu_NIn ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Flu_NOut", HOFFSET(SymConst_t,Flu_NOut ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Flu_NIn_T", HOFFSET(SymConst_t,Flu_NIn_T ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Flu_NIn_S", HOFFSET(SymConst_t,Flu_NIn_S ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Flu_NOut_S", HOFFSET(SymConst_t,Flu_NOut_S ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "NFluxFluid", HOFFSET(SymConst_t,NFluxFluid ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "NFluxPassive", HOFFSET(SymConst_t,NFluxPassive ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Flu_GhostSize", HOFFSET(SymConst_t,Flu_GhostSize ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Flu_Nxt", HOFFSET(SymConst_t,Flu_Nxt ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Debug_HDF5", HOFFSET(SymConst_t,Debug_HDF5 ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "SibOffsetNonperiodic", HOFFSET(SymConst_t,SibOffsetNonperiodic), H5T_NATIVE_INT ); -# ifdef LOAD_BALANCE - H5Tinsert( H5_TypeID, "SonOffsetLB", HOFFSET(SymConst_t,SonOffsetLB ), H5T_NATIVE_INT ); -# endif - H5Tinsert( H5_TypeID, "TinyNumber", HOFFSET(SymConst_t,TinyNumber ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "HugeNumber", HOFFSET(SymConst_t,HugeNumber ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "MaxError", HOFFSET(SymConst_t,MaxError ), H5T_NATIVE_DOUBLE ); - -# ifdef GRAVITY - H5Tinsert( H5_TypeID, "Gra_NIn", HOFFSET(SymConst_t,Gra_NIn ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Pot_GhostSize", HOFFSET(SymConst_t,Pot_GhostSize ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Gra_GhostSize", HOFFSET(SymConst_t,Gra_GhostSize ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Rho_GhostSize", HOFFSET(SymConst_t,Rho_GhostSize ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Pot_Nxt", HOFFSET(SymConst_t,Pot_Nxt ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Gra_Nxt", HOFFSET(SymConst_t,Gra_Nxt ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Rho_Nxt", HOFFSET(SymConst_t,Rho_Nxt ), H5T_NATIVE_INT ); -# ifdef UNSPLIT_GRAVITY - H5Tinsert( H5_TypeID, "USG_GhostSizeF", HOFFSET(SymConst_t,USG_GhostSizeF ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "USG_GhostSizeG", HOFFSET(SymConst_t,USG_GhostSizeG ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "USG_NxtF", HOFFSET(SymConst_t,USG_NxtF ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "USG_NxtG", HOFFSET(SymConst_t,USG_NxtG ), H5T_NATIVE_INT ); -# endif - H5Tinsert( H5_TypeID, "ExtPot_BlockSize", HOFFSET(SymConst_t,ExtPot_BlockSize ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Gra_BlockSize", HOFFSET(SymConst_t,Gra_BlockSize ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "ExtPotNAuxMax", HOFFSET(SymConst_t,ExtPotNAuxMax ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "ExtAccNAuxMax", HOFFSET(SymConst_t,ExtAccNAuxMax ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "ExtPotNGeneMax", HOFFSET(SymConst_t,ExtPotNGeneMax ), H5T_NATIVE_INT ); -# if ( POT_SCHEME == SOR ) - H5Tinsert( H5_TypeID, "Pot_BlockSize_z", HOFFSET(SymConst_t,Pot_BlockSize_z ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "SOR_RhoShared", HOFFSET(SymConst_t,SOR_RhoShared ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "SOR_CPotShared", HOFFSET(SymConst_t,SOR_CPotShared ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "SOR_UseShuffle", HOFFSET(SymConst_t,SOR_UseShuffle ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "SOR_UsePadding", HOFFSET(SymConst_t,SOR_UsePadding ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "SOR_ModReduction", HOFFSET(SymConst_t,SOR_ModReduction ), H5T_NATIVE_INT ); -# elif ( POT_SCHEME == MG ) - H5Tinsert( H5_TypeID, "Pot_BlockSize_x", HOFFSET(SymConst_t,Pot_BlockSize_x ), H5T_NATIVE_INT ); -# endif -# endif // #ifdef GRAVITY - -# ifdef PARTICLE - H5Tinsert( H5_TypeID, "Par_NAttFltStored", HOFFSET(SymConst_t,Par_NAttFltStored ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Par_NAttIntStored", HOFFSET(SymConst_t,Par_NAttIntStored ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Par_NType", HOFFSET(SymConst_t,Par_NType ), H5T_NATIVE_INT ); -# ifdef GRAVITY - H5Tinsert( H5_TypeID, "RhoExt_GhostSize", HOFFSET(SymConst_t,RhoExt_GhostSize ), H5T_NATIVE_INT ); -# endif - H5Tinsert( H5_TypeID, "Debug_Particle", HOFFSET(SymConst_t,Debug_Particle ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "ParList_GrowthFactor", HOFFSET(SymConst_t,ParList_GrowthFactor), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "ParList_ReduceFactor", HOFFSET(SymConst_t,ParList_ReduceFactor), H5T_NATIVE_DOUBLE ); -# endif // #ifdef PARTICLE - - H5Tinsert( H5_TypeID, "BitRep_Flux", HOFFSET(SymConst_t,BitRep_Flux ), H5T_NATIVE_INT ); -# ifdef MHD - H5Tinsert( H5_TypeID, "BitRep_Electric", HOFFSET(SymConst_t,BitRep_Electric ), H5T_NATIVE_INT ); -# endif - H5Tinsert( H5_TypeID, "InterpMask", HOFFSET(SymConst_t,InterpMask ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "FB_SepFluOut", HOFFSET(SymConst_t,FB_SepFluOut ), H5T_NATIVE_INT ); - -# if ( MODEL == HYDRO ) - H5Tinsert( H5_TypeID, "Flu_BlockSize_x", HOFFSET(SymConst_t,Flu_BlockSize_x ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Flu_BlockSize_y", HOFFSET(SymConst_t,Flu_BlockSize_y ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "CheckUnphyInFluid", HOFFSET(SymConst_t,CheckUnphyInFluid ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "CharReconstruction", HOFFSET(SymConst_t,CharReconstruction ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "LR_Eint", HOFFSET(SymConst_t,LR_Eint ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "CheckIntermediate", HOFFSET(SymConst_t,CheckIntermediate ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "RSolverRescue", HOFFSET(SymConst_t,RSolverRescue ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "HLL_NoRefState", HOFFSET(SymConst_t,HLL_NoRefState ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "HLL_IncludeAllWaves", HOFFSET(SymConst_t,HLL_IncludeAllWaves ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "HLLC_WaveSpeed", HOFFSET(SymConst_t,HLLC_WaveSpeed ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "HLLE_WaveSpeed", HOFFSET(SymConst_t,HLLE_WaveSpeed ), H5T_NATIVE_INT ); -# ifdef MHD - H5Tinsert( H5_TypeID, "HLLD_WaveSpeed", HOFFSET(SymConst_t,HLLD_WaveSpeed ), H5T_NATIVE_INT ); -# endif -# ifdef N_FC_VAR - H5Tinsert( H5_TypeID, "N_FC_Var", HOFFSET(SymConst_t,N_FC_Var ), H5T_NATIVE_INT ); -# endif -# ifdef N_SLOPE_PPM - H5Tinsert( H5_TypeID, "N_Slope_PPM", HOFFSET(SymConst_t,N_Slope_PPM ), H5T_NATIVE_INT ); -# endif -# ifdef MHD - H5Tinsert( H5_TypeID, "EulerY", HOFFSET(SymConst_t,EulerY ), H5T_NATIVE_INT ); -# endif - H5Tinsert( H5_TypeID, "MHM_CheckPredict", HOFFSET(SymConst_t,MHM_CheckPredict ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "EoSNAuxMax", HOFFSET(SymConst_t,EoSNAuxMax ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "EoSNTableMax", HOFFSET(SymConst_t,EoSNTableMax ), H5T_NATIVE_INT ); - -# elif ( MODEL == ELBDM ) - H5Tinsert( H5_TypeID, "Flu_BlockSize_x", HOFFSET(SymConst_t,Flu_BlockSize_x ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Flu_BlockSize_y", HOFFSET(SymConst_t,Flu_BlockSize_y ), H5T_NATIVE_INT ); -# if ( ELBDM_SCHEME == ELBDM_HYBRID ) - H5Tinsert( H5_TypeID, "Flu_HJ_BlockSize_y", HOFFSET(SymConst_t,Flu_HJ_BlockSize_y ), H5T_NATIVE_INT ); -# endif - -# if ( WAVE_SCHEME == WAVE_GRAMFE ) - H5Tinsert( H5_TypeID, "GramFEScheme", HOFFSET(SymConst_t,GramFEScheme ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "GramFEGamma", HOFFSET(SymConst_t,GramFEGamma ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "GramFEG", HOFFSET(SymConst_t,GramFEG ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "GramFENDelta", HOFFSET(SymConst_t,GramFENDelta ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "GramFEOrder", HOFFSET(SymConst_t,GramFEOrder ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "GramFEND", HOFFSET(SymConst_t,GramFEND ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "GramFEFluNxt", HOFFSET(SymConst_t,GramFEFluNxt ), H5T_NATIVE_INT ); -# endif - + const bool Opt__FlagLohner = OPT__FLAG_LOHNER_DENS; # else # error : ERROR : unsupported MODEL !! -# endif // MODEL - - H5Tinsert( H5_TypeID, "dt_Flu_BlockSize", HOFFSET(SymConst_t,dt_Flu_BlockSize ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "dt_Flu_UseShuffle", HOFFSET(SymConst_t,dt_Flu_UseShuffle ), H5T_NATIVE_INT ); -# ifdef GRAVITY - H5Tinsert( H5_TypeID, "dt_Gra_BlockSize", HOFFSET(SymConst_t,dt_Gra_BlockSize ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "dt_Gra_UseShuffle", HOFFSET(SymConst_t,dt_Gra_UseShuffle ), H5T_NATIVE_INT ); # endif - - H5Tinsert( H5_TypeID, "Src_BlockSize", HOFFSET(SymConst_t,Src_BlockSize ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Src_GhostSize", HOFFSET(SymConst_t,Src_GhostSize ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Src_Nxt", HOFFSET(SymConst_t,Src_Nxt ), H5T_NATIVE_INT ); -# if ( MODEL == HYDRO ) - H5Tinsert( H5_TypeID, "Src_NAuxDlep", HOFFSET(SymConst_t,Src_NAuxDlep ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Src_DlepProfNVar", HOFFSET(SymConst_t,Src_DlepProfNVar ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Src_DlepProfNBinMax", HOFFSET(SymConst_t,Src_DlepProfNBinMax ), H5T_NATIVE_INT ); -# endif - H5Tinsert( H5_TypeID, "Src_NAuxUser", HOFFSET(SymConst_t,Src_NAuxUser ), H5T_NATIVE_INT ); - - H5Tinsert( H5_TypeID, "Der_GhostSize", HOFFSET(SymConst_t,Der_GhostSize ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Der_Nxt", HOFFSET(SymConst_t,Der_Nxt ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Der_NOut_Max", HOFFSET(SymConst_t,Der_NOut_Max ), H5T_NATIVE_INT ); - -# ifdef FEEDBACK - H5Tinsert( H5_TypeID, "FB_GhostSize", HOFFSET(SymConst_t,FB_GhostSize ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "FB_Nxt", HOFFSET(SymConst_t,FB_Nxt ), H5T_NATIVE_INT ); -# endif - - H5Tinsert( H5_TypeID, "NFieldStoredMax", HOFFSET(SymConst_t,NFieldStoredMax ), H5T_NATIVE_INT ); - - H5Tinsert( H5_TypeID, "NConRefMax", HOFFSET(SymConst_t,NConRefMax ), H5T_NATIVE_INT ); - -} // FUNCTION : GetCompound_SymConst - - - -//------------------------------------------------------------------------------------------------------- -// Function : GetCompound_InputPara -// Description : Create the HDF5 compound datatype for InputPara -// -// Note : 1. Data structure is defined in "HDF5_Typedef.h" -// 2. The returned H5_TypeID must be closed manually -// 3. Call-by-reference -// -// Parameter : H5_TypeID : HDF5 type ID for storing the compound datatype -// NFieldStored : Number of grid fields to be stored on disk -//------------------------------------------------------------------------------------------------------- -void GetCompound_InputPara( hid_t &H5_TypeID, const int NFieldStored ) -{ - -// create the array type - const hsize_t H5_ArrDims_3Var = 3; // array size of [3] - const hsize_t H5_ArrDims_6Var = 6; // array size of [6] -# if ( NCOMP_PASSIVE > 0 ) - const hsize_t H5_ArrDims_NPassive = NCOMP_PASSIVE; // array size of [NCOMP_PASSIVE] -# endif -# if ( NLEVEL > 1 ) - const hsize_t H5_ArrDims_NLvM1 = NLEVEL-1; // array size of [NLEVEL-1] - const hsize_t H5_ArrDims_NLvM1_2[2] = { NLEVEL-1, 2 }; // array size of [NLEVEL-1][2] - const hsize_t H5_ArrDims_NLvM1_3[2] = { NLEVEL-1, 3 }; // array size of [NLEVEL-1][3] - const hsize_t H5_ArrDims_NLvM1_4[2] = { NLEVEL-1, 4 }; // array size of [NLEVEL-1][4] - const hsize_t H5_ArrDims_NLvM1_5[2] = { NLEVEL-1, 5 }; // array size of [NLEVEL-1][5] - const hsize_t H5_ArrDims_NLvM1_6[2] = { NLEVEL-1, 6 }; // array size of [NLEVEL-1][6] -# endif - - const hid_t H5_TypeID_Arr_3Int = H5Tarray_create( H5T_NATIVE_INT, 1, &H5_ArrDims_3Var ); - const hid_t H5_TypeID_Arr_6Int = H5Tarray_create( H5T_NATIVE_INT, 1, &H5_ArrDims_6Var ); -# if ( NCOMP_PASSIVE > 0 ) - const hid_t H5_TypeID_Arr_NPassive = H5Tarray_create( H5T_NATIVE_INT, 1, &H5_ArrDims_NPassive ); -# endif -# if ( NLEVEL > 1 ) - const hid_t H5_TypeID_Arr_NLvM1Int = H5Tarray_create( H5T_NATIVE_INT, 1, &H5_ArrDims_NLvM1 ); - const hid_t H5_TypeID_Arr_NLvM1_6Int = H5Tarray_create( H5T_NATIVE_INT, 2, H5_ArrDims_NLvM1_6 ); - const hid_t H5_TypeID_Arr_NLvM1Double = H5Tarray_create( H5T_NATIVE_DOUBLE, 1, &H5_ArrDims_NLvM1 ); - const hid_t H5_TypeID_Arr_NLvM1_2Double = H5Tarray_create( H5T_NATIVE_DOUBLE, 2, H5_ArrDims_NLvM1_2 ); - const hid_t H5_TypeID_Arr_NLvM1_3Double = H5Tarray_create( H5T_NATIVE_DOUBLE, 2, H5_ArrDims_NLvM1_3 ); - const hid_t H5_TypeID_Arr_NLvM1_4Double = H5Tarray_create( H5T_NATIVE_DOUBLE, 2, H5_ArrDims_NLvM1_4 ); - const hid_t H5_TypeID_Arr_NLvM1_5Double = H5Tarray_create( H5T_NATIVE_DOUBLE, 2, H5_ArrDims_NLvM1_5 ); - const hid_t H5_TypeID_Arr_NLvM1_VLDouble = H5Tvlen_create ( H5T_NATIVE_DOUBLE ); -# endif - const hid_t H5_TypeID_Arr_3Double = H5Tarray_create( H5T_NATIVE_DOUBLE, 1, &H5_ArrDims_3Var ); - - -// create the "variable-length string" datatype - hid_t H5_TypeID_VarStr; - herr_t H5_Status; - - H5_TypeID_VarStr = H5Tcopy( H5T_C_S1 ); - H5_Status = H5Tset_size( H5_TypeID_VarStr, H5T_VARIABLE ); - - -// get the size of a single pointer, which is used for storing the array of variable-length strings -// --> FieldLabel[], MagLabel[], ParAttFltLabel[], ParAttIntLabel[] - const int PtrSize = sizeof( char* ); - const int PtrSize_hvl = sizeof( hvl_t ); - char Key[MAX_STRING]; - - -// get the compound type - H5_TypeID = H5Tcreate( H5T_COMPOUND, sizeof(InputPara_t) ); - -// simulation scale - H5Tinsert( H5_TypeID, "BoxSize", HOFFSET(InputPara_t,BoxSize ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "NX0_Tot", HOFFSET(InputPara_t,NX0_Tot ), H5_TypeID_Arr_3Int ); - H5Tinsert( H5_TypeID, "MPI_NRank", HOFFSET(InputPara_t,MPI_NRank ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "MPI_NRank_X", HOFFSET(InputPara_t,MPI_NRank_X ), H5_TypeID_Arr_3Int ); - H5Tinsert( H5_TypeID, "OMP_NThread", HOFFSET(InputPara_t,OMP_NThread ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "EndT", HOFFSET(InputPara_t,EndT ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "EndStep", HOFFSET(InputPara_t,EndStep ), H5T_NATIVE_LONG ); - -// test problems - H5Tinsert( H5_TypeID, "TestProb_ID", HOFFSET(InputPara_t,TestProb_ID ), H5T_NATIVE_INT ); - -// code units - H5Tinsert( H5_TypeID, "Opt__Unit", HOFFSET(InputPara_t,Opt__Unit ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Unit_L", HOFFSET(InputPara_t,Unit_L ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Unit_M", HOFFSET(InputPara_t,Unit_M ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Unit_T", HOFFSET(InputPara_t,Unit_T ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Unit_V", HOFFSET(InputPara_t,Unit_V ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Unit_D", HOFFSET(InputPara_t,Unit_D ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Unit_E", HOFFSET(InputPara_t,Unit_E ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Unit_P", HOFFSET(InputPara_t,Unit_P ), H5T_NATIVE_DOUBLE ); -# ifdef MHD - H5Tinsert( H5_TypeID, "Unit_B", HOFFSET(InputPara_t,Unit_B ), H5T_NATIVE_DOUBLE ); -# endif - -// boundary condition - H5Tinsert( H5_TypeID, "Opt__BC_Flu", HOFFSET(InputPara_t,Opt__BC_Flu ), H5_TypeID_Arr_6Int ); -# ifdef GRAVITY - H5Tinsert( H5_TypeID, "Opt__BC_Pot", HOFFSET(InputPara_t,Opt__BC_Pot ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "GFunc_Coeff0", HOFFSET(InputPara_t,GFunc_Coeff0 ), H5T_NATIVE_DOUBLE ); -# endif - -// particle -# ifdef PARTICLE - H5Tinsert( H5_TypeID, "Par_Init", HOFFSET(InputPara_t,Par_Init ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Par_ICFormat", HOFFSET(InputPara_t,Par_ICFormat ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Par_ICMass", HOFFSET(InputPara_t,Par_ICMass ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Par_ICType", HOFFSET(InputPara_t,Par_ICType ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Par_ICFloat8", HOFFSET(InputPara_t,Par_ICFloat8 ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Par_ICInt8", HOFFSET(InputPara_t,Par_ICInt8 ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Par_Interp", HOFFSET(InputPara_t,Par_Interp ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Par_InterpTracer", HOFFSET(InputPara_t,Par_InterpTracer ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Par_Integ", HOFFSET(InputPara_t,Par_Integ ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Par_IntegTracer", HOFFSET(InputPara_t,Par_IntegTracer ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Par_ImproveAcc", HOFFSET(InputPara_t,Par_ImproveAcc ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Par_PredictPos", HOFFSET(InputPara_t,Par_PredictPos ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Par_RemoveCell", HOFFSET(InputPara_t,Par_RemoveCell ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Opt__FreezePar", HOFFSET(InputPara_t,Opt__FreezePar ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Par_GhostSize", HOFFSET(InputPara_t,Par_GhostSize ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Par_GhostSizeTracer", HOFFSET(InputPara_t,Par_GhostSizeTracer ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Par_TracerVelCorr", HOFFSET(InputPara_t,Par_TracerVelCorr ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__ParInitCheck", HOFFSET(InputPara_t,Opt__ParInitCheck ), H5T_NATIVE_INT ); - -// store the name of all particle attributes - for (int v=0; vAdd( "FlagAngular_CenX", &FLAG_ANGULAR_CEN_X, 0, NULL, Compare_Flag_Angular, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "FlagAngular_CenY", &FLAG_ANGULAR_CEN_Y, 0, NULL, Compare_Flag_Angular, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "FlagAngular_CenZ", &FLAG_ANGULAR_CEN_Z, 0, NULL, Compare_Flag_Angular, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "FlagRadial_CenX", &FLAG_RADIAL_CEN_X, 0, NULL, Compare_Flag_Radial, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "FlagRadial_CenY", &FLAG_RADIAL_CEN_Y, 0, NULL, Compare_Flag_Radial, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "FlagRadial_CenZ", &FLAG_RADIAL_CEN_Z, 0, NULL, Compare_Flag_Radial, Fatal_No, Fatal_No ); + if ( (Load_RS && MAX_LEVEL > 0) || !Load_RS ) { -// key for each particle attribute - sprintf( Key, "ParAttFltLabel%02d", v ); - -// assuming the offset between successive ParAttFltLabel pointers is "PtrSize", which is equal to "sizeof( char* )" - H5Tinsert( H5_TypeID, Key, HOFFSET(InputPara_t,ParAttFltLabel[0])+v*PtrSize, H5_TypeID_VarStr ); + HDF5_InputPara->Add( "FlagTable_Rho", &FlagTable_Rho [0], 1, H5_Arr_Lv, Compare_Flag_Rho, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "FlagTable_RhoGradient", &FlagTable_RhoGradient [0], 1, H5_Arr_Lv, Compare_Flag_RhoGrad, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "FlagTable_Lohner", &FlagTable_Lohner [0][0], 2, H5_Arr_Lv_5, Compare_Flag_Lohner, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "FlagTable_Angular", &FlagTable_Angular [0][0], 2, H5_Arr_Lv_3, Compare_Flag_Angular, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "FlagTable_Radial", &FlagTable_Radial [0], 1, H5_Arr_Lv, Compare_Flag_Radial, Fatal_No, Fatal_No ); } - - for (int v=0; vAdd( Key, &FlagTable_User [lv][0], 1, H5_Arr_User, Compare_Flag_User, Fatal_No, Fatal_No ); } -# endif - -// cosmology -# ifdef COMOVING - H5Tinsert( H5_TypeID, "A_Init", HOFFSET(InputPara_t,A_Init ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "OmegaM0", HOFFSET(InputPara_t,OmegaM0 ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Hubble0", HOFFSET(InputPara_t,Hubble0 ), H5T_NATIVE_DOUBLE ); -# endif - -// time-step determination - H5Tinsert( H5_TypeID, "Dt__Max", HOFFSET(InputPara_t,Dt__Max ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Dt__Fluid", HOFFSET(InputPara_t,Dt__Fluid ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Dt__FluidInit", HOFFSET(InputPara_t,Dt__FluidInit ), H5T_NATIVE_DOUBLE ); -# ifdef GRAVITY - H5Tinsert( H5_TypeID, "Dt__Gravity", HOFFSET(InputPara_t,Dt__Gravity ), H5T_NATIVE_DOUBLE ); -# endif -# if ( MODEL == ELBDM ) - H5Tinsert( H5_TypeID, "Dt__Phase", HOFFSET(InputPara_t,Dt__Phase ), H5T_NATIVE_DOUBLE ); -# if ( ELBDM_SCHEME == ELBDM_HYBRID ) - H5Tinsert( H5_TypeID, "Dt__HybridCFL", HOFFSET(InputPara_t,Dt__HybridCFL ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Dt__HybridCFLInit", HOFFSET(InputPara_t,Dt__HybridCFLInit ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Dt__HybridVelocity", HOFFSET(InputPara_t,Dt__HybridVelocity ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Dt__HybridVelocityInit", HOFFSET(InputPara_t,Dt__HybridVelocityInit ), H5T_NATIVE_DOUBLE ); -# endif -# endif // ELBDM -# ifdef PARTICLE - H5Tinsert( H5_TypeID, "Dt__ParVel", HOFFSET(InputPara_t,Dt__ParVel ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Dt__ParVelMax", HOFFSET(InputPara_t,Dt__ParVelMax ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Dt__ParAcc", HOFFSET(InputPara_t,Dt__ParAcc ), H5T_NATIVE_DOUBLE ); -# endif -# ifdef SRHD - H5Tinsert( H5_TypeID, "Dt__SpeedOfLight", HOFFSET(InputPara_t,Dt__SpeedOfLight ), H5T_NATIVE_INT ); -# endif -# ifdef CR_DIFFUSION - H5Tinsert( H5_TypeID, "Dt__CR_Diffusion", HOFFSET(InputPara_t,Dt__CR_Diffusion ), H5T_NATIVE_DOUBLE ); -# endif -# ifdef COMOVING - H5Tinsert( H5_TypeID, "Dt__MaxDeltaA", HOFFSET(InputPara_t,Dt__MaxDeltaA ), H5T_NATIVE_DOUBLE ); -# endif - H5Tinsert( H5_TypeID, "Dt__SyncParentLv", HOFFSET(InputPara_t,Dt__SyncParentLv ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Dt__SyncChildrenLv", HOFFSET(InputPara_t,Dt__SyncChildrenLv ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Opt__DtUser", HOFFSET(InputPara_t,Opt__DtUser ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__DtLevel", HOFFSET(InputPara_t,Opt__DtLevel ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__RecordDt", HOFFSET(InputPara_t,Opt__RecordDt ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "AutoReduceDt", HOFFSET(InputPara_t,AutoReduceDt ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "AutoReduceDtFactor", HOFFSET(InputPara_t,AutoReduceDtFactor ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "AutoReduceDtFactorMin", HOFFSET(InputPara_t,AutoReduceDtFactorMin ), H5T_NATIVE_DOUBLE ); -# if ( MODEL == HYDRO ) - H5Tinsert( H5_TypeID, "AutoReduceMinModFactor", HOFFSET(InputPara_t,AutoReduceMinModFactor ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "AutoReduceMinModMin", HOFFSET(InputPara_t,AutoReduceMinModMin ), H5T_NATIVE_DOUBLE ); -# endif - H5Tinsert( H5_TypeID, "AutoReduceIntMonoFactor", HOFFSET(InputPara_t,AutoReduceIntMonoFactor), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "AutoReduceIntMonoMin", HOFFSET(InputPara_t,AutoReduceIntMonoMin ), H5T_NATIVE_DOUBLE ); - -// domain refinement - H5Tinsert( H5_TypeID, "RegridCount", HOFFSET(InputPara_t,RegridCount ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "RefineNLevel", HOFFSET(InputPara_t,RefineNLevel ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "FlagBufferSize", HOFFSET(InputPara_t,FlagBufferSize ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "FlagBufferSizeMaxM1Lv", HOFFSET(InputPara_t,FlagBufferSizeMaxM1Lv ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "FlagBufferSizeMaxM2Lv", HOFFSET(InputPara_t,FlagBufferSizeMaxM2Lv ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "MaxLevel", HOFFSET(InputPara_t,MaxLevel ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Flag_Rho", HOFFSET(InputPara_t,Opt__Flag_Rho ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Flag_RhoGradient", HOFFSET(InputPara_t,Opt__Flag_RhoGradient ), H5T_NATIVE_INT ); -# if ( MODEL == HYDRO ) - H5Tinsert( H5_TypeID, "Opt__Flag_PresGradient", HOFFSET(InputPara_t,Opt__Flag_PresGradient ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Flag_Vorticity", HOFFSET(InputPara_t,Opt__Flag_Vorticity ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Flag_Jeans", HOFFSET(InputPara_t,Opt__Flag_Jeans ), H5T_NATIVE_INT ); +# if ( MODEL == HYDRO ) + const bool Compare_Flag_PresGrad = ( OPT__FLAG_PRES_GRADIENT ) ? Compare_Yes : Compare_No; + const bool Compare_Flag_Vorticity = ( OPT__FLAG_VORTICITY ) ? Compare_Yes : Compare_No; + const bool Compare_Flag_Jeans = ( OPT__FLAG_JEANS ) ? Compare_Yes : Compare_No; + if ( (Load_RS && MAX_LEVEL > 0) || !Load_RS ) + { + HDF5_InputPara->Add( "FlagTable_PresGradient", &FlagTable_PresGradient[0], 1, H5_Arr_Lv, Compare_Flag_PresGrad, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "FlagTable_Vorticity", &FlagTable_Vorticity [0], 1, H5_Arr_Lv, Compare_Flag_Vorticity, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "FlagTable_Jeans", &FlagTable_Jeans [0], 1, H5_Arr_Lv, Compare_Flag_Jeans, Fatal_No, Fatal_No ); + } # ifdef MHD - H5Tinsert( H5_TypeID, "Opt__Flag_Current", HOFFSET(InputPara_t,Opt__Flag_Current ), H5T_NATIVE_INT ); + const bool Compare_Flag_Current = ( OPT__FLAG_CURRENT ) ? Compare_Yes : Compare_No; + if ( (Load_RS && MAX_LEVEL > 0) || !Load_RS ) + HDF5_InputPara->Add( "FlagTable_Current", &FlagTable_Current [0], 1, H5_Arr_Lv, Compare_Flag_Current, Fatal_No, Fatal_No ); # endif # ifdef SRHD - H5Tinsert( H5_TypeID, "Opt__Flag_LrtzGradient", HOFFSET(InputPara_t,Opt__Flag_LrtzGradient ), H5T_NATIVE_INT ); + const bool Compare_Flag_LrtzGrad = ( OPT__FLAG_LRTZ_GRADIENT ) ? Compare_Yes : Compare_No; + if ( (Load_RS && MAX_LEVEL > 0) || !Load_RS ) + HDF5_InputPara->Add( "FlagTable_LrtzGradient", &FlagTable_LrtzGradient[0], 1, H5_Arr_Lv, Compare_Flag_LrtzGrad, Fatal_No, Fatal_No ); # endif # ifdef COSMIC_RAY - H5Tinsert( H5_TypeID, "Opt__Flag_CRay", HOFFSET(InputPara_t,Opt__Flag_CRay ), H5T_NATIVE_INT ); + const bool Compare_Flag_CRay = ( OPT__FLAG_CRAY ) ? Compare_Yes : Compare_No; + if ( (Load_RS && MAX_LEVEL > 0) || !Load_RS ) + HDF5_InputPara->Add( "FlagTable_CRay", &FlagTable_CRay [0], 1, H5_Arr_Lv, Compare_Flag_CRay, Fatal_No, Fatal_No ); # endif -# endif -# if ( MODEL == ELBDM ) - H5Tinsert( H5_TypeID, "Opt__Flag_EngyDensity", HOFFSET(InputPara_t,Opt__Flag_EngyDensity ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Flag_Spectral", HOFFSET(InputPara_t,Opt__Flag_Spectral ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Flag_Spectral_N", HOFFSET(InputPara_t,Opt__Flag_Spectral_N ), H5T_NATIVE_INT ); -# if ( ELBDM_SCHEME == ELBDM_HYBRID ) - H5Tinsert( H5_TypeID, "Opt__Flag_Interference", HOFFSET(InputPara_t,Opt__Flag_Interference ), H5T_NATIVE_INT ); -# endif -# endif // ELBDM - H5Tinsert( H5_TypeID, "Opt__Flag_LohnerDens", HOFFSET(InputPara_t,Opt__Flag_LohnerDens ), H5T_NATIVE_INT ); -# if ( MODEL == HYDRO ) - H5Tinsert( H5_TypeID, "Opt__Flag_LohnerEngy", HOFFSET(InputPara_t,Opt__Flag_LohnerEngy ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Flag_LohnerPres", HOFFSET(InputPara_t,Opt__Flag_LohnerPres ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Flag_LohnerTemp", HOFFSET(InputPara_t,Opt__Flag_LohnerTemp ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Flag_LohnerEntr", HOFFSET(InputPara_t,Opt__Flag_LohnerEntr ), H5T_NATIVE_INT ); -# ifdef COSMIC_RAY - H5Tinsert( H5_TypeID, "Opt__Flag_LohnerCRay", HOFFSET(InputPara_t,Opt__Flag_LohnerCRay ), H5T_NATIVE_INT ); -# endif -# endif - H5Tinsert( H5_TypeID, "Opt__Flag_LohnerForm", HOFFSET(InputPara_t,Opt__Flag_LohnerForm ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Flag_User", HOFFSET(InputPara_t,Opt__Flag_User ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Flag_User_Num", HOFFSET(InputPara_t,Opt__Flag_User_Num ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Flag_Region", HOFFSET(InputPara_t,Opt__Flag_Region ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Flag_Angular", HOFFSET(InputPara_t,Opt__Flag_Angular ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "FlagAngular_CenX", HOFFSET(InputPara_t,FlagAngular_CenX ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "FlagAngular_CenY", HOFFSET(InputPara_t,FlagAngular_CenY ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "FlagAngular_CenZ", HOFFSET(InputPara_t,FlagAngular_CenZ ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Opt__Flag_Radial", HOFFSET(InputPara_t,Opt__Flag_Radial ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "FlagRadial_CenX", HOFFSET(InputPara_t,FlagRadial_CenX ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "FlagRadial_CenY", HOFFSET(InputPara_t,FlagRadial_CenY ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "FlagRadial_CenZ", HOFFSET(InputPara_t,FlagRadial_CenZ ), H5T_NATIVE_DOUBLE ); -# ifdef PARTICLE - H5Tinsert( H5_TypeID, "Opt__Flag_NParPatch", HOFFSET(InputPara_t,Opt__Flag_NParPatch ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Flag_NParCell", HOFFSET(InputPara_t,Opt__Flag_NParCell ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Flag_ParMassCell", HOFFSET(InputPara_t,Opt__Flag_ParMassCell ), H5T_NATIVE_INT ); -# endif - H5Tinsert( H5_TypeID, "Opt__NoFlagNearBoundary", HOFFSET(InputPara_t,Opt__NoFlagNearBoundary), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__PatchCount", HOFFSET(InputPara_t,Opt__PatchCount ), H5T_NATIVE_INT ); -# ifdef PARTICLE - H5Tinsert( H5_TypeID, "Opt__ParticleCount", HOFFSET(InputPara_t,Opt__ParticleCount ), H5T_NATIVE_INT ); -# endif - H5Tinsert( H5_TypeID, "Opt__ReuseMemory", HOFFSET(InputPara_t,Opt__ReuseMemory ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__MemoryPool", HOFFSET(InputPara_t,Opt__MemoryPool ), H5T_NATIVE_INT ); -// load balance -# ifdef LOAD_BALANCE - H5Tinsert( H5_TypeID, "LB_WLI_Max", HOFFSET(InputPara_t,LB_WLI_Max ), H5T_NATIVE_DOUBLE ); -# ifdef PARTICLE - H5Tinsert( H5_TypeID, "LB_Par_Weight", HOFFSET(InputPara_t,LB_Par_Weight ), H5T_NATIVE_DOUBLE ); -# endif - H5Tinsert( H5_TypeID, "Opt__RecordLoadBalance", HOFFSET(InputPara_t,Opt__RecordLoadBalance ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__LB_ExchangeFather", HOFFSET(InputPara_t,Opt__LB_ExchangeFather ), H5T_NATIVE_INT ); -# endif - H5Tinsert( H5_TypeID, "Opt__MinimizeMPIBarrier", HOFFSET(InputPara_t,Opt__MinimizeMPIBarrier), H5T_NATIVE_INT ); - -// fluid solvers in HYDRO -# if ( MODEL == HYDRO ) - H5Tinsert( H5_TypeID, "Gamma", HOFFSET(InputPara_t,Gamma ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "MolecularWeight", HOFFSET(InputPara_t,MolecularWeight ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "MuNorm", HOFFSET(InputPara_t,MuNorm ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "IsoTemp", HOFFSET(InputPara_t,IsoTemp ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "MinMod_Coeff", HOFFSET(InputPara_t,MinMod_Coeff ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "MinMod_MaxIter", HOFFSET(InputPara_t,MinMod_MaxIter ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__LR_Limiter", HOFFSET(InputPara_t,Opt__LR_Limiter ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__1stFluxCorr", HOFFSET(InputPara_t,Opt__1stFluxCorr ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__1stFluxCorrScheme", HOFFSET(InputPara_t,Opt__1stFluxCorrScheme ), H5T_NATIVE_INT ); -# ifdef DUAL_ENERGY - H5Tinsert( H5_TypeID, "DualEnergySwitch", HOFFSET(InputPara_t,DualEnergySwitch ), H5T_NATIVE_DOUBLE ); -# endif -# ifdef MHD - H5Tinsert( H5_TypeID, "Opt__SameInterfaceB", HOFFSET(InputPara_t,Opt__SameInterfaceB ), H5T_NATIVE_INT ); -# endif -# endif // HYDRO - -// ELBDM solvers -# if ( MODEL == ELBDM ) - H5Tinsert( H5_TypeID, "ELBDM_Mass", HOFFSET(InputPara_t,ELBDM_Mass ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "ELBDM_PlanckConst", HOFFSET(InputPara_t,ELBDM_PlanckConst ), H5T_NATIVE_DOUBLE ); -# ifdef QUARTIC_SELF_INTERACTION - H5Tinsert( H5_TypeID, "ELBDM_Lambda", HOFFSET(InputPara_t,ELBDM_Lambda ), H5T_NATIVE_DOUBLE ); -# endif - H5Tinsert( H5_TypeID, "ELBDM_Taylor3_Coeff", HOFFSET(InputPara_t,ELBDM_Taylor3_Coeff ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "ELBDM_Taylor3_Auto", HOFFSET(InputPara_t,ELBDM_Taylor3_Auto ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "ELBDM_RemoveMotionCM", HOFFSET(InputPara_t,ELBDM_RemoveMotionCM ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "ELBDM_BaseSpectral", HOFFSET(InputPara_t,ELBDM_BaseSpectral ), H5T_NATIVE_INT ); - -# if ( ELBDM_SCHEME == ELBDM_HYBRID ) - H5Tinsert( H5_TypeID, "ELBDM_FirstWaveLevel", HOFFSET(InputPara_t,ELBDM_FirstWaveLevel ), H5T_NATIVE_INT ); -# endif -# endif // ELBDM - -// fluid solvers in different models - H5Tinsert( H5_TypeID, "Flu_GPU_NPGroup", HOFFSET(InputPara_t,Flu_GPU_NPGroup ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "GPU_NStream", HOFFSET(InputPara_t,GPU_NStream ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__FixUp_Flux", HOFFSET(InputPara_t,Opt__FixUp_Flux ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "FixUpFlux_Var", HOFFSET(InputPara_t,FixUpFlux_Var ), H5T_NATIVE_LONG ); -# ifdef MHD - H5Tinsert( H5_TypeID, "Opt__FixUp_Electric", HOFFSET(InputPara_t,Opt__FixUp_Electric ), H5T_NATIVE_INT ); -# endif - H5Tinsert( H5_TypeID, "Opt__FixUp_Restrict", HOFFSET(InputPara_t,Opt__FixUp_Restrict ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "FixUpRestrict_Var", HOFFSET(InputPara_t,FixUpRestrict_Var ), H5T_NATIVE_LONG ); - H5Tinsert( H5_TypeID, "Opt__CorrAfterAllSync", HOFFSET(InputPara_t,Opt__CorrAfterAllSync ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__NormalizePassive", HOFFSET(InputPara_t,Opt__NormalizePassive ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "NormalizePassive_NVar", HOFFSET(InputPara_t,NormalizePassive_NVar ), H5T_NATIVE_INT ); -# if ( NCOMP_PASSIVE > 0 ) - H5Tinsert( H5_TypeID, "NormalizePassive_VarIdx", HOFFSET(InputPara_t,NormalizePassive_VarIdx), H5_TypeID_Arr_NPassive ); -# endif - H5Tinsert( H5_TypeID, "Opt__IntFracPassive_LR", HOFFSET(InputPara_t,Opt__IntFracPassive_LR ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "IntFracPassive_NVar", HOFFSET(InputPara_t,IntFracPassive_NVar ), H5T_NATIVE_INT ); -# if ( NCOMP_PASSIVE > 0 ) - H5Tinsert( H5_TypeID, "IntFracPassive_VarIdx", HOFFSET(InputPara_t,IntFracPassive_VarIdx ), H5_TypeID_Arr_NPassive ); -# endif - -// store the name of all fields - for (int v=0; v 0) || !Load_RS ) { -// key for each field - sprintf( Key, "MagLabel%02d", v ); - -// assuming the offset between successive MagLabel pointers is "PtrSize", which is equal to "sizeof( char* )" - H5Tinsert( H5_TypeID, Key, HOFFSET(InputPara_t,MagLabel[0])+v*PtrSize, H5_TypeID_VarStr ); + HDF5_InputPara->Add( "FlagTable_EngyDensity", &FlagTable_EngyDensity [0][0], 2, H5_Arr_Lv_2, Compare_Flag_EngyDens, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "FlagTable_Spectral", &FlagTable_Spectral [0][0], 2, H5_Arr_Lv_2, Compare_Flag_Spectral, Fatal_No, Fatal_No ); } -# endif - - H5Tinsert( H5_TypeID, "Opt__OverlapMPI", HOFFSET(InputPara_t,Opt__OverlapMPI ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__ResetFluid", HOFFSET(InputPara_t,Opt__ResetFluid ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__ResetFluidInit", HOFFSET(InputPara_t,Opt__ResetFluidInit ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__FreezeFluid", HOFFSET(InputPara_t,Opt__FreezeFluid ), H5T_NATIVE_INT ); -# if ( MODEL == HYDRO || MODEL == ELBDM ) - H5Tinsert( H5_TypeID, "MinDens", HOFFSET(InputPara_t,MinDens ), H5T_NATIVE_DOUBLE ); -# endif -# if ( MODEL == HYDRO ) - H5Tinsert( H5_TypeID, "MinPres", HOFFSET(InputPara_t,MinPres ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "MinEint", HOFFSET(InputPara_t,MinEint ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "MinTemp", HOFFSET(InputPara_t,MinTemp ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "MinEntr", HOFFSET(InputPara_t,MinEntr ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Opt__CheckPresAfterFlu", HOFFSET(InputPara_t,Opt__CheckPresAfterFlu ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__LastResortFloor", HOFFSET(InputPara_t,Opt__LastResortFloor ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "JeansMinPres", HOFFSET(InputPara_t,JeansMinPres ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "JeansMinPres_Level", HOFFSET(InputPara_t,JeansMinPres_Level ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "JeansMinPres_NCell", HOFFSET(InputPara_t,JeansMinPres_NCell ), H5T_NATIVE_INT ); -# endif - -// self-gravity -# ifdef GRAVITY - H5Tinsert( H5_TypeID, "NewtonG", HOFFSET(InputPara_t,NewtonG ), H5T_NATIVE_DOUBLE ); -# if ( POT_SCHEME == SOR ) - H5Tinsert( H5_TypeID, "SOR_Omega", HOFFSET(InputPara_t,SOR_Omega ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "SOR_MaxIter", HOFFSET(InputPara_t,SOR_MaxIter ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "SOR_MinIter", HOFFSET(InputPara_t,SOR_MinIter ), H5T_NATIVE_INT ); -# elif ( POT_SCHEME == MG ) - H5Tinsert( H5_TypeID, "MG_MaxIter", HOFFSET(InputPara_t,MG_MaxIter ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "MG_NPreSmooth", HOFFSET(InputPara_t,MG_NPreSmooth ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "MG_NPostSmooth", HOFFSET(InputPara_t,MG_NPostSmooth ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "MG_ToleratedError", HOFFSET(InputPara_t,MG_ToleratedError ), H5T_NATIVE_DOUBLE ); -# endif - H5Tinsert( H5_TypeID, "Pot_GPU_NPGroup", HOFFSET(InputPara_t,Pot_GPU_NPGroup ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__GraP5Gradient", HOFFSET(InputPara_t,Opt__GraP5Gradient ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__SelfGravity", HOFFSET(InputPara_t,Opt__SelfGravity ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__ExtAcc", HOFFSET(InputPara_t,Opt__ExtAcc ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__ExtPot", HOFFSET(InputPara_t,Opt__ExtPot ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "ExtPotTable_Name", HOFFSET(InputPara_t,ExtPotTable_Name ), H5_TypeID_VarStr ); - H5Tinsert( H5_TypeID, "ExtPotTable_NPoint", HOFFSET(InputPara_t,ExtPotTable_NPoint ), H5_TypeID_Arr_3Int ); - H5Tinsert( H5_TypeID, "ExtPotTable_dh", HOFFSET(InputPara_t,ExtPotTable_dh ), H5_TypeID_Arr_3Double ); - H5Tinsert( H5_TypeID, "ExtPotTable_EdgeL", HOFFSET(InputPara_t,ExtPotTable_EdgeL ), H5_TypeID_Arr_3Double ); - H5Tinsert( H5_TypeID, "ExtPotTable_Float8", HOFFSET(InputPara_t,ExtPotTable_Float8 ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__GravityExtraMass", HOFFSET(InputPara_t,Opt__GravityExtraMass ), H5T_NATIVE_INT ); -# endif // #ifdef GRAVITY - -// source terms - H5Tinsert( H5_TypeID, "Src_Deleptonization", HOFFSET(InputPara_t,Src_Deleptonization ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Src_User", HOFFSET(InputPara_t,Src_User ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Src_GPU_NPGroup", HOFFSET(InputPara_t,Src_GPU_NPGroup ), H5T_NATIVE_INT ); - -// Grackle -# ifdef SUPPORT_GRACKLE - H5Tinsert( H5_TypeID, "Grackle_Activate", HOFFSET(InputPara_t,Grackle_Activate ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Grackle_Verbose", HOFFSET(InputPara_t,Grackle_Verbose ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Grackle_Cooling", HOFFSET(InputPara_t,Grackle_Cooling ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Grackle_Primordial", HOFFSET(InputPara_t,Grackle_Primordial ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Grackle_Metal", HOFFSET(InputPara_t,Grackle_Metal ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Grackle_UV", HOFFSET(InputPara_t,Grackle_UV ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Grackle_CMB_Floor", HOFFSET(InputPara_t,Grackle_CMB_Floor ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Grackle_PE_Heating", HOFFSET(InputPara_t,Grackle_PE_Heating ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Grackle_PE_HeatingRate", HOFFSET(InputPara_t,Grackle_PE_HeatingRate ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Grackle_CloudyTable", HOFFSET(InputPara_t,Grackle_CloudyTable ), H5_TypeID_VarStr ); - H5Tinsert( H5_TypeID, "Grackle_ThreeBodyRate", HOFFSET(InputPara_t,Grackle_ThreeBodyRate ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Grackle_CIE_Cooling", HOFFSET(InputPara_t,Grackle_CIE_Cooling ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Grackle_H2_OpaApprox", HOFFSET(InputPara_t,Grackle_H2_OpaApprox ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Che_GPU_NPGroup", HOFFSET(InputPara_t,Che_GPU_NPGroup ), H5T_NATIVE_INT ); -# endif - -// star formation -# ifdef STAR_FORMATION - H5Tinsert( H5_TypeID, "SF_CreateStar_Scheme", HOFFSET(InputPara_t,SF_CreateStar_Scheme ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "SF_CreateStar_RSeed", HOFFSET(InputPara_t,SF_CreateStar_RSeed ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "SF_CreateStar_DetRandom", HOFFSET(InputPara_t,SF_CreateStar_DetRandom ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "SF_CreateStar_MinLevel", HOFFSET(InputPara_t,SF_CreateStar_MinLevel ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "SF_CreateStar_MinGasDens", HOFFSET(InputPara_t,SF_CreateStar_MinGasDens ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "SF_CreateStar_MassEff", HOFFSET(InputPara_t,SF_CreateStar_MassEff ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "SF_CreateStar_MinStarMass", HOFFSET(InputPara_t,SF_CreateStar_MinStarMass ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "SF_CreateStar_MaxStarMFrac", HOFFSET(InputPara_t,SF_CreateStar_MaxStarMFrac ), H5T_NATIVE_DOUBLE ); -# endif - -// feedback -# ifdef FEEDBACK - H5Tinsert( H5_TypeID, "FB_Level", HOFFSET(InputPara_t,FB_Level ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "FB_RSeed", HOFFSET(InputPara_t,FB_RSeed ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "FB_SNe", HOFFSET(InputPara_t,FB_SNe ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "FB_User", HOFFSET(InputPara_t,FB_User ), H5T_NATIVE_INT ); -# endif - -// cosmic ray -# ifdef COSMIC_RAY - H5Tinsert( H5_TypeID, "CR_Gamma", HOFFSET(InputPara_t,CR_Gamma ), H5T_NATIVE_DOUBLE ); -# ifdef CR_DIFFUSION - H5Tinsert( H5_TypeID, "CR_Diffusion_ParaCoeff", HOFFSET(InputPara_t,CR_Diffusion_ParaCoeff ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "CR_Diffusion_PerpCoeff", HOFFSET(InputPara_t,CR_Diffusion_PerpCoeff ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "CR_Diffusion_MinB", HOFFSET(InputPara_t,CR_Diffusion_MinB ), H5T_NATIVE_DOUBLE ); -# endif -# endif // #ifdef COSMIC_RAY - -// initialization - H5Tinsert( H5_TypeID, "Opt__Init", HOFFSET(InputPara_t,Opt__Init ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "RestartLoadNRank", HOFFSET(InputPara_t,RestartLoadNRank ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__RestartReset", HOFFSET(InputPara_t,Opt__RestartReset ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__UM_IC_Level", HOFFSET(InputPara_t,Opt__UM_IC_Level ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__UM_IC_NLevel", HOFFSET(InputPara_t,Opt__UM_IC_NLevel ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__UM_IC_NVar", HOFFSET(InputPara_t,Opt__UM_IC_NVar ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__UM_IC_Format", HOFFSET(InputPara_t,Opt__UM_IC_Format ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__UM_IC_Float8", HOFFSET(InputPara_t,Opt__UM_IC_Float8 ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__UM_IC_Downgrade", HOFFSET(InputPara_t,Opt__UM_IC_Downgrade ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__UM_IC_Refine", HOFFSET(InputPara_t,Opt__UM_IC_Refine ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__UM_IC_LoadNRank", HOFFSET(InputPara_t,Opt__UM_IC_LoadNRank ), H5T_NATIVE_INT ); -# if ( NLEVEL > 1 ) - H5Tinsert( H5_TypeID, "UM_IC_RefineRegion", HOFFSET(InputPara_t,UM_IC_RefineRegion ), H5_TypeID_Arr_NLvM1_6Int ); -# endif - H5Tinsert( H5_TypeID, "Opt__InitRestrict", HOFFSET(InputPara_t,Opt__InitRestrict ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__InitGridWithOMP", HOFFSET(InputPara_t,Opt__InitGridWithOMP ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__GPUID_Select", HOFFSET(InputPara_t,Opt__GPUID_Select ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Init_Subsampling_NCell", HOFFSET(InputPara_t,Init_Subsampling_NCell ), H5T_NATIVE_INT ); -# ifdef MHD - H5Tinsert( H5_TypeID, "Opt__InitBFieldByVecPot", HOFFSET(InputPara_t,Opt__InitBFieldByVecPot ), H5T_NATIVE_INT ); -# endif -# ifdef SUPPORT_FFTW - H5Tinsert( H5_TypeID, "Opt__FFTW_Startup", HOFFSET(InputPara_t,Opt__FFTW_Startup ), H5T_NATIVE_INT ); -# endif - -// interpolation schemes - H5Tinsert( H5_TypeID, "Opt__Int_Time", HOFFSET(InputPara_t,Opt__Int_Time ), H5T_NATIVE_INT ); -# if ( MODEL == HYDRO ) - H5Tinsert( H5_TypeID, "Opt__Int_Prim", HOFFSET(InputPara_t,Opt__Int_Prim ), H5T_NATIVE_INT ); -# endif -# if ( MODEL == ELBDM ) - H5Tinsert( H5_TypeID, "Opt__Int_Phase", HOFFSET(InputPara_t,Opt__Int_Phase ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Res_Phase", HOFFSET(InputPara_t,Opt__Res_Phase ), H5T_NATIVE_INT ); # if ( ELBDM_SCHEME == ELBDM_HYBRID ) - H5Tinsert( H5_TypeID, "Opt__Hybrid_Match_Phase", HOFFSET(InputPara_t,Opt__Hybrid_Match_Phase), H5T_NATIVE_INT ); -# endif -# endif // ELBDM - H5Tinsert( H5_TypeID, "Opt__Flu_IntScheme", HOFFSET(InputPara_t,Opt__Flu_IntScheme ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__RefFlu_IntScheme", HOFFSET(InputPara_t,Opt__RefFlu_IntScheme ), H5T_NATIVE_INT ); -# ifdef MHD - H5Tinsert( H5_TypeID, "Opt__Mag_IntScheme", HOFFSET(InputPara_t,Opt__Mag_IntScheme ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__RefMag_IntScheme", HOFFSET(InputPara_t,Opt__RefMag_IntScheme ), H5T_NATIVE_INT ); -# endif -# ifdef GRAVITY - H5Tinsert( H5_TypeID, "Opt__Pot_IntScheme", HOFFSET(InputPara_t,Opt__Pot_IntScheme ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Rho_IntScheme", HOFFSET(InputPara_t,Opt__Rho_IntScheme ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Gra_IntScheme", HOFFSET(InputPara_t,Opt__Gra_IntScheme ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__RefPot_IntScheme", HOFFSET(InputPara_t,Opt__RefPot_IntScheme ), H5T_NATIVE_INT ); -# endif - H5Tinsert( H5_TypeID, "IntMonoCoeff", HOFFSET(InputPara_t,IntMonoCoeff ), H5T_NATIVE_DOUBLE ); -# ifdef MHD - H5Tinsert( H5_TypeID, "IntMonoCoeffB", HOFFSET(InputPara_t,IntMonoCoeffB ), H5T_NATIVE_DOUBLE ); -# endif - H5Tinsert( H5_TypeID, "Mono_MaxIter", HOFFSET(InputPara_t,Mono_MaxIter ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "IntOppSign0thOrder", HOFFSET(InputPara_t,IntOppSign0thOrder ), H5T_NATIVE_INT ); -# ifdef SUPPORT_SPECTRAL_INT - H5Tinsert( H5_TypeID, "SpecInt_TablePath", HOFFSET(InputPara_t,SpecInt_TablePath ), H5_TypeID_VarStr ); - H5Tinsert( H5_TypeID, "SpecInt_GhostBoundary", HOFFSET(InputPara_t,SpecInt_GhostBoundary ), H5T_NATIVE_INT ); -# if ( MODEL == ELBDM ) - H5Tinsert( H5_TypeID, "SpecInt_XY_Instead_DePha",HOFFSET(InputPara_t,SpecInt_XY_Instead_DePha),H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "SpecInt_VortexThreshold", HOFFSET(InputPara_t,SpecInt_VortexThreshold), H5T_NATIVE_DOUBLE ); -# endif -# endif // #ifdef SUPPORT_SPECTRAL_INT - -// data dump - H5Tinsert( H5_TypeID, "Opt__Output_Total", HOFFSET(InputPara_t,Opt__Output_Total ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Output_Part", HOFFSET(InputPara_t,Opt__Output_Part ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Output_User", HOFFSET(InputPara_t,Opt__Output_User ), H5T_NATIVE_INT ); -# ifdef PARTICLE - H5Tinsert( H5_TypeID, "Opt__Output_Par_Mode", HOFFSET(InputPara_t,Opt__Output_Par_Mode ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Output_Par_Mesh", HOFFSET(InputPara_t,Opt__Output_Par_Mesh ), H5T_NATIVE_INT ); -# endif - H5Tinsert( H5_TypeID, "Opt__Output_BasePS", HOFFSET(InputPara_t,Opt__Output_BasePS ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Output_Base", HOFFSET(InputPara_t,Opt__Output_Base ), H5T_NATIVE_INT ); -# ifdef GRAVITY - H5Tinsert( H5_TypeID, "Opt__Output_Pot", HOFFSET(InputPara_t,Opt__Output_Pot ), H5T_NATIVE_INT ); -# endif -# ifdef PARTICLE - H5Tinsert( H5_TypeID, "Opt__Output_ParDens", HOFFSET(InputPara_t,Opt__Output_ParDens ), H5T_NATIVE_INT ); -# endif -# ifdef MHD - H5Tinsert( H5_TypeID, "Opt__Output_CC_Mag", HOFFSET(InputPara_t,Opt__Output_CC_Mag ), H5T_NATIVE_INT ); -# endif -# if ( MODEL == HYDRO ) - H5Tinsert( H5_TypeID, "Opt__Output_Pres", HOFFSET(InputPara_t,Opt__Output_Pres ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Output_Temp", HOFFSET(InputPara_t,Opt__Output_Temp ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Output_Entr", HOFFSET(InputPara_t,Opt__Output_Entr ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Output_Cs", HOFFSET(InputPara_t,Opt__Output_Cs ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Output_DivVel", HOFFSET(InputPara_t,Opt__Output_DivVel ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Output_Mach", HOFFSET(InputPara_t,Opt__Output_Mach ), H5T_NATIVE_INT ); -# ifdef MHD - H5Tinsert( H5_TypeID, "Opt__Output_DivMag", HOFFSET(InputPara_t,Opt__Output_DivMag ), H5T_NATIVE_INT ); -# endif -# ifdef SRHD - H5Tinsert( H5_TypeID, "Opt__Output_3Velocity", HOFFSET(InputPara_t,Opt__Output_3Velocity ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Output_Lorentz", HOFFSET(InputPara_t,Opt__Output_Lorentz ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Output_Enthalpy", HOFFSET(InputPara_t,Opt__Output_Enthalpy ), H5T_NATIVE_INT ); -# endif -# endif // #if ( MODEL == HYDRO ) - H5Tinsert( H5_TypeID, "Opt__Output_UserField", HOFFSET(InputPara_t,Opt__Output_UserField ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Output_Mode", HOFFSET(InputPara_t,Opt__Output_Mode ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Output_Restart", HOFFSET(InputPara_t,Opt__Output_Restart ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Output_Step", HOFFSET(InputPara_t,Opt__Output_Step ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Output_Dt", HOFFSET(InputPara_t,Opt__Output_Dt ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Opt__Output_Text_Format_Flt", HOFFSET(InputPara_t,Opt__Output_Text_Format_Flt), H5_TypeID_VarStr ); - H5Tinsert( H5_TypeID, "Opt__Output_Text_Length_Int", HOFFSET(InputPara_t,Opt__Output_Text_Length_Int), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Output_PartX", HOFFSET(InputPara_t,Output_PartX ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Output_PartY", HOFFSET(InputPara_t,Output_PartY ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Output_PartZ", HOFFSET(InputPara_t,Output_PartZ ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "InitDumpID", HOFFSET(InputPara_t,InitDumpID ), H5T_NATIVE_INT ); + const bool Compare_Flag_Interfer = ( OPT__FLAG_INTERFERENCE ) ? Compare_Yes : Compare_No; + if ( (Load_RS && MAX_LEVEL > 0) || !Load_RS ) + HDF5_InputPara->Add( "FlagTable_Interference", &FlagTable_Interference[0][0], 2, H5_Arr_Lv_4, Compare_Flag_Interfer, Fatal_No, Fatal_No ); +# endif // #if ( ELBDM_SCHEME == ELBDM_HYBRID ) +# endif // #elif ( MODEL == ELBDM ) -// libyt jupyter -# if ( defined(SUPPORT_LIBYT) && defined(LIBYT_JUPYTER) ) - H5Tinsert( H5_TypeID, "Yt_JupyterUseConnectionFile", HOFFSET(InputPara_t,Yt_JupyterUseConnectionFile), H5T_NATIVE_INT ); -# endif - -// miscellaneous - H5Tinsert( H5_TypeID, "Opt__Verbose", HOFFSET(InputPara_t,Opt__Verbose ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__TimingBarrier", HOFFSET(InputPara_t,Opt__TimingBarrier ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__TimingBalance", HOFFSET(InputPara_t,Opt__TimingBalance ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__TimingMPI", HOFFSET(InputPara_t,Opt__TimingMPI ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__RecordNote", HOFFSET(InputPara_t,Opt__RecordNote ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__RecordUnphy", HOFFSET(InputPara_t,Opt__RecordUnphy ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__RecordMemory", HOFFSET(InputPara_t,Opt__RecordMemory ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__RecordPerformance", HOFFSET(InputPara_t,Opt__RecordPerformance ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__ManualControl", HOFFSET(InputPara_t,Opt__ManualControl ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__RecordCenter", HOFFSET(InputPara_t,Opt__RecordCenter ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "COM_CenX", HOFFSET(InputPara_t,COM_CenX ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "COM_CenY", HOFFSET(InputPara_t,COM_CenY ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "COM_CenZ", HOFFSET(InputPara_t,COM_CenZ ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "COM_MaxR", HOFFSET(InputPara_t,COM_MaxR ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "COM_MinRho", HOFFSET(InputPara_t,COM_MinRho ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "COM_TolErrR", HOFFSET(InputPara_t,COM_TolErrR ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "COM_MaxIter", HOFFSET(InputPara_t,COM_MaxIter ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__RecordUser", HOFFSET(InputPara_t,Opt__RecordUser ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__OptimizeAggressive", HOFFSET(InputPara_t,Opt__OptimizeAggressive), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__SortPatchByLBIdx", HOFFSET(InputPara_t,Opt__SortPatchByLBIdx ), H5T_NATIVE_INT ); - -// simulation checks - H5Tinsert( H5_TypeID, "Opt__Ck_Refine", HOFFSET(InputPara_t,Opt__Ck_Refine ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Ck_ProperNesting", HOFFSET(InputPara_t,Opt__Ck_ProperNesting ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Ck_Conservation", HOFFSET(InputPara_t,Opt__Ck_Conservation ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "AngMom_OriginX", HOFFSET(InputPara_t,AngMom_OriginX ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "AngMom_OriginY", HOFFSET(InputPara_t,AngMom_OriginY ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "AngMom_OriginZ", HOFFSET(InputPara_t,AngMom_OriginZ ), H5T_NATIVE_DOUBLE ); - H5Tinsert( H5_TypeID, "Opt__Ck_NormPassive", HOFFSET(InputPara_t,Opt__Ck_NormPassive ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Ck_Restrict", HOFFSET(InputPara_t,Opt__Ck_Restrict ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Ck_Finite", HOFFSET(InputPara_t,Opt__Ck_Finite ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Ck_PatchAllocate", HOFFSET(InputPara_t,Opt__Ck_PatchAllocate ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Ck_FluxAllocate", HOFFSET(InputPara_t,Opt__Ck_FluxAllocate ), H5T_NATIVE_INT ); -# if ( MODEL == HYDRO ) - H5Tinsert( H5_TypeID, "Opt__Ck_Negative", HOFFSET(InputPara_t,Opt__Ck_Negative ), H5T_NATIVE_INT ); -# endif - H5Tinsert( H5_TypeID, "Opt__Ck_MemFree", HOFFSET(InputPara_t,Opt__Ck_MemFree ), H5T_NATIVE_DOUBLE ); # ifdef PARTICLE - H5Tinsert( H5_TypeID, "Opt__Ck_Particle", HOFFSET(InputPara_t,Opt__Ck_Particle ), H5T_NATIVE_INT ); -# endif -# ifdef MHD - H5Tinsert( H5_TypeID, "Opt__Ck_InterfaceB", HOFFSET(InputPara_t,Opt__Ck_InterfaceB ), H5T_NATIVE_INT ); - H5Tinsert( H5_TypeID, "Opt__Ck_DivergenceB", HOFFSET(InputPara_t,Opt__Ck_DivergenceB ), H5T_NATIVE_INT ); -# endif - H5Tinsert( H5_TypeID, "Opt__Ck_InputFluid", HOFFSET(InputPara_t,Opt__Ck_InputFluid ), H5T_NATIVE_INT ); - -// flag tables -# if ( NLEVEL > 1 ) - H5Tinsert( H5_TypeID, "FlagTable_Rho", HOFFSET(InputPara_t,FlagTable_Rho ), H5_TypeID_Arr_NLvM1Double ); - H5Tinsert( H5_TypeID, "FlagTable_RhoGradient", HOFFSET(InputPara_t,FlagTable_RhoGradient ), H5_TypeID_Arr_NLvM1Double ); - H5Tinsert( H5_TypeID, "FlagTable_Lohner", HOFFSET(InputPara_t,FlagTable_Lohner ), H5_TypeID_Arr_NLvM1_5Double ); - H5Tinsert( H5_TypeID, "FlagTable_Angular", HOFFSET(InputPara_t,FlagTable_Angular ), H5_TypeID_Arr_NLvM1_3Double ); - H5Tinsert( H5_TypeID, "FlagTable_Radial", HOFFSET(InputPara_t,FlagTable_Radial ), H5_TypeID_Arr_NLvM1Double ); - -// store the user-defined thresholds at all levels - for (int lv=0; lv 0) || !Load_RS ) { -// key for each level - sprintf( Key, "FlagTable_User_Lv%02d", lv ); - -// assuming the offset between successive FlagTable_User pointers is "PtrSize_hvl", which is equal to "sizeof( hvl_t )" - H5Tinsert( H5_TypeID, Key, HOFFSET(InputPara_t,FlagTable_User)+lv*PtrSize_hvl, H5_TypeID_Arr_NLvM1_VLDouble ); + HDF5_InputPara->Add( "FlagTable_NParPatch", &FlagTable_NParPatch [0], 1, H5_Arr_Lv, Compare_Flag_NParPatch, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "FlagTable_NParCell", &FlagTable_NParCell [0], 1, H5_Arr_Lv, Compare_Flag_NParCell, Fatal_No, Fatal_No ); + HDF5_InputPara->Add( "FlagTable_ParMassCell", &FlagTable_ParMassCell [0], 1, H5_Arr_Lv, Compare_Flag_ParMassCell, Fatal_No, Fatal_No ); } - -# if ( MODEL == HYDRO ) - H5Tinsert( H5_TypeID, "FlagTable_PresGradient", HOFFSET(InputPara_t,FlagTable_PresGradient ), H5_TypeID_Arr_NLvM1Double ); - H5Tinsert( H5_TypeID, "FlagTable_Vorticity", HOFFSET(InputPara_t,FlagTable_Vorticity ), H5_TypeID_Arr_NLvM1Double ); - H5Tinsert( H5_TypeID, "FlagTable_Jeans", HOFFSET(InputPara_t,FlagTable_Jeans ), H5_TypeID_Arr_NLvM1Double ); -# ifdef MHD - H5Tinsert( H5_TypeID, "FlagTable_Current", HOFFSET(InputPara_t,FlagTable_Current ), H5_TypeID_Arr_NLvM1Double ); -# endif -# ifdef SRHD - H5Tinsert( H5_TypeID, "FlagTable_LrtzGradient", HOFFSET(InputPara_t,FlagTable_LrtzGradient ), H5_TypeID_Arr_NLvM1Double ); -# endif -# ifdef COSMIC_RAY - H5Tinsert( H5_TypeID, "FlagTable_CRay", HOFFSET(InputPara_t,FlagTable_CRay ), H5_TypeID_Arr_NLvM1Double ); -# endif -# elif ( MODEL == ELBDM ) - H5Tinsert( H5_TypeID, "FlagTable_EngyDensity", HOFFSET(InputPara_t,FlagTable_EngyDensity ), H5_TypeID_Arr_NLvM1_2Double ); - H5Tinsert( H5_TypeID, "FlagTable_Spectral", HOFFSET(InputPara_t,FlagTable_Spectral ), H5_TypeID_Arr_NLvM1_2Double ); -# if ( ELBDM_SCHEME == ELBDM_HYBRID ) - H5Tinsert( H5_TypeID, "FlagTable_Interference", HOFFSET(InputPara_t,FlagTable_Interference ), H5_TypeID_Arr_NLvM1_4Double ); -# endif -# endif // MODEL -# ifdef PARTICLE - H5Tinsert( H5_TypeID, "FlagTable_NParPatch", HOFFSET(InputPara_t,FlagTable_NParPatch ), H5_TypeID_Arr_NLvM1Int ); - H5Tinsert( H5_TypeID, "FlagTable_NParCell", HOFFSET(InputPara_t,FlagTable_NParCell ), H5_TypeID_Arr_NLvM1Int ); - H5Tinsert( H5_TypeID, "FlagTable_ParMassCell", HOFFSET(InputPara_t,FlagTable_ParMassCell ), H5_TypeID_Arr_NLvM1Double ); # endif # endif // #if ( NLEVEL > 1 ) -// user-defined derived fields - H5Tinsert( H5_TypeID, "UserDerField_Num", HOFFSET(InputPara_t,UserDerField_Num ), H5T_NATIVE_INT ); -// --> only need to insert UserDerField_Num strings even though *UserDerField_Label/Unit are pointer arrays with -// a size DER_NOUT_MAX in InputPara_t -// --> it should be fine as long as the "offset" (i.e., HOFFSET(InputPara_t,UserDerField_Label[0])+v*PtrSize) is correct +// user derived fields +// ---------------------------------------------------------------------------------------------------- + HDF5_InputPara->Add( "UserDerField_Num", &UserDerField_Num, 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); for (int v=0; vAdd( Key, &UserDerField_Label[v][0], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); } - for (int v=0; vAdd( Key, &UserDerField_Unit [v][0], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); } - -// free memory - H5_Status = H5Tclose( H5_TypeID_Arr_3Int ); - H5_Status = H5Tclose( H5_TypeID_Arr_6Int ); -# if ( NCOMP_PASSIVE > 0 ) - H5_Status = H5Tclose( H5_TypeID_Arr_NPassive ); -# endif -# if ( NLEVEL > 1 ) - H5_Status = H5Tclose( H5_TypeID_Arr_NLvM1Int ); - H5_Status = H5Tclose( H5_TypeID_Arr_NLvM1Double ); - H5_Status = H5Tclose( H5_TypeID_Arr_NLvM1_2Double ); - H5_Status = H5Tclose( H5_TypeID_Arr_NLvM1_3Double ); - H5_Status = H5Tclose( H5_TypeID_Arr_NLvM1_4Double ); - H5_Status = H5Tclose( H5_TypeID_Arr_NLvM1_5Double ); - H5_Status = H5Tclose( H5_TypeID_Arr_NLvM1_VLDouble ); -# endif - H5_Status = H5Tclose( H5_TypeID_Arr_3Double ); - H5_Status = H5Tclose( H5_TypeID_VarStr ); - -} // FUNCTION : GetCompound_InputPara - - - -//------------------------------------------------------------------------------------------------------- -// Function : GetCompound_General -// Description : Create the HDF5 compound datatype for HDF5_Output_t -// -// Note : 1. HDF5_Output_t is defined in HDF5_Typedef.h -// 2. Support int, long, uint, ulong, float, double, and string datatypes -// -// Parameter : H5_TypeID : HDF5 type ID for storing the compound datatype -// HDF5_Output : Structure storing all parameters to be written -//------------------------------------------------------------------------------------------------------- -void GetCompound_General( hid_t &H5_TypeID, const HDF5_Output_t *HDF5_Output ) -{ - - if ( HDF5_Output->TotalSize == 0 ) Aux_Error( ERROR_INFO, "HDF5_Output_t structure must not be empty !!\n" ); - - herr_t H5_Status; - hid_t H5_Type; - hid_t H5_TypeID_VarStr = H5Tcopy( H5T_C_S1 ); - - H5_Status = H5Tset_size( H5_TypeID_VarStr, MAX_STRING ); // H5T_VARIABLE will cause segmentation fault - H5_TypeID = H5Tcreate( H5T_COMPOUND, HDF5_Output->TotalSize ); - - size_t offset = 0; - - for (int i=0; iNPara; i++) - { - const int type = HDF5_Output->Type[i]; - switch ( type ) - { -// must match TYPE_* defined in HDF5_Typedef.h - case 1: H5_Type = H5T_NATIVE_INT; break; - case 2: H5_Type = H5T_NATIVE_LONG; break; - case 3: H5_Type = H5T_NATIVE_UINT; break; - case 4: H5_Type = H5T_NATIVE_ULONG; break; - case 5: H5_Type = H5T_NATIVE_INT; break; // bool is stored as int - case 6: H5_Type = H5T_NATIVE_FLOAT; break; - case 7: H5_Type = H5T_NATIVE_DOUBLE; break; - case 8: H5_Type = H5_TypeID_VarStr; break; - default: Aux_Error( ERROR_INFO, "Unrecognized type: %d !!\n", type ); break; - } // switch ( type ) - - H5Tinsert( H5_TypeID, HDF5_Output->Key[i], offset, H5_Type ); - offset += HDF5_Output->TypeSize[i]; - - } // for (int i=0; iNPara; i++) - H5_Status = H5Tclose( H5_TypeID_VarStr ); - -} // FUNCTION : GetCompound_General - - - -//------------------------------------------------------------------------------------------------------- -// Function : H5_write_compound -// Description : Write all parameters in HDF5_Output to an HDF5 compound dataset -// -// Note : 1. HDF5_Output_t is defined in HDF5_Typedef.h -// 2. Support int, long, uint, ulong, float, double, and string datatypes -// -// Parameter : H5_SetID : HDF5 dataset ID -// H5_TypeID : HDF5 compound type ID associated with HDF5_Output -// HDF5_Output : Structure storing all parameters to be written -// -// Return : H5_Status_write : Status of the write operation -//------------------------------------------------------------------------------------------------------- -herr_t H5_write_compound( const hid_t H5_SetID, const hid_t H5_TypeID, const HDF5_Output_t *HDF5_Output ) -{ - - herr_t H5_Status, H5_Status_write; - hid_t H5_TypeID_VarStr; - hid_t H5_Type; - - H5_TypeID_VarStr = H5Tcopy( H5T_C_S1 ); - H5_Status = H5Tset_size( H5_TypeID_VarStr, MAX_STRING ); // H5T_VARIABLE will cause segmentation fault - - char *data = new char [HDF5_Output->TotalSize]; - size_t offset = 0; - - for (int i=0; iNPara; i++) - { - const int type = HDF5_Output->Type [i]; - const size_t type_size = HDF5_Output->TypeSize[i]; - switch ( type ) - { -// must match TYPE_* defined in HDF5_Typedef.h - case 1: H5_Type = H5T_NATIVE_INT; break; - case 2: H5_Type = H5T_NATIVE_LONG; break; - case 3: H5_Type = H5T_NATIVE_UINT; break; - case 4: H5_Type = H5T_NATIVE_ULONG; break; - case 5: H5_Type = H5T_NATIVE_INT; break; // bool is stored as int - case 6: H5_Type = H5T_NATIVE_FLOAT; break; - case 7: H5_Type = H5T_NATIVE_DOUBLE; break; - case 8: H5_Type = H5_TypeID_VarStr; break; - default: Aux_Error( ERROR_INFO, "Unrecognized type: %d !!\n", type ); break; - } // switch ( type ) - - if ( type == 5 ) - { -// convert int to bool - const int temp = ( *(bool *)(HDF5_Output->Ptr[i]) ) ? 1 : 0; - - memcpy( data+offset, &temp, type_size ); - } - else - memcpy( data+offset, HDF5_Output->Ptr[i], type_size ); - - offset += type_size; - } // for (int i=0; iNPara; i++) - - H5_Status_write = H5Dwrite( H5_SetID, H5_TypeID, H5S_ALL, H5S_ALL, H5P_DEFAULT, data ); - - H5_Status = H5Tclose( H5_TypeID_VarStr ); - - delete [] data; - - return H5_Status_write; - -} // FUNCTION : H5_write_compound +} // FUNCTION : FillIn_HDF5_InputPara @@ -4165,11 +3179,15 @@ herr_t H5_write_compound( const hid_t H5_SetID, const hid_t H5_TypeID, const HDF // Function : Output_HDF5_UserPara_Template // Description : Template for storing user-specified parameters in an HDF5 snapshot at User/UserPara // -// Note : 1. This function is only called by the root MPI rank -// 2. Support int, uint, long, ulong, bool, float, double, and string datatypes +// Note : 1. This function is only called by the root MPI rank +// 2. Support int, uint, long, ulong, bool, float, double, string, and their corresponding array types // 3. HDF5_UserPara MUST store at least one parameter -// 4. The data pointer (i.e., the second argument passed to HDF5_UserPara->Add()) MUST persist outside this function (e.g., global variables) +// 4. The second argument passed to HDF5_UserPara->Add() can be: +// a. pointer : Support int, uint, long, ulong, bool, float, double, and string datatypes +// b. variable : Support int, uint, long, ulong, bool, float, and double datatypes // 5. Linked to the function pointer Output_HDF5_UserPara_Ptr +// 6. The string size MUST be `MAX_STRING` +// 7. The memeory space of the array MUST be continuous // // Parameter : HDF5_UserPara : Structure storing all parameters to be written // @@ -4178,7 +3196,25 @@ herr_t H5_write_compound( const hid_t H5_SetID, const hid_t H5_TypeID, const HDF void Output_HDF5_UserPara_Template( HDF5_Output_t *HDF5_UserPara ) { -// HDF5_UserPara->Add( "Your_Data_Label", &Your_Data_Pointer ); + const bool Compare_Yes = true, Compare_No = false; + const bool Fatal_Yes = true, Fatal_No = false; + + int ArrLen_1D[1] = {3}; + int ArrLen_2D[2] = {2, 3}; + + long long_data = 1L; + int IntArr_1D[4] = {1, 2, 3, 4}; + double DblArr_2D[2][3] = { {1., 2., 3.}, {4., 5., 6.}}; + char StrArr_2D[2][3][MAX_STRING] = { {"1", "2", "3"}, {"4", "5", "6"}}; + +// example +// HDF5_UserPara->Add( "Your_Data1_Label", &Your_Data1_Pointer, arr_dim, arr_len, compare_or_not, fatal_exist, fatal_comapre ); +// HDF5_UserPara->Add( "Your_Data2_Label", const_var, 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + + HDF5_UserPara->Add( "const_long_data", &long_data, 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( "int_1D_array", &IntArr_1D[0], 1, ArrLen_1D, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( "double_2D_array", &DblArr_2D[0][0], 2, ArrLen_2D, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( "string_2D_array", &StrArr_2D[0][0][0], 2, ArrLen_2D, Compare_No, NULL_BOOL, NULL_BOOL ); } // FUNCTION : Output_HDF5_UserPara_Template diff --git a/src/TestProblem/ELBDM/HaloMerger/Init_TestProb_ELBDM_HaloMerger.cpp b/src/TestProblem/ELBDM/HaloMerger/Init_TestProb_ELBDM_HaloMerger.cpp index cb896003ec..319a8d89b0 100644 --- a/src/TestProblem/ELBDM/HaloMerger/Init_TestProb_ELBDM_HaloMerger.cpp +++ b/src/TestProblem/ELBDM/HaloMerger/Init_TestProb_ELBDM_HaloMerger.cpp @@ -1393,11 +1393,15 @@ void SetGridIC( real fluid[], const double x, const double y, const double z, co // Function : Output_HDF5_UserPara_HaloMerger // Description : Store user-specified parameters in an HDF5 snapshot at User/UserPara // -// Note : 1. This function is only called by the root MPI rank -// 2. Support int, uint, long, ulong, bool, float, double, and string datatypes -// 3. HDF5_UserPara MUST store at least one parameter -// 4. The data pointer (i.e., the second argument passed to HDF5_UserPara->Add()) MUST persist outside this function (e.g., global variables) -// 5. Linked to the function pointer Output_HDF5_UserPara_Ptr +// Note : 1. This function is only called by the root MPI rank +// 2. Support int, uint, long, ulong, bool, float, double, string, and their corresponding array types +// 3. HDF5_UserPara MUST store at least one parameter +// 4. The second argument passed to HDF5_UserPara->Add() can be: +// a. pointer : Support int, uint, long, ulong, bool, float, double, and string datatypes +// b. variable : Support int, uint, long, ulong, bool, float, and double datatypes +// 5. Linked to the function pointer Output_HDF5_UserPara_Ptr +// 6. The string size MUST be `MAX_STRING` +// 7. The memeory space of the array MUST be continuous // // Parameter : HDF5_UserPara : Structure storing all parameters to be written // @@ -1406,6 +1410,9 @@ void SetGridIC( real fluid[], const double x, const double y, const double z, co void Output_HDF5_UserPara_HaloMerger( HDF5_Output_t *HDF5_UserPara ) { + const bool Compare_Yes = true, Compare_No = false; + const bool Fatal_Yes = true, Fatal_No = false; + // halo-related parameters if ( HaloMerger_Halo_Num > 0 ) { @@ -1451,23 +1458,23 @@ void Output_HDF5_UserPara_HaloMerger( HDF5_Output_t *HDF5_UserPara ) Aux_Error( ERROR_INFO, "unsupported initialization mode (%s = %d) !!\n", "HaloMerger_Halo_InitMode", HaloMerger_Halo_InitMode ); - HDF5_UserPara->Add( HaloMerger_Halo_i_CenCoordX, &HaloMerger_Halo_CenCoord[index_halo][0] ); - HDF5_UserPara->Add( HaloMerger_Halo_i_CenCoordY, &HaloMerger_Halo_CenCoord[index_halo][1] ); - HDF5_UserPara->Add( HaloMerger_Halo_i_CenCoordZ, &HaloMerger_Halo_CenCoord[index_halo][2] ); - HDF5_UserPara->Add( HaloMerger_Halo_i_VelocityX, &HaloMerger_Halo_Velocity[index_halo][0] ); - HDF5_UserPara->Add( HaloMerger_Halo_i_VelocityY, &HaloMerger_Halo_Velocity[index_halo][1] ); - HDF5_UserPara->Add( HaloMerger_Halo_i_VelocityZ, &HaloMerger_Halo_Velocity[index_halo][2] ); + HDF5_UserPara->Add( HaloMerger_Halo_i_CenCoordX, &HaloMerger_Halo_CenCoord[index_halo][0], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_Halo_i_CenCoordY, &HaloMerger_Halo_CenCoord[index_halo][1], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_Halo_i_CenCoordZ, &HaloMerger_Halo_CenCoord[index_halo][2], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_Halo_i_VelocityX, &HaloMerger_Halo_Velocity[index_halo][0], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_Halo_i_VelocityY, &HaloMerger_Halo_Velocity[index_halo][1], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_Halo_i_VelocityZ, &HaloMerger_Halo_Velocity[index_halo][2], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); if ( HaloMerger_Halo_InitMode == 1 ) { - HDF5_UserPara->Add( HaloMerger_Halo_i_HALO_IC_Filename, HaloMerger_Halo_HALO_IC_Filename[index_halo] ); - HDF5_UserPara->Add( HaloMerger_Halo_i_HALO_IC_BoxLenX, &HaloMerger_Halo_HALO_IC_BoxLen [index_halo][0] ); - HDF5_UserPara->Add( HaloMerger_Halo_i_HALO_IC_BoxLenY, &HaloMerger_Halo_HALO_IC_BoxLen [index_halo][1] ); - HDF5_UserPara->Add( HaloMerger_Halo_i_HALO_IC_BoxLenZ, &HaloMerger_Halo_HALO_IC_BoxLen [index_halo][2] ); - HDF5_UserPara->Add( HaloMerger_Halo_i_HALO_IC_NCellsX, &HaloMerger_Halo_HALO_IC_NCells [index_halo][0] ); - HDF5_UserPara->Add( HaloMerger_Halo_i_HALO_IC_NCellsY, &HaloMerger_Halo_HALO_IC_NCells [index_halo][1] ); - HDF5_UserPara->Add( HaloMerger_Halo_i_HALO_IC_NCellsZ, &HaloMerger_Halo_HALO_IC_NCells [index_halo][2] ); - HDF5_UserPara->Add( HaloMerger_Halo_i_HALO_IC_Float8, &HaloMerger_Halo_HALO_IC_Float8 [index_halo] ); + HDF5_UserPara->Add( HaloMerger_Halo_i_HALO_IC_Filename, HaloMerger_Halo_HALO_IC_Filename[index_halo], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_Halo_i_HALO_IC_BoxLenX, &HaloMerger_Halo_HALO_IC_BoxLen [index_halo][0], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_Halo_i_HALO_IC_BoxLenY, &HaloMerger_Halo_HALO_IC_BoxLen [index_halo][1], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_Halo_i_HALO_IC_BoxLenZ, &HaloMerger_Halo_HALO_IC_BoxLen [index_halo][2], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_Halo_i_HALO_IC_NCellsX, &HaloMerger_Halo_HALO_IC_NCells [index_halo][0], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_Halo_i_HALO_IC_NCellsY, &HaloMerger_Halo_HALO_IC_NCells [index_halo][1], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_Halo_i_HALO_IC_NCellsZ, &HaloMerger_Halo_HALO_IC_NCells [index_halo][2], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_Halo_i_HALO_IC_Float8, &HaloMerger_Halo_HALO_IC_Float8 [index_halo], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); } // if ( HaloMerger_Halo_InitMode == 1 ) else Aux_Error( ERROR_INFO, "unsupported initialization mode (%s = %d) !!\n", @@ -1519,23 +1526,23 @@ void Output_HDF5_UserPara_HaloMerger( HDF5_Output_t *HDF5_UserPara ) Aux_Error( ERROR_INFO, "unsupported initialization mode (%s = %d) !!\n", "HaloMerger_Soliton_InitMode", HaloMerger_Soliton_InitMode ); - HDF5_UserPara->Add( HaloMerger_Soliton_i_CoreRadius, &HaloMerger_Soliton_CoreRadius[index_soliton] ); - HDF5_UserPara->Add( HaloMerger_Soliton_i_CoreRho, &HaloMerger_Soliton_CoreRho [index_soliton] ); - HDF5_UserPara->Add( HaloMerger_Soliton_i_CenCoordX, &HaloMerger_Soliton_CenCoord [index_soliton][0] ); - HDF5_UserPara->Add( HaloMerger_Soliton_i_CenCoordY, &HaloMerger_Soliton_CenCoord [index_soliton][1] ); - HDF5_UserPara->Add( HaloMerger_Soliton_i_CenCoordZ, &HaloMerger_Soliton_CenCoord [index_soliton][2] ); - HDF5_UserPara->Add( HaloMerger_Soliton_i_VelocityX, &HaloMerger_Soliton_Velocity [index_soliton][0] ); - HDF5_UserPara->Add( HaloMerger_Soliton_i_VelocityY, &HaloMerger_Soliton_Velocity [index_soliton][1] ); - HDF5_UserPara->Add( HaloMerger_Soliton_i_VelocityZ, &HaloMerger_Soliton_Velocity [index_soliton][2] ); + HDF5_UserPara->Add( HaloMerger_Soliton_i_CoreRadius, &HaloMerger_Soliton_CoreRadius[index_soliton], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_Soliton_i_CoreRho, &HaloMerger_Soliton_CoreRho [index_soliton], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_Soliton_i_CenCoordX, &HaloMerger_Soliton_CenCoord [index_soliton][0], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_Soliton_i_CenCoordY, &HaloMerger_Soliton_CenCoord [index_soliton][1], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_Soliton_i_CenCoordZ, &HaloMerger_Soliton_CenCoord [index_soliton][2], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_Soliton_i_VelocityX, &HaloMerger_Soliton_Velocity [index_soliton][0], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_Soliton_i_VelocityY, &HaloMerger_Soliton_Velocity [index_soliton][1], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_Soliton_i_VelocityZ, &HaloMerger_Soliton_Velocity [index_soliton][2], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); if ( HaloMerger_Soliton_InitMode == 1 ) { - HDF5_UserPara->Add( HaloMerger_Soliton_i_DensProf_Filename, HaloMerger_Soliton_DensProf_Filename[index_soliton] ); - HDF5_UserPara->Add( HaloMerger_Soliton_i_DensProf_Rescale, &HaloMerger_Soliton_DensProf_Rescale [index_soliton] ); + HDF5_UserPara->Add( HaloMerger_Soliton_i_DensProf_Filename, HaloMerger_Soliton_DensProf_Filename[index_soliton], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_Soliton_i_DensProf_Rescale, &HaloMerger_Soliton_DensProf_Rescale [index_soliton], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); } // if ( HaloMerger_Soliton_InitMode == 1 ) else if ( HaloMerger_Soliton_InitMode == 2 ) { - HDF5_UserPara->Add( HaloMerger_Soliton_i_OuterSlope, &HaloMerger_Soliton_OuterSlope [index_soliton] ); + HDF5_UserPara->Add( HaloMerger_Soliton_i_OuterSlope, &HaloMerger_Soliton_OuterSlope [index_soliton], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); } // else if ( HaloMerger_Soliton_InitMode == 2 ) else Aux_Error( ERROR_INFO, "unsupported initialization mode (%s = %d) !!\n", @@ -1580,19 +1587,19 @@ void Output_HDF5_UserPara_HaloMerger( HDF5_Output_t *HDF5_UserPara ) Aux_Error( ERROR_INFO, "unsupported initialization mode (%s = %d) !!\n", "HaloMerger_ParCloud_InitMode", HaloMerger_ParCloud_InitMode ); - HDF5_UserPara->Add( HaloMerger_ParCloud_i_CenCoordX, &HaloMerger_ParCloud_CenCoord[index_parcloud][0] ); - HDF5_UserPara->Add( HaloMerger_ParCloud_i_CenCoordY, &HaloMerger_ParCloud_CenCoord[index_parcloud][1] ); - HDF5_UserPara->Add( HaloMerger_ParCloud_i_CenCoordZ, &HaloMerger_ParCloud_CenCoord[index_parcloud][2] ); - HDF5_UserPara->Add( HaloMerger_ParCloud_i_VelocityX, &HaloMerger_ParCloud_Velocity[index_parcloud][0] ); - HDF5_UserPara->Add( HaloMerger_ParCloud_i_VelocityY, &HaloMerger_ParCloud_Velocity[index_parcloud][1] ); - HDF5_UserPara->Add( HaloMerger_ParCloud_i_VelocityZ, &HaloMerger_ParCloud_Velocity[index_parcloud][2] ); + HDF5_UserPara->Add( HaloMerger_ParCloud_i_CenCoordX, &HaloMerger_ParCloud_CenCoord[index_parcloud][0], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_ParCloud_i_CenCoordY, &HaloMerger_ParCloud_CenCoord[index_parcloud][1], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_ParCloud_i_CenCoordZ, &HaloMerger_ParCloud_CenCoord[index_parcloud][2], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_ParCloud_i_VelocityX, &HaloMerger_ParCloud_Velocity[index_parcloud][0], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_ParCloud_i_VelocityY, &HaloMerger_ParCloud_Velocity[index_parcloud][1], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_ParCloud_i_VelocityZ, &HaloMerger_ParCloud_Velocity[index_parcloud][2], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); if ( HaloMerger_ParCloud_InitMode == 1 ) { - HDF5_UserPara->Add( HaloMerger_ParCloud_i_DensProf_Filename, HaloMerger_ParCloud_DensProf_Filename[index_parcloud] ); - HDF5_UserPara->Add( HaloMerger_ParCloud_i_DensProf_MaxR, &HaloMerger_ParCloud_DensProf_MaxR [index_parcloud] ); - HDF5_UserPara->Add( HaloMerger_ParCloud_i_RSeed, &HaloMerger_ParCloud_RSeed [index_parcloud] ); - HDF5_UserPara->Add( HaloMerger_ParCloud_i_NPar, &HaloMerger_ParCloud_NPar [index_parcloud] ); + HDF5_UserPara->Add( HaloMerger_ParCloud_i_DensProf_Filename, HaloMerger_ParCloud_DensProf_Filename[index_parcloud], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_ParCloud_i_DensProf_MaxR, &HaloMerger_ParCloud_DensProf_MaxR [index_parcloud], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_ParCloud_i_RSeed, &HaloMerger_ParCloud_RSeed [index_parcloud], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); + HDF5_UserPara->Add( HaloMerger_ParCloud_i_NPar, &HaloMerger_ParCloud_NPar [index_parcloud], 0, NULL, Compare_No, NULL_BOOL, NULL_BOOL ); } // if ( HaloMerger_ParCloud_InitMode == 1 ) else Aux_Error( ERROR_INFO, "unsupported initialization mode (%s = %d) !!\n", diff --git a/tool/analysis/gamer_compare_data/GAMER_Functions/LoadData_HDF5.cpp b/tool/analysis/gamer_compare_data/GAMER_Functions/LoadData_HDF5.cpp index 90798876ea..075a1625b4 100644 --- a/tool/analysis/gamer_compare_data/GAMER_Functions/LoadData_HDF5.cpp +++ b/tool/analysis/gamer_compare_data/GAMER_Functions/LoadData_HDF5.cpp @@ -98,7 +98,8 @@ void LoadData_HDF5( const char *FileName, AMR_t &amr, int &Format, int &NField, int FormatVersion, NPatchTotal[NLEVEL], NPatchAllLv, DumpID; long Step; double Time[NLEVEL]; - char **FieldLabel_In=NULL, **MagLabel_In=NULL, **ParAttFltLabel_In=NULL, **ParAttIntLabel_In=NULL; + char (*FieldLabel_In)[MAX_STRING]=NULL, (*MagLabel_In)[MAX_STRING]=NULL; + char (*ParAttFltLabel_In)[MAX_STRING]=NULL, (*ParAttIntLabel_In)[MAX_STRING]=NULL; int *NullPtr=NULL; int WithPar; @@ -193,7 +194,7 @@ void LoadData_HDF5( const char *FileName, AMR_t &amr, int &Format, int &NField, } // if ( WithPar ) ... else ... // field and particle attribute labels - FieldLabel_In = new char* [NField]; + FieldLabel_In = new char [NField][MAX_STRING]; for (int v=0; v= 2300 + char (*PassiveFieldName_Grid)[MaxString]; // for format version < 2300 + char (*FieldName_In)[MaxString]; // for format version >= 2300 int *NullPtr = NULL; # if ( MODEL == HYDRO ) @@ -178,6 +178,7 @@ void LoadData_HDF5( const char *FileName ) // field labels if ( FormatVersion >= 2300 ) { + FieldName_In = new char [NCOMP_TOTAL][MaxString]; for (int v=0; v= 2300 + char (*PassiveFieldName_Grid)[MAX_STRING]; // for format version < 2300 + char (*FieldName_In)[MAX_STRING]; // for format version >= 2300 int *NullPtr = NULL; # if ( MODEL == HYDRO ) @@ -197,6 +197,7 @@ void LoadData_HDF5( const char *FileName ) // field labels if ( FormatVersion >= 2300 ) { + FieldName_In = new char [NCOMP_TOTAL][MAX_STRING]; for (int v=0; v