N-GenIC/0000755000076500000240000000000011624526370011371 5ustar volkerstaffN-GenIC/allvars.c0000644000076500000240000000177411224135727013210 0ustar volkerstaff#include "allvars.h" struct io_header_1 header1, header; int WhichSpectrum; int SphereMode; int *Local_nx_table; FILE *FdTmp, *FdTmpInput; int Nmesh, Nsample; long long IDStart; char GlassFile[500]; char FileWithInputSpectrum[500]; int TileFac; double Box; int Seed; long long TotNumPart; int NumPart; int *Slab_to_task; int NTaskWithN; struct part_data *P; int Nglass; double InitTime; double Redshift; double MassTable[6]; char OutputDir[100], FileBase[100]; int NumFilesWrittenInParallel; int ThisTask, NTask; int Local_nx, Local_x_start; int IdStart; rfftwnd_mpi_plan Inverse_plan; fftw_real *Disp, *Workspace; fftw_complex *Cdata; double UnitTime_in_s, UnitLength_in_cm, UnitMass_in_g, UnitVelocity_in_cm_per_s; double InputSpectrum_UnitLength_in_cm; double G, Hubble; double RhoCrit; double Omega, OmegaLambda, OmegaDM_2ndSpecies, Sigma8; double OmegaBaryon, HubbleParam; double ShapeGamma; double PrimordialIndex; double Dplus; /* growth factor */ int ReNormalizeInputSpectrum; N-GenIC/allvars.h0000644000076500000240000000673711224135727013221 0ustar volkerstaff#include #define PI 3.14159265358979323846 #define GRAVITY 6.672e-8 #define HUBBLE 3.2407789e-18 /* in h/sec */ double PowerSpec(double kmag); double GrowthFactor(double astart, double aend); double F_Omega(double a); int read_parameter_file(char *fname); double PowerSpec_EH(double k); double PowerSpec_Efstathiou(double k); #ifdef T3E typedef short int int4byte; /* Note: int has 8 Bytes on the T3E ! */ typedef unsigned short int uint4byte; /* Note: int has 8 Bytes on the T3E ! */ #else typedef int int4byte; typedef unsigned int uint4byte; #endif extern struct io_header_1 { uint4byte npart[6]; /*!< npart[1] gives the number of particles in the present file, other particle types are ignored */ double mass[6]; /*!< mass[1] gives the particle mass */ double time; /*!< time (=cosmological scale factor) of snapshot */ double redshift; /*!< redshift of snapshot */ int4byte flag_sfr; /*!< flags whether star formation is used (not available in L-Gadget2) */ int4byte flag_feedback; /*!< flags whether feedback from star formation is included */ uint4byte npartTotal[6]; /*!< npart[1] gives the total number of particles in the run. If this number exceeds 2^32, the npartTotal[2] stores the result of a division of the particle number by 2^32, while npartTotal[1] holds the remainder. */ int4byte flag_cooling; /*!< flags whether radiative cooling is included */ int4byte num_files; /*!< determines the number of files that are used for a snapshot */ double BoxSize; /*!< Simulation box size (in code units) */ double Omega0; /*!< matter density */ double OmegaLambda; /*!< vacuum energy density */ double HubbleParam; /*!< little 'h' */ int4byte flag_stellarage; /*!< flags whether the age of newly formed stars is recorded and saved */ int4byte flag_metals; /*!< flags whether metal enrichment is included */ int4byte hashtabsize; /*!< gives the size of the hashtable belonging to this snapshot file */ char fill[84]; /*!< fills to 256 Bytes */ } header, header1; extern int Nglass; extern int *Local_nx_table; extern int WhichSpectrum; extern FILE *FdTmp, *FdTmpInput; extern int Nmesh, Nsample; extern int SphereMode; extern long long IDStart; extern char GlassFile[500]; extern char FileWithInputSpectrum[500]; extern int TileFac; extern double Box; extern int Seed; extern long long TotNumPart; extern int NumPart; extern int NTaskWithN; extern int *Slab_to_task; extern struct part_data { float Pos[3]; float Vel[3]; long long ID; } *P; extern double InitTime; extern double Redshift; extern double MassTable[6]; extern char OutputDir[100], FileBase[100]; extern int NumFilesWrittenInParallel; extern int ThisTask, NTask; extern int Local_nx, Local_x_start; extern int IdStart; extern rfftwnd_mpi_plan Inverse_plan; extern fftw_real *Disp, *Workspace; extern fftw_complex *Cdata; extern double UnitTime_in_s, UnitLength_in_cm, UnitMass_in_g, UnitVelocity_in_cm_per_s; extern double InputSpectrum_UnitLength_in_cm; extern double G, Hubble; extern double RhoCrit; extern double Omega, OmegaLambda, OmegaDM_2ndSpecies, Sigma8; extern double OmegaBaryon, HubbleParam; extern double PrimordialIndex; extern double ShapeGamma; extern double Dplus; /* growth factor */ extern int ReNormalizeInputSpectrum; N-GenIC/dummy_glass.dat0000644000076500000240000014042011224136376014407 0ustar volkerstaffY@ÀÈ@HA–AÈAúAB/BHBaBzB€‰B–B€¢B¯B€»BÈ@È@È@È@HAÈ@–AÈ@ÈAÈ@úAÈ@BÈ@/BÈ@HBÈ@aBÈ@zBÈ@€‰BÈ@–BÈ@€¢BÈ@¯BÈ@€»BHAHAÈ@HAHAHA–AHAÈAHAúAHABHA/BHAHBHAaBHAzBHA€‰BHA–BHA€¢BHA¯BHA€»B–A–AÈ@–AHA–A–A–AÈA–AúA–AB–A/B–AHB–AaB–AzB–A€‰B–A–B–A€¢B–A¯B–A€»BÈAÈAÈ@ÈAHAÈA–AÈAÈAÈAúAÈABÈA/BÈAHBÈAaBÈAzBÈA€‰BÈA–BÈA€¢BÈA¯BÈA€»BúAúAÈ@úAHAúA–AúAÈAúAúAúABúA/BúAHBúAaBúAzBúA€‰BúA–BúA€¢BúA¯BúA€»BBBÈ@BHAB–ABÈABúABBB/BBHBBaBBzBB€‰BB–BB€¢BB¯BB€»B/B/BÈ@/BHA/B–A/BÈA/BúA/BB/B/B/BHB/BaB/BzB/B€‰B/B–B/B€¢B/B¯B/B€»BHBHBÈ@HBHAHB–AHBÈAHBúAHBBHB/BHBHBHBaBHBzBHB€‰BHB–BHB€¢BHB¯BHB€»BaBaBÈ@aBHAaB–AaBÈAaBúAaBBaB/BaBHBaBaBaBzBaB€‰BaB–BaB€¢BaB¯BaB€»BzBzBÈ@zBHAzB–AzBÈAzBúAzBBzB/BzBHBzBaBzBzBzB€‰BzB–BzB€¢BzB¯BzB€»B€‰B€‰BÈ@€‰BHA€‰B–A€‰BÈA€‰BúA€‰BB€‰B/B€‰BHB€‰BaB€‰BzB€‰B€‰B€‰B–B€‰B€¢B€‰B¯B€‰B€»B–B–BÈ@–BHA–B–A–BÈA–BúA–BB–B/B–BHB–BaB–BzB–B€‰B–B–B–B€¢B–B¯B–B€»B€¢B€¢BÈ@€¢BHA€¢B–A€¢BÈA€¢BúA€¢BB€¢B/B€¢BHB€¢BaB€¢BzB€¢B€‰B€¢B–B€¢B€¢B€¢B¯B€¢B€»B¯B¯BÈ@¯BHA¯B–A¯BÈA¯BúA¯BB¯B/B¯BHB¯BaB¯BzB¯B€‰B¯B–B¯B€¢B¯B¯B¯B€»B€»B€»BÈ@€»BHA€»B–A€»BÈA€»BúA€»BB€»B/B€»BHB€»BaB€»BzB€»B€‰B€»B–B€»B€¢B€»B¯B€»B€»BÈ@È@È@È@HAÈ@–AÈ@ÈAÈ@úAÈ@BÈ@/BÈ@HBÈ@aBÈ@zBÈ@€‰BÈ@–BÈ@€¢BÈ@¯BÈ@€»BÈ@È@È@È@È@È@È@HAÈ@È@–AÈ@È@ÈAÈ@È@úAÈ@È@BÈ@È@/BÈ@È@HBÈ@È@aBÈ@È@zBÈ@È@€‰BÈ@È@–BÈ@È@€¢BÈ@È@¯BÈ@È@€»BÈ@HAÈ@HAÈ@È@HAHAÈ@HA–AÈ@HAÈAÈ@HAúAÈ@HABÈ@HA/BÈ@HAHBÈ@HAaBÈ@HAzBÈ@HA€‰BÈ@HA–BÈ@HA€¢BÈ@HA¯BÈ@HA€»BÈ@–AÈ@–AÈ@È@–AHAÈ@–A–AÈ@–AÈAÈ@–AúAÈ@–ABÈ@–A/BÈ@–AHBÈ@–AaBÈ@–AzBÈ@–A€‰BÈ@–A–BÈ@–A€¢BÈ@–A¯BÈ@–A€»BÈ@ÈAÈ@ÈAÈ@È@ÈAHAÈ@ÈA–AÈ@ÈAÈAÈ@ÈAúAÈ@ÈABÈ@ÈA/BÈ@ÈAHBÈ@ÈAaBÈ@ÈAzBÈ@ÈA€‰BÈ@ÈA–BÈ@ÈA€¢BÈ@ÈA¯BÈ@ÈA€»BÈ@úAÈ@úAÈ@È@úAHAÈ@úA–AÈ@úAÈAÈ@úAúAÈ@úABÈ@úA/BÈ@úAHBÈ@úAaBÈ@úAzBÈ@úA€‰BÈ@úA–BÈ@úA€¢BÈ@úA¯BÈ@úA€»BÈ@BÈ@BÈ@È@BHAÈ@B–AÈ@BÈAÈ@BúAÈ@BBÈ@B/BÈ@BHBÈ@BaBÈ@BzBÈ@B€‰BÈ@B–BÈ@B€¢BÈ@B¯BÈ@B€»BÈ@/BÈ@/BÈ@È@/BHAÈ@/B–AÈ@/BÈAÈ@/BúAÈ@/BBÈ@/B/BÈ@/BHBÈ@/BaBÈ@/BzBÈ@/B€‰BÈ@/B–BÈ@/B€¢BÈ@/B¯BÈ@/B€»BÈ@HBÈ@HBÈ@È@HBHAÈ@HB–AÈ@HBÈAÈ@HBúAÈ@HBBÈ@HB/BÈ@HBHBÈ@HBaBÈ@HBzBÈ@HB€‰BÈ@HB–BÈ@HB€¢BÈ@HB¯BÈ@HB€»BÈ@aBÈ@aBÈ@È@aBHAÈ@aB–AÈ@aBÈAÈ@aBúAÈ@aBBÈ@aB/BÈ@aBHBÈ@aBaBÈ@aBzBÈ@aB€‰BÈ@aB–BÈ@aB€¢BÈ@aB¯BÈ@aB€»BÈ@zBÈ@zBÈ@È@zBHAÈ@zB–AÈ@zBÈAÈ@zBúAÈ@zBBÈ@zB/BÈ@zBHBÈ@zBaBÈ@zBzBÈ@zB€‰BÈ@zB–BÈ@zB€¢BÈ@zB¯BÈ@zB€»BÈ@€‰BÈ@€‰BÈ@È@€‰BHAÈ@€‰B–AÈ@€‰BÈAÈ@€‰BúAÈ@€‰BBÈ@€‰B/BÈ@€‰BHBÈ@€‰BaBÈ@€‰BzBÈ@€‰B€‰BÈ@€‰B–BÈ@€‰B€¢BÈ@€‰B¯BÈ@€‰B€»BÈ@–BÈ@–BÈ@È@–BHAÈ@–B–AÈ@–BÈAÈ@–BúAÈ@–BBÈ@–B/BÈ@–BHBÈ@–BaBÈ@–BzBÈ@–B€‰BÈ@–B–BÈ@–B€¢BÈ@–B¯BÈ@–B€»BÈ@€¢BÈ@€¢BÈ@È@€¢BHAÈ@€¢B–AÈ@€¢BÈAÈ@€¢BúAÈ@€¢BBÈ@€¢B/BÈ@€¢BHBÈ@€¢BaBÈ@€¢BzBÈ@€¢B€‰BÈ@€¢B–BÈ@€¢B€¢BÈ@€¢B¯BÈ@€¢B€»BÈ@¯BÈ@¯BÈ@È@¯BHAÈ@¯B–AÈ@¯BÈAÈ@¯BúAÈ@¯BBÈ@¯B/BÈ@¯BHBÈ@¯BaBÈ@¯BzBÈ@¯B€‰BÈ@¯B–BÈ@¯B€¢BÈ@¯B¯BÈ@¯B€»BÈ@€»BÈ@€»BÈ@È@€»BHAÈ@€»B–AÈ@€»BÈAÈ@€»BúAÈ@€»BBÈ@€»B/BÈ@€»BHBÈ@€»BaBÈ@€»BzBÈ@€»B€‰BÈ@€»B–BÈ@€»B€¢BÈ@€»B¯BÈ@€»B€»BHAHAÈ@HAHAHA–AHAÈAHAúAHABHA/BHAHBHAaBHAzBHA€‰BHA–BHA€¢BHA¯BHA€»BHAÈ@HAÈ@È@HAÈ@HAHAÈ@–AHAÈ@ÈAHAÈ@úAHAÈ@BHAÈ@/BHAÈ@HBHAÈ@aBHAÈ@zBHAÈ@€‰BHAÈ@–BHAÈ@€¢BHAÈ@¯BHAÈ@€»BHAHAHAHAÈ@HAHAHAHAHA–AHAHAÈAHAHAúAHAHABHAHA/BHAHAHBHAHAaBHAHAzBHAHA€‰BHAHA–BHAHA€¢BHAHA¯BHAHA€»BHA–AHA–AÈ@HA–AHAHA–A–AHA–AÈAHA–AúAHA–ABHA–A/BHA–AHBHA–AaBHA–AzBHA–A€‰BHA–A–BHA–A€¢BHA–A¯BHA–A€»BHAÈAHAÈAÈ@HAÈAHAHAÈA–AHAÈAÈAHAÈAúAHAÈABHAÈA/BHAÈAHBHAÈAaBHAÈAzBHAÈA€‰BHAÈA–BHAÈA€¢BHAÈA¯BHAÈA€»BHAúAHAúAÈ@HAúAHAHAúA–AHAúAÈAHAúAúAHAúABHAúA/BHAúAHBHAúAaBHAúAzBHAúA€‰BHAúA–BHAúA€¢BHAúA¯BHAúA€»BHABHABÈ@HABHAHAB–AHABÈAHABúAHABBHAB/BHABHBHABaBHABzBHAB€‰BHAB–BHAB€¢BHAB¯BHAB€»BHA/BHA/BÈ@HA/BHAHA/B–AHA/BÈAHA/BúAHA/BBHA/B/BHA/BHBHA/BaBHA/BzBHA/B€‰BHA/B–BHA/B€¢BHA/B¯BHA/B€»BHAHBHAHBÈ@HAHBHAHAHB–AHAHBÈAHAHBúAHAHBBHAHB/BHAHBHBHAHBaBHAHBzBHAHB€‰BHAHB–BHAHB€¢BHAHB¯BHAHB€»BHAaBHAaBÈ@HAaBHAHAaB–AHAaBÈAHAaBúAHAaBBHAaB/BHAaBHBHAaBaBHAaBzBHAaB€‰BHAaB–BHAaB€¢BHAaB¯BHAaB€»BHAzBHAzBÈ@HAzBHAHAzB–AHAzBÈAHAzBúAHAzBBHAzB/BHAzBHBHAzBaBHAzBzBHAzB€‰BHAzB–BHAzB€¢BHAzB¯BHAzB€»BHA€‰BHA€‰BÈ@HA€‰BHAHA€‰B–AHA€‰BÈAHA€‰BúAHA€‰BBHA€‰B/BHA€‰BHBHA€‰BaBHA€‰BzBHA€‰B€‰BHA€‰B–BHA€‰B€¢BHA€‰B¯BHA€‰B€»BHA–BHA–BÈ@HA–BHAHA–B–AHA–BÈAHA–BúAHA–BBHA–B/BHA–BHBHA–BaBHA–BzBHA–B€‰BHA–B–BHA–B€¢BHA–B¯BHA–B€»BHA€¢BHA€¢BÈ@HA€¢BHAHA€¢B–AHA€¢BÈAHA€¢BúAHA€¢BBHA€¢B/BHA€¢BHBHA€¢BaBHA€¢BzBHA€¢B€‰BHA€¢B–BHA€¢B€¢BHA€¢B¯BHA€¢B€»BHA¯BHA¯BÈ@HA¯BHAHA¯B–AHA¯BÈAHA¯BúAHA¯BBHA¯B/BHA¯BHBHA¯BaBHA¯BzBHA¯B€‰BHA¯B–BHA¯B€¢BHA¯B¯BHA¯B€»BHA€»BHA€»BÈ@HA€»BHAHA€»B–AHA€»BÈAHA€»BúAHA€»BBHA€»B/BHA€»BHBHA€»BaBHA€»BzBHA€»B€‰BHA€»B–BHA€»B€¢BHA€»B¯BHA€»B€»B–A–AÈ@–AHA–A–A–AÈA–AúA–AB–A/B–AHB–AaB–AzB–A€‰B–A–B–A€¢B–A¯B–A€»B–AÈ@–AÈ@È@–AÈ@HA–AÈ@–A–AÈ@ÈA–AÈ@úA–AÈ@B–AÈ@/B–AÈ@HB–AÈ@aB–AÈ@zB–AÈ@€‰B–AÈ@–B–AÈ@€¢B–AÈ@¯B–AÈ@€»B–AHA–AHAÈ@–AHAHA–AHA–A–AHAÈA–AHAúA–AHAB–AHA/B–AHAHB–AHAaB–AHAzB–AHA€‰B–AHA–B–AHA€¢B–AHA¯B–AHA€»B–A–A–A–AÈ@–A–AHA–A–A–A–A–AÈA–A–AúA–A–AB–A–A/B–A–AHB–A–AaB–A–AzB–A–A€‰B–A–A–B–A–A€¢B–A–A¯B–A–A€»B–AÈA–AÈAÈ@–AÈAHA–AÈA–A–AÈAÈA–AÈAúA–AÈAB–AÈA/B–AÈAHB–AÈAaB–AÈAzB–AÈA€‰B–AÈA–B–AÈA€¢B–AÈA¯B–AÈA€»B–AúA–AúAÈ@–AúAHA–AúA–A–AúAÈA–AúAúA–AúAB–AúA/B–AúAHB–AúAaB–AúAzB–AúA€‰B–AúA–B–AúA€¢B–AúA¯B–AúA€»B–AB–ABÈ@–ABHA–AB–A–ABÈA–ABúA–ABB–AB/B–ABHB–ABaB–ABzB–AB€‰B–AB–B–AB€¢B–AB¯B–AB€»B–A/B–A/BÈ@–A/BHA–A/B–A–A/BÈA–A/BúA–A/BB–A/B/B–A/BHB–A/BaB–A/BzB–A/B€‰B–A/B–B–A/B€¢B–A/B¯B–A/B€»B–AHB–AHBÈ@–AHBHA–AHB–A–AHBÈA–AHBúA–AHBB–AHB/B–AHBHB–AHBaB–AHBzB–AHB€‰B–AHB–B–AHB€¢B–AHB¯B–AHB€»B–AaB–AaBÈ@–AaBHA–AaB–A–AaBÈA–AaBúA–AaBB–AaB/B–AaBHB–AaBaB–AaBzB–AaB€‰B–AaB–B–AaB€¢B–AaB¯B–AaB€»B–AzB–AzBÈ@–AzBHA–AzB–A–AzBÈA–AzBúA–AzBB–AzB/B–AzBHB–AzBaB–AzBzB–AzB€‰B–AzB–B–AzB€¢B–AzB¯B–AzB€»B–A€‰B–A€‰BÈ@–A€‰BHA–A€‰B–A–A€‰BÈA–A€‰BúA–A€‰BB–A€‰B/B–A€‰BHB–A€‰BaB–A€‰BzB–A€‰B€‰B–A€‰B–B–A€‰B€¢B–A€‰B¯B–A€‰B€»B–A–B–A–BÈ@–A–BHA–A–B–A–A–BÈA–A–BúA–A–BB–A–B/B–A–BHB–A–BaB–A–BzB–A–B€‰B–A–B–B–A–B€¢B–A–B¯B–A–B€»B–A€¢B–A€¢BÈ@–A€¢BHA–A€¢B–A–A€¢BÈA–A€¢BúA–A€¢BB–A€¢B/B–A€¢BHB–A€¢BaB–A€¢BzB–A€¢B€‰B–A€¢B–B–A€¢B€¢B–A€¢B¯B–A€¢B€»B–A¯B–A¯BÈ@–A¯BHA–A¯B–A–A¯BÈA–A¯BúA–A¯BB–A¯B/B–A¯BHB–A¯BaB–A¯BzB–A¯B€‰B–A¯B–B–A¯B€¢B–A¯B¯B–A¯B€»B–A€»B–A€»BÈ@–A€»BHA–A€»B–A–A€»BÈA–A€»BúA–A€»BB–A€»B/B–A€»BHB–A€»BaB–A€»BzB–A€»B€‰B–A€»B–B–A€»B€¢B–A€»B¯B–A€»B€»BÈAÈAÈ@ÈAHAÈA–AÈAÈAÈAúAÈABÈA/BÈAHBÈAaBÈAzBÈA€‰BÈA–BÈA€¢BÈA¯BÈA€»BÈAÈ@ÈAÈ@È@ÈAÈ@HAÈAÈ@–AÈAÈ@ÈAÈAÈ@úAÈAÈ@BÈAÈ@/BÈAÈ@HBÈAÈ@aBÈAÈ@zBÈAÈ@€‰BÈAÈ@–BÈAÈ@€¢BÈAÈ@¯BÈAÈ@€»BÈAHAÈAHAÈ@ÈAHAHAÈAHA–AÈAHAÈAÈAHAúAÈAHABÈAHA/BÈAHAHBÈAHAaBÈAHAzBÈAHA€‰BÈAHA–BÈAHA€¢BÈAHA¯BÈAHA€»BÈA–AÈA–AÈ@ÈA–AHAÈA–A–AÈA–AÈAÈA–AúAÈA–ABÈA–A/BÈA–AHBÈA–AaBÈA–AzBÈA–A€‰BÈA–A–BÈA–A€¢BÈA–A¯BÈA–A€»BÈAÈAÈAÈAÈ@ÈAÈAHAÈAÈA–AÈAÈAÈAÈAÈAúAÈAÈABÈAÈA/BÈAÈAHBÈAÈAaBÈAÈAzBÈAÈA€‰BÈAÈA–BÈAÈA€¢BÈAÈA¯BÈAÈA€»BÈAúAÈAúAÈ@ÈAúAHAÈAúA–AÈAúAÈAÈAúAúAÈAúABÈAúA/BÈAúAHBÈAúAaBÈAúAzBÈAúA€‰BÈAúA–BÈAúA€¢BÈAúA¯BÈAúA€»BÈABÈABÈ@ÈABHAÈAB–AÈABÈAÈABúAÈABBÈAB/BÈABHBÈABaBÈABzBÈAB€‰BÈAB–BÈAB€¢BÈAB¯BÈAB€»BÈA/BÈA/BÈ@ÈA/BHAÈA/B–AÈA/BÈAÈA/BúAÈA/BBÈA/B/BÈA/BHBÈA/BaBÈA/BzBÈA/B€‰BÈA/B–BÈA/B€¢BÈA/B¯BÈA/B€»BÈAHBÈAHBÈ@ÈAHBHAÈAHB–AÈAHBÈAÈAHBúAÈAHBBÈAHB/BÈAHBHBÈAHBaBÈAHBzBÈAHB€‰BÈAHB–BÈAHB€¢BÈAHB¯BÈAHB€»BÈAaBÈAaBÈ@ÈAaBHAÈAaB–AÈAaBÈAÈAaBúAÈAaBBÈAaB/BÈAaBHBÈAaBaBÈAaBzBÈAaB€‰BÈAaB–BÈAaB€¢BÈAaB¯BÈAaB€»BÈAzBÈAzBÈ@ÈAzBHAÈAzB–AÈAzBÈAÈAzBúAÈAzBBÈAzB/BÈAzBHBÈAzBaBÈAzBzBÈAzB€‰BÈAzB–BÈAzB€¢BÈAzB¯BÈAzB€»BÈA€‰BÈA€‰BÈ@ÈA€‰BHAÈA€‰B–AÈA€‰BÈAÈA€‰BúAÈA€‰BBÈA€‰B/BÈA€‰BHBÈA€‰BaBÈA€‰BzBÈA€‰B€‰BÈA€‰B–BÈA€‰B€¢BÈA€‰B¯BÈA€‰B€»BÈA–BÈA–BÈ@ÈA–BHAÈA–B–AÈA–BÈAÈA–BúAÈA–BBÈA–B/BÈA–BHBÈA–BaBÈA–BzBÈA–B€‰BÈA–B–BÈA–B€¢BÈA–B¯BÈA–B€»BÈA€¢BÈA€¢BÈ@ÈA€¢BHAÈA€¢B–AÈA€¢BÈAÈA€¢BúAÈA€¢BBÈA€¢B/BÈA€¢BHBÈA€¢BaBÈA€¢BzBÈA€¢B€‰BÈA€¢B–BÈA€¢B€¢BÈA€¢B¯BÈA€¢B€»BÈA¯BÈA¯BÈ@ÈA¯BHAÈA¯B–AÈA¯BÈAÈA¯BúAÈA¯BBÈA¯B/BÈA¯BHBÈA¯BaBÈA¯BzBÈA¯B€‰BÈA¯B–BÈA¯B€¢BÈA¯B¯BÈA¯B€»BÈA€»BÈA€»BÈ@ÈA€»BHAÈA€»B–AÈA€»BÈAÈA€»BúAÈA€»BBÈA€»B/BÈA€»BHBÈA€»BaBÈA€»BzBÈA€»B€‰BÈA€»B–BÈA€»B€¢BÈA€»B¯BÈA€»B€»BúAúAÈ@úAHAúA–AúAÈAúAúAúABúA/BúAHBúAaBúAzBúA€‰BúA–BúA€¢BúA¯BúA€»BúAÈ@úAÈ@È@úAÈ@HAúAÈ@–AúAÈ@ÈAúAÈ@úAúAÈ@BúAÈ@/BúAÈ@HBúAÈ@aBúAÈ@zBúAÈ@€‰BúAÈ@–BúAÈ@€¢BúAÈ@¯BúAÈ@€»BúAHAúAHAÈ@úAHAHAúAHA–AúAHAÈAúAHAúAúAHABúAHA/BúAHAHBúAHAaBúAHAzBúAHA€‰BúAHA–BúAHA€¢BúAHA¯BúAHA€»BúA–AúA–AÈ@úA–AHAúA–A–AúA–AÈAúA–AúAúA–ABúA–A/BúA–AHBúA–AaBúA–AzBúA–A€‰BúA–A–BúA–A€¢BúA–A¯BúA–A€»BúAÈAúAÈAÈ@úAÈAHAúAÈA–AúAÈAÈAúAÈAúAúAÈABúAÈA/BúAÈAHBúAÈAaBúAÈAzBúAÈA€‰BúAÈA–BúAÈA€¢BúAÈA¯BúAÈA€»BúAúAúAúAÈ@úAúAHAúAúA–AúAúAÈAúAúAúAúAúABúAúA/BúAúAHBúAúAaBúAúAzBúAúA€‰BúAúA–BúAúA€¢BúAúA¯BúAúA€»BúABúABÈ@úABHAúAB–AúABÈAúABúAúABBúAB/BúABHBúABaBúABzBúAB€‰BúAB–BúAB€¢BúAB¯BúAB€»BúA/BúA/BÈ@úA/BHAúA/B–AúA/BÈAúA/BúAúA/BBúA/B/BúA/BHBúA/BaBúA/BzBúA/B€‰BúA/B–BúA/B€¢BúA/B¯BúA/B€»BúAHBúAHBÈ@úAHBHAúAHB–AúAHBÈAúAHBúAúAHBBúAHB/BúAHBHBúAHBaBúAHBzBúAHB€‰BúAHB–BúAHB€¢BúAHB¯BúAHB€»BúAaBúAaBÈ@úAaBHAúAaB–AúAaBÈAúAaBúAúAaBBúAaB/BúAaBHBúAaBaBúAaBzBúAaB€‰BúAaB–BúAaB€¢BúAaB¯BúAaB€»BúAzBúAzBÈ@úAzBHAúAzB–AúAzBÈAúAzBúAúAzBBúAzB/BúAzBHBúAzBaBúAzBzBúAzB€‰BúAzB–BúAzB€¢BúAzB¯BúAzB€»BúA€‰BúA€‰BÈ@úA€‰BHAúA€‰B–AúA€‰BÈAúA€‰BúAúA€‰BBúA€‰B/BúA€‰BHBúA€‰BaBúA€‰BzBúA€‰B€‰BúA€‰B–BúA€‰B€¢BúA€‰B¯BúA€‰B€»BúA–BúA–BÈ@úA–BHAúA–B–AúA–BÈAúA–BúAúA–BBúA–B/BúA–BHBúA–BaBúA–BzBúA–B€‰BúA–B–BúA–B€¢BúA–B¯BúA–B€»BúA€¢BúA€¢BÈ@úA€¢BHAúA€¢B–AúA€¢BÈAúA€¢BúAúA€¢BBúA€¢B/BúA€¢BHBúA€¢BaBúA€¢BzBúA€¢B€‰BúA€¢B–BúA€¢B€¢BúA€¢B¯BúA€¢B€»BúA¯BúA¯BÈ@úA¯BHAúA¯B–AúA¯BÈAúA¯BúAúA¯BBúA¯B/BúA¯BHBúA¯BaBúA¯BzBúA¯B€‰BúA¯B–BúA¯B€¢BúA¯B¯BúA¯B€»BúA€»BúA€»BÈ@úA€»BHAúA€»B–AúA€»BÈAúA€»BúAúA€»BBúA€»B/BúA€»BHBúA€»BaBúA€»BzBúA€»B€‰BúA€»B–BúA€»B€¢BúA€»B¯BúA€»B€»BBBÈ@BHAB–ABÈABúABBB/BBHBBaBBzBB€‰BB–BB€¢BB¯BB€»BBÈ@BÈ@È@BÈ@HABÈ@–ABÈ@ÈABÈ@úABÈ@BBÈ@/BBÈ@HBBÈ@aBBÈ@zBBÈ@€‰BBÈ@–BBÈ@€¢BBÈ@¯BBÈ@€»BBHABHAÈ@BHAHABHA–ABHAÈABHAúABHABBHA/BBHAHBBHAaBBHAzBBHA€‰BBHA–BBHA€¢BBHA¯BBHA€»BB–AB–AÈ@B–AHAB–A–AB–AÈAB–AúAB–ABB–A/BB–AHBB–AaBB–AzBB–A€‰BB–A–BB–A€¢BB–A¯BB–A€»BBÈABÈAÈ@BÈAHABÈA–ABÈAÈABÈAúABÈABBÈA/BBÈAHBBÈAaBBÈAzBBÈA€‰BBÈA–BBÈA€¢BBÈA¯BBÈA€»BBúABúAÈ@BúAHABúA–ABúAÈABúAúABúABBúA/BBúAHBBúAaBBúAzBBúA€‰BBúA–BBúA€¢BBúA¯BBúA€»BBBBBÈ@BBHABB–ABBÈABBúABBBBB/BBBHBBBaBBBzBBB€‰BBB–BBB€¢BBB¯BBB€»BB/BB/BÈ@B/BHAB/B–AB/BÈAB/BúAB/BBB/B/BB/BHBB/BaBB/BzBB/B€‰BB/B–BB/B€¢BB/B¯BB/B€»BBHBBHBÈ@BHBHABHB–ABHBÈABHBúABHBBBHB/BBHBHBBHBaBBHBzBBHB€‰BBHB–BBHB€¢BBHB¯BBHB€»BBaBBaBÈ@BaBHABaB–ABaBÈABaBúABaBBBaB/BBaBHBBaBaBBaBzBBaB€‰BBaB–BBaB€¢BBaB¯BBaB€»BBzBBzBÈ@BzBHABzB–ABzBÈABzBúABzBBBzB/BBzBHBBzBaBBzBzBBzB€‰BBzB–BBzB€¢BBzB¯BBzB€»BB€‰BB€‰BÈ@B€‰BHAB€‰B–AB€‰BÈAB€‰BúAB€‰BBB€‰B/BB€‰BHBB€‰BaBB€‰BzBB€‰B€‰BB€‰B–BB€‰B€¢BB€‰B¯BB€‰B€»BB–BB–BÈ@B–BHAB–B–AB–BÈAB–BúAB–BBB–B/BB–BHBB–BaBB–BzBB–B€‰BB–B–BB–B€¢BB–B¯BB–B€»BB€¢BB€¢BÈ@B€¢BHAB€¢B–AB€¢BÈAB€¢BúAB€¢BBB€¢B/BB€¢BHBB€¢BaBB€¢BzBB€¢B€‰BB€¢B–BB€¢B€¢BB€¢B¯BB€¢B€»BB¯BB¯BÈ@B¯BHAB¯B–AB¯BÈAB¯BúAB¯BBB¯B/BB¯BHBB¯BaBB¯BzBB¯B€‰BB¯B–BB¯B€¢BB¯B¯BB¯B€»BB€»BB€»BÈ@B€»BHAB€»B–AB€»BÈAB€»BúAB€»BBB€»B/BB€»BHBB€»BaBB€»BzBB€»B€‰BB€»B–BB€»B€¢BB€»B¯BB€»B€»B/B/BÈ@/BHA/B–A/BÈA/BúA/BB/B/B/BHB/BaB/BzB/B€‰B/B–B/B€¢B/B¯B/B€»B/BÈ@/BÈ@È@/BÈ@HA/BÈ@–A/BÈ@ÈA/BÈ@úA/BÈ@B/BÈ@/B/BÈ@HB/BÈ@aB/BÈ@zB/BÈ@€‰B/BÈ@–B/BÈ@€¢B/BÈ@¯B/BÈ@€»B/BHA/BHAÈ@/BHAHA/BHA–A/BHAÈA/BHAúA/BHAB/BHA/B/BHAHB/BHAaB/BHAzB/BHA€‰B/BHA–B/BHA€¢B/BHA¯B/BHA€»B/B–A/B–AÈ@/B–AHA/B–A–A/B–AÈA/B–AúA/B–AB/B–A/B/B–AHB/B–AaB/B–AzB/B–A€‰B/B–A–B/B–A€¢B/B–A¯B/B–A€»B/BÈA/BÈAÈ@/BÈAHA/BÈA–A/BÈAÈA/BÈAúA/BÈAB/BÈA/B/BÈAHB/BÈAaB/BÈAzB/BÈA€‰B/BÈA–B/BÈA€¢B/BÈA¯B/BÈA€»B/BúA/BúAÈ@/BúAHA/BúA–A/BúAÈA/BúAúA/BúAB/BúA/B/BúAHB/BúAaB/BúAzB/BúA€‰B/BúA–B/BúA€¢B/BúA¯B/BúA€»B/BB/BBÈ@/BBHA/BB–A/BBÈA/BBúA/BBB/BB/B/BBHB/BBaB/BBzB/BB€‰B/BB–B/BB€¢B/BB¯B/BB€»B/B/B/B/BÈ@/B/BHA/B/B–A/B/BÈA/B/BúA/B/BB/B/B/B/B/BHB/B/BaB/B/BzB/B/B€‰B/B/B–B/B/B€¢B/B/B¯B/B/B€»B/BHB/BHBÈ@/BHBHA/BHB–A/BHBÈA/BHBúA/BHBB/BHB/B/BHBHB/BHBaB/BHBzB/BHB€‰B/BHB–B/BHB€¢B/BHB¯B/BHB€»B/BaB/BaBÈ@/BaBHA/BaB–A/BaBÈA/BaBúA/BaBB/BaB/B/BaBHB/BaBaB/BaBzB/BaB€‰B/BaB–B/BaB€¢B/BaB¯B/BaB€»B/BzB/BzBÈ@/BzBHA/BzB–A/BzBÈA/BzBúA/BzBB/BzB/B/BzBHB/BzBaB/BzBzB/BzB€‰B/BzB–B/BzB€¢B/BzB¯B/BzB€»B/B€‰B/B€‰BÈ@/B€‰BHA/B€‰B–A/B€‰BÈA/B€‰BúA/B€‰BB/B€‰B/B/B€‰BHB/B€‰BaB/B€‰BzB/B€‰B€‰B/B€‰B–B/B€‰B€¢B/B€‰B¯B/B€‰B€»B/B–B/B–BÈ@/B–BHA/B–B–A/B–BÈA/B–BúA/B–BB/B–B/B/B–BHB/B–BaB/B–BzB/B–B€‰B/B–B–B/B–B€¢B/B–B¯B/B–B€»B/B€¢B/B€¢BÈ@/B€¢BHA/B€¢B–A/B€¢BÈA/B€¢BúA/B€¢BB/B€¢B/B/B€¢BHB/B€¢BaB/B€¢BzB/B€¢B€‰B/B€¢B–B/B€¢B€¢B/B€¢B¯B/B€¢B€»B/B¯B/B¯BÈ@/B¯BHA/B¯B–A/B¯BÈA/B¯BúA/B¯BB/B¯B/B/B¯BHB/B¯BaB/B¯BzB/B¯B€‰B/B¯B–B/B¯B€¢B/B¯B¯B/B¯B€»B/B€»B/B€»BÈ@/B€»BHA/B€»B–A/B€»BÈA/B€»BúA/B€»BB/B€»B/B/B€»BHB/B€»BaB/B€»BzB/B€»B€‰B/B€»B–B/B€»B€¢B/B€»B¯B/B€»B€»BHBHBÈ@HBHAHB–AHBÈAHBúAHBBHB/BHBHBHBaBHBzBHB€‰BHB–BHB€¢BHB¯BHB€»BHBÈ@HBÈ@È@HBÈ@HAHBÈ@–AHBÈ@ÈAHBÈ@úAHBÈ@BHBÈ@/BHBÈ@HBHBÈ@aBHBÈ@zBHBÈ@€‰BHBÈ@–BHBÈ@€¢BHBÈ@¯BHBÈ@€»BHBHAHBHAÈ@HBHAHAHBHA–AHBHAÈAHBHAúAHBHABHBHA/BHBHAHBHBHAaBHBHAzBHBHA€‰BHBHA–BHBHA€¢BHBHA¯BHBHA€»BHB–AHB–AÈ@HB–AHAHB–A–AHB–AÈAHB–AúAHB–ABHB–A/BHB–AHBHB–AaBHB–AzBHB–A€‰BHB–A–BHB–A€¢BHB–A¯BHB–A€»BHBÈAHBÈAÈ@HBÈAHAHBÈA–AHBÈAÈAHBÈAúAHBÈABHBÈA/BHBÈAHBHBÈAaBHBÈAzBHBÈA€‰BHBÈA–BHBÈA€¢BHBÈA¯BHBÈA€»BHBúAHBúAÈ@HBúAHAHBúA–AHBúAÈAHBúAúAHBúABHBúA/BHBúAHBHBúAaBHBúAzBHBúA€‰BHBúA–BHBúA€¢BHBúA¯BHBúA€»BHBBHBBÈ@HBBHAHBB–AHBBÈAHBBúAHBBBHBB/BHBBHBHBBaBHBBzBHBB€‰BHBB–BHBB€¢BHBB¯BHBB€»BHB/BHB/BÈ@HB/BHAHB/B–AHB/BÈAHB/BúAHB/BBHB/B/BHB/BHBHB/BaBHB/BzBHB/B€‰BHB/B–BHB/B€¢BHB/B¯BHB/B€»BHBHBHBHBÈ@HBHBHAHBHB–AHBHBÈAHBHBúAHBHBBHBHB/BHBHBHBHBHBaBHBHBzBHBHB€‰BHBHB–BHBHB€¢BHBHB¯BHBHB€»BHBaBHBaBÈ@HBaBHAHBaB–AHBaBÈAHBaBúAHBaBBHBaB/BHBaBHBHBaBaBHBaBzBHBaB€‰BHBaB–BHBaB€¢BHBaB¯BHBaB€»BHBzBHBzBÈ@HBzBHAHBzB–AHBzBÈAHBzBúAHBzBBHBzB/BHBzBHBHBzBaBHBzBzBHBzB€‰BHBzB–BHBzB€¢BHBzB¯BHBzB€»BHB€‰BHB€‰BÈ@HB€‰BHAHB€‰B–AHB€‰BÈAHB€‰BúAHB€‰BBHB€‰B/BHB€‰BHBHB€‰BaBHB€‰BzBHB€‰B€‰BHB€‰B–BHB€‰B€¢BHB€‰B¯BHB€‰B€»BHB–BHB–BÈ@HB–BHAHB–B–AHB–BÈAHB–BúAHB–BBHB–B/BHB–BHBHB–BaBHB–BzBHB–B€‰BHB–B–BHB–B€¢BHB–B¯BHB–B€»BHB€¢BHB€¢BÈ@HB€¢BHAHB€¢B–AHB€¢BÈAHB€¢BúAHB€¢BBHB€¢B/BHB€¢BHBHB€¢BaBHB€¢BzBHB€¢B€‰BHB€¢B–BHB€¢B€¢BHB€¢B¯BHB€¢B€»BHB¯BHB¯BÈ@HB¯BHAHB¯B–AHB¯BÈAHB¯BúAHB¯BBHB¯B/BHB¯BHBHB¯BaBHB¯BzBHB¯B€‰BHB¯B–BHB¯B€¢BHB¯B¯BHB¯B€»BHB€»BHB€»BÈ@HB€»BHAHB€»B–AHB€»BÈAHB€»BúAHB€»BBHB€»B/BHB€»BHBHB€»BaBHB€»BzBHB€»B€‰BHB€»B–BHB€»B€¢BHB€»B¯BHB€»B€»BaBaBÈ@aBHAaB–AaBÈAaBúAaBBaB/BaBHBaBaBaBzBaB€‰BaB–BaB€¢BaB¯BaB€»BaBÈ@aBÈ@È@aBÈ@HAaBÈ@–AaBÈ@ÈAaBÈ@úAaBÈ@BaBÈ@/BaBÈ@HBaBÈ@aBaBÈ@zBaBÈ@€‰BaBÈ@–BaBÈ@€¢BaBÈ@¯BaBÈ@€»BaBHAaBHAÈ@aBHAHAaBHA–AaBHAÈAaBHAúAaBHABaBHA/BaBHAHBaBHAaBaBHAzBaBHA€‰BaBHA–BaBHA€¢BaBHA¯BaBHA€»BaB–AaB–AÈ@aB–AHAaB–A–AaB–AÈAaB–AúAaB–ABaB–A/BaB–AHBaB–AaBaB–AzBaB–A€‰BaB–A–BaB–A€¢BaB–A¯BaB–A€»BaBÈAaBÈAÈ@aBÈAHAaBÈA–AaBÈAÈAaBÈAúAaBÈABaBÈA/BaBÈAHBaBÈAaBaBÈAzBaBÈA€‰BaBÈA–BaBÈA€¢BaBÈA¯BaBÈA€»BaBúAaBúAÈ@aBúAHAaBúA–AaBúAÈAaBúAúAaBúABaBúA/BaBúAHBaBúAaBaBúAzBaBúA€‰BaBúA–BaBúA€¢BaBúA¯BaBúA€»BaBBaBBÈ@aBBHAaBB–AaBBÈAaBBúAaBBBaBB/BaBBHBaBBaBaBBzBaBB€‰BaBB–BaBB€¢BaBB¯BaBB€»BaB/BaB/BÈ@aB/BHAaB/B–AaB/BÈAaB/BúAaB/BBaB/B/BaB/BHBaB/BaBaB/BzBaB/B€‰BaB/B–BaB/B€¢BaB/B¯BaB/B€»BaBHBaBHBÈ@aBHBHAaBHB–AaBHBÈAaBHBúAaBHBBaBHB/BaBHBHBaBHBaBaBHBzBaBHB€‰BaBHB–BaBHB€¢BaBHB¯BaBHB€»BaBaBaBaBÈ@aBaBHAaBaB–AaBaBÈAaBaBúAaBaBBaBaB/BaBaBHBaBaBaBaBaBzBaBaB€‰BaBaB–BaBaB€¢BaBaB¯BaBaB€»BaBzBaBzBÈ@aBzBHAaBzB–AaBzBÈAaBzBúAaBzBBaBzB/BaBzBHBaBzBaBaBzBzBaBzB€‰BaBzB–BaBzB€¢BaBzB¯BaBzB€»BaB€‰BaB€‰BÈ@aB€‰BHAaB€‰B–AaB€‰BÈAaB€‰BúAaB€‰BBaB€‰B/BaB€‰BHBaB€‰BaBaB€‰BzBaB€‰B€‰BaB€‰B–BaB€‰B€¢BaB€‰B¯BaB€‰B€»BaB–BaB–BÈ@aB–BHAaB–B–AaB–BÈAaB–BúAaB–BBaB–B/BaB–BHBaB–BaBaB–BzBaB–B€‰BaB–B–BaB–B€¢BaB–B¯BaB–B€»BaB€¢BaB€¢BÈ@aB€¢BHAaB€¢B–AaB€¢BÈAaB€¢BúAaB€¢BBaB€¢B/BaB€¢BHBaB€¢BaBaB€¢BzBaB€¢B€‰BaB€¢B–BaB€¢B€¢BaB€¢B¯BaB€¢B€»BaB¯BaB¯BÈ@aB¯BHAaB¯B–AaB¯BÈAaB¯BúAaB¯BBaB¯B/BaB¯BHBaB¯BaBaB¯BzBaB¯B€‰BaB¯B–BaB¯B€¢BaB¯B¯BaB¯B€»BaB€»BaB€»BÈ@aB€»BHAaB€»B–AaB€»BÈAaB€»BúAaB€»BBaB€»B/BaB€»BHBaB€»BaBaB€»BzBaB€»B€‰BaB€»B–BaB€»B€¢BaB€»B¯BaB€»B€»BzBzBÈ@zBHAzB–AzBÈAzBúAzBBzB/BzBHBzBaBzBzBzB€‰BzB–BzB€¢BzB¯BzB€»BzBÈ@zBÈ@È@zBÈ@HAzBÈ@–AzBÈ@ÈAzBÈ@úAzBÈ@BzBÈ@/BzBÈ@HBzBÈ@aBzBÈ@zBzBÈ@€‰BzBÈ@–BzBÈ@€¢BzBÈ@¯BzBÈ@€»BzBHAzBHAÈ@zBHAHAzBHA–AzBHAÈAzBHAúAzBHABzBHA/BzBHAHBzBHAaBzBHAzBzBHA€‰BzBHA–BzBHA€¢BzBHA¯BzBHA€»BzB–AzB–AÈ@zB–AHAzB–A–AzB–AÈAzB–AúAzB–ABzB–A/BzB–AHBzB–AaBzB–AzBzB–A€‰BzB–A–BzB–A€¢BzB–A¯BzB–A€»BzBÈAzBÈAÈ@zBÈAHAzBÈA–AzBÈAÈAzBÈAúAzBÈABzBÈA/BzBÈAHBzBÈAaBzBÈAzBzBÈA€‰BzBÈA–BzBÈA€¢BzBÈA¯BzBÈA€»BzBúAzBúAÈ@zBúAHAzBúA–AzBúAÈAzBúAúAzBúABzBúA/BzBúAHBzBúAaBzBúAzBzBúA€‰BzBúA–BzBúA€¢BzBúA¯BzBúA€»BzBBzBBÈ@zBBHAzBB–AzBBÈAzBBúAzBBBzBB/BzBBHBzBBaBzBBzBzBB€‰BzBB–BzBB€¢BzBB¯BzBB€»BzB/BzB/BÈ@zB/BHAzB/B–AzB/BÈAzB/BúAzB/BBzB/B/BzB/BHBzB/BaBzB/BzBzB/B€‰BzB/B–BzB/B€¢BzB/B¯BzB/B€»BzBHBzBHBÈ@zBHBHAzBHB–AzBHBÈAzBHBúAzBHBBzBHB/BzBHBHBzBHBaBzBHBzBzBHB€‰BzBHB–BzBHB€¢BzBHB¯BzBHB€»BzBaBzBaBÈ@zBaBHAzBaB–AzBaBÈAzBaBúAzBaBBzBaB/BzBaBHBzBaBaBzBaBzBzBaB€‰BzBaB–BzBaB€¢BzBaB¯BzBaB€»BzBzBzBzBÈ@zBzBHAzBzB–AzBzBÈAzBzBúAzBzBBzBzB/BzBzBHBzBzBaBzBzBzBzBzB€‰BzBzB–BzBzB€¢BzBzB¯BzBzB€»BzB€‰BzB€‰BÈ@zB€‰BHAzB€‰B–AzB€‰BÈAzB€‰BúAzB€‰BBzB€‰B/BzB€‰BHBzB€‰BaBzB€‰BzBzB€‰B€‰BzB€‰B–BzB€‰B€¢BzB€‰B¯BzB€‰B€»BzB–BzB–BÈ@zB–BHAzB–B–AzB–BÈAzB–BúAzB–BBzB–B/BzB–BHBzB–BaBzB–BzBzB–B€‰BzB–B–BzB–B€¢BzB–B¯BzB–B€»BzB€¢BzB€¢BÈ@zB€¢BHAzB€¢B–AzB€¢BÈAzB€¢BúAzB€¢BBzB€¢B/BzB€¢BHBzB€¢BaBzB€¢BzBzB€¢B€‰BzB€¢B–BzB€¢B€¢BzB€¢B¯BzB€¢B€»BzB¯BzB¯BÈ@zB¯BHAzB¯B–AzB¯BÈAzB¯BúAzB¯BBzB¯B/BzB¯BHBzB¯BaBzB¯BzBzB¯B€‰BzB¯B–BzB¯B€¢BzB¯B¯BzB¯B€»BzB€»BzB€»BÈ@zB€»BHAzB€»B–AzB€»BÈAzB€»BúAzB€»BBzB€»B/BzB€»BHBzB€»BaBzB€»BzBzB€»B€‰BzB€»B–BzB€»B€¢BzB€»B¯BzB€»B€»B€‰B€‰BÈ@€‰BHA€‰B–A€‰BÈA€‰BúA€‰BB€‰B/B€‰BHB€‰BaB€‰BzB€‰B€‰B€‰B–B€‰B€¢B€‰B¯B€‰B€»B€‰BÈ@€‰BÈ@È@€‰BÈ@HA€‰BÈ@–A€‰BÈ@ÈA€‰BÈ@úA€‰BÈ@B€‰BÈ@/B€‰BÈ@HB€‰BÈ@aB€‰BÈ@zB€‰BÈ@€‰B€‰BÈ@–B€‰BÈ@€¢B€‰BÈ@¯B€‰BÈ@€»B€‰BHA€‰BHAÈ@€‰BHAHA€‰BHA–A€‰BHAÈA€‰BHAúA€‰BHAB€‰BHA/B€‰BHAHB€‰BHAaB€‰BHAzB€‰BHA€‰B€‰BHA–B€‰BHA€¢B€‰BHA¯B€‰BHA€»B€‰B–A€‰B–AÈ@€‰B–AHA€‰B–A–A€‰B–AÈA€‰B–AúA€‰B–AB€‰B–A/B€‰B–AHB€‰B–AaB€‰B–AzB€‰B–A€‰B€‰B–A–B€‰B–A€¢B€‰B–A¯B€‰B–A€»B€‰BÈA€‰BÈAÈ@€‰BÈAHA€‰BÈA–A€‰BÈAÈA€‰BÈAúA€‰BÈAB€‰BÈA/B€‰BÈAHB€‰BÈAaB€‰BÈAzB€‰BÈA€‰B€‰BÈA–B€‰BÈA€¢B€‰BÈA¯B€‰BÈA€»B€‰BúA€‰BúAÈ@€‰BúAHA€‰BúA–A€‰BúAÈA€‰BúAúA€‰BúAB€‰BúA/B€‰BúAHB€‰BúAaB€‰BúAzB€‰BúA€‰B€‰BúA–B€‰BúA€¢B€‰BúA¯B€‰BúA€»B€‰BB€‰BBÈ@€‰BBHA€‰BB–A€‰BBÈA€‰BBúA€‰BBB€‰BB/B€‰BBHB€‰BBaB€‰BBzB€‰BB€‰B€‰BB–B€‰BB€¢B€‰BB¯B€‰BB€»B€‰B/B€‰B/BÈ@€‰B/BHA€‰B/B–A€‰B/BÈA€‰B/BúA€‰B/BB€‰B/B/B€‰B/BHB€‰B/BaB€‰B/BzB€‰B/B€‰B€‰B/B–B€‰B/B€¢B€‰B/B¯B€‰B/B€»B€‰BHB€‰BHBÈ@€‰BHBHA€‰BHB–A€‰BHBÈA€‰BHBúA€‰BHBB€‰BHB/B€‰BHBHB€‰BHBaB€‰BHBzB€‰BHB€‰B€‰BHB–B€‰BHB€¢B€‰BHB¯B€‰BHB€»B€‰BaB€‰BaBÈ@€‰BaBHA€‰BaB–A€‰BaBÈA€‰BaBúA€‰BaBB€‰BaB/B€‰BaBHB€‰BaBaB€‰BaBzB€‰BaB€‰B€‰BaB–B€‰BaB€¢B€‰BaB¯B€‰BaB€»B€‰BzB€‰BzBÈ@€‰BzBHA€‰BzB–A€‰BzBÈA€‰BzBúA€‰BzBB€‰BzB/B€‰BzBHB€‰BzBaB€‰BzBzB€‰BzB€‰B€‰BzB–B€‰BzB€¢B€‰BzB¯B€‰BzB€»B€‰B€‰B€‰B€‰BÈ@€‰B€‰BHA€‰B€‰B–A€‰B€‰BÈA€‰B€‰BúA€‰B€‰BB€‰B€‰B/B€‰B€‰BHB€‰B€‰BaB€‰B€‰BzB€‰B€‰B€‰B€‰B€‰B–B€‰B€‰B€¢B€‰B€‰B¯B€‰B€‰B€»B€‰B–B€‰B–BÈ@€‰B–BHA€‰B–B–A€‰B–BÈA€‰B–BúA€‰B–BB€‰B–B/B€‰B–BHB€‰B–BaB€‰B–BzB€‰B–B€‰B€‰B–B–B€‰B–B€¢B€‰B–B¯B€‰B–B€»B€‰B€¢B€‰B€¢BÈ@€‰B€¢BHA€‰B€¢B–A€‰B€¢BÈA€‰B€¢BúA€‰B€¢BB€‰B€¢B/B€‰B€¢BHB€‰B€¢BaB€‰B€¢BzB€‰B€¢B€‰B€‰B€¢B–B€‰B€¢B€¢B€‰B€¢B¯B€‰B€¢B€»B€‰B¯B€‰B¯BÈ@€‰B¯BHA€‰B¯B–A€‰B¯BÈA€‰B¯BúA€‰B¯BB€‰B¯B/B€‰B¯BHB€‰B¯BaB€‰B¯BzB€‰B¯B€‰B€‰B¯B–B€‰B¯B€¢B€‰B¯B¯B€‰B¯B€»B€‰B€»B€‰B€»BÈ@€‰B€»BHA€‰B€»B–A€‰B€»BÈA€‰B€»BúA€‰B€»BB€‰B€»B/B€‰B€»BHB€‰B€»BaB€‰B€»BzB€‰B€»B€‰B€‰B€»B–B€‰B€»B€¢B€‰B€»B¯B€‰B€»B€»B–B–BÈ@–BHA–B–A–BÈA–BúA–BB–B/B–BHB–BaB–BzB–B€‰B–B–B–B€¢B–B¯B–B€»B–BÈ@–BÈ@È@–BÈ@HA–BÈ@–A–BÈ@ÈA–BÈ@úA–BÈ@B–BÈ@/B–BÈ@HB–BÈ@aB–BÈ@zB–BÈ@€‰B–BÈ@–B–BÈ@€¢B–BÈ@¯B–BÈ@€»B–BHA–BHAÈ@–BHAHA–BHA–A–BHAÈA–BHAúA–BHAB–BHA/B–BHAHB–BHAaB–BHAzB–BHA€‰B–BHA–B–BHA€¢B–BHA¯B–BHA€»B–B–A–B–AÈ@–B–AHA–B–A–A–B–AÈA–B–AúA–B–AB–B–A/B–B–AHB–B–AaB–B–AzB–B–A€‰B–B–A–B–B–A€¢B–B–A¯B–B–A€»B–BÈA–BÈAÈ@–BÈAHA–BÈA–A–BÈAÈA–BÈAúA–BÈAB–BÈA/B–BÈAHB–BÈAaB–BÈAzB–BÈA€‰B–BÈA–B–BÈA€¢B–BÈA¯B–BÈA€»B–BúA–BúAÈ@–BúAHA–BúA–A–BúAÈA–BúAúA–BúAB–BúA/B–BúAHB–BúAaB–BúAzB–BúA€‰B–BúA–B–BúA€¢B–BúA¯B–BúA€»B–BB–BBÈ@–BBHA–BB–A–BBÈA–BBúA–BBB–BB/B–BBHB–BBaB–BBzB–BB€‰B–BB–B–BB€¢B–BB¯B–BB€»B–B/B–B/BÈ@–B/BHA–B/B–A–B/BÈA–B/BúA–B/BB–B/B/B–B/BHB–B/BaB–B/BzB–B/B€‰B–B/B–B–B/B€¢B–B/B¯B–B/B€»B–BHB–BHBÈ@–BHBHA–BHB–A–BHBÈA–BHBúA–BHBB–BHB/B–BHBHB–BHBaB–BHBzB–BHB€‰B–BHB–B–BHB€¢B–BHB¯B–BHB€»B–BaB–BaBÈ@–BaBHA–BaB–A–BaBÈA–BaBúA–BaBB–BaB/B–BaBHB–BaBaB–BaBzB–BaB€‰B–BaB–B–BaB€¢B–BaB¯B–BaB€»B–BzB–BzBÈ@–BzBHA–BzB–A–BzBÈA–BzBúA–BzBB–BzB/B–BzBHB–BzBaB–BzBzB–BzB€‰B–BzB–B–BzB€¢B–BzB¯B–BzB€»B–B€‰B–B€‰BÈ@–B€‰BHA–B€‰B–A–B€‰BÈA–B€‰BúA–B€‰BB–B€‰B/B–B€‰BHB–B€‰BaB–B€‰BzB–B€‰B€‰B–B€‰B–B–B€‰B€¢B–B€‰B¯B–B€‰B€»B–B–B–B–BÈ@–B–BHA–B–B–A–B–BÈA–B–BúA–B–BB–B–B/B–B–BHB–B–BaB–B–BzB–B–B€‰B–B–B–B–B–B€¢B–B–B¯B–B–B€»B–B€¢B–B€¢BÈ@–B€¢BHA–B€¢B–A–B€¢BÈA–B€¢BúA–B€¢BB–B€¢B/B–B€¢BHB–B€¢BaB–B€¢BzB–B€¢B€‰B–B€¢B–B–B€¢B€¢B–B€¢B¯B–B€¢B€»B–B¯B–B¯BÈ@–B¯BHA–B¯B–A–B¯BÈA–B¯BúA–B¯BB–B¯B/B–B¯BHB–B¯BaB–B¯BzB–B¯B€‰B–B¯B–B–B¯B€¢B–B¯B¯B–B¯B€»B–B€»B–B€»BÈ@–B€»BHA–B€»B–A–B€»BÈA–B€»BúA–B€»BB–B€»B/B–B€»BHB–B€»BaB–B€»BzB–B€»B€‰B–B€»B–B–B€»B€¢B–B€»B¯B–B€»B€»B€¢B€¢BÈ@€¢BHA€¢B–A€¢BÈA€¢BúA€¢BB€¢B/B€¢BHB€¢BaB€¢BzB€¢B€‰B€¢B–B€¢B€¢B€¢B¯B€¢B€»B€¢BÈ@€¢BÈ@È@€¢BÈ@HA€¢BÈ@–A€¢BÈ@ÈA€¢BÈ@úA€¢BÈ@B€¢BÈ@/B€¢BÈ@HB€¢BÈ@aB€¢BÈ@zB€¢BÈ@€‰B€¢BÈ@–B€¢BÈ@€¢B€¢BÈ@¯B€¢BÈ@€»B€¢BHA€¢BHAÈ@€¢BHAHA€¢BHA–A€¢BHAÈA€¢BHAúA€¢BHAB€¢BHA/B€¢BHAHB€¢BHAaB€¢BHAzB€¢BHA€‰B€¢BHA–B€¢BHA€¢B€¢BHA¯B€¢BHA€»B€¢B–A€¢B–AÈ@€¢B–AHA€¢B–A–A€¢B–AÈA€¢B–AúA€¢B–AB€¢B–A/B€¢B–AHB€¢B–AaB€¢B–AzB€¢B–A€‰B€¢B–A–B€¢B–A€¢B€¢B–A¯B€¢B–A€»B€¢BÈA€¢BÈAÈ@€¢BÈAHA€¢BÈA–A€¢BÈAÈA€¢BÈAúA€¢BÈAB€¢BÈA/B€¢BÈAHB€¢BÈAaB€¢BÈAzB€¢BÈA€‰B€¢BÈA–B€¢BÈA€¢B€¢BÈA¯B€¢BÈA€»B€¢BúA€¢BúAÈ@€¢BúAHA€¢BúA–A€¢BúAÈA€¢BúAúA€¢BúAB€¢BúA/B€¢BúAHB€¢BúAaB€¢BúAzB€¢BúA€‰B€¢BúA–B€¢BúA€¢B€¢BúA¯B€¢BúA€»B€¢BB€¢BBÈ@€¢BBHA€¢BB–A€¢BBÈA€¢BBúA€¢BBB€¢BB/B€¢BBHB€¢BBaB€¢BBzB€¢BB€‰B€¢BB–B€¢BB€¢B€¢BB¯B€¢BB€»B€¢B/B€¢B/BÈ@€¢B/BHA€¢B/B–A€¢B/BÈA€¢B/BúA€¢B/BB€¢B/B/B€¢B/BHB€¢B/BaB€¢B/BzB€¢B/B€‰B€¢B/B–B€¢B/B€¢B€¢B/B¯B€¢B/B€»B€¢BHB€¢BHBÈ@€¢BHBHA€¢BHB–A€¢BHBÈA€¢BHBúA€¢BHBB€¢BHB/B€¢BHBHB€¢BHBaB€¢BHBzB€¢BHB€‰B€¢BHB–B€¢BHB€¢B€¢BHB¯B€¢BHB€»B€¢BaB€¢BaBÈ@€¢BaBHA€¢BaB–A€¢BaBÈA€¢BaBúA€¢BaBB€¢BaB/B€¢BaBHB€¢BaBaB€¢BaBzB€¢BaB€‰B€¢BaB–B€¢BaB€¢B€¢BaB¯B€¢BaB€»B€¢BzB€¢BzBÈ@€¢BzBHA€¢BzB–A€¢BzBÈA€¢BzBúA€¢BzBB€¢BzB/B€¢BzBHB€¢BzBaB€¢BzBzB€¢BzB€‰B€¢BzB–B€¢BzB€¢B€¢BzB¯B€¢BzB€»B€¢B€‰B€¢B€‰BÈ@€¢B€‰BHA€¢B€‰B–A€¢B€‰BÈA€¢B€‰BúA€¢B€‰BB€¢B€‰B/B€¢B€‰BHB€¢B€‰BaB€¢B€‰BzB€¢B€‰B€‰B€¢B€‰B–B€¢B€‰B€¢B€¢B€‰B¯B€¢B€‰B€»B€¢B–B€¢B–BÈ@€¢B–BHA€¢B–B–A€¢B–BÈA€¢B–BúA€¢B–BB€¢B–B/B€¢B–BHB€¢B–BaB€¢B–BzB€¢B–B€‰B€¢B–B–B€¢B–B€¢B€¢B–B¯B€¢B–B€»B€¢B€¢B€¢B€¢BÈ@€¢B€¢BHA€¢B€¢B–A€¢B€¢BÈA€¢B€¢BúA€¢B€¢BB€¢B€¢B/B€¢B€¢BHB€¢B€¢BaB€¢B€¢BzB€¢B€¢B€‰B€¢B€¢B–B€¢B€¢B€¢B€¢B€¢B¯B€¢B€¢B€»B€¢B¯B€¢B¯BÈ@€¢B¯BHA€¢B¯B–A€¢B¯BÈA€¢B¯BúA€¢B¯BB€¢B¯B/B€¢B¯BHB€¢B¯BaB€¢B¯BzB€¢B¯B€‰B€¢B¯B–B€¢B¯B€¢B€¢B¯B¯B€¢B¯B€»B€¢B€»B€¢B€»BÈ@€¢B€»BHA€¢B€»B–A€¢B€»BÈA€¢B€»BúA€¢B€»BB€¢B€»B/B€¢B€»BHB€¢B€»BaB€¢B€»BzB€¢B€»B€‰B€¢B€»B–B€¢B€»B€¢B€¢B€»B¯B€¢B€»B€»B¯B¯BÈ@¯BHA¯B–A¯BÈA¯BúA¯BB¯B/B¯BHB¯BaB¯BzB¯B€‰B¯B–B¯B€¢B¯B¯B¯B€»B¯BÈ@¯BÈ@È@¯BÈ@HA¯BÈ@–A¯BÈ@ÈA¯BÈ@úA¯BÈ@B¯BÈ@/B¯BÈ@HB¯BÈ@aB¯BÈ@zB¯BÈ@€‰B¯BÈ@–B¯BÈ@€¢B¯BÈ@¯B¯BÈ@€»B¯BHA¯BHAÈ@¯BHAHA¯BHA–A¯BHAÈA¯BHAúA¯BHAB¯BHA/B¯BHAHB¯BHAaB¯BHAzB¯BHA€‰B¯BHA–B¯BHA€¢B¯BHA¯B¯BHA€»B¯B–A¯B–AÈ@¯B–AHA¯B–A–A¯B–AÈA¯B–AúA¯B–AB¯B–A/B¯B–AHB¯B–AaB¯B–AzB¯B–A€‰B¯B–A–B¯B–A€¢B¯B–A¯B¯B–A€»B¯BÈA¯BÈAÈ@¯BÈAHA¯BÈA–A¯BÈAÈA¯BÈAúA¯BÈAB¯BÈA/B¯BÈAHB¯BÈAaB¯BÈAzB¯BÈA€‰B¯BÈA–B¯BÈA€¢B¯BÈA¯B¯BÈA€»B¯BúA¯BúAÈ@¯BúAHA¯BúA–A¯BúAÈA¯BúAúA¯BúAB¯BúA/B¯BúAHB¯BúAaB¯BúAzB¯BúA€‰B¯BúA–B¯BúA€¢B¯BúA¯B¯BúA€»B¯BB¯BBÈ@¯BBHA¯BB–A¯BBÈA¯BBúA¯BBB¯BB/B¯BBHB¯BBaB¯BBzB¯BB€‰B¯BB–B¯BB€¢B¯BB¯B¯BB€»B¯B/B¯B/BÈ@¯B/BHA¯B/B–A¯B/BÈA¯B/BúA¯B/BB¯B/B/B¯B/BHB¯B/BaB¯B/BzB¯B/B€‰B¯B/B–B¯B/B€¢B¯B/B¯B¯B/B€»B¯BHB¯BHBÈ@¯BHBHA¯BHB–A¯BHBÈA¯BHBúA¯BHBB¯BHB/B¯BHBHB¯BHBaB¯BHBzB¯BHB€‰B¯BHB–B¯BHB€¢B¯BHB¯B¯BHB€»B¯BaB¯BaBÈ@¯BaBHA¯BaB–A¯BaBÈA¯BaBúA¯BaBB¯BaB/B¯BaBHB¯BaBaB¯BaBzB¯BaB€‰B¯BaB–B¯BaB€¢B¯BaB¯B¯BaB€»B¯BzB¯BzBÈ@¯BzBHA¯BzB–A¯BzBÈA¯BzBúA¯BzBB¯BzB/B¯BzBHB¯BzBaB¯BzBzB¯BzB€‰B¯BzB–B¯BzB€¢B¯BzB¯B¯BzB€»B¯B€‰B¯B€‰BÈ@¯B€‰BHA¯B€‰B–A¯B€‰BÈA¯B€‰BúA¯B€‰BB¯B€‰B/B¯B€‰BHB¯B€‰BaB¯B€‰BzB¯B€‰B€‰B¯B€‰B–B¯B€‰B€¢B¯B€‰B¯B¯B€‰B€»B¯B–B¯B–BÈ@¯B–BHA¯B–B–A¯B–BÈA¯B–BúA¯B–BB¯B–B/B¯B–BHB¯B–BaB¯B–BzB¯B–B€‰B¯B–B–B¯B–B€¢B¯B–B¯B¯B–B€»B¯B€¢B¯B€¢BÈ@¯B€¢BHA¯B€¢B–A¯B€¢BÈA¯B€¢BúA¯B€¢BB¯B€¢B/B¯B€¢BHB¯B€¢BaB¯B€¢BzB¯B€¢B€‰B¯B€¢B–B¯B€¢B€¢B¯B€¢B¯B¯B€¢B€»B¯B¯B¯B¯BÈ@¯B¯BHA¯B¯B–A¯B¯BÈA¯B¯BúA¯B¯BB¯B¯B/B¯B¯BHB¯B¯BaB¯B¯BzB¯B¯B€‰B¯B¯B–B¯B¯B€¢B¯B¯B¯B¯B¯B€»B¯B€»B¯B€»BÈ@¯B€»BHA¯B€»B–A¯B€»BÈA¯B€»BúA¯B€»BB¯B€»B/B¯B€»BHB¯B€»BaB¯B€»BzB¯B€»B€‰B¯B€»B–B¯B€»B€¢B¯B€»B¯B¯B€»B€»B€»B€»BÈ@€»BHA€»B–A€»BÈA€»BúA€»BB€»B/B€»BHB€»BaB€»BzB€»B€‰B€»B–B€»B€¢B€»B¯B€»B€»B€»BÈ@€»BÈ@È@€»BÈ@HA€»BÈ@–A€»BÈ@ÈA€»BÈ@úA€»BÈ@B€»BÈ@/B€»BÈ@HB€»BÈ@aB€»BÈ@zB€»BÈ@€‰B€»BÈ@–B€»BÈ@€¢B€»BÈ@¯B€»BÈ@€»B€»BHA€»BHAÈ@€»BHAHA€»BHA–A€»BHAÈA€»BHAúA€»BHAB€»BHA/B€»BHAHB€»BHAaB€»BHAzB€»BHA€‰B€»BHA–B€»BHA€¢B€»BHA¯B€»BHA€»B€»B–A€»B–AÈ@€»B–AHA€»B–A–A€»B–AÈA€»B–AúA€»B–AB€»B–A/B€»B–AHB€»B–AaB€»B–AzB€»B–A€‰B€»B–A–B€»B–A€¢B€»B–A¯B€»B–A€»B€»BÈA€»BÈAÈ@€»BÈAHA€»BÈA–A€»BÈAÈA€»BÈAúA€»BÈAB€»BÈA/B€»BÈAHB€»BÈAaB€»BÈAzB€»BÈA€‰B€»BÈA–B€»BÈA€¢B€»BÈA¯B€»BÈA€»B€»BúA€»BúAÈ@€»BúAHA€»BúA–A€»BúAÈA€»BúAúA€»BúAB€»BúA/B€»BúAHB€»BúAaB€»BúAzB€»BúA€‰B€»BúA–B€»BúA€¢B€»BúA¯B€»BúA€»B€»BB€»BBÈ@€»BBHA€»BB–A€»BBÈA€»BBúA€»BBB€»BB/B€»BBHB€»BBaB€»BBzB€»BB€‰B€»BB–B€»BB€¢B€»BB¯B€»BB€»B€»B/B€»B/BÈ@€»B/BHA€»B/B–A€»B/BÈA€»B/BúA€»B/BB€»B/B/B€»B/BHB€»B/BaB€»B/BzB€»B/B€‰B€»B/B–B€»B/B€¢B€»B/B¯B€»B/B€»B€»BHB€»BHBÈ@€»BHBHA€»BHB–A€»BHBÈA€»BHBúA€»BHBB€»BHB/B€»BHBHB€»BHBaB€»BHBzB€»BHB€‰B€»BHB–B€»BHB€¢B€»BHB¯B€»BHB€»B€»BaB€»BaBÈ@€»BaBHA€»BaB–A€»BaBÈA€»BaBúA€»BaBB€»BaB/B€»BaBHB€»BaBaB€»BaBzB€»BaB€‰B€»BaB–B€»BaB€¢B€»BaB¯B€»BaB€»B€»BzB€»BzBÈ@€»BzBHA€»BzB–A€»BzBÈA€»BzBúA€»BzBB€»BzB/B€»BzBHB€»BzBaB€»BzBzB€»BzB€‰B€»BzB–B€»BzB€¢B€»BzB¯B€»BzB€»B€»B€‰B€»B€‰BÈ@€»B€‰BHA€»B€‰B–A€»B€‰BÈA€»B€‰BúA€»B€‰BB€»B€‰B/B€»B€‰BHB€»B€‰BaB€»B€‰BzB€»B€‰B€‰B€»B€‰B–B€»B€‰B€¢B€»B€‰B¯B€»B€‰B€»B€»B–B€»B–BÈ@€»B–BHA€»B–B–A€»B–BÈA€»B–BúA€»B–BB€»B–B/B€»B–BHB€»B–BaB€»B–BzB€»B–B€‰B€»B–B–B€»B–B€¢B€»B–B¯B€»B–B€»B€»B€¢B€»B€¢BÈ@€»B€¢BHA€»B€¢B–A€»B€¢BÈA€»B€¢BúA€»B€¢BB€»B€¢B/B€»B€¢BHB€»B€¢BaB€»B€¢BzB€»B€¢B€‰B€»B€¢B–B€»B€¢B€¢B€»B€¢B¯B€»B€¢B€»B€»B¯B€»B¯BÈ@€»B¯BHA€»B¯B–A€»B¯BÈA€»B¯BúA€»B¯BB€»B¯B/B€»B¯BHB€»B¯BaB€»B¯BzB€»B¯B€‰B€»B¯B–B€»B¯B€¢B€»B¯B¯B€»B¯B€»B€»B€»B€»B€»BÈ@€»B€»BHA€»B€»B–A€»B€»BÈA€»B€»BúA€»B€»BB€»B€»B/B€»B€»BHB€»B€»BaB€»B€»BzB€»B€»B€‰B€»B€»B–B€»B€»B€¢B€»B€»B¯B€»B€»B€»BÀN-GenIC/ics.param0000644000076500000240000000710311226353636013173 0ustar volkerstaff Nmesh 128 % This is the size of the FFT grid used to % compute the displacement field. One % should have Nmesh >= Nsample. Nsample 128 % sets the maximum k that the code uses, % i.e. this effectively determines the % Nyquist frequency that the code assumes, % k_Nyquist = 2*PI/Box * Nsample/2 % Normally, one chooses Nsample such that % Ntot = Nsample^3, where Ntot is the % total number of particles Box 150000.0 % Periodic box size of simulation FileBase ics % Base-filename of output files OutputDir ./ICs/ % Directory for output GlassFile dummy_glass.dat % File with unperturbed glass or % Cartesian grid TileFac 8 % Number of times the glass file is % tiled in each dimension (must be % an integer) Omega 0.3 % Total matter density (at z=0) OmegaLambda 0.7 % Cosmological constant (at z=0) OmegaBaryon 0.0 % Baryon density (at z=0) HubbleParam 0.7 % Hubble paramater (may be used for power spec parameterization) Redshift 63 % Starting redshift Sigma8 0.9 % power spectrum normalization SphereMode 1 % if "1" only modes with |k| < k_Nyquist are % used (i.e. a sphere in k-space), otherwise modes with % |k_x|,|k_y|,|k_z| < k_Nyquist are used % (i.e. a cube in k-space) WhichSpectrum 0 % "1" selects Eisenstein & Hu spectrum, % "2" selects a tabulated power spectrum in % the file 'FileWithInputSpectrum' % otherwise, Efstathiou parametrization is used FileWithInputSpectrum input_spectrum.txt % filename of tabulated input % spectrum (if used) InputSpectrum_UnitLength_in_cm 3.085678e24 % defines length unit of tabulated % input spectrum in cm/h. % Note: This can be chosen different from UnitLength_in_cm ReNormalizeInputSpectrum 1 % if set to zero, the % tabulated spectrum is % assumed to be normalized % already in its amplitude to % the starting redshift, % otherwise this is recomputed % based on the specified sigma8 ShapeGamma 0.21 % only needed for Efstathiou power spectrum PrimordialIndex 1.0 % may be used to tilt the primordial index, % primordial spectrum is k^PrimordialIndex Seed 123456 % seed for IC-generator NumFilesWrittenInParallel 2 % limits the number of files that are % written in parallel when outputting UnitLength_in_cm 3.085678e21 % defines length unit of output (in cm/h) UnitMass_in_g 1.989e43 % defines mass unit of output (in g/cm) UnitVelocity_in_cm_per_s 1e5 % defines velocity unit of output (in cm/sec) N-GenIC/job.sh0000755000076500000240000000027111226351653012500 0ustar volkerstaff#!/bin/tcsh #$ -j n #$ -cwd #$ -pe mvapich2 4 #$ -m be #$ -M volker@mpa-garching.mpg.de #$ -N ics # module load mvapich2-1.2-sdr-gnu/4.1.2 mpiexec -np $NSLOTS ./N-GenIC ics.param N-GenIC/main.c0000644000076500000240000003517111224135727012466 0ustar volkerstaff#include #include #include #include #include #include "allvars.h" #include "proto.h" int main(int argc, char **argv) { MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &ThisTask); MPI_Comm_size(MPI_COMM_WORLD, &NTask); if(argc < 2) { if(ThisTask == 0) { fprintf(stdout, "\nParameters are missing.\n"); fprintf(stdout, "Call with \n\n"); } MPI_Finalize(); exit(0); } read_parameterfile(argv[1]); set_units(); initialize_powerspectrum(); initialize_ffts(); read_glass(GlassFile); displacement_fields(); write_particle_data(); if(NumPart) free(P); free_ffts(); if(ThisTask == 0) { printf("\nIC's generated.\n\n"); printf("Initial scale factor = %g\n", InitTime); printf("\n"); } MPI_Barrier(MPI_COMM_WORLD); print_spec(); MPI_Finalize(); /* clean up & finalize MPI */ exit(0); } void displacement_fields(void) { MPI_Request request; MPI_Status status; gsl_rng *random_generator; int i, j, k, ii, jj, kk, axes; int n; int sendTask, recvTask; double fac, vel_prefac; double kvec[3], kmag, kmag2, p_of_k; double delta, phase, ampl, hubble_a; double u, v, w; double f1, f2, f3, f4, f5, f6, f7, f8; double dis, maxdisp, max_disp_glob; unsigned int *seedtable; #ifdef CORRECT_CIC double fx, fy, fz, ff, smth; #endif if(ThisTask == 0) { printf("\nstart computing displacement fields...\n"); fflush(stdout); } hubble_a = Hubble * sqrt(Omega / pow(InitTime, 3) + (1 - Omega - OmegaLambda) / pow(InitTime, 2) + OmegaLambda); vel_prefac = InitTime * hubble_a * F_Omega(InitTime); vel_prefac /= sqrt(InitTime); /* converts to Gadget velocity */ if(ThisTask == 0) printf("vel_prefac= %g hubble_a=%g fom=%g \n", vel_prefac, hubble_a, F_Omega(InitTime)); fac = pow(2 * PI / Box, 1.5); maxdisp = 0; random_generator = gsl_rng_alloc(gsl_rng_ranlxd1); gsl_rng_set(random_generator, Seed); if(!(seedtable = malloc(Nmesh * Nmesh * sizeof(unsigned int)))) FatalError(4); for(i = 0; i < Nmesh / 2; i++) { for(j = 0; j < i; j++) seedtable[i * Nmesh + j] = 0x7fffffff * gsl_rng_uniform(random_generator); for(j = 0; j < i + 1; j++) seedtable[j * Nmesh + i] = 0x7fffffff * gsl_rng_uniform(random_generator); for(j = 0; j < i; j++) seedtable[(Nmesh - 1 - i) * Nmesh + j] = 0x7fffffff * gsl_rng_uniform(random_generator); for(j = 0; j < i + 1; j++) seedtable[(Nmesh - 1 - j) * Nmesh + i] = 0x7fffffff * gsl_rng_uniform(random_generator); for(j = 0; j < i; j++) seedtable[i * Nmesh + (Nmesh - 1 - j)] = 0x7fffffff * gsl_rng_uniform(random_generator); for(j = 0; j < i + 1; j++) seedtable[j * Nmesh + (Nmesh - 1 - i)] = 0x7fffffff * gsl_rng_uniform(random_generator); for(j = 0; j < i; j++) seedtable[(Nmesh - 1 - i) * Nmesh + (Nmesh - 1 - j)] = 0x7fffffff * gsl_rng_uniform(random_generator); for(j = 0; j < i + 1; j++) seedtable[(Nmesh - 1 - j) * Nmesh + (Nmesh - 1 - i)] = 0x7fffffff * gsl_rng_uniform(random_generator); } for(axes = 0; axes < 3; axes++) { if(ThisTask == 0) { printf("\nstarting axes=%d...\n", axes); fflush(stdout); } /* first, clean the array */ for(i = 0; i < Local_nx; i++) for(j = 0; j < Nmesh; j++) for(k = 0; k <= Nmesh / 2; k++) { Cdata[(i * Nmesh + j) * (Nmesh / 2 + 1) + k].re = 0; Cdata[(i * Nmesh + j) * (Nmesh / 2 + 1) + k].im = 0; } for(i = 0; i < Nmesh; i++) { ii = Nmesh - i; if(ii == Nmesh) ii = 0; if((i >= Local_x_start && i < (Local_x_start + Local_nx)) || (ii >= Local_x_start && ii < (Local_x_start + Local_nx))) { for(j = 0; j < Nmesh; j++) { gsl_rng_set(random_generator, seedtable[i * Nmesh + j]); for(k = 0; k < Nmesh / 2; k++) { phase = gsl_rng_uniform(random_generator) * 2 * PI; do ampl = gsl_rng_uniform(random_generator); while(ampl == 0); if(i == Nmesh / 2 || j == Nmesh / 2 || k == Nmesh / 2) continue; if(i == 0 && j == 0 && k == 0) continue; if(i < Nmesh / 2) kvec[0] = i * 2 * PI / Box; else kvec[0] = -(Nmesh - i) * 2 * PI / Box; if(j < Nmesh / 2) kvec[1] = j * 2 * PI / Box; else kvec[1] = -(Nmesh - j) * 2 * PI / Box; if(k < Nmesh / 2) kvec[2] = k * 2 * PI / Box; else kvec[2] = -(Nmesh - k) * 2 * PI / Box; kmag2 = kvec[0] * kvec[0] + kvec[1] * kvec[1] + kvec[2] * kvec[2]; kmag = sqrt(kmag2); if(SphereMode == 1) { if(kmag * Box / (2 * PI) > Nsample / 2) /* select a sphere in k-space */ continue; } else { if(fabs(kvec[0]) * Box / (2 * PI) > Nsample / 2) continue; if(fabs(kvec[1]) * Box / (2 * PI) > Nsample / 2) continue; if(fabs(kvec[2]) * Box / (2 * PI) > Nsample / 2) continue; } p_of_k = PowerSpec(kmag); p_of_k *= -log(ampl); delta = fac * sqrt(p_of_k) / Dplus; /* scale back to starting redshift */ #ifdef CORRECT_CIC /* do deconvolution of CIC interpolation */ fx = fy = fz = 1; if(kvec[0] != 0) { fx = (kvec[0] * Box / 2) / Nmesh; fx = sin(fx) / fx; } if(kvec[1] != 0) { fy = (kvec[1] * Box / 2) / Nmesh; fy = sin(fy) / fy; } if(kvec[2] != 0) { fz = (kvec[2] * Box / 2) / Nmesh; fz = sin(fz) / fz; } ff = 1 / (fx * fy * fz); smth = ff * ff; delta *= smth; /* end deconvolution */ #endif if(k > 0) { if(i >= Local_x_start && i < (Local_x_start + Local_nx)) { Cdata[((i - Local_x_start) * Nmesh + j) * (Nmesh / 2 + 1) + k].re = -kvec[axes] / kmag2 * delta * sin(phase); Cdata[((i - Local_x_start) * Nmesh + j) * (Nmesh / 2 + 1) + k].im = kvec[axes] / kmag2 * delta * cos(phase); } } else /* k=0 plane needs special treatment */ { if(i == 0) { if(j >= Nmesh / 2) continue; else { if(i >= Local_x_start && i < (Local_x_start + Local_nx)) { jj = Nmesh - j; /* note: j!=0 surely holds at this point */ Cdata[((i - Local_x_start) * Nmesh + j) * (Nmesh / 2 + 1) + k].re = -kvec[axes] / kmag2 * delta * sin(phase); Cdata[((i - Local_x_start) * Nmesh + j) * (Nmesh / 2 + 1) + k].im = kvec[axes] / kmag2 * delta * cos(phase); Cdata[((i - Local_x_start) * Nmesh + jj) * (Nmesh / 2 + 1) + k].re = -kvec[axes] / kmag2 * delta * sin(phase); Cdata[((i - Local_x_start) * Nmesh + jj) * (Nmesh / 2 + 1) + k].im = -kvec[axes] / kmag2 * delta * cos(phase); } } } else /* here comes i!=0 : conjugate can be on other processor! */ { if(i >= Nmesh / 2) continue; else { ii = Nmesh - i; if(ii == Nmesh) ii = 0; jj = Nmesh - j; if(jj == Nmesh) jj = 0; if(i >= Local_x_start && i < (Local_x_start + Local_nx)) { Cdata[((i - Local_x_start) * Nmesh + j) * (Nmesh / 2 + 1) + k].re = -kvec[axes] / kmag2 * delta * sin(phase); Cdata[((i - Local_x_start) * Nmesh + j) * (Nmesh / 2 + 1) + k].im = kvec[axes] / kmag2 * delta * cos(phase); } if(ii >= Local_x_start && ii < (Local_x_start + Local_nx)) { Cdata[((ii - Local_x_start) * Nmesh + jj) * (Nmesh / 2 + 1) + k].re = -kvec[axes] / kmag2 * delta * sin(phase); Cdata[((ii - Local_x_start) * Nmesh + jj) * (Nmesh / 2 + 1) + k].im = -kvec[axes] / kmag2 * delta * cos(phase); } } } } } } } } rfftwnd_mpi(Inverse_plan, 1, Disp, Workspace, FFTW_NORMAL_ORDER); /** FFT **/ /* now get the plane on the right side from neighbour on the right, and send the left plane */ recvTask = ThisTask; do { recvTask--; if(recvTask < 0) recvTask = NTask - 1; } while(Local_nx_table[recvTask] == 0); sendTask = ThisTask; do { sendTask++; if(sendTask >= NTask) sendTask = 0; } while(Local_nx_table[sendTask] == 0); /* use non-blocking send */ if(Local_nx > 0) { MPI_Isend(&Disp[0], sizeof(fftw_real) * Nmesh * (2 * (Nmesh / 2 + 1)), MPI_BYTE, recvTask, 10, MPI_COMM_WORLD, &request); MPI_Recv(&Disp[(Local_nx * Nmesh) * (2 * (Nmesh / 2 + 1))], sizeof(fftw_real) * Nmesh * (2 * (Nmesh / 2 + 1)), MPI_BYTE, sendTask, 10, MPI_COMM_WORLD, &status); MPI_Wait(&request, &status); } /* read-out displacements */ for(n = 0; n < NumPart; n++) { { u = P[n].Pos[0] / Box * Nmesh; v = P[n].Pos[1] / Box * Nmesh; w = P[n].Pos[2] / Box * Nmesh; i = (int) u; j = (int) v; k = (int) w; if(i == (Local_x_start + Local_nx)) i = (Local_x_start + Local_nx) - 1; if(i < Local_x_start) i = Local_x_start; if(j == Nmesh) j = Nmesh - 1; if(k == Nmesh) k = Nmesh - 1; u -= i; v -= j; w -= k; i -= Local_x_start; ii = i + 1; jj = j + 1; kk = k + 1; if(jj >= Nmesh) jj -= Nmesh; if(kk >= Nmesh) kk -= Nmesh; f1 = (1 - u) * (1 - v) * (1 - w); f2 = (1 - u) * (1 - v) * (w); f3 = (1 - u) * (v) * (1 - w); f4 = (1 - u) * (v) * (w); f5 = (u) * (1 - v) * (1 - w); f6 = (u) * (1 - v) * (w); f7 = (u) * (v) * (1 - w); f8 = (u) * (v) * (w); dis = Disp[(i * Nmesh + j) * (2 * (Nmesh / 2 + 1)) + k] * f1 + Disp[(i * Nmesh + j) * (2 * (Nmesh / 2 + 1)) + kk] * f2 + Disp[(i * Nmesh + jj) * (2 * (Nmesh / 2 + 1)) + k] * f3 + Disp[(i * Nmesh + jj) * (2 * (Nmesh / 2 + 1)) + kk] * f4 + Disp[(ii * Nmesh + j) * (2 * (Nmesh / 2 + 1)) + k] * f5 + Disp[(ii * Nmesh + j) * (2 * (Nmesh / 2 + 1)) + kk] * f6 + Disp[(ii * Nmesh + jj) * (2 * (Nmesh / 2 + 1)) + k] * f7 + Disp[(ii * Nmesh + jj) * (2 * (Nmesh / 2 + 1)) + kk] * f8; P[n].Vel[axes] = dis; if(dis > maxdisp) maxdisp = dis; } } } /* now add displacement to Lagrangian coordinates, and multiply velocities by correct factor */ for(n = 0; n < NumPart; n++) { for(axes = 0; axes < 3; axes++) { P[n].Pos[axes] += P[n].Vel[axes]; P[n].Vel[axes] *= vel_prefac; P[n].Pos[axes] = periodic_wrap(P[n].Pos[axes]); } } gsl_rng_free(random_generator); MPI_Reduce(&maxdisp, &max_disp_glob, 1, MPI_DOUBLE, MPI_MAX, 0, MPI_COMM_WORLD); if(ThisTask == 0) { printf("\nMaximum displacement: %g kpc/h, in units of the part-spacing= %g\n", max_disp_glob, max_disp_glob / (Box / Nmesh)); } } double periodic_wrap(double x) { while(x >= Box) x -= Box; while(x < 0) x += Box; return x; } void set_units(void) /* ... set some units */ { UnitTime_in_s = UnitLength_in_cm / UnitVelocity_in_cm_per_s; G = GRAVITY / pow(UnitLength_in_cm, 3) * UnitMass_in_g * pow(UnitTime_in_s, 2); Hubble = HUBBLE * UnitTime_in_s; } void initialize_ffts(void) { int total_size, i, additional; int local_ny_after_transpose, local_y_start_after_transpose; int *slab_to_task_local; size_t bytes; Inverse_plan = rfftw3d_mpi_create_plan(MPI_COMM_WORLD, Nmesh, Nmesh, Nmesh, FFTW_COMPLEX_TO_REAL, FFTW_ESTIMATE); rfftwnd_mpi_local_sizes(Inverse_plan, &Local_nx, &Local_x_start, &local_ny_after_transpose, &local_y_start_after_transpose, &total_size); Local_nx_table = malloc(sizeof(int) * NTask); MPI_Allgather(&Local_nx, 1, MPI_INT, Local_nx_table, 1, MPI_INT, MPI_COMM_WORLD); if(ThisTask == 0) { for(i = 0; i < NTask; i++) printf("Task=%d Local_nx=%d\n", i, Local_nx_table[i]); fflush(stdout); } Slab_to_task = malloc(sizeof(int) * Nmesh); slab_to_task_local = malloc(sizeof(int) * Nmesh); for(i = 0; i < Nmesh; i++) slab_to_task_local[i] = 0; for(i = 0; i < Local_nx; i++) slab_to_task_local[Local_x_start + i] = ThisTask; MPI_Allreduce(slab_to_task_local, Slab_to_task, Nmesh, MPI_INT, MPI_SUM, MPI_COMM_WORLD); free(slab_to_task_local); additional = (Nmesh) * (2 * (Nmesh / 2 + 1)); /* additional plane on the right side */ Disp = (fftw_real *) malloc(bytes = sizeof(fftw_real) * (total_size + additional)); Workspace = (fftw_real *) malloc(bytes += sizeof(fftw_real) * total_size); if(Disp && Workspace) { if(ThisTask == 0) printf("\nallocated %g Mbyte on Task %d for FFT's\n", bytes / (1024.0 * 1024.0), ThisTask); } else { printf("failed to allocate %g Mbyte on Task %d\n", bytes / (1024.0 * 1024.0), ThisTask); printf("bailing out.\n"); FatalError(1); } Cdata = (fftw_complex *) Disp; /* transformed array */ } void free_ffts(void) { free(Workspace); free(Disp); free(Slab_to_task); rfftwnd_mpi_destroy_plan(Inverse_plan); } int FatalError(int errnum) { printf("FatalError called with number=%d\n", errnum); fflush(stdout); MPI_Abort(MPI_COMM_WORLD, errnum); exit(0); } static double A, B, alpha, beta, V, gf; double fnl(double x) /* Peacock & Dodds formula */ { return x * pow((1 + B * beta * x + pow(A * x, alpha * beta)) / (1 + pow(pow(A * x, alpha) * gf * gf * gf / (V * sqrt(x)), beta)), 1 / beta); } void print_spec(void) { double k, knl, po, dl, dnl, neff, kf, kstart, kend, po2, po1, DDD; char buf[1000]; FILE *fd; if(ThisTask == 0) { sprintf(buf, "%s/inputspec_%s.txt", OutputDir, FileBase); fd = fopen(buf, "w"); gf = GrowthFactor(0.001, 1.0) / (1.0 / 0.001); DDD = GrowthFactor(1.0 / (Redshift + 1), 1.0); fprintf(fd, "%12g %12g\n", Redshift, DDD); /* print actual starting redshift and linear growth factor for this cosmology */ kstart = 2 * PI / (1000.0 * (3.085678e24 / UnitLength_in_cm)); /* 1000 Mpc/h */ kend = 2 * PI / (0.001 * (3.085678e24 / UnitLength_in_cm)); /* 0.001 Mpc/h */ for(k = kstart; k < kend; k *= 1.025) { po = PowerSpec(k); dl = 4.0 * PI * k * k * k * po; kf = 0.5; po2 = PowerSpec(1.001 * k * kf); po1 = PowerSpec(k * kf); if(po != 0 && po1 != 0 && po2 != 0) { neff = (log(po2) - log(po1)) / (log(1.001 * k * kf) - log(k * kf)); if(1 + neff / 3 > 0) { A = 0.482 * pow(1 + neff / 3, -0.947); B = 0.226 * pow(1 + neff / 3, -1.778); alpha = 3.310 * pow(1 + neff / 3, -0.244); beta = 0.862 * pow(1 + neff / 3, -0.287); V = 11.55 * pow(1 + neff / 3, -0.423) * 1.2; dnl = fnl(dl); knl = k * pow(1 + dnl, 1.0 / 3); } else { dnl = 0; knl = 0; } } else { dnl = 0; knl = 0; } fprintf(fd, "%12g %12g %12g %12g\n", k, dl, knl, dnl); } fclose(fd); } } N-GenIC/make_dummy_glass.pro0000644000076500000240000000134511224135727015435 0ustar volkerstaff N = 16L fout = "dummy_glass.dat" Ntot = N * N * N npart=lonarr(6) massarr=dblarr(6) time=0.0D redshift=0.0D flag_sfr=0L flag_feedback=0L npartall=lonarr(6) flag_cooling= 0L num_files= 1L BoxSize = 0.0D bytesleft=120 la=intarr(bytesleft/2) BoxSize = 100.0D npart(1) = Ntot npartall(1) = Ntot pos= fltarr(3, Ntot) for i=0L, N-1 do begin for j=0L, N-1 do begin for k=0L, N-1 do begin pos(0, (i*N+j)*N+k) = (i+0.0)/N * BoxSize pos(1, (i*N+j)*N+k) = (j+0.0)/N * BoxSize pos(2, (i*N+j)*N+k) = (k+0.0)/N * BoxSize endfor endfor endfor openw,1,fout,/f77_unformatted writeu,1, npart,massarr,time,redshift,flag_sfr,flag_feedback,npartall,flag_cooling,num_files,BoxSize,la writeu,1, pos close,1 end N-GenIC/Makefile0000644000076500000240000001137511224136027013030 0ustar volkerstaffEXEC = N-GenIC OBJS = main.o power.o allvars.o save.o read_param.o read_glass.o INCL = allvars.h proto.h Makefile #OPT += -DPRODUCEGAS # Set this to automatically produce gas particles # for a single DM species in the input file by interleaved by a half a grid spacing OPT += -DNO64BITID # switch this on if you want normal 32-bit IDs #OPT += -DCORRECT_CIC # only switch this on if particles are homogenously distributed over mesh cells (say glass) OPTIONS = $(OPT) #SYSTYPE="OpenSuse" #SYSTYPE="Stella" #SYSTYPE="Regatta" #SYSTYPE="RZG_LinuxCluster" #SYSTYPE="RZG_LinuxCluster-gcc" #SYSTYPE="Solaris" # module load mvapich2-1.2-sdr-intel/11.0 #SYSTYPE="OPA-Cluster64-Intel" # module load mvapich2-1.2-sdr-gnu/4.1.2 SYSTYPE="OPA-Cluster64-Gnu" FFTW_INCL = -I/usr/common/pdsoft/include FFTW_LIBS = -L/usr/common/pdsoft/lib CC = mpicc # sets the C-compiler (default) OPTIMIZE = -O3 -Wall # optimization and warning flags (default) MPICHLIB = -lmpich ifeq ($(SYSTYPE),"OpenSuse") CC = mpicc OPTIMIZE = -Wall GSL_INCL = GSL_LIBS = FFTW_INCL= FFTW_LIBS= MPICHLIB = -L/usr/lib/mpi/gcc/openmpi/lib -Xlinker -R -Xlinker /usr/lib/mpi/gcc/openmpi/lib -lmpi endif ifeq ($(SYSTYPE),"Stella") CC = mpicc OPTIMIZE = -O3 -Wall GSL_INCL = -I/home/schaye/libs/include GSL_LIBS = -L/home/schaye/libs/lib -static FFTW_INCL= -I/home/schaye/libs/include FFTW_LIBS= -L/home/schaye/libs/lib MPICHLIB = endif ifeq ($(SYSTYPE),"OPA-Cluster64-Intel") # module load mvapich2-1.2-sdr-intel/11.0 CC = mpicc ifeq (SOFTDOUBLEDOUBLE,$(findstring SOFTDOUBLEDOUBLE,$(OPT))) CC = mpicxx endif OPTIMIZE = -O3 -g -Wall -m64 GSL_INCL = -I/afs/rzg/home/v/vrs/Libs/opteron64/mvapich2-1.2-sdr-intel-11.0/include GSL_LIBS = -L/afs/rzg/home/v/vrs/Libs/opteron64/mvapich2-1.2-sdr-intel-11.0/lib -Xlinker -R -Xlinker /afs/rzg/home/v/vrs/Libs/opteron64/mvapich2-1.2-sdr-intel-11.0/lib FFTW_INCL= -I/afs/rzg/home/v/vrs/Libs/opteron64/mvapich2-1.2-sdr-intel-11.0/include FFTW_LIBS= -L/afs/rzg/home/v/vrs/Libs/opteron64/mvapich2-1.2-sdr-intel-11.0/lib MPICHLIB = HDF5INCL = HDF5LIB = OPT += -DNOCALLSOFSYSTEM endif ifeq ($(SYSTYPE),"OPA-Cluster64-Gnu") # module load mvapich2-1.2-sdr-gnu/4.1.2 CC = mpicc ifeq (SOFTDOUBLEDOUBLE,$(findstring SOFTDOUBLEDOUBLE,$(OPT))) CC = mpicxx endif OPTIMIZE = -O3 -g -Wall -m64 GSL_INCL = -I/afs/rzg/home/v/vrs/Libs/opteron64/mvapich2-1.2-sdr-gnu-4.1.2/include GSL_LIBS = -L/afs/rzg/home/v/vrs/Libs/opteron64/mvapich2-1.2-sdr-gnu-4.1.2/lib -Xlinker -R -Xlinker /afs/rzg/home/v/vrs/Libs/opteron64/mvapich2-1.2-sdr-gnu-4.1.2/lib FFTW_INCL= -I/afs/rzg/home/v/vrs/Libs/opteron64/mvapich2-1.2-sdr-gnu-4.1.2/include FFTW_LIBS= -L/afs/rzg/home/v/vrs/Libs/opteron64/mvapich2-1.2-sdr-gnu-4.1.2/lib MPICHLIB = HDF5INCL = HDF5LIB = OPT += -DNOCALLSOFSYSTEM endif ifeq ($(SYSTYPE),"Regatta") CC = mpcc_r OPTIMIZE = -O5 -qstrict -qipa -q64 GSL_INCL = -I/afs/ipp-garching.mpg.de/u/vrs/gsl_psi64/include GSL_LIBS = -L/afs/ipp-garching.mpg.de/u/vrs/gsl_psi64/lib FFTW_INCL= -I/afs/ipp-garching.mpg.de/u/vrs/fftw_psi64/include FFTW_LIBS= -L/afs/ipp-garching.mpg.de/u/vrs/fftw_psi64/lib -q64 -qipa MPICHLIB = endif ifeq ($(SYSTYPE),"RZG_LinuxCluster") CC = mpicci OPTIMIZE = -O3 GSL_INCL = -I/afs/ipp-garching.mpg.de/u/vrs/gsl_linux/include GSL_LIBS = -L/afs/ipp-garching.mpg.de/u/vrs/gsl_linux/lib -static FFTW_INCL= -I/afs/ipp-garching.mpg.de/u/vrs/fftw_linux/include FFTW_LIBS= -L/afs/ipp-garching.mpg.de/u/vrs/fftw_linux/lib endif ifeq ($(SYSTYPE),"RZG_LinuxCluster-gcc") CC = /afs/ipp-garching.mpg.de/u/vrs/bin/mpiccf OPTIMIZE = -O3 GSL_INCL = -I/afs/ipp-garching.mpg.de/u/vrs/gsl_linux_gcc3.2/include GSL_LIBS = -L/afs/ipp-garching.mpg.de/u/vrs/gsl_linux_gcc3.2/lib FFTW_INCL= -I/afs/ipp-garching.mpg.de/u/vrs/fftw_linux_gcc3.2/include FFTW_LIBS= -L/afs/ipp-garching.mpg.de/u/vrs/fftw_linux_gcc3.2/lib endif ifeq ($(SYSTYPE),"Solaris") CC = mpcc # sets the C-compiler OPTIMIZE = -i -fast -xvector -xarch=v9b -xchip=ultra3 -xcache=64/32/4:8192/512/1 -I/opt/local/include GSL_INCL = -I/opt/local/include/gsl GSL_LIBS = -L/opt/local/lib/sparcv9 FFTW_INCL= -I/opt/local/include FFTW_LIBS= -L/opt/local/lib/sparcv9 endif FFTW_LIB = $(FFTW_LIBS) -ldrfftw_mpi -ldfftw_mpi -ldrfftw -ldfftw LIBS = -lm $(MPICHLIB) $(FFTW_LIB) $(GSL_LIBS) -lgsl -lgslcblas ifeq ($(SYSTYPE),"Solaris") LIBS = -R/opt/local/lib/sparcv9 -lm -lmpi $(GSL_LIBS) -lgsl -lgslcblas $(FFTW_LIB) endif CFLAGS = $(OPTIONS) $(OPTIMIZE) $(FFTW_INCL) $(GSL_INCL) $(EXEC): $(OBJS) $(CC) $(OPTIMIZE) $(OBJS) $(LIBS) -o $(EXEC) $(OBJS): $(INCL) .PHONY : clean clean: rm -f $(OBJS) $(EXEC) N-GenIC/power.c0000644000076500000240000001500211224135727012665 0ustar volkerstaff#include #include #include #include "allvars.h" #include "proto.h" #define WORKSIZE 100000 static double R8; static double r_tophat; static double AA, BB, CC; static double nu; static double Norm; static int NPowerTable; static struct pow_table { double logk, logD; } *PowerTable; double PowerSpec(double k) { double power = 0; switch (WhichSpectrum) { case 1: power = PowerSpec_EH(k); break; case 2: power = PowerSpec_Tabulated(k); break; default: power = PowerSpec_Efstathiou(k); break; } power *= pow(k, PrimordialIndex - 1.0); return power; } void read_power_table(void) { FILE *fd; char buf[500]; double k, p; sprintf(buf, FileWithInputSpectrum); if(!(fd = fopen(buf, "r"))) { printf("can't read input spectrum in file '%s' on task %d\n", buf, ThisTask); FatalError(17); } NPowerTable = 0; do { if(fscanf(fd, " %lg %lg ", &k, &p) == 2) NPowerTable++; else break; } while(1); fclose(fd); if(ThisTask == 0) { printf("found %d rows in input spectrum table\n", NPowerTable); fflush(stdout); } PowerTable = malloc(NPowerTable * sizeof(struct pow_table)); sprintf(buf, FileWithInputSpectrum); if(!(fd = fopen(buf, "r"))) { printf("can't read input spectrum in file '%s' on task %d\n", buf, ThisTask); FatalError(18); } NPowerTable = 0; do { double p; if(fscanf(fd, " %lg %lg ", &k, &p) == 2) { PowerTable[NPowerTable].logk = k; PowerTable[NPowerTable].logD = p; NPowerTable++; } else break; } while(1); fclose(fd); qsort(PowerTable, NPowerTable, sizeof(struct pow_table), compare_logk); } int compare_logk(const void *a, const void *b) { if(((struct pow_table *) a)->logk < (((struct pow_table *) b)->logk)) return -1; if(((struct pow_table *) a)->logk > (((struct pow_table *) b)->logk)) return +1; return 0; } void initialize_powerspectrum(void) { double res; InitTime = 1 / (1 + Redshift); AA = 6.4 / ShapeGamma * (3.085678e24 / UnitLength_in_cm); BB = 3.0 / ShapeGamma * (3.085678e24 / UnitLength_in_cm); CC = 1.7 / ShapeGamma * (3.085678e24 / UnitLength_in_cm); nu = 1.13; R8 = 8 * (3.085678e24 / UnitLength_in_cm); /* 8 Mpc/h */ if(WhichSpectrum == 2) read_power_table(); if(ReNormalizeInputSpectrum == 0 && WhichSpectrum == 2) { Norm = 1.0; /* tabulated file is already at the initial redshift */ Dplus = 1.0; } else { Norm = 1.0; res = TopHatSigma2(R8); if(ThisTask == 0 && WhichSpectrum == 2) printf("\nNormalization of spectrum in file: Sigma8 = %g\n", sqrt(res)); Norm = Sigma8 * Sigma8 / res; if(ThisTask == 0 && WhichSpectrum == 2) printf("Normalization adjusted to Sigma8=%g (Normfac=%g)\n\n", Sigma8, Norm); Dplus = GrowthFactor(InitTime, 1.0); } } double PowerSpec_Tabulated(double k) { double logk, logD, P, kold, u, dlogk, Delta2; int binlow, binhigh, binmid; kold = k; k *= (InputSpectrum_UnitLength_in_cm / UnitLength_in_cm); /* convert to h/Mpc */ logk = log10(k); if(logk < PowerTable[0].logk || logk > PowerTable[NPowerTable - 1].logk) return 0; binlow = 0; binhigh = NPowerTable - 1; while(binhigh - binlow > 1) { binmid = (binhigh + binlow) / 2; if(logk < PowerTable[binmid].logk) binhigh = binmid; else binlow = binmid; } dlogk = PowerTable[binhigh].logk - PowerTable[binlow].logk; if(dlogk == 0) FatalError(777); u = (logk - PowerTable[binlow].logk) / dlogk; logD = (1 - u) * PowerTable[binlow].logD + u * PowerTable[binhigh].logD; Delta2 = pow(10.0, logD); P = Norm * Delta2 / (4 * M_PI * kold * kold * kold); return P; } double PowerSpec_Efstathiou(double k) { return Norm * k / pow(1 + pow(AA * k + pow(BB * k, 1.5) + CC * CC * k * k, nu), 2 / nu); } double PowerSpec_EH(double k) /* Eisenstein & Hu */ { return Norm * k * pow(tk_eh(k), 2); } double tk_eh(double k) /* from Martin White */ { double q, theta, ommh2, a, s, gamma, L0, C0; double tmp; double omegam, ombh2, hubble; /* other input parameters */ hubble = HubbleParam; omegam = Omega; ombh2 = OmegaBaryon * HubbleParam * HubbleParam; if(OmegaBaryon == 0) ombh2 = 0.04 * HubbleParam * HubbleParam; k *= (3.085678e24 / UnitLength_in_cm); /* convert to h/Mpc */ theta = 2.728 / 2.7; ommh2 = omegam * hubble * hubble; s = 44.5 * log(9.83 / ommh2) / sqrt(1. + 10. * exp(0.75 * log(ombh2))) * hubble; a = 1. - 0.328 * log(431. * ommh2) * ombh2 / ommh2 + 0.380 * log(22.3 * ommh2) * (ombh2 / ommh2) * (ombh2 / ommh2); gamma = a + (1. - a) / (1. + exp(4 * log(0.43 * k * s))); gamma *= omegam * hubble; q = k * theta * theta / gamma; L0 = log(2. * exp(1.) + 1.8 * q); C0 = 14.2 + 731. / (1. + 62.5 * q); tmp = L0 / (L0 + C0 * q * q); return (tmp); } double TopHatSigma2(double R) { double result, abserr; gsl_integration_workspace *workspace; gsl_function F; workspace = gsl_integration_workspace_alloc(WORKSIZE); F.function = &sigma2_int; r_tophat = R; gsl_integration_qag(&F, 0, 500.0 * 1 / R, 0, 1.0e-8, WORKSIZE, GSL_INTEG_GAUSS41, workspace, &result, &abserr); gsl_integration_workspace_free(workspace); return result; /* note: 500/R is here chosen as (effectively) infinity integration boundary */ } double sigma2_int(double k, void *param) { double kr, kr3, kr2, w, x; kr = r_tophat * k; kr2 = kr * kr; kr3 = kr2 * kr; if(kr < 1e-8) return 0; w = 3 * (sin(kr) / kr3 - cos(kr) / kr2); x = 4 * PI * k * k * w * w * PowerSpec(k); return x; } double GrowthFactor(double astart, double aend) { return growth(aend) / growth(astart); } double growth(double a) { double hubble_a; hubble_a = sqrt(Omega / (a * a * a) + (1 - Omega - OmegaLambda) / (a * a) + OmegaLambda); double result, abserr; gsl_integration_workspace *workspace; gsl_function F; workspace = gsl_integration_workspace_alloc(WORKSIZE); F.function = &growth_int; gsl_integration_qag(&F, 0, a, 0, 1.0e-8, WORKSIZE, GSL_INTEG_GAUSS41, workspace, &result, &abserr); gsl_integration_workspace_free(workspace); return hubble_a * result; } double growth_int(double a, void *param) { return pow(a / (Omega + (1 - Omega - OmegaLambda) * a + OmegaLambda * a * a * a), 1.5); } double F_Omega(double a) { double omega_a; omega_a = Omega / (Omega + a * (1 - Omega - OmegaLambda) + a * a * a * OmegaLambda); return pow(omega_a, 0.6); } N-GenIC/proto.h0000644000076500000240000000301211224135727012677 0ustar volkerstaff #include double GrowthFactor(double astart, double aend); void print_spec(void); int FatalError(int errnum); void displacement_fields(void); void initialize_ffts(void); void set_units(void); void assemble_particles(void); void free_ffts(void); double fnl(double x); int find_files(char *fname); void assemble_grid(void); void read_power_table(void); double periodic_wrap(double x); double PowerSpec(double kmag); double PowerSpec_Efstathiou(double k); double PowerSpec_EH(double k); double PowerSpec_Tabulated(double k); double PowerSpec_DM_2ndSpecies(double k); double PowerSpec_Tabulated2nd(double k); void initialize_powerspectrum(void); double GrowthFactor(double astart, double aend); double growth(double a); double growth_int(double, void *param); double qromb(double (*func)(double), double a, double b); double sigma2_int(double k, void *param); double TopHatSigma2(double R); double F_Omega(double a); void combine_particle_data(void); int compare_logk(const void *a, const void *b); void write_particle_data(void); void read_parameterfile(char *fname); void read_glass(char *fname); double tk_eh(double k); size_t my_fread(void *ptr, size_t size, size_t nmemb, FILE * stream); size_t my_fwrite(void *ptr, size_t size, size_t nmemb, FILE * stream); void save_local_data(void); void add_WDM_thermal_speeds(float *vel); int compare_type(const void *a, const void *b); double get_fermi_dirac_vel_nu(void); void fermi_dirac_init_nu(void); void add_NU_thermal_speeds(float *vel); N-GenIC/read_glass.c0000644000076500000240000001317611224135727013647 0ustar volkerstaff#include #include #include #include "allvars.h" #include "proto.h" void read_glass(char *fname) { int i, j, k, n, m, slab, count, type; unsigned int dummy, dummy2; float *pos = 0; float x, y, z; FILE *fd = 0; size_t bytes; int *npart_Task; int num, numfiles, skip, nlocal; char buf[500]; #define SKIP {my_fread(&dummy, sizeof(int), 1, fd);} #define SKIP2 {my_fread(&dummy2, sizeof(int), 1, fd);} if(ThisTask == 0) { printf("\nreading Lagrangian glass file...\n"); fflush(stdout); numfiles = find_files(fname); for(num = 0, skip = 0; num < numfiles; num++) { if(numfiles > 1) sprintf(buf, "%s.%d", fname, num); else sprintf(buf, "%s", fname); if(!(fd = fopen(buf, "r"))) { printf("can't open file `%s' for reading glass file.\n", buf); FatalError(1); } SKIP; my_fread(&header1, sizeof(header1), 1, fd); SKIP2; if(dummy != sizeof(header1) || dummy2 != sizeof(header1)) { printf("incorrect header size!\n"); FatalError(2); } nlocal = 0; for(k = 0; k < 6; k++) nlocal += header1.npart[k]; printf("reading '%s' with %d particles\n", fname, nlocal); if(num == 0) { Nglass = 0; for(k = 0; k < 6; k++) Nglass += header1.npartTotal[k]; printf("\nNglass= %d\n\n", Nglass); pos = (float *) malloc(sizeof(float) * Nglass * 3); if(!(pos)) { printf("failed to allocate %g Mbyte on Task %d for glass file\n", sizeof(float) * Nglass * 3.0 / (1024.0 * 1024.0), ThisTask); FatalError(112); } } SKIP; my_fread(&pos[3 * skip], sizeof(float), 3 * nlocal, fd); SKIP2; if(dummy != sizeof(float) * 3 * nlocal || dummy2 != sizeof(float) * 3 * nlocal) { printf("incorrect block structure in positions block!\n"); FatalError(3); } skip += nlocal; fclose(fd); } } MPI_Bcast(&Nglass, 1, MPI_INT, 0, MPI_COMM_WORLD); MPI_Bcast(&header1, sizeof(header1), MPI_BYTE, 0, MPI_COMM_WORLD); if(ThisTask != 0) { pos = (float *) malloc(sizeof(float) * Nglass * 3); if(!(pos)) { printf("failed to allocate %g Mbyte on Task %d for glass file\n", sizeof(float) * Nglass * 3.0 / (1024.0 * 1024.0), ThisTask); FatalError(112); } } MPI_Bcast(&pos[0], sizeof(float) * Nglass * 3, MPI_BYTE, 0, MPI_COMM_WORLD); npart_Task = malloc(sizeof(int) * NTask); for(i = 0; i < NTask; i++) npart_Task[i] = 0; #if defined(MULTICOMPONENTGLASSFILE) && defined(DIFFERENT_TRANSFER_FUNC) MinType = 7; MaxType = -2; for(type = 0; type < 6; type++) if(header1.npartTotal[type]) { if(MinType > type - 1) MinType = type - 1; if(MaxType < type - 1) MaxType = type - 1; } #endif for(i = 0; i < TileFac; i++) for(j = 0; j < TileFac; j++) for(k = 0; k < TileFac; k++) { for(type = 0, n = 0; type < 6; type++) { for(m = 0; m < header1.npartTotal[type]; m++, n++) { x = pos[3 * n] / header1.BoxSize * (Box / TileFac) + i * (Box / TileFac); slab = x / Box * Nmesh; if(slab >= Nmesh) slab = Nmesh - 1; npart_Task[Slab_to_task[slab]] += 1; } } } TotNumPart = 0; /* note: This is a 64 bit integer */ NTaskWithN = 0; NumPart = npart_Task[ThisTask]; for(i = 0; i < NTask; i++) { TotNumPart += npart_Task[i]; if(npart_Task[i] > 0) NTaskWithN++; } if(ThisTask == 0) { for(i = 0; i < NTask; i++) printf("%d particles on task=%d (slabs=%d)\n", npart_Task[i], i, Local_nx_table[i]); printf("\nTotal number of particles = %d%09d\n\n", (int) (TotNumPart / 1000000000), (int) (TotNumPart % 1000000000)); fflush(stdout); } free(npart_Task); if(NumPart) { P = (struct part_data *) malloc(bytes = sizeof(struct part_data) * NumPart); if(!(P)) { printf("failed to allocate %g Mbyte (%d particles) on Task %d\n", bytes / (1024.0 * 1024.0), NumPart, ThisTask); FatalError(9891); } } count = 0; IDStart = 1; for(i = 0; i < TileFac; i++) for(j = 0; j < TileFac; j++) for(k = 0; k < TileFac; k++) { for(type = 0, n = 0; type < 6; type++) { for(m = 0; m < header1.npartTotal[type]; m++, n++) { x = pos[3 * n] / header1.BoxSize * (Box / TileFac) + i * (Box / TileFac); slab = x / Box * Nmesh; if(slab >= Nmesh) slab = Nmesh - 1; if(Slab_to_task[slab] == ThisTask) { y = pos[3 * n + 1] / header1.BoxSize * (Box / TileFac) + j * (Box / TileFac); z = pos[3 * n + 2] / header1.BoxSize * (Box / TileFac) + k * (Box / TileFac); P[count].Pos[0] = x; P[count].Pos[1] = y; P[count].Pos[2] = z; #ifdef MULTICOMPONENTGLASSFILE P[count].Type = type - 1; #endif P[count].ID = IDStart; count++; } IDStart++; } } } if(count != NumPart) { printf("fatal mismatch (%d %d) on Task %d\n", count, NumPart, ThisTask); FatalError(1); } free(pos); } int find_files(char *fname) { FILE *fd; char buf[200], buf1[200]; int dummy; sprintf(buf, "%s.%d", fname, 0); sprintf(buf1, "%s", fname); if((fd = fopen(buf, "r"))) { my_fread(&dummy, sizeof(dummy), 1, fd); my_fread(&header, sizeof(header), 1, fd); my_fread(&dummy, sizeof(dummy), 1, fd); fclose(fd); return header.num_files; } if((fd = fopen(buf1, "r"))) { my_fread(&dummy, sizeof(dummy), 1, fd); my_fread(&header, sizeof(header), 1, fd); my_fread(&dummy, sizeof(dummy), 1, fd); fclose(fd); header.num_files = 1; return header.num_files; } FatalError(121); return 0; } N-GenIC/read_param.c0000644000076500000240000000727111224135727013635 0ustar volkerstaff#include #include #include #include "allvars.h" #include "proto.h" void read_parameterfile(char *fname) { #define FLOAT 1 #define STRING 2 #define INT 3 #define MAXTAGS 300 FILE *fd; char buf[200], buf1[200], buf2[200], buf3[200]; int i, j, nt; int id[MAXTAGS]; void *addr[MAXTAGS]; char *ret, tag[MAXTAGS][50]; int errorFlag = 0; /* read parameter file on all processes for simplicty */ nt = 0; strcpy(tag[nt], "Omega"); addr[nt] = Ω id[nt++] = FLOAT; strcpy(tag[nt], "OmegaLambda"); addr[nt] = &OmegaLambda; id[nt++] = FLOAT; strcpy(tag[nt], "OmegaBaryon"); addr[nt] = &OmegaBaryon; id[nt++] = FLOAT; strcpy(tag[nt], "HubbleParam"); addr[nt] = &HubbleParam; id[nt++] = FLOAT; strcpy(tag[nt], "ShapeGamma"); addr[nt] = &ShapeGamma; id[nt++] = FLOAT; strcpy(tag[nt], "Sigma8"); addr[nt] = &Sigma8; id[nt++] = FLOAT; strcpy(tag[nt], "PrimordialIndex"); addr[nt] = &PrimordialIndex; id[nt++] = FLOAT; strcpy(tag[nt], "Box"); addr[nt] = &Box; id[nt++] = FLOAT; strcpy(tag[nt], "Redshift"); addr[nt] = &Redshift; id[nt++] = FLOAT; strcpy(tag[nt], "Nmesh"); addr[nt] = &Nmesh; id[nt++] = INT; strcpy(tag[nt], "Nsample"); addr[nt] = &Nsample; id[nt++] = INT; strcpy(tag[nt], "GlassFile"); addr[nt] = GlassFile; id[nt++] = STRING; strcpy(tag[nt], "FileWithInputSpectrum"); addr[nt] = FileWithInputSpectrum; id[nt++] = STRING; strcpy(tag[nt], "TileFac"); addr[nt] = &TileFac; id[nt++] = INT; strcpy(tag[nt], "Seed"); addr[nt] = &Seed; id[nt++] = INT; strcpy(tag[nt], "SphereMode"); addr[nt] = &SphereMode; id[nt++] = INT; strcpy(tag[nt], "NumFilesWrittenInParallel"); addr[nt] = &NumFilesWrittenInParallel; id[nt++] = INT; strcpy(tag[nt], "OutputDir"); addr[nt] = OutputDir; id[nt++] = STRING; strcpy(tag[nt], "FileBase"); addr[nt] = FileBase; id[nt++] = STRING; strcpy(tag[nt], "WhichSpectrum"); addr[nt] = &WhichSpectrum; id[nt++] = INT; strcpy(tag[nt], "UnitVelocity_in_cm_per_s"); addr[nt] = &UnitVelocity_in_cm_per_s; id[nt++] = FLOAT; strcpy(tag[nt], "UnitLength_in_cm"); addr[nt] = &UnitLength_in_cm; id[nt++] = FLOAT; strcpy(tag[nt], "UnitMass_in_g"); addr[nt] = &UnitMass_in_g; id[nt++] = FLOAT; strcpy(tag[nt], "InputSpectrum_UnitLength_in_cm"); addr[nt] = &InputSpectrum_UnitLength_in_cm; id[nt++] = FLOAT; strcpy(tag[nt], "ReNormalizeInputSpectrum"); addr[nt] = &ReNormalizeInputSpectrum; id[nt++] = INT; if((fd = fopen(fname, "r"))) { while(!feof(fd)) { buf[0] = 0; ret = fgets(buf, 200, fd); if(sscanf(buf, "%s%s%s", buf1, buf2, buf3) < 2) continue; if(buf1[0] == '%') continue; for(i = 0, j = -1; i < nt; i++) if(strcmp(buf1, tag[i]) == 0) { j = i; tag[i][0] = 0; break; } if(j >= 0) { switch (id[j]) { case FLOAT: *((double *) addr[j]) = atof(buf2); break; case STRING: strcpy(addr[j], buf2); break; case INT: *((int *) addr[j]) = atoi(buf2); break; } } else { if(ThisTask == 0) fprintf(stdout, "Error in file %s: Tag '%s' not allowed or multiple defined.\n", fname, buf1); errorFlag = 1; } } fclose(fd); } else { if(ThisTask == 0) fprintf(stdout, "Parameter file %s not found.\n", fname); errorFlag = 1; } for(i = 0; i < nt; i++) { if(*tag[i]) { if(ThisTask == 0) fprintf(stdout, "Error. I miss a value for tag '%s' in parameter file '%s'.\n", tag[i], fname); errorFlag = 1; } } if(errorFlag) { MPI_Finalize(); exit(0); } #undef FLOAT #undef STRING #undef INT #undef MAXTAGS } N-GenIC/README0000600000076500000240000000501011624526370012235 0ustar volkerstaff ************************************************************* * N-GenIC - A code for cosmological initial conditions * * * * written by: Volker Springel, MPA, (c) 2003 * * * ************************************************************* This code can be used to create initial conditions for N-body simulations of cosmological structure formation, within the standard LCDM paradigm. Optionally the code can also create additional SPH particles for mixed dark matter/gas simulations. The code is an MPI code and can be used to setup fairly large initial conditions if desired. The output format is that of the GADGET code, in its basic file format 1. To use the code, first adjust the Makefile as needed. Like GADGET, the code needs a correctly compiled FFTW-2 version with MPI support. You also need the Gnu Scientific library (GSL). In the Makefile, you can set/unset the following compile time options: PRODUCEGAS - use this if you want the code to automatically produce interleaved pairs of particles for dark matter and SPH particles. The relative masses of the gas and the dark will be inferred from the cosmological parameters you set in the code's parameterfile. NO64BITID - activate this if ordinary 32-bit integers are sufficient to store unique particle IDs. You only need to unset this and use 64-bit long integer IDs if the total particle number exceeds 2^32 ~ 4 billion. CORRECT_CIC - this determines whether or not the effect of CIC interpolation should be deconvolved when interpolating the displacement field from the FFT-grid to the actual particle positions. If you use a Cartesian grid of particles for the unperturbed particle load, then it's best to leave this off and use a Fourier grid size that exactly matches the particle grid dimension. Then there is no interpolation error at all. If you use a glass particle load instead, the power close to the Nyquist frequency will be more accurately represented if you set this option. Once you sucessfully compiled the code, you then create ICs by calling the code, for example, with a command of the form: mpiexec -np 8 ./N-GenIC ics.param This would launch the code using 8 MPI tasks. The parameterfile "ics.param" has a similar structure to GADGET parameterfiles, and describes the ICs. Please consult the enclosed example parameterfile "ics.param" for comments about the meaning of the different parameters in this file. Best regards, Volker Springel N-GenIC/save.c0000644000076500000240000001657511224135727012507 0ustar volkerstaff#include #include #include "allvars.h" #include "proto.h" void write_particle_data(void) { int nprocgroup, groupTask, masterTask; if(ThisTask == 0) printf("\nwriting initial conditions... \n"); if((NTask < NumFilesWrittenInParallel)) { printf ("Fatal error.\nNumber of processors must be a smaller or equal than `NumFilesWrittenInParallel'.\n"); FatalError(24131); } nprocgroup = NTask / NumFilesWrittenInParallel; if((NTask % NumFilesWrittenInParallel)) nprocgroup++; masterTask = (ThisTask / nprocgroup) * nprocgroup; for(groupTask = 0; groupTask < nprocgroup; groupTask++) { if(ThisTask == (masterTask + groupTask)) /* ok, it's this processor's turn */ save_local_data(); /* wait inside the group */ MPI_Barrier(MPI_COMM_WORLD); } if(ThisTask == 0) printf("done with writing initial conditions.\n"); } void save_local_data(void) { #define BUFFER 10 size_t bytes; float *block; int *blockid; long long *blocklongid; int blockmaxlen, maxidlen, maxlongidlen; int4byte dummy; FILE *fd; char buf[300]; int i, k, pc; double meanspacing, shift_gas, shift_dm; if(NumPart == 0) return; if(NTaskWithN > 1) sprintf(buf, "%s/%s.%d", OutputDir, FileBase, ThisTask); else sprintf(buf, "%s/%s", OutputDir, FileBase); if(!(fd = fopen(buf, "w"))) { printf("Error. Can't write in file '%s'\n", buf); FatalError(10); } for(i = 0; i < 6; i++) { header.npart[i] = 0; header.npartTotal[i] = 0; header.mass[i] = 0; } header.npart[1] = NumPart; header.npartTotal[1] = TotNumPart; header.npartTotal[2] = (TotNumPart >> 32); header.mass[1] = (Omega) * 3 * Hubble * Hubble / (8 * PI * G) * pow(Box, 3) / TotNumPart; #ifdef PRODUCEGAS header.npart[0] = NumPart; header.npartTotal[0] = TotNumPart; header.mass[0] = (OmegaBaryon) * 3 * Hubble * Hubble / (8 * PI * G) * pow(Box, 3) / TotNumPart; header.mass[1] = (Omega - OmegaBaryon) * 3 * Hubble * Hubble / (8 * PI * G) * pow(Box, 3) / TotNumPart; #endif header.time = InitTime; header.redshift = 1.0 / InitTime - 1; header.flag_sfr = 0; header.flag_feedback = 0; header.flag_cooling = 0; header.flag_stellarage = 0; header.flag_metals = 0; header.num_files = NTaskWithN; header.BoxSize = Box; header.Omega0 = Omega; header.OmegaLambda = OmegaLambda; header.HubbleParam = HubbleParam; header.flag_stellarage = 0; header.flag_metals = 0; header.hashtabsize = 0; dummy = sizeof(header); my_fwrite(&dummy, sizeof(dummy), 1, fd); my_fwrite(&header, sizeof(header), 1, fd); my_fwrite(&dummy, sizeof(dummy), 1, fd); meanspacing = Box / pow(TotNumPart, 1.0 / 3); shift_gas = -0.5 * (Omega - OmegaBaryon) / (Omega) * meanspacing; shift_dm = +0.5 * OmegaBaryon / (Omega) * meanspacing; if(!(block = malloc(bytes = BUFFER * 1024 * 1024))) { printf("failed to allocate memory for `block' (%g bytes).\n", (double) bytes); FatalError(24); } blockmaxlen = bytes / (3 * sizeof(float)); blockid = (int *) block; blocklongid = (long long *) block; maxidlen = bytes / (sizeof(int)); maxlongidlen = bytes / (sizeof(long long)); /* write coordinates */ dummy = sizeof(float) * 3 * NumPart; #ifdef PRODUCEGAS dummy *= 2; #endif my_fwrite(&dummy, sizeof(dummy), 1, fd); for(i = 0, pc = 0; i < NumPart; i++) { for(k = 0; k < 3; k++) { block[3 * pc + k] = P[i].Pos[k]; #ifdef PRODUCEGAS block[3 * pc + k] = periodic_wrap(P[i].Pos[k] + shift_gas); #endif } pc++; if(pc == blockmaxlen) { my_fwrite(block, sizeof(float), 3 * pc, fd); pc = 0; } } if(pc > 0) my_fwrite(block, sizeof(float), 3 * pc, fd); #ifdef PRODUCEGAS for(i = 0, pc = 0; i < NumPart; i++) { for(k = 0; k < 3; k++) { block[3 * pc + k] = periodic_wrap(P[i].Pos[k] + shift_dm); } pc++; if(pc == blockmaxlen) { my_fwrite(block, sizeof(float), 3 * pc, fd); pc = 0; } } if(pc > 0) my_fwrite(block, sizeof(float), 3 * pc, fd); #endif my_fwrite(&dummy, sizeof(dummy), 1, fd); /* write velocities */ dummy = sizeof(float) * 3 * NumPart; #ifdef PRODUCEGAS dummy *= 2; #endif my_fwrite(&dummy, sizeof(dummy), 1, fd); for(i = 0, pc = 0; i < NumPart; i++) { for(k = 0; k < 3; k++) block[3 * pc + k] = P[i].Vel[k]; pc++; if(pc == blockmaxlen) { my_fwrite(block, sizeof(float), 3 * pc, fd); pc = 0; } } if(pc > 0) my_fwrite(block, sizeof(float), 3 * pc, fd); #ifdef PRODUCEGAS for(i = 0, pc = 0; i < NumPart; i++) { for(k = 0; k < 3; k++) block[3 * pc + k] = P[i].Vel[k]; if(WDM_On == 1 && WDM_Vtherm_On == 1) add_WDM_thermal_speeds(&block[3 * pc]); pc++; if(pc == blockmaxlen) { my_fwrite(block, sizeof(float), 3 * pc, fd); pc = 0; } } if(pc > 0) my_fwrite(block, sizeof(float), 3 * pc, fd); #endif my_fwrite(&dummy, sizeof(dummy), 1, fd); /* write particle ID */ #ifdef NO64BITID dummy = sizeof(int) * NumPart; #else dummy = sizeof(long long) * NumPart; #endif #ifdef PRODUCEGAS dummy *= 2; #endif my_fwrite(&dummy, sizeof(dummy), 1, fd); for(i = 0, pc = 0; i < NumPart; i++) { #ifdef NO64BITID blockid[pc] = P[i].ID; #else blocklongid[pc] = P[i].ID; #endif pc++; if(pc == maxlongidlen) { #ifdef NO64BITID my_fwrite(blockid, sizeof(int), pc, fd); #else my_fwrite(blocklongid, sizeof(long long), pc, fd); #endif pc = 0; } } if(pc > 0) { #ifdef NO64BITID my_fwrite(blockid, sizeof(int), pc, fd); #else my_fwrite(blocklongid, sizeof(long long), pc, fd); #endif } #ifdef PRODUCEGAS for(i = 0, pc = 0; i < NumPart; i++) { #ifdef NO64BITID blockid[pc] = P[i].ID + TotNumPart; #else blocklongid[pc] = P[i].ID + TotNumPart; #endif pc++; if(pc == maxlongidlen) { #ifdef NO64BITID my_fwrite(blockid, sizeof(int), pc, fd); #else my_fwrite(blocklongid, sizeof(long long), pc, fd); #endif pc = 0; } } if(pc > 0) { #ifdef NO64BITID my_fwrite(blockid, sizeof(int), pc, fd); #else my_fwrite(blocklongid, sizeof(long long), pc, fd); #endif } #endif my_fwrite(&dummy, sizeof(dummy), 1, fd); /* write zero temperatures if needed */ #ifdef PRODUCEGAS dummy = sizeof(float) * NumPart; my_fwrite(&dummy, sizeof(dummy), 1, fd); for(i = 0, pc = 0; i < NumPart; i++) { block[pc] = 0; pc++; if(pc == blockmaxlen) { my_fwrite(block, sizeof(float), pc, fd); pc = 0; } } if(pc > 0) my_fwrite(block, sizeof(float), pc, fd); my_fwrite(&dummy, sizeof(dummy), 1, fd); #endif free(block); fclose(fd); } /* This catches I/O errors occuring for my_fwrite(). In this case we better stop. */ size_t my_fwrite(void *ptr, size_t size, size_t nmemb, FILE * stream) { size_t nwritten; if((nwritten = fwrite(ptr, size, nmemb, stream)) != nmemb) { printf("I/O error (fwrite) on task=%d has occured.\n", ThisTask); fflush(stdout); FatalError(777); } return nwritten; } /* This catches I/O errors occuring for fread(). In this case we better stop. */ size_t my_fread(void *ptr, size_t size, size_t nmemb, FILE * stream) { size_t nread; if((nread = fread(ptr, size, nmemb, stream)) != nmemb) { printf("I/O error (fread) on task=%d has occured.\n", ThisTask); fflush(stdout); FatalError(778); } return nread; } N-GenIC/show_output_spectrum.pro0000644000076500000240000000066611224135727016443 0ustar volkerstaff fname = "ICs/inputspec_ics.txt" spawn,"wc "+fname,result result=strtrim(result, 1) lines=long(result) lines=lines(0) en=fltarr(4, lines-1) openr,1,fname zstart=0.0 growthfactor=0.0 readf,1,zstart, growthfactor readf,1,en close,1 k_linear = en(0,*) d2_linear = en(1,*) k_nonlinear = en(2,*) d2_nonlinear = en(3,*) plot, k_linear, d2_linear, /xlog, /ylog, yrange=[0.0001,1000] oplot, k_nonlinear, d2_nonlinear, color=255 end