Mercurial > public > ostc4
annotate Discovery/Src/buehlmann.c @ 983:7891160acde3 GasConsumption
Bugfix calculation of needed gas:
Sometimes a gas was not calculated because of it's change depth calculation. Rootcause was a problem in the setup of the gas change list. The old function collecting milestones like time to first stop etc. has been removed because after the deco compression the complete profile is available. Instead of doing another way of profile calculation the existing profil is now evaluated and the time stamps / gas consumption derived from there.
| author | Ideenmodellierer |
|---|---|
| date | Sun, 02 Mar 2025 21:43:08 +0100 |
| parents | 79b522fbabe6 |
| children | d91345e9c009 |
| rev | line source |
|---|---|
|
51
8f8ea3a32e82
Resolved warnings pointing to possible invalid memory access
Ideenmodellierer
parents:
38
diff
changeset
|
1 /* getrennte Gase f�r die verschiedenen Modi |
|
8f8ea3a32e82
Resolved warnings pointing to possible invalid memory access
Ideenmodellierer
parents:
38
diff
changeset
|
2 um Gaswechsel Eintr�ge zu vereinfachen |
| 38 | 3 das heisst: |
| 4 oc == bailout in cc mode | |
| 5 */ | |
| 6 | |
| 7 /* Konvention: | |
| 8 float extExample_variable_can_be_used_with_extern; | |
| 9 */ | |
| 10 | |
| 11 #include <string.h> | |
| 12 #include <math.h> | |
| 13 #include <stdbool.h> | |
| 14 #include "buehlmann.h" | |
| 15 #include "decom.h" | |
| 16 | |
| 17 extern const float buehlmann_N2_a[]; | |
| 18 extern const float buehlmann_N2_b[]; | |
| 19 extern const float buehlmann_He_a[]; | |
| 20 extern const float buehlmann_He_b[]; | |
| 21 | |
| 22 typedef struct | |
| 23 { | |
| 24 float depth; | |
| 25 int id; | |
| 26 } SStop; | |
| 27 | |
| 28 #define DECO_STOPS_MAX_TTS_CALCULATON_IN_SECONDS 59940 // 999 minuten; before: 18000 // 5(h) * 60(min) * 60 sec = 18000 sec | |
| 29 #define DECO_STOPS_MAX_TTS_FOR_EVERY_SECOND_CALC_IN_SECONDS 7200 | |
| 30 #define NINETY_NINE_MINUTES_IN_SECONDS 59940 | |
| 31 | |
| 32 # define PRESSURE_TEN_METER 1.0f | |
| 33 # define PRESSURE_THREE_METER 0.333334f | |
| 34 # define PRESSURE_150_CM 0.15f | |
| 35 # define PRESSURE_HALF_METER 0.05f | |
| 36 | |
|
253
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
37 static void buehlmann_backup_and_restore(_Bool backup_restore_otherwise); |
|
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
38 static float tissue_tolerance(void); |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
39 static void ambient_bar_to_deco_stop_depth_bar(SDiveSettings *pDiveSettings, float ceiling); |
|
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
40 static int ascend_with_all_gaschanges(SDiveSettings *pDiveSettings, float pressure_decrease); |
|
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
41 static float next_stop_depth_input_is_actual_stop_id(SDiveSettings *pDiveSettings, int actual_id); |
|
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
42 static float get_gf_at_pressure(SDiveSettings *pDiveSettings, float pressure); |
|
257
21387d7e786f
Buehlmann: factor out gNDL and gTTS
Jan Mulder <jlmulder@xs4all.nl>
parents:
256
diff
changeset
|
43 static int buehlmann_calc_ndl(SDiveSettings *pDiveSettings); |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
44 static _Bool dive1_check_deco(SDiveSettings *pDiveSettings); |
| 38 | 45 |
|
253
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
46 static float gSurface_pressure_bar; |
|
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
47 static float gPressure; |
|
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
48 static int gGas_id; |
|
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
49 static float gTissue_nitrogen_bar[16]; |
|
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
50 static float gTissue_helium_bar[16]; |
|
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
51 static float gGF_value; |
|
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
52 static float gCNS; |
| 38 | 53 |
| 54 float gGF_low_depth_bar; | |
| 55 SStop gStop; | |
| 56 | |
| 57 void buehlmann_init(void) | |
| 58 { | |
| 59 } | |
| 60 | |
|
253
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
61 static void buehlmann_backup_and_restore(_Bool backup_restore_otherwise) |
| 38 | 62 { |
| 63 static float pressure; | |
| 64 static float gas_id; | |
| 65 static float tissue_nitrogen_bar[16]; | |
| 66 static float tissue_helium_bar[16]; | |
| 67 static float gf_value; | |
| 68 static float cns; | |
| 69 | |
| 70 if(backup_restore_otherwise) | |
| 71 { | |
| 72 pressure = gPressure; | |
| 73 gas_id = gGas_id; | |
| 74 gf_value = gGF_value; | |
| 75 cns = gCNS; | |
| 76 memcpy(tissue_nitrogen_bar, gTissue_nitrogen_bar, (4*16)); | |
| 77 memcpy(tissue_helium_bar, gTissue_helium_bar, (4*16)); | |
| 78 } | |
| 79 else | |
| 80 { | |
| 81 gPressure = pressure; | |
| 82 gGas_id = gas_id; | |
| 83 gGF_value = gf_value; | |
| 84 gCNS = cns; | |
| 85 memcpy(gTissue_nitrogen_bar, tissue_nitrogen_bar, (4*16)); | |
| 86 memcpy(gTissue_helium_bar, tissue_helium_bar, (4*16)); | |
| 87 } | |
| 88 | |
| 89 } | |
| 90 | |
| 91 float buehlmann_get_gCNS(void) | |
| 92 { | |
| 93 return gCNS; | |
| 94 } | |
| 95 | |
| 96 void buehlmann_calc_deco(SLifeData* pLifeData, SDiveSettings * pDiveSettings, SDecoinfo * pDecoInfo) | |
| 97 { | |
| 98 float ceiling; | |
| 99 int ascend_time; | |
| 100 int tts_seconds; | |
| 101 float pressure_delta; | |
| 102 float next_depth; | |
| 103 _Bool deco_reached = false; | |
| 104 unsigned short *stoplist; | |
| 105 int i; | |
| 106 | |
| 107 gCNS = 0; | |
|
253
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
108 pDecoInfo->output_time_to_surface_seconds = 0; |
| 38 | 109 pDecoInfo->output_ndl_seconds = 0; |
| 110 for(int i=0;i<DECOINFO_STRUCT_MAX_STOPS;i++) | |
| 111 { | |
| 112 pDecoInfo->output_stop_length_seconds[i] = 0; | |
| 113 } | |
| 114 | |
| 115 /* internal copying */ | |
| 116 gSurface_pressure_bar = pLifeData->pressure_surface_bar; | |
| 117 | |
| 118 gPressure = pLifeData->pressure_ambient_bar; | |
| 119 gGas_id = 0; | |
| 120 memcpy(gTissue_nitrogen_bar, pLifeData->tissue_nitrogen_bar, (4*16)); | |
| 121 memcpy(gTissue_helium_bar, pLifeData->tissue_helium_bar, (4*16)); | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
122 gGF_value = ((float)pDiveSettings->gf_low) / 100.0f; |
| 38 | 123 |
|
258
0087d6251f59
Buehlmann: factor out another global gDecotable
Jan Mulder <jlmulder@xs4all.nl>
parents:
257
diff
changeset
|
124 stoplist = pDecoInfo->output_stop_length_seconds; |
| 38 | 125 |
|
305
305f251cc981
bugfix, consistency: show deco/NDL really after 1 minute divetime
Jan Mulder <jlmulder@xs4all.nl>
parents:
291
diff
changeset
|
126 if(pLifeData->dive_time_seconds_without_surface_time < 60) |
|
253
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
127 return; |
| 38 | 128 |
| 129 // clean stop list | |
| 130 for(i = 0; i < DECOINFO_STRUCT_MAX_STOPS; i++) | |
| 131 stoplist[i] = 0; | |
| 132 | |
|
253
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
133 if(pDiveSettings->internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero >= (gPressure - PRESSURE_150_CM)) |
|
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
134 { |
|
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
135 deco_reached = true; |
|
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
136 } |
| 38 | 137 |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
138 gGF_value = ((float)pDiveSettings->gf_high) / 100.0f; |
|
257
21387d7e786f
Buehlmann: factor out gNDL and gTTS
Jan Mulder <jlmulder@xs4all.nl>
parents:
256
diff
changeset
|
139 buehlmann_backup_and_restore(true); |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
140 if(!dive1_check_deco(pDiveSettings) ) |
| 38 | 141 { |
|
257
21387d7e786f
Buehlmann: factor out gNDL and gTTS
Jan Mulder <jlmulder@xs4all.nl>
parents:
256
diff
changeset
|
142 buehlmann_backup_and_restore(false); |
| 38 | 143 // no deco |
|
257
21387d7e786f
Buehlmann: factor out gNDL and gTTS
Jan Mulder <jlmulder@xs4all.nl>
parents:
256
diff
changeset
|
144 pDecoInfo->output_time_to_surface_seconds = 0; |
| 38 | 145 for(i = 0; i < DECOINFO_STRUCT_MAX_STOPS; i++) |
|
254
a17f7fb3b2b5
Buehlmann: cleanup, remove global pDecolistBuehlmann
Jan Mulder <jlmulder@xs4all.nl>
parents:
253
diff
changeset
|
146 pDecoInfo->output_stop_length_seconds[i] = 0; |
| 38 | 147 // calc NDL |
|
257
21387d7e786f
Buehlmann: factor out gNDL and gTTS
Jan Mulder <jlmulder@xs4all.nl>
parents:
256
diff
changeset
|
148 pDecoInfo->output_ndl_seconds = buehlmann_calc_ndl(pDiveSettings);; |
| 38 | 149 return; |
| 150 } | |
| 151 buehlmann_backup_and_restore(false); | |
|
254
a17f7fb3b2b5
Buehlmann: cleanup, remove global pDecolistBuehlmann
Jan Mulder <jlmulder@xs4all.nl>
parents:
253
diff
changeset
|
152 pDecoInfo->output_ndl_seconds = 0; |
| 38 | 153 |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
154 gGF_value = get_gf_at_pressure(pDiveSettings, gPressure); |
| 38 | 155 //current ceiling at actual position |
| 156 ceiling = tissue_tolerance(); | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
157 ambient_bar_to_deco_stop_depth_bar(pDiveSettings, ceiling); |
| 38 | 158 |
| 159 // set the base for all upcoming parameters | |
| 160 ceiling = gStop.depth + gSurface_pressure_bar; | |
| 161 tts_seconds = 0; | |
| 162 | |
| 163 // modify parameters if there is ascend or parameter fine adjustment | |
| 164 if(ceiling < (gPressure - PRESSURE_150_CM)) // more than 1.5 meter below ceiling | |
| 165 { | |
| 166 // ascend within 10 mtr to GF_low // speed 12 mtr/min -> 50 sec / 10 mtr; 15 sec / 3 mtr. | |
| 167 if(ceiling < (gPressure - PRESSURE_TEN_METER) ) | |
| 168 { do { | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
169 ascend_time = ascend_with_all_gaschanges(pDiveSettings, PRESSURE_TEN_METER); |
| 38 | 170 tts_seconds += ascend_time; |
| 171 ceiling = tissue_tolerance(); | |
| 172 if(tts_seconds > DECO_STOPS_MAX_TTS_CALCULATON_IN_SECONDS) | |
| 173 { | |
|
254
a17f7fb3b2b5
Buehlmann: cleanup, remove global pDecolistBuehlmann
Jan Mulder <jlmulder@xs4all.nl>
parents:
253
diff
changeset
|
174 pDecoInfo->output_time_to_surface_seconds = NINETY_NINE_MINUTES_IN_SECONDS; |
| 38 | 175 return;// NINETY_NINE_MINUTES_IN_SECONDS; |
| 176 } | |
| 177 } while ((ascend_time > 0 ) && ((gPressure - PRESSURE_TEN_METER ) > gSurface_pressure_bar) && (ceiling < (gPressure - PRESSURE_TEN_METER))); | |
| 178 } | |
| 179 do { | |
| 180 buehlmann_backup_and_restore(true); | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
181 ascend_time = ascend_with_all_gaschanges(pDiveSettings, PRESSURE_THREE_METER); |
| 38 | 182 tts_seconds += ascend_time; |
| 183 ceiling = tissue_tolerance(); | |
| 184 if(tts_seconds > DECO_STOPS_MAX_TTS_CALCULATON_IN_SECONDS) | |
| 185 { | |
|
254
a17f7fb3b2b5
Buehlmann: cleanup, remove global pDecolistBuehlmann
Jan Mulder <jlmulder@xs4all.nl>
parents:
253
diff
changeset
|
186 pDecoInfo->output_time_to_surface_seconds = NINETY_NINE_MINUTES_IN_SECONDS; |
| 38 | 187 return;// NINETY_NINE_MINUTES_IN_SECONDS; |
| 188 } | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
189 ambient_bar_to_deco_stop_depth_bar(pDiveSettings, ceiling); |
| 38 | 190 } while ((ascend_time > 0 ) && ((gStop.depth + gSurface_pressure_bar) < gPressure)); |
| 191 | |
| 192 if(gStop.depth + gSurface_pressure_bar > gPressure) | |
| 193 { | |
| 194 gPressure += PRESSURE_THREE_METER; | |
| 195 buehlmann_backup_and_restore(false); | |
| 196 tts_seconds -= ascend_time; | |
| 197 } | |
| 198 // calculate first stop based on tissue saturation within 10 meters of stop | |
| 199 //ambient_bar_to_deco_stop_depth_bar(ceiling); | |
| 200 } | |
| 201 else | |
| 202 { | |
| 203 // initial values, upper code might not be executed (is within 150 cm) | |
| 204 } | |
| 205 | |
|
253
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
206 if (ceiling > gSurface_pressure_bar) |
|
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
207 { |
|
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
208 ceiling = gStop.depth + gSurface_pressure_bar; |
|
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
209 // ascend the last meters to first stop (especially consider any gas changes around) |
|
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
210 pressure_delta = gPressure - ceiling; |
|
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
211 ascend_time = (int) ceil(pressure_delta * 50.0f); |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
212 tts_seconds += ascend_with_all_gaschanges(pDiveSettings, pressure_delta); |
|
253
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
213 } |
| 38 | 214 // NDL check |
| 215 if(ceiling <= gSurface_pressure_bar) | |
| 216 { | |
| 217 // NDL with GF_low | |
|
254
a17f7fb3b2b5
Buehlmann: cleanup, remove global pDecolistBuehlmann
Jan Mulder <jlmulder@xs4all.nl>
parents:
253
diff
changeset
|
218 pDecoInfo->output_time_to_surface_seconds = 0; |
| 38 | 219 return; |
| 220 } | |
|
253
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
221 if (ceiling > pDiveSettings->internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero) |
|
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
222 pDiveSettings->internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero = ceiling; |
| 38 | 223 |
| 224 // calc gf loop | |
| 225 if(deco_reached) | |
| 226 gGF_low_depth_bar = pDiveSettings->internal__pressure_first_stop_ambient_bar_as_upper_limit_for_gf_low_otherwise_zero - gSurface_pressure_bar; | |
| 227 else | |
| 228 gGF_low_depth_bar = ceiling - gSurface_pressure_bar; | |
| 229 | |
| 230 while(gStop.depth > 0) | |
| 231 { | |
| 232 do | |
| 233 { | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
234 next_depth = next_stop_depth_input_is_actual_stop_id(pDiveSettings, gStop.id); |
|
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
235 gGF_value = get_gf_at_pressure(pDiveSettings, next_depth + gSurface_pressure_bar); |
| 38 | 236 buehlmann_backup_and_restore(true); |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
237 ascend_time = ascend_with_all_gaschanges(pDiveSettings, gStop.depth - next_depth); |
| 38 | 238 ceiling = tissue_tolerance(); |
| 239 /* pre check actual limit */ | |
|
258
0087d6251f59
Buehlmann: factor out another global gDecotable
Jan Mulder <jlmulder@xs4all.nl>
parents:
257
diff
changeset
|
240 if(pDecoInfo->output_stop_length_seconds[gStop.id] >= 999*60) |
| 38 | 241 { |
|
258
0087d6251f59
Buehlmann: factor out another global gDecotable
Jan Mulder <jlmulder@xs4all.nl>
parents:
257
diff
changeset
|
242 tts_seconds -= 999*60 - pDecoInfo->output_stop_length_seconds[gStop.id]; |
|
0087d6251f59
Buehlmann: factor out another global gDecotable
Jan Mulder <jlmulder@xs4all.nl>
parents:
257
diff
changeset
|
243 pDecoInfo->output_stop_length_seconds[gStop.id] = 999*60; |
| 38 | 244 } |
| 245 else | |
| 246 /* more deco on the actual depth */ | |
| 247 if(ceiling > next_depth + gSurface_pressure_bar) | |
| 248 { | |
| 249 next_depth = -1; | |
| 250 buehlmann_backup_and_restore(false); | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
251 decom_tissues_exposure2(10, &pDiveSettings->decogaslist[gGas_id], gPressure,gTissue_nitrogen_bar,gTissue_helium_bar); // some seconds at least at each stop |
|
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
252 decom_oxygen_calculate_cns_exposure(10, &pDiveSettings->decogaslist[gGas_id], gPressure, &gCNS); |
|
258
0087d6251f59
Buehlmann: factor out another global gDecotable
Jan Mulder <jlmulder@xs4all.nl>
parents:
257
diff
changeset
|
253 pDecoInfo->output_stop_length_seconds[gStop.id] += 10; |
| 38 | 254 tts_seconds += 10; |
| 255 } | |
| 256 } while(next_depth == -1); | |
|
253
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
257 tts_seconds += ascend_time; |
| 38 | 258 gStop.depth = next_depth; |
| 259 for(i = gGas_id + 1; i < BUEHLMANN_STRUCT_MAX_GASES; i++) | |
| 260 { | |
| 983 | 261 if(pDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero == 0) |
|
862
974648b5ccfe
Only use deco gas for calculation if option is enabled:
Ideenmodellierer
parents:
833
diff
changeset
|
262 { |
| 38 | 263 break; |
|
862
974648b5ccfe
Only use deco gas for calculation if option is enabled:
Ideenmodellierer
parents:
833
diff
changeset
|
264 } |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
265 float pressureChange = ((float)pDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero) / 10; |
| 38 | 266 if(gStop.depth <= pressureChange + 0.00001f) |
| 267 { | |
| 268 gGas_id = i; | |
| 269 } | |
| 270 else | |
| 271 { | |
| 272 break; | |
| 273 } | |
| 274 } | |
| 275 gStop.id--; | |
| 276 } | |
| 277 | |
|
258
0087d6251f59
Buehlmann: factor out another global gDecotable
Jan Mulder <jlmulder@xs4all.nl>
parents:
257
diff
changeset
|
278 pDecoInfo->output_time_to_surface_seconds = tts_seconds; |
| 38 | 279 } |
| 280 | |
| 281 | |
|
253
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
282 static float tissue_tolerance(void) |
| 38 | 283 { |
| 284 float tissue_inertgas_saturation; | |
| 285 float inertgas_a; | |
| 286 float inertgas_b; | |
| 287 float ceiling; | |
| 288 float global_ceiling; | |
| 289 int ci; | |
| 290 | |
| 291 global_ceiling = -1; | |
| 292 | |
| 293 for (ci = 0; ci < 16; ci++) | |
| 294 { | |
| 295 if(gTissue_helium_bar[ci] == 0) | |
| 296 { | |
| 297 tissue_inertgas_saturation = gTissue_nitrogen_bar[ci]; | |
| 298 // | |
| 299 inertgas_a = buehlmann_N2_a[ci]; | |
| 300 inertgas_b = buehlmann_N2_b[ci]; | |
| 301 } | |
| 302 else | |
| 303 { | |
| 304 tissue_inertgas_saturation = gTissue_nitrogen_bar[ci] + gTissue_helium_bar[ci]; | |
| 305 // | |
| 306 inertgas_a = ( ( buehlmann_N2_a[ci] * gTissue_nitrogen_bar[ci]) + ( buehlmann_He_a[ci] * gTissue_helium_bar[ci]) ) / tissue_inertgas_saturation; | |
| 307 inertgas_b = ( ( buehlmann_N2_b[ci] * gTissue_nitrogen_bar[ci]) + ( buehlmann_He_b[ci] * gTissue_helium_bar[ci]) ) / tissue_inertgas_saturation; | |
| 308 } | |
| 309 // | |
| 310 ceiling = (inertgas_b * ( tissue_inertgas_saturation - gGF_value * inertgas_a ) ) / (gGF_value - (inertgas_b * gGF_value) + inertgas_b); | |
| 311 if(ceiling > global_ceiling) | |
| 312 global_ceiling = ceiling; | |
| 313 } | |
| 314 return global_ceiling; | |
| 315 } | |
| 316 | |
|
246
ff0d23625cd5
feature: replace Relative GF by saturation, computational only
Jan Mulder <jlmulder@xs4all.nl>
parents:
224
diff
changeset
|
317 void buehlmann_super_saturation_calculator(SLifeData* pLifeData, SDecoinfo * pDecoInfo) |
| 38 | 318 { |
| 319 float tissue_inertgas_saturation; | |
| 320 float inertgas_a; | |
| 321 float inertgas_b; | |
| 322 float ceiling; | |
|
246
ff0d23625cd5
feature: replace Relative GF by saturation, computational only
Jan Mulder <jlmulder@xs4all.nl>
parents:
224
diff
changeset
|
323 float super_saturation; |
|
ff0d23625cd5
feature: replace Relative GF by saturation, computational only
Jan Mulder <jlmulder@xs4all.nl>
parents:
224
diff
changeset
|
324 float pres_respiration = pLifeData->pressure_ambient_bar; |
| 38 | 325 int ci; |
| 326 | |
|
246
ff0d23625cd5
feature: replace Relative GF by saturation, computational only
Jan Mulder <jlmulder@xs4all.nl>
parents:
224
diff
changeset
|
327 pDecoInfo->super_saturation = 0; |
| 38 | 328 |
| 329 for (ci = 0; ci < 16; ci++) | |
| 330 { | |
| 331 if(gTissue_helium_bar[ci] == 0) | |
| 332 { | |
| 333 tissue_inertgas_saturation = gTissue_nitrogen_bar[ci]; | |
| 334 inertgas_a = buehlmann_N2_a[ci]; | |
| 335 inertgas_b = buehlmann_N2_b[ci]; | |
| 336 } | |
| 337 else | |
| 338 { | |
| 339 tissue_inertgas_saturation = gTissue_nitrogen_bar[ci] + gTissue_helium_bar[ci]; | |
| 340 inertgas_a = ( ( buehlmann_N2_a[ci] * gTissue_nitrogen_bar[ci]) + ( buehlmann_He_a[ci] * gTissue_helium_bar[ci]) ) / tissue_inertgas_saturation; | |
| 341 inertgas_b = ( ( buehlmann_N2_b[ci] * gTissue_nitrogen_bar[ci]) + ( buehlmann_He_b[ci] * gTissue_helium_bar[ci]) ) / tissue_inertgas_saturation; | |
| 342 } | |
|
246
ff0d23625cd5
feature: replace Relative GF by saturation, computational only
Jan Mulder <jlmulder@xs4all.nl>
parents:
224
diff
changeset
|
343 |
|
ff0d23625cd5
feature: replace Relative GF by saturation, computational only
Jan Mulder <jlmulder@xs4all.nl>
parents:
224
diff
changeset
|
344 ceiling = pres_respiration / inertgas_b + inertgas_a; |
|
ff0d23625cd5
feature: replace Relative GF by saturation, computational only
Jan Mulder <jlmulder@xs4all.nl>
parents:
224
diff
changeset
|
345 if(tissue_inertgas_saturation > pres_respiration) |
| 38 | 346 { |
|
246
ff0d23625cd5
feature: replace Relative GF by saturation, computational only
Jan Mulder <jlmulder@xs4all.nl>
parents:
224
diff
changeset
|
347 super_saturation = |
|
ff0d23625cd5
feature: replace Relative GF by saturation, computational only
Jan Mulder <jlmulder@xs4all.nl>
parents:
224
diff
changeset
|
348 (tissue_inertgas_saturation - pres_respiration) / (ceiling - pres_respiration); |
|
ff0d23625cd5
feature: replace Relative GF by saturation, computational only
Jan Mulder <jlmulder@xs4all.nl>
parents:
224
diff
changeset
|
349 |
|
ff0d23625cd5
feature: replace Relative GF by saturation, computational only
Jan Mulder <jlmulder@xs4all.nl>
parents:
224
diff
changeset
|
350 if (super_saturation > pDecoInfo->super_saturation) |
|
ff0d23625cd5
feature: replace Relative GF by saturation, computational only
Jan Mulder <jlmulder@xs4all.nl>
parents:
224
diff
changeset
|
351 pDecoInfo->super_saturation = super_saturation; |
| 38 | 352 } |
| 353 } | |
| 354 } | |
| 355 | |
| 356 | |
|
253
1663b3b204d7
Buehlmann: cleanup, whitespace, static
Jan Mulder <jlmulder@xs4all.nl>
parents:
250
diff
changeset
|
357 static float buehlmann_tissue_test_tolerance(float depth_in_bar_absolute) |
| 38 | 358 { |
| 359 float tissue_inertgas_saturation; | |
| 360 float inertgas_a; | |
| 361 float inertgas_b; | |
| 362 float inertgas_tolerance; | |
| 363 float gf_minus_1; | |
| 364 | |
| 365 gf_minus_1 = gGF_value - 1.0f; | |
| 366 | |
| 367 for (int ci = 0; ci < 16; ci++) | |
| 368 { | |
| 369 if(gTissue_helium_bar[ci] == 0) | |
| 370 { | |
| 371 tissue_inertgas_saturation = gTissue_nitrogen_bar[ci]; | |
| 372 inertgas_a = buehlmann_N2_a[ci]; | |
| 373 inertgas_b = buehlmann_N2_b[ci]; | |
| 374 } | |
| 375 else | |
| 376 { | |
| 377 tissue_inertgas_saturation = gTissue_nitrogen_bar[ci] + gTissue_helium_bar[ci]; | |
| 378 inertgas_a = ( ( buehlmann_N2_a[ci] * gTissue_nitrogen_bar[ci]) + ( buehlmann_He_a[ci] * gTissue_helium_bar[ci]) ) / tissue_inertgas_saturation; | |
| 379 inertgas_b = ( ( buehlmann_N2_b[ci] * gTissue_nitrogen_bar[ci]) + ( buehlmann_He_b[ci] * gTissue_helium_bar[ci]) ) / tissue_inertgas_saturation; | |
| 380 } | |
| 381 inertgas_tolerance = ( (gGF_value / inertgas_b - gf_minus_1) * depth_in_bar_absolute ) + ( gGF_value * inertgas_a ); | |
| 382 if(inertgas_tolerance < tissue_inertgas_saturation) | |
|
250
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
383 return tissue_inertgas_saturation - inertgas_tolerance; // positive |
| 38 | 384 } |
|
250
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
385 return tissue_inertgas_saturation - inertgas_tolerance; // negative |
| 38 | 386 } |
| 387 | |
| 388 | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
389 static void ambient_bar_to_deco_stop_depth_bar(SDiveSettings *pDiveSettings, float ceiling) |
| 38 | 390 { |
| 391 int i; | |
| 392 | |
| 393 ceiling -= gSurface_pressure_bar; | |
| 394 | |
| 395 if(ceiling <= 0) | |
| 396 { | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
397 gStop.depth = pDiveSettings->last_stop_depth_bar; |
| 38 | 398 gStop.id = 0; |
| 399 return; | |
| 400 } | |
| 401 | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
402 if((ceiling - pDiveSettings->last_stop_depth_bar) <= 0) |
| 38 | 403 { |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
404 gStop.depth = pDiveSettings->last_stop_depth_bar; |
| 38 | 405 gStop.id = 0; |
| 406 return; | |
| 407 } | |
| 408 | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
409 gStop.depth = pDiveSettings->input_second_to_last_stop_depth_bar; |
| 38 | 410 gStop.id = 1; |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
411 ceiling -= pDiveSettings->input_second_to_last_stop_depth_bar; |
| 38 | 412 |
| 413 if(ceiling <= 0) | |
| 414 return; | |
| 415 | |
| 416 for(i = 1; i < (DECOINFO_STRUCT_MAX_STOPS - 2); i++) | |
| 417 { | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
418 ceiling -= pDiveSettings->input_next_stop_increment_depth_bar; |
| 38 | 419 if(ceiling <= 0) |
| 420 break; | |
| 421 } | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
422 gStop.depth += i * pDiveSettings->input_next_stop_increment_depth_bar; |
| 38 | 423 gStop.id += i; |
| 424 return; | |
| 425 } | |
| 426 | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
427 static float next_stop_depth_input_is_actual_stop_id(SDiveSettings *pDiveSettings, int actual_id) |
| 38 | 428 { |
| 429 if(actual_id == 0) | |
| 430 return 0; | |
| 431 | |
| 432 if(actual_id == 1) | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
433 return pDiveSettings->last_stop_depth_bar; |
| 38 | 434 |
| 435 actual_id -= 2; | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
436 return pDiveSettings->input_second_to_last_stop_depth_bar + (actual_id * pDiveSettings->input_next_stop_increment_depth_bar); |
| 38 | 437 } |
| 438 | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
439 static int ascend_with_all_gaschanges(SDiveSettings *pDiveSettings, float pressure_decrease) |
| 38 | 440 { |
| 441 float pressureTop, pressureTop_tmp, pressureBottom, pressureChange, ascendrate_in_seconds_for_one_bar, pressure_difference; | |
|
51
8f8ea3a32e82
Resolved warnings pointing to possible invalid memory access
Ideenmodellierer
parents:
38
diff
changeset
|
442 int time_for_ascend = 0; |
| 38 | 443 int seconds; |
| 444 int i; | |
| 445 | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
446 ascendrate_in_seconds_for_one_bar = 60 * 10 / pDiveSettings->ascentRate_meterperminute; |
| 38 | 447 |
| 448 if(fabsf(gPressure - gSurface_pressure_bar) < PRESSURE_HALF_METER) | |
| 449 { | |
| 450 gPressure = gSurface_pressure_bar; | |
| 451 return 0; | |
| 452 } | |
| 453 | |
| 454 pressureTop = gPressure - pressure_decrease; | |
| 455 if( gSurface_pressure_bar > pressureTop) | |
| 456 pressureTop = gSurface_pressure_bar; | |
| 457 pressureBottom = gPressure; | |
| 458 seconds = 0; | |
| 459 do{ | |
| 460 pressureTop_tmp = pressureTop; | |
| 461 for(i = gGas_id + 1; i < BUEHLMANN_STRUCT_MAX_GASES; i++) | |
| 462 { | |
| 983 | 463 if(pDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero == 0) |
|
862
974648b5ccfe
Only use deco gas for calculation if option is enabled:
Ideenmodellierer
parents:
833
diff
changeset
|
464 { |
| 38 | 465 break; |
|
862
974648b5ccfe
Only use deco gas for calculation if option is enabled:
Ideenmodellierer
parents:
833
diff
changeset
|
466 } |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
467 pressureChange = gSurface_pressure_bar + ((float)pDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero) / 10; |
| 38 | 468 if(pressureBottom <= pressureChange) |
| 469 { | |
| 470 gGas_id = i; | |
| 471 } | |
| 472 else | |
| 473 { | |
| 474 break; | |
| 475 } | |
| 476 | |
| 477 } | |
| 478 for(i = gGas_id + 1; i < BUEHLMANN_STRUCT_MAX_GASES; i++) | |
| 479 { | |
| 983 | 480 if(pDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero == 0) |
|
862
974648b5ccfe
Only use deco gas for calculation if option is enabled:
Ideenmodellierer
parents:
833
diff
changeset
|
481 { |
| 38 | 482 break; |
|
862
974648b5ccfe
Only use deco gas for calculation if option is enabled:
Ideenmodellierer
parents:
833
diff
changeset
|
483 } |
|
974648b5ccfe
Only use deco gas for calculation if option is enabled:
Ideenmodellierer
parents:
833
diff
changeset
|
484 |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
485 pressureChange = gSurface_pressure_bar + ((float)pDiveSettings->decogaslist[i].change_during_ascent_depth_meter_otherwise_zero)/ 10; |
| 38 | 486 if((pressureChange < pressureBottom) && (pressureChange > pressureTop)) |
| 487 { | |
| 488 pressureTop_tmp = pressureChange; | |
| 489 } | |
| 490 } | |
| 491 pressure_difference = pressureBottom - pressureTop_tmp; | |
| 492 if(pressure_difference > 0.0001f) | |
| 493 { | |
| 494 time_for_ascend = (int)ceilf(pressure_difference * ascendrate_in_seconds_for_one_bar); | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
495 decom_tissues_exposure_stage_schreiner(time_for_ascend, &pDiveSettings->decogaslist[gGas_id], |
| 38 | 496 pressureBottom, pressureTop_tmp, gTissue_nitrogen_bar, gTissue_helium_bar); |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
497 decom_oxygen_calculate_cns_stage_SchreinerStyle(time_for_ascend,&pDiveSettings->decogaslist[gGas_id], |
| 38 | 498 pressureBottom, pressureTop_tmp, &gCNS); |
| 499 } | |
| 500 pressureBottom = pressureTop_tmp; | |
| 501 seconds += time_for_ascend; | |
| 502 }while(pressureTop_tmp > pressureTop); | |
| 503 gPressure = pressureTop; | |
| 504 return seconds; | |
| 505 } | |
| 506 | |
| 507 | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
508 static float get_gf_at_pressure(SDiveSettings *pDiveSettings, float pressure) |
| 38 | 509 { |
| 510 float gfSteigung = 0.0f; | |
| 511 | |
| 512 if(gGF_low_depth_bar < 0) | |
| 513 gGF_low_depth_bar = PRESSURE_THREE_METER; // just to prevent erratic behaviour if variable is not set | |
| 514 | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
515 gfSteigung = ((float)(pDiveSettings->gf_high - pDiveSettings->gf_low))/ gGF_low_depth_bar; |
| 38 | 516 |
| 517 | |
| 518 if((pressure - gSurface_pressure_bar) <= PRESSURE_HALF_METER) | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
519 return ((float)pDiveSettings->gf_high) / 100.0f; |
| 38 | 520 |
| 521 if(pressure >= gSurface_pressure_bar + gGF_low_depth_bar) | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
522 return ((float)pDiveSettings->gf_low) / 100.0f; |
| 38 | 523 |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
524 return (pDiveSettings->gf_high - gfSteigung * (pressure - gSurface_pressure_bar) )/ 100.0f; |
| 38 | 525 } |
| 526 | |
|
291
24ff72e627f4
Deco Models: limit NDL to 240 minutes
Jan Mulder <jlmulder@xs4all.nl>
parents:
261
diff
changeset
|
527 #define MAX_NDL 240 |
|
257
21387d7e786f
Buehlmann: factor out gNDL and gTTS
Jan Mulder <jlmulder@xs4all.nl>
parents:
256
diff
changeset
|
528 static int buehlmann_calc_ndl(SDiveSettings *pDiveSettings) |
| 38 | 529 { |
| 530 float local_tissue_nitrogen_bar[16]; | |
| 531 float local_tissue_helium_bar[16]; | |
| 532 int i; | |
|
257
21387d7e786f
Buehlmann: factor out gNDL and gTTS
Jan Mulder <jlmulder@xs4all.nl>
parents:
256
diff
changeset
|
533 int ndl = 0; |
| 38 | 534 |
| 535 //Check ndl always use gHigh | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
536 gGF_value = ((float)pDiveSettings->gf_high) / 100.0f; |
| 38 | 537 //10 minutes steps |
|
291
24ff72e627f4
Deco Models: limit NDL to 240 minutes
Jan Mulder <jlmulder@xs4all.nl>
parents:
261
diff
changeset
|
538 while(ndl < (MAX_NDL * 60)) |
| 38 | 539 { |
| 540 memcpy(local_tissue_nitrogen_bar, gTissue_nitrogen_bar, (4*16)); | |
| 541 memcpy(local_tissue_helium_bar, gTissue_helium_bar, (4*16)); | |
| 542 // | |
|
257
21387d7e786f
Buehlmann: factor out gNDL and gTTS
Jan Mulder <jlmulder@xs4all.nl>
parents:
256
diff
changeset
|
543 ndl += 600; |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
544 decom_tissues_exposure2(600, &pDiveSettings->decogaslist[gGas_id], gPressure,gTissue_nitrogen_bar,gTissue_helium_bar); |
|
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
545 decom_oxygen_calculate_cns_exposure(600,&pDiveSettings->decogaslist[gGas_id],gPressure,&gCNS); |
| 38 | 546 buehlmann_backup_and_restore(true); |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
547 if(dive1_check_deco(pDiveSettings)) |
| 38 | 548 { |
| 549 buehlmann_backup_and_restore(false); | |
| 550 break; | |
| 551 } | |
| 552 buehlmann_backup_and_restore(false); | |
| 553 } | |
| 554 | |
|
291
24ff72e627f4
Deco Models: limit NDL to 240 minutes
Jan Mulder <jlmulder@xs4all.nl>
parents:
261
diff
changeset
|
555 if(ndl < (MAX_NDL * 60)) |
|
257
21387d7e786f
Buehlmann: factor out gNDL and gTTS
Jan Mulder <jlmulder@xs4all.nl>
parents:
256
diff
changeset
|
556 ndl -= 600; |
| 38 | 557 |
|
291
24ff72e627f4
Deco Models: limit NDL to 240 minutes
Jan Mulder <jlmulder@xs4all.nl>
parents:
261
diff
changeset
|
558 if(ndl > (MAX_NDL/2 * 60)) |
|
257
21387d7e786f
Buehlmann: factor out gNDL and gTTS
Jan Mulder <jlmulder@xs4all.nl>
parents:
256
diff
changeset
|
559 return ndl; |
| 38 | 560 |
| 561 // refine | |
| 562 memcpy(gTissue_nitrogen_bar, local_tissue_nitrogen_bar, (4*16)); | |
| 563 memcpy(gTissue_helium_bar, local_tissue_helium_bar, (4*16)); | |
| 564 | |
| 565 //One minutes step | |
|
256
d10f53e39374
Buehlmann: trivial performance improvement (NDL)
Jan Mulder <jlmulder@xs4all.nl>
parents:
255
diff
changeset
|
566 for(i = 0; i < 10; i++) |
| 38 | 567 { |
|
257
21387d7e786f
Buehlmann: factor out gNDL and gTTS
Jan Mulder <jlmulder@xs4all.nl>
parents:
256
diff
changeset
|
568 ndl += 60; |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
569 decom_tissues_exposure2(60, &pDiveSettings->decogaslist[gGas_id], gPressure,gTissue_nitrogen_bar,gTissue_helium_bar); |
|
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
570 decom_oxygen_calculate_cns_exposure(60,&pDiveSettings->decogaslist[gGas_id],gPressure,&gCNS); |
| 38 | 571 buehlmann_backup_and_restore(true); |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
572 if(dive1_check_deco(pDiveSettings)) |
| 38 | 573 break; |
| 574 buehlmann_backup_and_restore(false); | |
| 575 } | |
|
257
21387d7e786f
Buehlmann: factor out gNDL and gTTS
Jan Mulder <jlmulder@xs4all.nl>
parents:
256
diff
changeset
|
576 return ndl; |
| 38 | 577 } |
| 578 | |
| 579 | |
| 580 // =============================================================================== | |
| 581 // dive1_check_deco | |
| 582 /// @brief for NDL calculations | |
| 583 /// 160614 using ceilingOther and not ceiling | |
| 584 // =============================================================================== | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
585 static _Bool dive1_check_deco(SDiveSettings *pDiveSettings) |
| 38 | 586 { |
| 587 // gGF_value is set in call routine; | |
| 588 // internes Backup! | |
| 589 | |
| 590 // calc like in deco | |
| 591 float ceiling; | |
| 592 float ceilingOther; // new hw 160614 | |
| 593 | |
| 594 ceiling = tissue_tolerance(); | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
595 ambient_bar_to_deco_stop_depth_bar(pDiveSettings, ceiling); // this will set gStop.depth :-) (and gStop.id) |
| 38 | 596 |
| 597 // set the base for all upcoming parameters | |
| 598 ceilingOther = gStop.depth + gSurface_pressure_bar; | |
| 599 | |
| 600 // modify parameters if there is ascend or parameter fine adjustment | |
| 601 if(ceilingOther < (gPressure - PRESSURE_150_CM)) // more than 1.5 meter below ceiling | |
| 602 { | |
| 603 // ascend within 10 mtr to GF_low // speed 12 mtr/min -> 50 sec / 10 mtr; 15 sec / 3 mtr. | |
| 604 while(((gPressure - PRESSURE_TEN_METER ) > gSurface_pressure_bar) && (ceiling < (gPressure - PRESSURE_TEN_METER))) | |
| 605 { | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
606 ascend_with_all_gaschanges(pDiveSettings, PRESSURE_TEN_METER); |
| 38 | 607 ceiling = tissue_tolerance(); |
| 608 } | |
| 609 while(((gPressure - PRESSURE_THREE_METER )> gSurface_pressure_bar) && (ceiling < gPressure)) | |
| 610 { | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
611 ascend_with_all_gaschanges(pDiveSettings, PRESSURE_THREE_METER); |
| 38 | 612 ceiling = tissue_tolerance(); |
| 613 } | |
| 614 } | |
|
255
dcf7a3435fe1
Buehlmann: cleanup, factor out pBuDiveSettings
Jan Mulder <jlmulder@xs4all.nl>
parents:
254
diff
changeset
|
615 return ceiling > gSurface_pressure_bar; |
| 38 | 616 } |
| 617 | |
|
250
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
618 // compute ceiling recursively, with a resolution of 10cm. Notice |
|
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
619 // that the initial call shall guarantee that the found ceiling |
|
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
620 // is between low and high parameters. |
|
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
621 static float compute_ceiling(float low, float high) |
| 38 | 622 { |
|
250
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
623 if ((high - low) < 0.01) |
|
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
624 return low; |
|
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
625 else { |
|
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
626 float next_pressure_absolute = (low + high)/2; |
|
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
627 float test_result = buehlmann_tissue_test_tolerance(next_pressure_absolute); |
|
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
628 if (test_result < 0) |
|
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
629 return compute_ceiling(low, next_pressure_absolute); |
|
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
630 else |
|
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
631 return compute_ceiling(next_pressure_absolute, high); |
|
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
632 } |
|
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
633 } |
| 38 | 634 |
|
250
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
635 void buehlmann_ceiling_calculator(SLifeData *pLifeData, SDecoinfo *pDecoInfo) |
|
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
636 { |
|
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
637 float ceiling; |
|
224
ceecabfddb57
Bugfix, deco: fix 2 (small) problems with calculated ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
130
diff
changeset
|
638 |
|
261
cc2406b835ff
Bugfix: do not reset saturation on surfacing
Jan Mulder <jlmulder@xs4all.nl>
parents:
258
diff
changeset
|
639 memcpy(gTissue_nitrogen_bar, pLifeData->tissue_nitrogen_bar, (4*16)); |
|
cc2406b835ff
Bugfix: do not reset saturation on surfacing
Jan Mulder <jlmulder@xs4all.nl>
parents:
258
diff
changeset
|
640 memcpy(gTissue_helium_bar, pLifeData->tissue_helium_bar, (4*16)); |
|
cc2406b835ff
Bugfix: do not reset saturation on surfacing
Jan Mulder <jlmulder@xs4all.nl>
parents:
258
diff
changeset
|
641 |
|
250
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
642 // this is just performance optimizing. The code below runs just fine |
|
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
643 // without this. There is never a ceiling in NDL deco state |
|
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
644 if (!pDecoInfo->output_time_to_surface_seconds) { |
|
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
645 pDecoInfo->output_ceiling_meter = 0; |
|
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
646 return; |
| 38 | 647 } |
| 648 | |
|
250
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
649 ceiling = compute_ceiling(pLifeData->pressure_surface_bar, 1.0f + pLifeData->max_depth_meter/10.0f); |
|
822416168585
Buelmann: new implementation for ceiling
Jan Mulder <jlmulder@xs4all.nl>
parents:
247
diff
changeset
|
650 pDecoInfo->output_ceiling_meter = (ceiling - pLifeData->pressure_surface_bar) * 10.0f; |
| 38 | 651 } |
