00001
00016 #ifndef ALLVARS_H
00017 #define ALLVARS_H
00018
00019 #include <stdio.h>
00020 #include <gsl/gsl_rng.h>
00021 #include "tags.h"
00022
00023 #define GADGETVERSION "2.0"
00025 #define TIMEBASE (1<<28)
00029 #define MAXTOPNODES 200000
00032 typedef long long peanokey;
00034 #define BITS_PER_DIMENSION 18
00038 #define PEANOCELLS (((peanokey)1)<<(3*BITS_PER_DIMENSION))
00041 #define RNDTABLE 3000
00044 #define MAX_REAL_NUMBER 1e37
00045 #define MIN_REAL_NUMBER 1e-37
00046
00047 #define MAXLEN_FILENAME 100
00049 #ifdef ISOTHERM_EQS
00050 #define GAMMA (1.0)
00051 #else
00052 #define GAMMA (5.0/3)
00053 #endif
00054
00055 #define GAMMA_MINUS1 (GAMMA-1)
00056
00057 #define HYDROGEN_MASSFRAC 0.76
00059
00060
00061 #define GRAVITY 6.672e-8
00062 #define SOLAR_MASS 1.989e33
00063 #define SOLAR_LUM 3.826e33
00064 #define RAD_CONST 7.565e-15
00065 #define AVOGADRO 6.0222e23
00066 #define BOLTZMANN 1.3806e-16
00067 #define GAS_CONST 8.31425e7
00068 #define C 2.9979e10
00069 #define PLANCK 6.6262e-27
00070 #define CM_PER_MPC 3.085678e24
00071 #define PROTONMASS 1.6726e-24
00072 #define ELECTRONMASS 9.10953e-28
00073 #define THOMPSON 6.65245e-25
00074 #define ELECTRONCHARGE 4.8032e-10
00075 #define HUBBLE 3.2407789e-18
00076
00077
00078
00079 #define SEC_PER_MEGAYEAR 3.155e13
00080 #define SEC_PER_YEAR 3.155e7
00081
00082 #ifndef ASMTH
00083 #define ASMTH 1.25
00084 #endif
00085
00086 #ifndef RCUT
00087 #define RCUT 4.5
00089 #endif
00090
00091 #define MAX_NGB 20000
00093 #define MAXLEN_OUTPUTLIST 500
00095 #define DRIFT_TABLE_LENGTH 1000
00097 #define MAXITER 150
00100 #ifdef DOUBLEPRECISION
00101 #define FLOAT double
00102 #else
00103 #define FLOAT float
00104 #endif
00105
00106
00107 #ifndef TWODIMS
00108 #define NUMDIMS 3
00109 #define KERNEL_COEFF_1 2.546479089470
00110 #define KERNEL_COEFF_2 15.278874536822
00111 #define KERNEL_COEFF_3 45.836623610466
00112 #define KERNEL_COEFF_4 30.557749073644
00113 #define KERNEL_COEFF_5 5.092958178941
00114 #define KERNEL_COEFF_6 (-15.278874536822)
00115 #define NORM_COEFF 4.188790204786
00116 #else
00117 #define NUMDIMS 2
00118 #define KERNEL_COEFF_1 (5.0/7*2.546479089470)
00119 #define KERNEL_COEFF_2 (5.0/7*15.278874536822)
00120 #define KERNEL_COEFF_3 (5.0/7*45.836623610466)
00121 #define KERNEL_COEFF_4 (5.0/7*30.557749073644)
00122 #define KERNEL_COEFF_5 (5.0/7*5.092958178941)
00123 #define KERNEL_COEFF_6 (5.0/7*(-15.278874536822))
00124 #define NORM_COEFF M_PI
00125 #endif
00126
00127
00128
00129 extern int ThisTask;
00130 extern int NTask;
00131 extern int PTask;
00133 extern int NumPart;
00134 extern int N_gas;
00135 extern long long Ntype[6];
00136 extern int NtypeLocal[6];
00138 extern int NumForceUpdate;
00139 extern int NumSphUpdate;
00141 extern double CPUThisRun;
00144 extern int RestartFlag;
00148 extern char *Exportflag;
00150 extern int *Ngblist;
00152 extern int TreeReconstructFlag;
00154 extern int Flag_FullStep;
00157 extern gsl_rng *random_generator;
00159 extern double RndTable[RNDTABLE];
00162 extern double DomainCorner[3];
00163 extern double DomainCenter[3];
00164 extern double DomainLen;
00165 extern double DomainFac;
00166 extern int DomainMyStart;
00167 extern int DomainMyLast;
00168 extern int *DomainStartList;
00169 extern int *DomainEndList;
00170 extern double *DomainWork;
00171 extern int *DomainCount;
00172 extern int *DomainCountSph;
00174 extern int *DomainTask;
00175 extern int *DomainNodeIndex;
00176 extern FLOAT *DomainTreeNodeLen;
00177 extern FLOAT *DomainHmax;
00179 extern struct DomainNODE
00180 {
00181 FLOAT s[3];
00182 FLOAT vs[3];
00183 FLOAT mass;
00184 #ifdef UNEQUALSOFTENINGS
00185 #ifndef ADAPTIVE_GRAVSOFT_FORGAS
00186 int bitflags;
00187 #else
00188 FLOAT maxsoft;
00190 #endif
00191 #endif
00192 }
00193 *DomainMoment;
00195 extern peanokey *DomainKeyBuf;
00197 extern peanokey *Key;
00198 extern peanokey *KeySorted;
00201 extern int NTopnodes;
00202 extern int NTopleaves;
00204 extern struct topnode_data
00205 {
00206 int Daughter;
00207 int Pstart;
00208 int Blocks;
00209 int Leaf;
00210 peanokey Size;
00211 peanokey StartKey;
00212 long long Count;
00213 }
00214 *TopNodes;
00217 extern double TimeOfLastTreeConstruction;
00221
00222
00223 extern char ParameterFile[MAXLEN_FILENAME];
00225 extern FILE *FdInfo;
00226 extern FILE *FdEnergy;
00227 extern FILE *FdTimings;
00228 extern FILE *FdCPU;
00230 #ifdef FORCETEST
00231 extern FILE *FdForceTest;
00232 #endif
00233
00234
00235 extern double DriftTable[DRIFT_TABLE_LENGTH];
00236 extern double GravKickTable[DRIFT_TABLE_LENGTH];
00237 extern double HydroKickTable[DRIFT_TABLE_LENGTH];
00239 extern void *CommBuffer;
00249 extern struct global_data_all_processes
00250 {
00251 long long TotNumPart;
00252 long long TotN_gas;
00254 int MaxPart;
00255 int MaxPartSph;
00257 double BoxSize;
00259 int ICFormat;
00261 int SnapFormat;
00263 int NumFilesPerSnapshot;
00264 int NumFilesWrittenInParallel;
00267 int BufferSize;
00268 int BunchSizeForce;
00269 int BunchSizeDensity;
00270 int BunchSizeHydro;
00271 int BunchSizeDomain;
00273 double PartAllocFactor;
00277 double TreeAllocFactor;
00281
00282
00283 double DesNumNgb;
00284 double MaxNumNgbDeviation;
00286 double ArtBulkViscConst;
00287 double InitGasTemp;
00288 double MinGasTemp;
00289 double MinEgySpec;
00292
00293
00294 long long TotNumOfForces;
00295 long long NumForcesSinceLastDomainDecomp;
00298
00299
00300 double G;
00301 double UnitTime_in_s;
00302 double UnitMass_in_g;
00303 double UnitVelocity_in_cm_per_s;
00304 double UnitLength_in_cm;
00305 double UnitPressure_in_cgs;
00306 double UnitDensity_in_cgs;
00307 double UnitCoolingRate_in_cgs;
00308 double UnitEnergy_in_cgs;
00309 double UnitTime_in_Megayears;
00310 double GravityConstantInternal;
00315
00316
00317 double Hubble;
00318 double Omega0;
00319 double OmegaLambda;
00320 double OmegaBaryon;
00321 double HubbleParam;
00324
00325
00326 int ComovingIntegrationOn;
00327 int PeriodicBoundariesOn;
00328 int ResubmitOn;
00329 int TypeOfOpeningCriterion;
00330 int TypeOfTimestepCriterion;
00331 int OutputListOn;
00334
00335
00336 int SnapshotFileCount;
00337 double TimeBetSnapshot;
00338 double TimeOfFirstSnapshot;
00339 double CpuTimeBetRestartFile;
00340 double TimeLastRestartFile;
00341 double TimeBetStatistics;
00342 double TimeLastStatistics;
00343 int NumCurrentTiStep;
00346
00347
00348 double Time;
00349 double TimeBegin;
00350 double TimeStep;
00351 double TimeMax;
00354
00355
00356 double Timebase_interval;
00357 int Ti_Current;
00358 int Ti_nextoutput;
00359 #ifdef FLEXSTEPS
00360 int PresentMinStep;
00361 int PresentMaxStep;
00362 #endif
00363 #ifdef PMGRID
00364 int PM_Ti_endstep;
00365 int PM_Ti_begstep;
00366 #endif
00367
00368
00369
00370
00371 #ifdef PMGRID
00372 double Asmth[2];
00373 double Rcut[2];
00374 double Corner[2][3];
00375 double UpperCorner[2][3];
00376 double Xmintot[2][3];
00377 double Xmaxtot[2][3];
00378 double TotalMeshSize[2];
00379 #endif
00380
00381
00382
00383
00384 double TimeLimitCPU;
00385 double CPU_TreeConstruction;
00386 double CPU_TreeWalk;
00387 double CPU_Gravity;
00388 double CPU_Potential;
00389 double CPU_Domain;
00390 double CPU_Snapshot;
00391 double CPU_Total;
00392 double CPU_CommSum;
00393 double CPU_Imbalance;
00394 double CPU_HydCompWalk;
00395 double CPU_HydCommSumm;
00396 double CPU_HydImbalance;
00397 double CPU_Hydro;
00398 double CPU_EnsureNgb;
00399 double CPU_Predict;
00400 double CPU_TimeLine;
00401 double CPU_PM;
00402 double CPU_Peano;
00404
00405
00406 double ErrTolTheta;
00407 double ErrTolForceAcc;
00410
00411
00412 double ErrTolIntAccuracy;
00415 double MinSizeTimestep;
00417 double MaxSizeTimestep;
00419 double MaxRMSDisplacementFac;
00426 double CourantFac;
00429
00430
00431 double TreeDomainUpdateFrequency;
00434
00435
00436
00437
00438 double MinGasHsmlFractional;
00439 double MinGasHsml;
00442 double SofteningGas;
00443 double SofteningHalo;
00444 double SofteningDisk;
00445 double SofteningBulge;
00446 double SofteningStars;
00447 double SofteningBndry;
00449 double SofteningGasMaxPhys;
00450 double SofteningHaloMaxPhys;
00451 double SofteningDiskMaxPhys;
00452 double SofteningBulgeMaxPhys;
00453 double SofteningStarsMaxPhys;
00454 double SofteningBndryMaxPhys;
00456 double SofteningTable[6];
00457 double ForceSoftening[6];
00460 double MassTable[6];
00466
00467
00468 char InitCondFile[MAXLEN_FILENAME];
00469 char OutputDir[MAXLEN_FILENAME];
00470 char SnapshotFileBase[MAXLEN_FILENAME];
00471 char EnergyFile[MAXLEN_FILENAME];
00472 char CpuFile[MAXLEN_FILENAME];
00473 char InfoFile[MAXLEN_FILENAME];
00474 char TimingsFile[MAXLEN_FILENAME];
00475 char RestartFile[MAXLEN_FILENAME];
00476 char ResubmitCommand[MAXLEN_FILENAME];
00477 char OutputListFilename[MAXLEN_FILENAME];
00479 double OutputListTimes[MAXLEN_OUTPUTLIST];
00480 int OutputListLength;
00482 }
00483 All;
00490 extern struct particle_data
00491 {
00492 FLOAT Pos[3];
00493 FLOAT Mass;
00494 FLOAT Vel[3];
00495 FLOAT GravAccel[3];
00496 #ifdef PMGRID
00497 FLOAT GravPM[3];
00498 #endif
00499 #ifdef FORCETEST
00500 FLOAT GravAccelDirect[3];
00501 #endif
00502 FLOAT Potential;
00503 FLOAT OldAcc;
00504 #ifndef LONGIDS
00505 unsigned int ID;
00506 #else
00507 unsigned long long ID;
00508 #endif
00509
00510 int Type;
00511 int Ti_endstep;
00512 int Ti_begstep;
00513 #ifdef FLEXSTEPS
00514 int FlexStepGrp;
00515 #endif
00516 float GravCost;
00517 #ifdef PSEUDOSYMMETRIC
00518 float AphysOld;
00522 #endif
00523 }
00524 *P,
00525 *DomainPartBuf;
00528
00529
00530
00531 extern struct sph_particle_data
00532 {
00533 FLOAT Entropy;
00534 FLOAT Density;
00535 FLOAT Hsml;
00536 FLOAT Left;
00537 FLOAT Right;
00538 FLOAT NumNgb;
00539 FLOAT Pressure;
00540 FLOAT DtEntropy;
00541 FLOAT HydroAccel[3];
00542 FLOAT VelPred[3];
00543 FLOAT DivVel;
00544 FLOAT CurlVel;
00545 FLOAT Rot[3];
00546 FLOAT DhsmlDensityFactor;
00547 FLOAT MaxSignalVel;
00548 }
00549 *SphP,
00550 *DomainSphBuf;
00556
00557
00558
00559 extern int MaxNodes;
00560 extern int Numnodestree;
00562 extern struct NODE
00563 {
00564 FLOAT len;
00565 FLOAT center[3];
00566 #ifdef ADAPTIVE_GRAVSOFT_FORGAS
00567 FLOAT maxsoft;
00569 #endif
00570 union
00571 {
00572 int suns[8];
00573 struct
00574 {
00575 FLOAT s[3];
00576 FLOAT mass;
00577 int bitflags;
00578 int sibling;
00579 int nextnode;
00580 int father;
00581 }
00582 d;
00583 }
00584 u;
00585 }
00586 *Nodes_base,
00587 *Nodes;
00591 extern int *Nextnode;
00592 extern int *Father;
00595 extern struct extNODE
00596 {
00597 FLOAT hmax;
00598 FLOAT vs[3];
00599 }
00600 *Extnodes_base,
00601 *Extnodes;
00609 extern struct io_header
00610 {
00611 int npart[6];
00612 double mass[6];
00614 double time;
00615 double redshift;
00616 int flag_sfr;
00617 int flag_feedback;
00618 unsigned int npartTotal[6];
00620 int flag_cooling;
00621 int num_files;
00622 double BoxSize;
00623 double Omega0;
00624 double OmegaLambda;
00625 double HubbleParam;
00626 int flag_stellarage;
00627 int flag_metals;
00628 unsigned int npartTotalHighWord[6];
00629 int flag_entropy_instead_u;
00630 char fill[60];
00631 }
00632 header;
00635 #define IO_NBLOCKS 11
00638 enum iofields
00639 {
00640 IO_POS,
00641 IO_VEL,
00642 IO_ID,
00643 IO_MASS,
00644 IO_U,
00645 IO_RHO,
00646 IO_HSML,
00647 IO_POT,
00648 IO_ACCEL,
00649 IO_DTENTR,
00650 IO_TSTP,
00651 };
00652
00653
00654 extern char Tab_IO_Labels[IO_NBLOCKS][4];
00655
00656
00657
00658
00659 extern struct state_of_system
00660 {
00661 double Mass;
00662 double EnergyKin;
00663 double EnergyPot;
00664 double EnergyInt;
00665 double EnergyTot;
00666 double Momentum[4];
00667 double AngMomentum[4];
00668 double CenterOfMass[4];
00669 double MassComp[6];
00670 double EnergyKinComp[6];
00671 double EnergyPotComp[6];
00672 double EnergyIntComp[6];
00673 double EnergyTotComp[6];
00674 double MomentumComp[6][4];
00675 double AngMomentumComp[6][4];
00676 double CenterOfMassComp[6][4];
00677 }
00678 SysState;
00679
00680
00681
00682
00683
00684 extern struct gravdata_in
00685 {
00686 union
00687 {
00688 FLOAT Pos[3];
00689 FLOAT Acc[3];
00690 FLOAT Potential;
00691 }
00692 u;
00693 #ifdef UNEQUALSOFTENINGS
00694 int Type;
00695 #ifdef ADAPTIVE_GRAVSOFT_FORGAS
00696 FLOAT Soft;
00697 #endif
00698 #endif
00699 union
00700 {
00701 FLOAT OldAcc;
00702 int Ninteractions;
00703 }
00704 w;
00705 }
00706 *GravDataIn,
00707 *GravDataGet,
00708 *GravDataResult,
00709 *GravDataOut;
00711 extern struct gravdata_index
00712 {
00713 int Task;
00714 int Index;
00715 int SortIndex;
00716 }
00717 *GravDataIndexTable;
00721 extern struct densdata_in
00722 {
00723 FLOAT Pos[3];
00724 FLOAT Vel[3];
00725 FLOAT Hsml;
00726 int Index;
00727 int Task;
00728 }
00729 *DensDataIn,
00730 *DensDataGet;
00732 extern struct densdata_out
00733 {
00734 FLOAT Rho;
00735 FLOAT Div, Rot[3];
00736 FLOAT DhsmlDensity;
00737 FLOAT Ngb;
00738 }
00739 *DensDataResult,
00740 *DensDataPartialResult;
00744 extern struct hydrodata_in
00745 {
00746 FLOAT Pos[3];
00747 FLOAT Vel[3];
00748 FLOAT Hsml;
00749 FLOAT Mass;
00750 FLOAT Density;
00751 FLOAT Pressure;
00752 FLOAT F1;
00753 FLOAT DhsmlDensityFactor;
00754 int Timestep;
00755 int Task;
00756 int Index;
00757 }
00758 *HydroDataIn,
00759 *HydroDataGet;
00761 extern struct hydrodata_out
00762 {
00763 FLOAT Acc[3];
00764 FLOAT DtEntropy;
00765 FLOAT MaxSignalVel;
00766 }
00767 *HydroDataResult,
00768 *HydroDataPartialResult;
00771 #endif
00772