From 18f77b9e1ec854a7fdeac9a44acfad94ab2c887d Mon Sep 17 00:00:00 2001
From: Matthieu Schaller <matthieu.schaller@durham.ac.uk>
Date: Wed, 17 Jan 2018 22:10:48 +0100
Subject: [PATCH] Add the chemistry information to all the other hydro schemes.

---
 src/hydro/Default/hydro_io.h           | 19 +++++++++++++++----
 src/hydro/Default/hydro_part.h         | 13 ++++++++-----
 src/hydro/Gizmo/hydro_io.h             | 20 ++++++++++++++++----
 src/hydro/Gizmo/hydro_part.h           |  3 +++
 src/hydro/Minimal/hydro_io.h           | 19 +++++++++++++++----
 src/hydro/Minimal/hydro_part.h         |  3 +++
 src/hydro/PressureEntropy/hydro_io.h   | 20 ++++++++++++++++----
 src/hydro/PressureEntropy/hydro_part.h |  3 +++
 src/hydro/Shadowswift/hydro_io.h       | 19 +++++++++++++++----
 src/hydro/Shadowswift/hydro_part.h     |  3 +++
 10 files changed, 97 insertions(+), 25 deletions(-)

diff --git a/src/hydro/Default/hydro_io.h b/src/hydro/Default/hydro_io.h
index 8c12f015bd..c057886ea6 100644
--- a/src/hydro/Default/hydro_io.h
+++ b/src/hydro/Default/hydro_io.h
@@ -32,8 +32,6 @@
 void hydro_read_particles(struct part* parts, struct io_props* list,
                           int* num_fields) {
 
-  *num_fields = 8;
-
   /* List what we want to read */
   list[0] = io_make_input_field("Coordinates", DOUBLE, 3, COMPULSORY,
                                 UNIT_CONV_LENGTH, parts, x);
@@ -51,6 +49,13 @@ void hydro_read_particles(struct part* parts, struct io_props* list,
                                 UNIT_CONV_ACCELERATION, parts, a_hydro);
   list[7] = io_make_input_field("Density", FLOAT, 1, OPTIONAL,
                                 UNIT_CONV_DENSITY, parts, rho);
+  *num_fields = 8;
+  list += *num_fields;
+
+  /* Read in chemistry information */
+  const int num_chem_fields = chemistry_read_particles(parts, list);
+  *num_fields += num_chem_fields;
+  list += num_chem_fields;
 }
 
 void convert_part_pos(const struct engine* e, const struct part* p,
@@ -77,8 +82,6 @@ void convert_part_pos(const struct engine* e, const struct part* p,
 void hydro_write_particles(struct part* parts, struct io_props* list,
                            int* num_fields) {
 
-  *num_fields = 8;
-
   /* List what we want to write */
   list[0] = io_make_output_field_convert_part(
       "Coordinates", DOUBLE, 3, UNIT_CONV_LENGTH, parts, convert_part_pos);
@@ -96,6 +99,14 @@ void hydro_write_particles(struct part* parts, struct io_props* list,
                                  UNIT_CONV_ACCELERATION, parts, a_hydro);
   list[7] =
       io_make_output_field("Density", FLOAT, 1, UNIT_CONV_DENSITY, parts, rho);
+
+  *num_fields = 8;
+  list += *num_fields;
+
+  /* Write some chemistry information */
+  const int num_chem_fields = chemistry_write_particles(parts, list);
+  *num_fields += num_chem_fields;
+  list += num_chem_fields;
 }
 
 /**
diff --git a/src/hydro/Default/hydro_part.h b/src/hydro/Default/hydro_part.h
index 5d2f76ab29..042fa2aee4 100644
--- a/src/hydro/Default/hydro_part.h
+++ b/src/hydro/Default/hydro_part.h
@@ -46,6 +46,12 @@ struct xpart {
 /* Data of a single particle. */
 struct part {
 
+  /* Particle ID. */
+  long long id;
+
+  /* Pointer to corresponding gravity part. */
+  struct gpart* gpart;
+
   /* Particle position. */
   double x[3];
 
@@ -116,11 +122,8 @@ struct part {
   /* Particle mass. */
   float mass;
 
-  /* Particle ID. */
-  long long id;
-
-  /* Pointer to corresponding gravity part. */
-  struct gpart* gpart;
+  /* Chemistry information */
+  struct chemistry_part_data chemistry_data;
 
   /* Particle time-bin */
   timebin_t time_bin;
diff --git a/src/hydro/Gizmo/hydro_io.h b/src/hydro/Gizmo/hydro_io.h
index 9d6acf4155..4c4b9e45d3 100644
--- a/src/hydro/Gizmo/hydro_io.h
+++ b/src/hydro/Gizmo/hydro_io.h
@@ -41,8 +41,6 @@
 void hydro_read_particles(struct part* parts, struct io_props* list,
                           int* num_fields) {
 
-  *num_fields = 8;
-
   /* List what we want to read */
   list[0] = io_make_input_field("Coordinates", DOUBLE, 3, COMPULSORY,
                                 UNIT_CONV_LENGTH, parts, x);
@@ -61,6 +59,14 @@ void hydro_read_particles(struct part* parts, struct io_props* list,
                                 UNIT_CONV_ACCELERATION, parts, a_hydro);
   list[7] = io_make_input_field("Density", FLOAT, 1, OPTIONAL,
                                 UNIT_CONV_DENSITY, parts, primitives.rho);
+
+  *num_fields = 8;
+  list += *num_fields;
+
+  /* Read in chemistry information */
+  const int num_chem_fields = chemistry_read_particles(parts, list);
+  *num_fields += num_chem_fields;
+  list += num_chem_fields;
 }
 
 /**
@@ -131,8 +137,6 @@ void convert_part_pos(const struct engine* e, const struct part* p,
 void hydro_write_particles(struct part* parts, struct io_props* list,
                            int* num_fields) {
 
-  *num_fields = 10;
-
   /* List what we want to write */
   list[0] = io_make_output_field_convert_part(
       "Coordinates", DOUBLE, 3, UNIT_CONV_LENGTH, parts, convert_part_pos);
@@ -155,6 +159,14 @@ void hydro_write_particles(struct part* parts, struct io_props* list,
                                  parts, primitives.P);
   list[9] = io_make_output_field_convert_part(
       "TotEnergy", FLOAT, 1, UNIT_CONV_ENERGY, parts, convert_Etot);
+
+  *num_fields = 10;
+  list += *num_fields;
+
+  /* Write some chemistry information */
+  const int num_chem_fields = chemistry_write_particles(parts, list);
+  *num_fields += num_chem_fields;
+  list += num_chem_fields;
 }
 
 /**
diff --git a/src/hydro/Gizmo/hydro_part.h b/src/hydro/Gizmo/hydro_part.h
index f13da395bb..76527f47b2 100644
--- a/src/hydro/Gizmo/hydro_part.h
+++ b/src/hydro/Gizmo/hydro_part.h
@@ -188,6 +188,9 @@ struct part {
 
   } gravity;
 
+  /* Chemistry information */
+  struct chemistry_part_data chemistry_data;
+
   /* Time-step length */
   timebin_t time_bin;
 
diff --git a/src/hydro/Minimal/hydro_io.h b/src/hydro/Minimal/hydro_io.h
index 771e4ac2d0..3d7333b8c3 100644
--- a/src/hydro/Minimal/hydro_io.h
+++ b/src/hydro/Minimal/hydro_io.h
@@ -48,8 +48,6 @@
 void hydro_read_particles(struct part* parts, struct io_props* list,
                           int* num_fields) {
 
-  *num_fields = 8;
-
   /* List what we want to read */
   list[0] = io_make_input_field("Coordinates", DOUBLE, 3, COMPULSORY,
                                 UNIT_CONV_LENGTH, parts, x);
@@ -67,6 +65,13 @@ void hydro_read_particles(struct part* parts, struct io_props* list,
                                 UNIT_CONV_ACCELERATION, parts, a_hydro);
   list[7] = io_make_input_field("Density", FLOAT, 1, OPTIONAL,
                                 UNIT_CONV_DENSITY, parts, rho);
+  *num_fields = 8;
+  list += *num_fields;
+
+  /* Read in chemistry information */
+  const int num_chem_fields = chemistry_read_particles(parts, list);
+  *num_fields += num_chem_fields;
+  list += num_chem_fields;
 }
 
 void convert_S(const struct engine* e, const struct part* p, float* ret) {
@@ -103,8 +108,6 @@ void convert_part_pos(const struct engine* e, const struct part* p,
 void hydro_write_particles(struct part* parts, struct io_props* list,
                            int* num_fields) {
 
-  *num_fields = 10;
-
   /* List what we want to write */
   list[0] = io_make_output_field_convert_part(
       "Coordinates", DOUBLE, 3, UNIT_CONV_LENGTH, parts, convert_part_pos);
@@ -126,6 +129,14 @@ void hydro_write_particles(struct part* parts, struct io_props* list,
       "Entropy", FLOAT, 1, UNIT_CONV_ENTROPY_PER_UNIT_MASS, parts, convert_S);
   list[9] = io_make_output_field_convert_part(
       "Pressure", FLOAT, 1, UNIT_CONV_PRESSURE, parts, convert_P);
+
+  *num_fields = 10;
+  list += *num_fields;
+
+  /* Write some chemistry information */
+  const int num_chem_fields = chemistry_write_particles(parts, list);
+  *num_fields += num_chem_fields;
+  list += num_chem_fields;
 }
 
 /**
diff --git a/src/hydro/Minimal/hydro_part.h b/src/hydro/Minimal/hydro_part.h
index e9289c099a..3ecf97e924 100644
--- a/src/hydro/Minimal/hydro_part.h
+++ b/src/hydro/Minimal/hydro_part.h
@@ -149,6 +149,9 @@ struct part {
     } force;
   };
 
+  /* Chemistry information */
+  struct chemistry_part_data chemistry_data;
+
   /*! Time-step length */
   timebin_t time_bin;
 
diff --git a/src/hydro/PressureEntropy/hydro_io.h b/src/hydro/PressureEntropy/hydro_io.h
index d3780261ba..3d414c6a26 100644
--- a/src/hydro/PressureEntropy/hydro_io.h
+++ b/src/hydro/PressureEntropy/hydro_io.h
@@ -45,8 +45,6 @@
 void hydro_read_particles(struct part* parts, struct io_props* list,
                           int* num_fields) {
 
-  *num_fields = 8;
-
   /* List what we want to read */
   list[0] = io_make_input_field("Coordinates", DOUBLE, 3, COMPULSORY,
                                 UNIT_CONV_LENGTH, parts, x);
@@ -65,6 +63,14 @@ void hydro_read_particles(struct part* parts, struct io_props* list,
                                 UNIT_CONV_ACCELERATION, parts, a_hydro);
   list[7] = io_make_input_field("Density", FLOAT, 1, OPTIONAL,
                                 UNIT_CONV_DENSITY, parts, rho);
+
+  *num_fields = 8;
+  list += *num_fields;
+
+  /* Read in chemistry information */
+  const int num_chem_fields = chemistry_read_particles(parts, list);
+  *num_fields += num_chem_fields;
+  list += num_chem_fields;
 }
 
 void convert_u(const struct engine* e, const struct part* p, float* ret) {
@@ -101,8 +107,6 @@ void convert_part_pos(const struct engine* e, const struct part* p,
 void hydro_write_particles(struct part* parts, struct io_props* list,
                            int* num_fields) {
 
-  *num_fields = 11;
-
   /* List what we want to write */
   list[0] = io_make_output_field_convert_part(
       "Coordinates", DOUBLE, 3, UNIT_CONV_LENGTH, parts, convert_part_pos);
@@ -127,6 +131,14 @@ void hydro_write_particles(struct part* parts, struct io_props* list,
       "Pressure", FLOAT, 1, UNIT_CONV_PRESSURE, parts, convert_P);
   list[10] = io_make_output_field("WeightedDensity", FLOAT, 1,
                                   UNIT_CONV_DENSITY, parts, rho_bar);
+
+  *num_fields = 11;
+  list += *num_fields;
+
+  /* Write some chemistry information */
+  const int num_chem_fields = chemistry_write_particles(parts, list);
+  *num_fields += num_chem_fields;
+  list += num_chem_fields;
 }
 
 /**
diff --git a/src/hydro/PressureEntropy/hydro_part.h b/src/hydro/PressureEntropy/hydro_part.h
index 6cb6fe8739..4f7f85e28f 100644
--- a/src/hydro/PressureEntropy/hydro_part.h
+++ b/src/hydro/PressureEntropy/hydro_part.h
@@ -138,6 +138,9 @@ struct part {
     } force;
   };
 
+  /* Chemistry information */
+  struct chemistry_part_data chemistry_data;
+
   /* Time-step length */
   timebin_t time_bin;
 
diff --git a/src/hydro/Shadowswift/hydro_io.h b/src/hydro/Shadowswift/hydro_io.h
index f6f6fcc6c0..2c19dded53 100644
--- a/src/hydro/Shadowswift/hydro_io.h
+++ b/src/hydro/Shadowswift/hydro_io.h
@@ -35,8 +35,6 @@
 void hydro_read_particles(struct part* parts, struct io_props* list,
                           int* num_fields) {
 
-  *num_fields = 8;
-
   /* List what we want to read */
   list[0] = io_make_input_field("Coordinates", DOUBLE, 3, COMPULSORY,
                                 UNIT_CONV_LENGTH, parts, x);
@@ -55,6 +53,13 @@ void hydro_read_particles(struct part* parts, struct io_props* list,
                                 UNIT_CONV_ACCELERATION, parts, a_hydro);
   list[7] = io_make_input_field("Density", FLOAT, 1, OPTIONAL,
                                 UNIT_CONV_DENSITY, parts, primitives.rho);
+  *num_fields = 8;
+  list += *num_fields;
+
+  /* Read in chemistry information */
+  const int num_chem_fields = chemistry_read_particles(parts, list);
+  *num_fields += num_chem_fields;
+  list += num_chem_fields;
 }
 
 /**
@@ -128,8 +133,6 @@ void convert_part_pos(const struct engine* e, const struct part* p,
 void hydro_write_particles(struct part* parts, struct io_props* list,
                            int* num_fields) {
 
-  *num_fields = 13;
-
   /* List what we want to write */
   list[0] = io_make_output_field_convert_part(
       "Coordinates", DOUBLE, 3, UNIT_CONV_LENGTH, parts, convert_part_pos);
@@ -158,6 +161,14 @@ void hydro_write_particles(struct part* parts, struct io_props* list,
                                   parts, primitives.P);
   list[12] = io_make_output_field_convert_part(
       "TotEnergy", FLOAT, 1, UNIT_CONV_ENERGY, parts, convert_Etot);
+
+  *num_fields = 13;
+  list += *num_fields;
+
+  /* Write some chemistry information */
+  const int num_chem_fields = chemistry_write_particles(parts, list);
+  *num_fields += num_chem_fields;
+  list += num_chem_fields;
 }
 
 /**
diff --git a/src/hydro/Shadowswift/hydro_part.h b/src/hydro/Shadowswift/hydro_part.h
index e25400e905..ae30ecca74 100644
--- a/src/hydro/Shadowswift/hydro_part.h
+++ b/src/hydro/Shadowswift/hydro_part.h
@@ -169,6 +169,9 @@ struct part {
 
   } force;
 
+  /* Chemistry information */
+  struct chemistry_part_data chemistry_data;
+
   /* Time-step length */
   timebin_t time_bin;
 
-- 
GitLab