diff --git a/Makefile b/Makefile index ccff84bd3111a249f94085a28871b5c68a14274e..57ff3d676843f2502b64b8a37775237598db7074 100644 --- a/Makefile +++ b/Makefile @@ -12,6 +12,7 @@ MC_GENERAL = ${MC_INSTDIR}/general_routines/ MC_COORD = ${MC_INSTDIR}/coordinates_systems MC_SEED = ${MC_INSTDIR}/seed_photons/ MC_HYDRO = ${MC_INSTDIR}/../../gr_code/hydrodynamics +MC_SYNC = ${MC_INSTDIR}/../../gr_code/synchrotron #======================================================================== @@ -31,6 +32,7 @@ MC_SEED_OBJ=${MC_SEED}/bb_spec.o MC_HYDRO_OBJ=${MC_HYDRO}/reverse_array.o +MC_SYNC_OBJ=${MC_SYNC}/envelop_gaussian.o ${MC_SYNC}/optimize_envelop.o ${MC_SYNC}/sync_distribution.o ${MC_SYNC}/setup_syncvariables.o MC_SLAB_OBJ=${MC_SLAB}/electricfield_fromfile.o ${MC_SLAB}/read_resultsfile.o ${MC_SLAB}/setup_gsl_objects.o ${MC_SLAB}/compute_cumulative_angdist.o @@ -40,12 +42,12 @@ all: start_iteration %.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) -start_iteration: ${LOCAL_DIR_OBJ} ${MC_GENERAL_OBJ} ${MC_POLARIZATION_OBJ} ${MC_ELE_DISTRIBUTION_OBJ} ${MC_COORD_OBJ} ${MC_SEED_OBJ} ${MC_HYDRO_OBJ} ${MC_SLAB_OBJ} +start_iteration: ${LOCAL_DIR_OBJ} ${MC_GENERAL_OBJ} ${MC_POLARIZATION_OBJ} ${MC_ELE_DISTRIBUTION_OBJ} ${MC_COORD_OBJ} ${MC_SEED_OBJ} ${MC_HYDRO_OBJ} ${MC_SLAB_OBJ} ${MC_SYNC_OBJ} ${CC} $^ -o $@ ${LDFLAGS} clean: - rm -f main_program.o ${LOCAL_DIR_OBJ} ${MC_GENERAL_OBJ} ${MC_POLARIZATION_OBJ} ${MC_ELE_DISTRIBUTION_OBJ} ${MC_COORD_OBJ} ${MC_SEED_OBJ} ${MC_HYDRO_OBJ} ${MC_SLAB_OBJ} + rm -f main_program.o ${LOCAL_DIR_OBJ} ${MC_GENERAL_OBJ} ${MC_POLARIZATION_OBJ} ${MC_ELE_DISTRIBUTION_OBJ} ${MC_COORD_OBJ} ${MC_SEED_OBJ} ${MC_HYDRO_OBJ} ${MC_SLAB_OBJ} ${MC_SYNC_OBJ} ciao: diff --git a/compila.txt b/compila.txt new file mode 100755 index 0000000000000000000000000000000000000000..60a214f21878b92c5a6f89285e306dbab0d35fb1 --- /dev/null +++ b/compila.txt @@ -0,0 +1,2 @@ + +$CC -o zio metropolis_gibbs.c ${MC_INSTDIR}/../../gr_code/clock_random.c -I ${HEADERS_GSL} -I ${MC_INSTDIR}/../../include/ -I ${HEADERS_MPI} -I ${HEADERS_CFITSIO} -L ${LIB_GSL} -lm -lgsl -lgslcblas diff --git a/main_program.c b/main_program.c index f585dc189d584ccc4fea6c6e3ea16f33a8c9a188..177828a2e01303d34cea35db8fd2052c0eb62766 100644 --- a/main_program.c +++ b/main_program.c @@ -287,8 +287,11 @@ int main(int argc, char* argv[]) integral = set_filename("integralpolar_mc_tau", tau_char, seed_char, albedo_char, "mc"); polarfile = set_filename("energypolar_mc_tau", tau_char, seed_char, albedo_char, "mc"); - status = slab_mc(nph, seed); + //status = slab_mc(nph, seed); + optimize_envelop(); + + // check_results(Spline_sample_Iu, Spline_eval_pdeg, Spline_eval_limbdark); } diff --git a/metropolis_gibbs.c b/metropolis_gibbs.c new file mode 100644 index 0000000000000000000000000000000000000000..5f2f731311fd47bf0f5ec1fda10d9924a1cb2c72 --- /dev/null +++ b/metropolis_gibbs.c @@ -0,0 +1,131 @@ +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <time.h> +#include <local_header.h> + +#define NUM_SAMPLES 400000 +#define BURN_IN 1000 // Numero di iterazioni di "bruciatura" +#define INITIAL_X 0.1 // Valore iniziale di x (deve essere positivo) +#define INITIAL_Y 0.1 // Valore iniziale di y (deve essere positivo) + +#define MIN_X 0.01 +#define MAX_X 10.0 // Massimo valore di x + +#define MIN_Y -5 // Massimo valore di y +#define MAX_Y 5 // Massimo valore di y + + + +double z_function(double x, double y); +double acceptance_ratio(double x_new, double x_old, double y_new, double y_old); +void metropolis_gibbs_sampling(double samples[NUM_SAMPLES][2]); + + +double z_function(double x, double y) +{ + + double f1; + double f2; + double bessel_arg; + double value; + + bessel_arg=x / 2.0 * pow(1 + y * y, 1.5); + + + f1=x * pow(1 + y * y, 2) * pow(gsl_sf_bessel_Knu(2.0/3.0, bessel_arg),2); + f2=x * pow(y,2) *(1 +y*y) * pow(gsl_sf_bessel_Knu(1.0/3.0, bessel_arg),2); + + + return f1+f2; // Z(x, y) = x * BesselK^(2/3)(...) +} + +double acceptance_ratio(double x_new, double x_old, double y_new, double y_old) +{ + double z_new; + double z_old; + + if (x_new <= MIN_X || x_new > MAX_X || x_old <= MIN_X || x_old > MAX_X + || y_new > MAX_Y || y_old > MAX_Y) + { + return 0; + } + else + { + + z_new = z_function(x_new, y_new); + z_old = z_function(x_old, y_old); + + if (z_new > z_old || clock_random() < z_new / z_old) + + return 1.0; + + else + return 0; + } + +} + + +void metropolis_gibbs_sampling(double samples[NUM_SAMPLES][2]) { + // Inizializza il generatore di numeri casuali + srand(time(NULL)); + + // Valori iniziali + double x = INITIAL_X; // Inizializza con un valore positivo + double y = INITIAL_Y; // Inizializza con un valore positivo + + for (int i = 0; i < NUM_SAMPLES; i++) + { + // Campiona x utilizzando il Metropolis step + double x_new; + do + { + x_new = x + (clock_random() - 0.5); // Propone un nuovo valore di x + } while (x_new < MIN_X || x_new > MAX_X); // Assicura che x sia positivo e rientri nel dominio + + double acceptance_x = acceptance_ratio(x_new, x, y, y); + + if (clock_random() < acceptance_x) + x = x_new; + + // Campiona y utilizzando il Metropolis step + double y_new; + do + { + y_new = y + (clock_random() - 0.5); // Propose un nuovo valore di y + } while (y_new < MIN_Y || y_new > MAX_Y); // Assicura che y sia positivo e rientri nel dominio + + double acceptance_y = acceptance_ratio(x, x_new, y_new, y); + + if (clock_random() < acceptance_y) + y = y_new; + + // Salva il campione dopo il periodo di "bruciatura" + if (i >= BURN_IN) { + samples[i - BURN_IN][0] = x; + samples[i - BURN_IN][1] = y; + printf("%lf %lf %5.4e\n", x, y, z_function(x, y)); + + } + } +} + + + +int main() { + double samples[NUM_SAMPLES][2]; + + // Esegui il campionamento utilizzando Metropolis-Gibbs + metropolis_gibbs_sampling(samples); + + // Stampa i campioni + //printf("Campioni dalla distribuzione Z(x, y) = x * BesselK^(2/3)(...):\n"); + + /* for (int i = 0; i < NUM_SAMPLES; i++) + { + printf("(%5.4e, %5.4e)\n", samples[i][0], samples[i][1]); + } +*/ + return 0; +}