调试计算通过,正确性需要验证

This commit is contained in:
廖德云 2025-07-06 22:29:58 +08:00
parent 562e7cd440
commit a58fb5c69a
38 changed files with 5053 additions and 5486 deletions

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -28,9 +28,9 @@ Project File Date: 07/06/2025
*** Using Compiler 'V5.06 update 7 (build 960)', folder: 'd:\Keil_v5\ARM\ARMCC\Bin' *** Using Compiler 'V5.06 update 7 (build 960)', folder: 'd:\Keil_v5\ARM\ARMCC\Bin'
Build target 'Fire_RT-Thread' Build target 'Fire_RT-Thread'
linking... linking...
Program Size: Code=17398 RO-data=1042 RW-data=164 ZI-data=5852 ..\..\Output\Fire_RT-Thread.axf: error: L6050U: The code size of this image (47388 bytes) exceeds the maximum allowed for this version of the linker.
FromELF: creating hex file... Finished: 0 information, 0 warning, 0 error and 1 fatal error messages.
"..\..\Output\Fire_RT-Thread.axf" - 0 Error(s), 0 Warning(s). "..\..\Output\Fire_RT-Thread.axf" - 1 Error(s), 0 Warning(s).
<h2>Software Packages used:</h2> <h2>Software Packages used:</h2>
@ -43,7 +43,8 @@ Package Vendor: Keil
d:\Keil_v5\Arm\Packs\Keil\STM32H7xx_DFP\2.6.0\Drivers\CMSIS\Device\ST\STM32H7xx\Include d:\Keil_v5\Arm\Packs\Keil\STM32H7xx_DFP\2.6.0\Drivers\CMSIS\Device\ST\STM32H7xx\Include
<h2>Collection of Component Files used:</h2> <h2>Collection of Component Files used:</h2>
Build Time Elapsed: 00:00:02 Target not created.
Build Time Elapsed: 00:00:04
</pre> </pre>
</body> </body>
</html> </html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -2608,7 +2608,7 @@ I (..\..\Libraries\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_uart.h)(0x6867D922)
I (..\..\Libraries\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_uart_ex.h)(0x6867D922) I (..\..\Libraries\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_uart_ex.h)(0x6867D922)
I (..\..\Libraries\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_usart.h)(0x6867D922) I (..\..\Libraries\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_usart.h)(0x6867D922)
I (..\..\Libraries\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_usart_ex.h)(0x6867D922) I (..\..\Libraries\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_usart_ex.h)(0x6867D922)
F (..\..\User\main.c)(0x6867D922)(--c99 -c --cpu Cortex-M7.fp.dp -D__EVAL -D__MICROLIB -g -O1 --apcs=interwork --split_sections -I ..\..\Libraries\CMSIS\Include -I ..\..\Libraries\CMSIS\Device\ST\STM32H7xx\Include -I ..\..\Libraries\STM32H7xx_HAL_Driver\Inc -I ..\..\rtthread\3.0.3\components\finsh -I ..\..\rtthread\3.0.3\include -I ..\..\rtthread\3.0.3\include\libc -I ..\..\User -I ..\..\User\bsp -I ..\..\User\NG -Id:\Keil_v5\Arm\Packs\Keil\STM32H7xx_DFP\2.6.0\Drivers\CMSIS\Device\ST\STM32H7xx\Include -D__UVISION_VERSION="536" -DSTM32H750xx -DUSE_HAL_DRIVER -DSTM32H743xx -o ..\..\output\main.o --depend ..\..\output\main.d) F (..\..\User\main.c)(0x686A873C)(--c99 -c --cpu Cortex-M7.fp.dp -D__EVAL -D__MICROLIB -g -O1 --apcs=interwork --split_sections -I ..\..\Libraries\CMSIS\Include -I ..\..\Libraries\CMSIS\Device\ST\STM32H7xx\Include -I ..\..\Libraries\STM32H7xx_HAL_Driver\Inc -I ..\..\rtthread\3.0.3\components\finsh -I ..\..\rtthread\3.0.3\include -I ..\..\rtthread\3.0.3\include\libc -I ..\..\User -I ..\..\User\bsp -I ..\..\User\NG -Id:\Keil_v5\Arm\Packs\Keil\STM32H7xx_DFP\2.6.0\Drivers\CMSIS\Device\ST\STM32H7xx\Include -D__UVISION_VERSION="536" -DSTM32H750xx -DUSE_HAL_DRIVER -DSTM32H743xx -o ..\..\output\main.o --depend ..\..\output\main.d)
I (..\..\User\board.h)(0x6867D922) I (..\..\User\board.h)(0x6867D922)
I (..\..\Libraries\CMSIS\Device\ST\STM32H7xx\Include\stm32h7xx.h)(0x6867D922) I (..\..\Libraries\CMSIS\Device\ST\STM32H7xx\Include\stm32h7xx.h)(0x6867D922)
I (..\..\Libraries\CMSIS\Device\ST\STM32H7xx\Include\stm32h743xx.h)(0x6867D922) I (..\..\Libraries\CMSIS\Device\ST\STM32H7xx\Include\stm32h743xx.h)(0x6867D922)
@ -2663,6 +2663,13 @@ I (d:\Keil_v5\ARM\ARMCC\include\signal.h)(0x60252376)
I (..\..\rtthread\3.0.3\include\libc/libc_fdset.h)(0x6867D922) I (..\..\rtthread\3.0.3\include\libc/libc_fdset.h)(0x6867D922)
I (..\..\rtthread\3.0.3\include\rtservice.h)(0x6867D922) I (..\..\rtthread\3.0.3\include\rtservice.h)(0x6867D922)
I (..\..\rtthread\3.0.3\include\rtm.h)(0x6867D922) I (..\..\rtthread\3.0.3\include\rtm.h)(0x6867D922)
I (..\..\User\NG\NGCal.h)(0x686A87C2)
I (d:\Keil_v5\ARM\ARMCC\include\stdlib.h)(0x60252374)
I (d:\Keil_v5\ARM\ARMCC\include\math.h)(0x60252378)
I (..\..\User\NG\Therm.h)(0x686A839A)
I (..\..\User\NG\Detail.h)(0x686A8399)
I (d:\Keil_v5\ARM\ARMCC\include\stdbool.h)(0x6025237C)
I (..\..\User\NG\FlowCal.h)(0x686A839A)
F (..\..\User\stm32h7xx_it.c)(0x6867D922)(--c99 -c --cpu Cortex-M7.fp.dp -D__EVAL -D__MICROLIB -g -O1 --apcs=interwork --split_sections -I ..\..\Libraries\CMSIS\Include -I ..\..\Libraries\CMSIS\Device\ST\STM32H7xx\Include -I ..\..\Libraries\STM32H7xx_HAL_Driver\Inc -I ..\..\rtthread\3.0.3\components\finsh -I ..\..\rtthread\3.0.3\include -I ..\..\rtthread\3.0.3\include\libc -I ..\..\User -I ..\..\User\bsp -I ..\..\User\NG -Id:\Keil_v5\Arm\Packs\Keil\STM32H7xx_DFP\2.6.0\Drivers\CMSIS\Device\ST\STM32H7xx\Include -D__UVISION_VERSION="536" -DSTM32H750xx -DUSE_HAL_DRIVER -DSTM32H743xx -o ..\..\output\stm32h7xx_it.o --depend ..\..\output\stm32h7xx_it.d) F (..\..\User\stm32h7xx_it.c)(0x6867D922)(--c99 -c --cpu Cortex-M7.fp.dp -D__EVAL -D__MICROLIB -g -O1 --apcs=interwork --split_sections -I ..\..\Libraries\CMSIS\Include -I ..\..\Libraries\CMSIS\Device\ST\STM32H7xx\Include -I ..\..\Libraries\STM32H7xx_HAL_Driver\Inc -I ..\..\rtthread\3.0.3\components\finsh -I ..\..\rtthread\3.0.3\include -I ..\..\rtthread\3.0.3\include\libc -I ..\..\User -I ..\..\User\bsp -I ..\..\User\NG -Id:\Keil_v5\Arm\Packs\Keil\STM32H7xx_DFP\2.6.0\Drivers\CMSIS\Device\ST\STM32H7xx\Include -D__UVISION_VERSION="536" -DSTM32H750xx -DUSE_HAL_DRIVER -DSTM32H743xx -o ..\..\output\stm32h7xx_it.o --depend ..\..\output\stm32h7xx_it.d)
I (..\..\Libraries\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal.h)(0x6867D922) I (..\..\Libraries\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal.h)(0x6867D922)
I (..\..\User\stm32h7xx_hal_conf.h)(0x6867D922) I (..\..\User\stm32h7xx_hal_conf.h)(0x6867D922)
@ -2891,43 +2898,44 @@ I (..\..\Libraries\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_uart.h)(0x6867D922)
I (..\..\Libraries\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_uart_ex.h)(0x6867D922) I (..\..\Libraries\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_uart_ex.h)(0x6867D922)
I (..\..\Libraries\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_usart.h)(0x6867D922) I (..\..\Libraries\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_usart.h)(0x6867D922)
I (..\..\Libraries\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_usart_ex.h)(0x6867D922) I (..\..\Libraries\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_usart_ex.h)(0x6867D922)
F (..\..\User\NG\Detail.c)(0x686A1243)(--c99 -c --cpu Cortex-M7.fp.dp -D__EVAL -D__MICROLIB -g -O1 --apcs=interwork --split_sections -I ..\..\Libraries\CMSIS\Include -I ..\..\Libraries\CMSIS\Device\ST\STM32H7xx\Include -I ..\..\Libraries\STM32H7xx_HAL_Driver\Inc -I ..\..\rtthread\3.0.3\components\finsh -I ..\..\rtthread\3.0.3\include -I ..\..\rtthread\3.0.3\include\libc -I ..\..\User -I ..\..\User\bsp -I ..\..\User\NG -Id:\Keil_v5\Arm\Packs\Keil\STM32H7xx_DFP\2.6.0\Drivers\CMSIS\Device\ST\STM32H7xx\Include -D__UVISION_VERSION="536" -DSTM32H750xx -DUSE_HAL_DRIVER -DSTM32H743xx -o ..\..\output\detail.o --depend ..\..\output\detail.d) F (..\..\User\NG\Detail.c)(0x686A839A)(--c99 -c --cpu Cortex-M7.fp.dp -D__EVAL -D__MICROLIB -g -O1 --apcs=interwork --split_sections -I ..\..\Libraries\CMSIS\Include -I ..\..\Libraries\CMSIS\Device\ST\STM32H7xx\Include -I ..\..\Libraries\STM32H7xx_HAL_Driver\Inc -I ..\..\rtthread\3.0.3\components\finsh -I ..\..\rtthread\3.0.3\include -I ..\..\rtthread\3.0.3\include\libc -I ..\..\User -I ..\..\User\bsp -I ..\..\User\NG -Id:\Keil_v5\Arm\Packs\Keil\STM32H7xx_DFP\2.6.0\Drivers\CMSIS\Device\ST\STM32H7xx\Include -D__UVISION_VERSION="536" -DSTM32H750xx -DUSE_HAL_DRIVER -DSTM32H743xx -o ..\..\output\detail.o --depend ..\..\output\detail.d)
I (..\..\User\NG\NGCal.h)(0x686A1BCB) I (..\..\User\NG\NGCal.h)(0x686A87C2)
I (d:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x60252374) I (d:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x60252374)
I (d:\Keil_v5\ARM\ARMCC\include\stdlib.h)(0x60252374) I (d:\Keil_v5\ARM\ARMCC\include\stdlib.h)(0x60252374)
I (d:\Keil_v5\ARM\ARMCC\include\math.h)(0x60252378) I (d:\Keil_v5\ARM\ARMCC\include\math.h)(0x60252378)
I (..\..\User\NG\Detail.h)(0x686A0183) I (..\..\User\NG\Detail.h)(0x686A8399)
I (d:\Keil_v5\ARM\ARMCC\include\stdbool.h)(0x6025237C) I (d:\Keil_v5\ARM\ARMCC\include\stdbool.h)(0x6025237C)
I (d:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E) I (d:\Keil_v5\ARM\ARMCC\include\string.h)(0x6025237E)
F (..\..\User\NG\Detail.h)(0x686A0183)() F (..\..\User\NG\Detail.h)(0x686A8399)()
F (..\..\User\NG\NGCal.c)(0x686A0183)(--c99 -c --cpu Cortex-M7.fp.dp -D__EVAL -D__MICROLIB -g -O1 --apcs=interwork --split_sections -I ..\..\Libraries\CMSIS\Include -I ..\..\Libraries\CMSIS\Device\ST\STM32H7xx\Include -I ..\..\Libraries\STM32H7xx_HAL_Driver\Inc -I ..\..\rtthread\3.0.3\components\finsh -I ..\..\rtthread\3.0.3\include -I ..\..\rtthread\3.0.3\include\libc -I ..\..\User -I ..\..\User\bsp -I ..\..\User\NG -Id:\Keil_v5\Arm\Packs\Keil\STM32H7xx_DFP\2.6.0\Drivers\CMSIS\Device\ST\STM32H7xx\Include -D__UVISION_VERSION="536" -DSTM32H750xx -DUSE_HAL_DRIVER -DSTM32H743xx -o ..\..\output\ngcal.o --depend ..\..\output\ngcal.d) F (..\..\User\NG\NGCal.c)(0x686A839A)(--c99 -c --cpu Cortex-M7.fp.dp -D__EVAL -D__MICROLIB -g -O1 --apcs=interwork --split_sections -I ..\..\Libraries\CMSIS\Include -I ..\..\Libraries\CMSIS\Device\ST\STM32H7xx\Include -I ..\..\Libraries\STM32H7xx_HAL_Driver\Inc -I ..\..\rtthread\3.0.3\components\finsh -I ..\..\rtthread\3.0.3\include -I ..\..\rtthread\3.0.3\include\libc -I ..\..\User -I ..\..\User\bsp -I ..\..\User\NG -Id:\Keil_v5\Arm\Packs\Keil\STM32H7xx_DFP\2.6.0\Drivers\CMSIS\Device\ST\STM32H7xx\Include -D__UVISION_VERSION="536" -DSTM32H750xx -DUSE_HAL_DRIVER -DSTM32H743xx -o ..\..\output\ngcal.o --depend ..\..\output\ngcal.d)
I (..\..\User\NG\NGCal.h)(0x686A1BCB) I (..\..\User\NG\NGCal.h)(0x686A87C2)
I (d:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x60252374) I (d:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x60252374)
I (d:\Keil_v5\ARM\ARMCC\include\stdlib.h)(0x60252374) I (d:\Keil_v5\ARM\ARMCC\include\stdlib.h)(0x60252374)
I (d:\Keil_v5\ARM\ARMCC\include\math.h)(0x60252378) I (d:\Keil_v5\ARM\ARMCC\include\math.h)(0x60252378)
I (..\..\User\NG\Therm.h)(0x686A0183) I (..\..\User\NG\Therm.h)(0x686A839A)
I (..\..\User\NG\Detail.h)(0x686A0183) I (..\..\User\NG\Detail.h)(0x686A8399)
I (d:\Keil_v5\ARM\ARMCC\include\stdbool.h)(0x6025237C) I (d:\Keil_v5\ARM\ARMCC\include\stdbool.h)(0x6025237C)
F (..\..\User\NG\NGCal.h)(0x686A1BCB)() I (d:\Keil_v5\ARM\ARMCC\include\String.h)(0x6025237E)
F (..\..\User\NG\Therm.c)(0x686A0183)(--c99 -c --cpu Cortex-M7.fp.dp -D__EVAL -D__MICROLIB -g -O1 --apcs=interwork --split_sections -I ..\..\Libraries\CMSIS\Include -I ..\..\Libraries\CMSIS\Device\ST\STM32H7xx\Include -I ..\..\Libraries\STM32H7xx_HAL_Driver\Inc -I ..\..\rtthread\3.0.3\components\finsh -I ..\..\rtthread\3.0.3\include -I ..\..\rtthread\3.0.3\include\libc -I ..\..\User -I ..\..\User\bsp -I ..\..\User\NG -Id:\Keil_v5\Arm\Packs\Keil\STM32H7xx_DFP\2.6.0\Drivers\CMSIS\Device\ST\STM32H7xx\Include -D__UVISION_VERSION="536" -DSTM32H750xx -DUSE_HAL_DRIVER -DSTM32H743xx -o ..\..\output\therm.o --depend ..\..\output\therm.d) F (..\..\User\NG\NGCal.h)(0x686A87C2)()
I (..\..\User\NG\NGCal.h)(0x686A1BCB) F (..\..\User\NG\Therm.c)(0x686A86C6)(--c99 -c --cpu Cortex-M7.fp.dp -D__EVAL -D__MICROLIB -g -O1 --apcs=interwork --split_sections -I ..\..\Libraries\CMSIS\Include -I ..\..\Libraries\CMSIS\Device\ST\STM32H7xx\Include -I ..\..\Libraries\STM32H7xx_HAL_Driver\Inc -I ..\..\rtthread\3.0.3\components\finsh -I ..\..\rtthread\3.0.3\include -I ..\..\rtthread\3.0.3\include\libc -I ..\..\User -I ..\..\User\bsp -I ..\..\User\NG -Id:\Keil_v5\Arm\Packs\Keil\STM32H7xx_DFP\2.6.0\Drivers\CMSIS\Device\ST\STM32H7xx\Include -D__UVISION_VERSION="536" -DSTM32H750xx -DUSE_HAL_DRIVER -DSTM32H743xx -o ..\..\output\therm.o --depend ..\..\output\therm.d)
I (..\..\User\NG\therm.h)(0x686A839A)
I (..\..\User\NG\NGCal.h)(0x686A87C2)
I (d:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x60252374) I (d:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x60252374)
I (d:\Keil_v5\ARM\ARMCC\include\stdlib.h)(0x60252374) I (d:\Keil_v5\ARM\ARMCC\include\stdlib.h)(0x60252374)
I (d:\Keil_v5\ARM\ARMCC\include\math.h)(0x60252378) I (d:\Keil_v5\ARM\ARMCC\include\math.h)(0x60252378)
I (..\..\User\NG\Detail.h)(0x686A0183) I (..\..\User\NG\Detail.h)(0x686A8399)
I (d:\Keil_v5\ARM\ARMCC\include\stdbool.h)(0x6025237C) I (d:\Keil_v5\ARM\ARMCC\include\stdbool.h)(0x6025237C)
I (..\..\User\NG\Therm.h)(0x686A0183) F (..\..\User\NG\Therm.h)(0x686A839A)()
F (..\..\User\NG\Therm.h)(0x686A0183)() F (..\..\User\NG\FlowCal.h)(0x686A839A)()
F (..\..\User\NG\FlowCal.h)(0x686A19F6)() F (..\..\User\NG\OFlowCal.c)(0x686A86FC)(--c99 -c --cpu Cortex-M7.fp.dp -D__EVAL -D__MICROLIB -g -O1 --apcs=interwork --split_sections -I ..\..\Libraries\CMSIS\Include -I ..\..\Libraries\CMSIS\Device\ST\STM32H7xx\Include -I ..\..\Libraries\STM32H7xx_HAL_Driver\Inc -I ..\..\rtthread\3.0.3\components\finsh -I ..\..\rtthread\3.0.3\include -I ..\..\rtthread\3.0.3\include\libc -I ..\..\User -I ..\..\User\bsp -I ..\..\User\NG -Id:\Keil_v5\Arm\Packs\Keil\STM32H7xx_DFP\2.6.0\Drivers\CMSIS\Device\ST\STM32H7xx\Include -D__UVISION_VERSION="536" -DSTM32H750xx -DUSE_HAL_DRIVER -DSTM32H743xx -o ..\..\output\oflowcal.o --depend ..\..\output\oflowcal.d)
F (..\..\User\NG\OFlowCal.c)(0x686A1C3D)(--c99 -c --cpu Cortex-M7.fp.dp -D__EVAL -D__MICROLIB -g -O1 --apcs=interwork --split_sections -I ..\..\Libraries\CMSIS\Include -I ..\..\Libraries\CMSIS\Device\ST\STM32H7xx\Include -I ..\..\Libraries\STM32H7xx_HAL_Driver\Inc -I ..\..\rtthread\3.0.3\components\finsh -I ..\..\rtthread\3.0.3\include -I ..\..\rtthread\3.0.3\include\libc -I ..\..\User -I ..\..\User\bsp -I ..\..\User\NG -Id:\Keil_v5\Arm\Packs\Keil\STM32H7xx_DFP\2.6.0\Drivers\CMSIS\Device\ST\STM32H7xx\Include -D__UVISION_VERSION="536" -DSTM32H750xx -DUSE_HAL_DRIVER -DSTM32H743xx -o ..\..\output\oflowcal.o --depend ..\..\output\oflowcal.d) I (..\..\User\NG\NGCal.h)(0x686A87C2)
I (..\..\User\NG\NGCal.h)(0x686A1BCB)
I (d:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x60252374) I (d:\Keil_v5\ARM\ARMCC\include\stdio.h)(0x60252374)
I (d:\Keil_v5\ARM\ARMCC\include\stdlib.h)(0x60252374) I (d:\Keil_v5\ARM\ARMCC\include\stdlib.h)(0x60252374)
I (d:\Keil_v5\ARM\ARMCC\include\math.h)(0x60252378) I (d:\Keil_v5\ARM\ARMCC\include\math.h)(0x60252378)
I (..\..\User\NG\Therm.h)(0x686A0183) I (..\..\User\NG\Therm.h)(0x686A839A)
I (..\..\User\NG\Detail.h)(0x686A0183) I (..\..\User\NG\Detail.h)(0x686A8399)
I (d:\Keil_v5\ARM\ARMCC\include\stdbool.h)(0x6025237C) I (d:\Keil_v5\ARM\ARMCC\include\stdbool.h)(0x6025237C)
I (..\..\User\NG\FlowCal.h)(0x686A19F6) I (..\..\User\NG\FlowCal.h)(0x686A839A)
F (..\..\±Ø¶Á˵Ã÷.txt)(0x6867D922)() F (..\..\±Ø¶Á˵Ã÷.txt)(0x6867D922)()
F (..\..\rtthread\3.0.3\src\clock.c)(0x6867D922)(--c99 -c --cpu Cortex-M7.fp.dp -D__EVAL -D__MICROLIB -g -O1 --apcs=interwork --split_sections -I ..\..\Libraries\CMSIS\Include -I ..\..\Libraries\CMSIS\Device\ST\STM32H7xx\Include -I ..\..\Libraries\STM32H7xx_HAL_Driver\Inc -I ..\..\rtthread\3.0.3\components\finsh -I ..\..\rtthread\3.0.3\include -I ..\..\rtthread\3.0.3\include\libc -I ..\..\User -I ..\..\User\bsp -I ..\..\User\NG -Id:\Keil_v5\Arm\Packs\Keil\STM32H7xx_DFP\2.6.0\Drivers\CMSIS\Device\ST\STM32H7xx\Include -D__UVISION_VERSION="536" -DSTM32H750xx -DUSE_HAL_DRIVER -DSTM32H743xx -o ..\..\output\clock.o --depend ..\..\output\clock.d) F (..\..\rtthread\3.0.3\src\clock.c)(0x6867D922)(--c99 -c --cpu Cortex-M7.fp.dp -D__EVAL -D__MICROLIB -g -O1 --apcs=interwork --split_sections -I ..\..\Libraries\CMSIS\Include -I ..\..\Libraries\CMSIS\Device\ST\STM32H7xx\Include -I ..\..\Libraries\STM32H7xx_HAL_Driver\Inc -I ..\..\rtthread\3.0.3\components\finsh -I ..\..\rtthread\3.0.3\include -I ..\..\rtthread\3.0.3\include\libc -I ..\..\User -I ..\..\User\bsp -I ..\..\User\NG -Id:\Keil_v5\Arm\Packs\Keil\STM32H7xx_DFP\2.6.0\Drivers\CMSIS\Device\ST\STM32H7xx\Include -D__UVISION_VERSION="536" -DSTM32H750xx -DUSE_HAL_DRIVER -DSTM32H743xx -o ..\..\output\clock.o --depend ..\..\output\clock.d)
I (..\..\rtthread\3.0.3\include\rthw.h)(0x6867D922) I (..\..\rtthread\3.0.3\include\rthw.h)(0x6867D922)

Binary file not shown.

View File

@ -56,3 +56,10 @@
..\..\output\main.o: ..\..\rtthread\3.0.3\include\rtservice.h ..\..\output\main.o: ..\..\rtthread\3.0.3\include\rtservice.h
..\..\output\main.o: ..\..\rtthread\3.0.3\include\rtm.h ..\..\output\main.o: ..\..\rtthread\3.0.3\include\rtm.h
..\..\output\main.o: ..\..\rtthread\3.0.3\include\rtthread.h ..\..\output\main.o: ..\..\rtthread\3.0.3\include\rtthread.h
..\..\output\main.o: ..\..\User\NG\NGCal.h
..\..\output\main.o: d:\Keil_v5\ARM\ARMCC\Bin\..\include\stdlib.h
..\..\output\main.o: d:\Keil_v5\ARM\ARMCC\Bin\..\include\math.h
..\..\output\main.o: ..\..\User\NG\Therm.h
..\..\output\main.o: ..\..\User\NG\Detail.h
..\..\output\main.o: d:\Keil_v5\ARM\ARMCC\Bin\..\include\stdbool.h
..\..\output\main.o: ..\..\User\NG\FlowCal.h

Binary file not shown.

View File

@ -6,3 +6,4 @@
..\..\output\ngcal.o: ..\..\User\NG\Therm.h ..\..\output\ngcal.o: ..\..\User\NG\Therm.h
..\..\output\ngcal.o: ..\..\User\NG\Detail.h ..\..\output\ngcal.o: ..\..\User\NG\Detail.h
..\..\output\ngcal.o: d:\Keil_v5\ARM\ARMCC\Bin\..\include\stdbool.h ..\..\output\ngcal.o: d:\Keil_v5\ARM\ARMCC\Bin\..\include\stdbool.h
..\..\output\ngcal.o: d:\Keil_v5\ARM\ARMCC\Bin\..\include\String.h

Binary file not shown.

Binary file not shown.

View File

@ -1,8 +1,8 @@
..\..\output\therm.o: ..\..\User\NG\Therm.c ..\..\output\therm.o: ..\..\User\NG\Therm.c
..\..\output\therm.o: ..\..\User\NG\therm.h
..\..\output\therm.o: ..\..\User\NG\NGCal.h ..\..\output\therm.o: ..\..\User\NG\NGCal.h
..\..\output\therm.o: d:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h ..\..\output\therm.o: d:\Keil_v5\ARM\ARMCC\Bin\..\include\stdio.h
..\..\output\therm.o: d:\Keil_v5\ARM\ARMCC\Bin\..\include\stdlib.h ..\..\output\therm.o: d:\Keil_v5\ARM\ARMCC\Bin\..\include\stdlib.h
..\..\output\therm.o: d:\Keil_v5\ARM\ARMCC\Bin\..\include\math.h ..\..\output\therm.o: d:\Keil_v5\ARM\ARMCC\Bin\..\include\math.h
..\..\output\therm.o: ..\..\User\NG\Detail.h ..\..\output\therm.o: ..\..\User\NG\Detail.h
..\..\output\therm.o: d:\Keil_v5\ARM\ARMCC\Bin\..\include\stdbool.h ..\..\output\therm.o: d:\Keil_v5\ARM\ARMCC\Bin\..\include\stdbool.h
..\..\output\therm.o: ..\..\User\NG\Therm.h

Binary file not shown.

File diff suppressed because one or more lines are too long

8
User/NG/.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

2
User/NG/.idea/NG.iml Normal file
View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<module classpath="CMake" type="CPP_MODULE" version="4" />

102
User/NG/.idea/editor.xml Normal file
View File

@ -0,0 +1,102 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="BackendCodeEditorSettings">
<option name="/Default/CodeStyle/CodeFormatting/CppClangFormat/EnableClangFormatSupport/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_ARGUMENT/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_BINARY_EXPRESSIONS_CHAIN/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_CALLS_CHAIN/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_EXPRESSION/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_EXTENDS_LIST/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_FOR_STMT/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_PARAMETER/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_TYPE_ARGUMENT/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_TYPE_PARAMETER/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTIPLE_DECLARATION/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_TERNARY/@EntryValue" value="ALIGN_ALL" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ANONYMOUS_METHOD_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_CLASS_DEFINITION/@EntryValue" value="1" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_DECLARATIONS/@EntryValue" value="0" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_FUNCTION_DECLARATION/@EntryValue" value="1" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_FUNCTION_DEFINITION/@EntryValue" value="1" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BREAK_TEMPLATE_DECLARATION/@EntryValue" value="LINE_BREAK" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CASE_BLOCK_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CONTINUOUS_LINE_INDENT/@EntryValue" value="Double" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/FREE_BLOCK_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_ACCESS_SPECIFIERS_FROM_CLASS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_CASE_FROM_SWITCH/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_CLASS_MEMBERS_FROM_ACCESS_SPECIFIERS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_COMMENT/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_SIZE/@EntryValue" value="4" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_STYLE/@EntryValue" value="Space" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INITIALIZER_BRACES/@EntryValue" value="END_OF_LINE_NO_SPACE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INT_ALIGN_EQ/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INVOCABLE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_BLANK_LINES_IN_CODE/@EntryValue" value="2" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_BLANK_LINES_IN_DECLARATIONS/@EntryValue" value="2" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_USER_LINEBREAKS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/LINE_BREAK_AFTER_COLON_IN_MEMBER_INITIALIZER_LISTS/@EntryValue" value="ON_SINGLE_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/MEMBER_INITIALIZER_LIST_STYLE/@EntryValue" value="DO_NOT_CHANGE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_INDENTATION/@EntryValue" value="All" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/OTHER_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_CATCH_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_ELSE_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_NAMESPACE_DEFINITIONS_ON_SAME_LINE/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_WHILE_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SIMPLE_BLOCK_STYLE/@EntryValue" value="DO_NOT_CHANGE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_CAST_EXPRESSION_PARENTHESES/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COLON_IN_BITFIELD_DECLARATOR/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COMMA_IN_TEMPLATE_ARGS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COMMA_IN_TEMPLATE_PARAMS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_EXTENDS_COLON/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_FOR_COLON/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_FOR_SEMICOLON/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_DATA_MEMBER/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_DATA_MEMBERS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_METHOD/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_NESTED_DECLARATOR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_DATA_MEMBER/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_DATA_MEMBERS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_METHOD/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_UNARY_OPERATOR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_COLON_IN_BITFIELD_DECLARATOR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_EXTENDS_COLON/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_FOR_COLON/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_FOR_SEMICOLON/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_ABSTRACT_DECL/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_DATA_MEMBER/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_DATA_MEMBERS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_METHOD/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_ABSTRACT_DECL/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_DATA_MEMBER/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_DATA_MEMBERS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_METHOD/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_TEMPLATE_ARGS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BETWEEN_CLOSING_ANGLE_BRACKETS_IN_TEMPLATE_ARGS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_ARRAY_ACCESS_BRACKETS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_CAST_EXPRESSION_PARENTHESES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_DECLARATION_PARENTHESES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_BLOCKS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_INITIALIZER_BRACES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_METHOD_PARENTHESES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_INITIALIZER_BRACES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_TEMPLATE_ARGS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPECIAL_ELSE_IF_TREATMENT/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/TAB_WIDTH/@EntryValue" value="4" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/TYPE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_BINARY_OPSIGN/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_DECLARATION_LPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_INVOCATION_LPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_ARGUMENTS_STYLE/@EntryValue" value="WRAP_IF_LONG" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_DECLARATION_LPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_DECLARATION_RPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_INVOCATION_LPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_INVOCATION_RPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_TERNARY_OPSIGNS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_PARAMETERS_STYLE/@EntryValue" value="WRAP_IF_LONG" type="string" />
<option name="/Default/CodeStyle/EditorConfig/EnableClangFormatSupport/@EntryValue" value="false" type="bool" />
</component>
</project>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/OFlowCal.c" charset="UTF-8" />
</component>
</project>

7
User/NG/.idea/misc.xml Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CMakePythonSetting">
<option name="pythonIntegrationState" value="YES" />
</component>
<component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
</project>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/NG.iml" filepath="$PROJECT_DIR$/.idea/NG.iml" />
</modules>
</component>
</project>

6
User/NG/.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
</component>
</project>

File diff suppressed because it is too large Load Diff

View File

14
User/NG/CMakeLists.txt Normal file
View File

@ -0,0 +1,14 @@
cmake_minimum_required(VERSION 3.31)
project(NG C)
set(CMAKE_C_STANDARD 99)
add_executable(NG
main.c
Detail.c
FlowCal.h #
main.c
NGCal.c
NGCal.h
FlowCal.c #
Therm.c)

View File

@ -3,49 +3,72 @@
#include <math.h> #include <math.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
Detail* Detail_Construct(void) #define NUMBEROFCOMPONENTS 21
{
Detail *Detail_Construct(void) {
Detail *pDetail = (Detail *) malloc(sizeof(Detail)); Detail *pDetail = (Detail *) malloc(sizeof(Detail));
if (!pDetail) return NULL; if (!pDetail) {
return NULL; // 内存分配失败返回NULL
}
// 首先使用memset进行基础初始化
memset(pDetail, 0, sizeof(Detail)); memset(pDetail, 0, sizeof(Detail));
// 显式初始化关键成员
pDetail->iNCC = 0; // 组件数量初始化为0
// 显式初始化aiCID数组使用-1表示未初始化
for (int i = 0; i < NUMBEROFCOMPONENTS; i++) {
pDetail->aiCID[i] = -1;
}
// 初始化其他成员
pDetail->dOldMixID = 0.0; pDetail->dOldMixID = 0.0;
pDetail->dOldPb = 0.0; pDetail->dOldPb = 0.0;
pDetail->dOldTb = 0.0; pDetail->dOldTb = 0.0;
pDetail->dOldPf = 0.0; pDetail->dOldPf = 0.0;
pDetail->dOldTf = 0.0; pDetail->dOldTf = 0.0;
for (int i = 0; i < NUMBEROFCOMPONENTS; i++)
pDetail->dXi[i] = 0; // 初始化dXi数组
Detail_table(pDetail); for (int i = 0; i < NUMBEROFCOMPONENTS; i++) {
pDetail->dXi[i] = 0.0;
}
// 调用表格初始化函数
if (Detail_table(pDetail) != 0) {
free(pDetail);
return NULL; // 表格初始化失败释放内存并返回NULL
}
return pDetail; return pDetail;
} }
int Detail_compositionchange(Detail* pDetail, NGParSTRUCT *ptNGPar)
{ void Detail_Destroy(Detail *pDetail) {
if (pDetail) {
free(pDetail);
}
}
int Detail_compositionchange(Detail *pDetail, NGParSTRUCT *ptNGPar) {
double dMixID = 0.0; double dMixID = 0.0;
int i; int i;
for (i = 0; i < NUMBEROFCOMPONENTS; i++) for (i = 0; i < NUMBEROFCOMPONENTS; i++)
dMixID += ((i + 2) * ptNGPar->adMixture[i]); dMixID += ((i + 2) * ptNGPar->adMixture[i]);
if (dMixID != pDetail->dOldMixID) if (dMixID != pDetail->dOldMixID) {
{
pDetail->dOldMixID = dMixID; pDetail->dOldMixID = dMixID;
return true; return true;
} } else {
else
{
return false; return false;
} }
} }
void Detail_Run(Detail* pDetail, NGParSTRUCT *ptNGPar)
{ void Detail_Run(Detail *pDetail, NGParSTRUCT *ptNGPar) {
int i; int i;
bool bCompChange = Detail_compositionchange(pDetail, ptNGPar); bool bCompChange = Detail_compositionchange(pDetail, ptNGPar);
ptNGPar->bForceUpdate = ptNGPar->bForceUpdate || bCompChange; ptNGPar->bForceUpdate = ptNGPar->bForceUpdate || bCompChange;
if (ptNGPar->bForceUpdate) if (ptNGPar->bForceUpdate) {
{
pDetail->iNCC = 0; pDetail->iNCC = 0;
for (i = 0; i < NUMBEROFCOMPONENTS; i++) for (i = 0; i < NUMBEROFCOMPONENTS; i++) {
{ if (ptNGPar->adMixture[i] > 0.0) {
if (ptNGPar->adMixture[i] > 0.0)
{
pDetail->aiCID[pDetail->iNCC] = i; pDetail->aiCID[pDetail->iNCC] = i;
pDetail->dXi[pDetail->iNCC] = ptNGPar->adMixture[i]; pDetail->dXi[pDetail->iNCC] = ptNGPar->adMixture[i];
pDetail->iNCC++; pDetail->iNCC++;
@ -56,9 +79,9 @@ void Detail_Run(Detail* pDetail, NGParSTRUCT *ptNGPar)
} }
if ((fabs(ptNGPar->dPb - pDetail->dOldPb) > P_CHG_TOL) || if ((fabs(ptNGPar->dPb - pDetail->dOldPb) > P_CHG_TOL) ||
(fabs(ptNGPar->dTb - pDetail->dOldTb) > T_CHG_TOL) || (fabs(ptNGPar->dTb - pDetail->dOldTb) > T_CHG_TOL) ||
(ptNGPar->bForceUpdate)) (ptNGPar->bForceUpdate)) {
{ pDetail->dP = ptNGPar->dPb * 1.0e-6;
pDetail->dP = ptNGPar->dPb * 1.0e-6; pDetail->dT = ptNGPar->dTb; pDetail->dT = ptNGPar->dTb;
Detail_temp(pDetail); Detail_temp(pDetail);
Detail_ddetail(pDetail, ptNGPar); Detail_ddetail(pDetail, ptNGPar);
ptNGPar->dDb = pDetail->dRho; ptNGPar->dDb = pDetail->dRho;
@ -72,13 +95,11 @@ void Detail_Run(Detail* pDetail, NGParSTRUCT *ptNGPar)
} }
pDetail->dP = ptNGPar->dPf * 1.0e-6; pDetail->dP = ptNGPar->dPf * 1.0e-6;
pDetail->dT = ptNGPar->dTf; pDetail->dT = ptNGPar->dTf;
if ((fabs(ptNGPar->dTf - pDetail->dOldTf) > T_CHG_TOL) || (ptNGPar->bForceUpdate)) if ((fabs(ptNGPar->dTf - pDetail->dOldTf) > T_CHG_TOL) || (ptNGPar->bForceUpdate)) {
{
Detail_temp(pDetail); Detail_temp(pDetail);
ptNGPar->bForceUpdate = true; ptNGPar->bForceUpdate = true;
} }
if ((fabs(ptNGPar->dPf - pDetail->dOldPf) > P_CHG_TOL) || (ptNGPar->bForceUpdate)) if ((fabs(ptNGPar->dPf - pDetail->dOldPf) > P_CHG_TOL) || (ptNGPar->bForceUpdate)) {
{
Detail_ddetail(pDetail, ptNGPar); Detail_ddetail(pDetail, ptNGPar);
ptNGPar->dDf = pDetail->dRho; ptNGPar->dDf = pDetail->dRho;
ptNGPar->dZf = Detail_zdetail(pDetail, pDetail->dRho); ptNGPar->dZf = Detail_zdetail(pDetail, pDetail->dRho);
@ -87,18 +108,142 @@ void Detail_Run(Detail* pDetail, NGParSTRUCT *ptNGPar)
pDetail->dOldTf = ptNGPar->dTf; pDetail->dOldTf = ptNGPar->dTf;
pDetail->dOldPf = ptNGPar->dPf; pDetail->dOldPf = ptNGPar->dPf;
} }
if ((ptNGPar->dZb > 0.0) && (ptNGPar->dZf > 0.0)) if ((ptNGPar->dZb > 0.0) && (ptNGPar->dZf > 0.0)) {
ptNGPar->dFpv = sqrt(ptNGPar->dZb / ptNGPar->dZf); ptNGPar->dFpv = sqrt(ptNGPar->dZb / ptNGPar->dZf);
else } else {
ptNGPar->lStatus = GENERAL_CALCULATION_FAILURE; ptNGPar->lStatus = GENERAL_CALCULATION_FAILURE;
ptNGPar->bForceUpdate = false; ptNGPar->bForceUpdate = false;
} }
void Detail_table(Detail* pDetail) }
{
const double adAn[58] = { 0.153832600,1.341953000,-2.998583000,-0.048312280,0.375796500,-1.589575000,-0.053588470,0.886594630,-0.710237040,-1.471722000, 1.321850350, -0.786659250, 2.29129E-09, 0.157672400, -0.436386400, -0.044081590, -0.003433888, 0.032059050, 0.024873550, 0.073322790, -0.001600573, 0.642470600, -0.416260100, -0.066899570, 0.279179500, -0.696605100, -0.002860589, -0.008098836, 3.150547000, 0.007224479, -0.705752900, 0.534979200, -0.079314910, -1.418465000, -5.99905E-17, 0.105840200, 0.034317290, -0.007022847, 0.024955870, 0.042968180, 0.746545300, -0.291961300, 7.294616000, -9.936757000, -0.005399808, -0.243256700, 0.049870160, 0.003733797, 1.874951000, 0.002168144, -0.658716400, 0.000205518, 0.009776195, -0.020487080, 0.015573220, 0.006862415, -0.001226752, 0.002850908 }; int Detail_table(Detail *pDetail) {
const double adUn[58] = {0.0,0.5,1.0,3.5,-0.5,4.5,0.5,7.5,9.5,6.0,12.0,12.5,-6.0,2.0,3.0,2.0,2.0,11.0,-0.5,0.5,0.0,4.0,6.0,21.0,23.0,22.0,-1.0,-0.5,7.0,-1.0,6.0,4.0,1.0,9.0,-13.0,21.0,8.0,-0.5,0.0,2.0,7.0,9.0,22.0,23.0,1.0,9.0,3.0,8.0,23.0,1.5,5.0,-0.5,4.0,7.0,3.0,0.0,1.0,0.0}; if (!pDetail) {
return -1; // 空指针错误
}
double adAn[58];
double adUn[58];
adAn[0] = 0.153832600;
adAn[1] = 1.341953000;
adAn[2] = -2.998583000;
adAn[3] = -0.048312280;
adAn[4] = 0.375796500;
adAn[5] = -1.589575000;
adAn[6] = -0.053588470;
adAn[7] = 0.886594630;
adAn[8] = -0.710237040;
adAn[9] = -1.471722000;
adAn[10] = 1.321850350;
adAn[11] = -0.786659250;
adAn[12] = 2.29129E-09;
adAn[13] = 0.157672400;
adAn[14] = -0.436386400;
adAn[15] = -0.044081590;
adAn[16] = -0.003433888;
adAn[17] = 0.032059050;
adAn[18] = 0.024873550;
adAn[19] = 0.073322790;
adAn[20] = -0.001600573;
adAn[21] = 0.642470600;
adAn[22] = -0.416260100;
adAn[23] = -0.066899570;
adAn[24] = 0.279179500;
adAn[25] = -0.696605100;
adAn[26] = -0.002860589;
adAn[27] = -0.008098836;
adAn[28] = 3.150547000;
adAn[29] = 0.007224479;
adAn[30] = -0.705752900;
adAn[31] = 0.534979200;
adAn[32] = -0.079314910;
adAn[33] = -1.418465000;
adAn[34] = -5.99905E-17;
adAn[35] = 0.105840200;
adAn[36] = 0.034317290;
adAn[37] = -0.007022847;
adAn[38] = 0.024955870;
adAn[39] = 0.042968180;
adAn[40] = 0.746545300;
adAn[41] = -0.291961300;
adAn[42] = 7.294616000;
adAn[43] = -9.936757000;
adAn[44] = -0.005399808;
adAn[45] = -0.243256700;
adAn[46] = 0.049870160;
adAn[47] = 0.003733797;
adAn[48] = 1.874951000;
adAn[49] = 0.002168144;
adAn[50] = -0.658716400;
adAn[51] = 0.000205518;
adAn[52] = 0.009776195;
adAn[53] = -0.020487080;
adAn[54] = 0.015573220;
adAn[55] = 0.006862415;
adAn[56] = -0.001226752;
adAn[57] = 0.002850908;
// 58 constants from table 4 - column Un
adUn[0] = 0.0;
adUn[1] = 0.5;
adUn[2] = 1.0;
adUn[3] = 3.5;
adUn[4] = -0.5;
adUn[5] = 4.5;
adUn[6] = 0.5;
adUn[7] = 7.5;
adUn[8] = 9.5;
adUn[9] = 6.0;
adUn[10] = 12.0;
adUn[11] = 12.5;
adUn[12] = -6.0;
adUn[13] = 2.0;
adUn[14] = 3.0;
adUn[15] = 2.0;
adUn[16] = 2.0;
adUn[17] = 11.0;
adUn[18] = -0.5;
adUn[19] = 0.5;
adUn[20] = 0.0;
adUn[21] = 4.0;
adUn[22] = 6.0;
adUn[23] = 21.0;
adUn[24] = 23.0;
adUn[25] = 22.0;
adUn[26] = -1.0;
adUn[27] = -0.5;
adUn[28] = 7.0;
adUn[29] = -1.0;
adUn[30] = 6.0;
adUn[31] = 4.0;
adUn[32] = 1.0;
adUn[33] = 9.0;
adUn[34] = -13.0;
adUn[35] = 21.0;
adUn[36] = 8.0;
adUn[37] = -0.5;
adUn[38] = 0.0;
adUn[39] = 2.0;
adUn[40] = 7.0;
adUn[41] = 9.0;
adUn[42] = 22.0;
adUn[43] = 23.0;
adUn[44] = 1.0;
adUn[45] = 9.0;
adUn[46] = 3.0;
adUn[47] = 8.0;
adUn[48] = 23.0;
adUn[49] = 1.5;
adUn[50] = 5.0;
adUn[51] = -0.5;
adUn[52] = 4.0;
adUn[53] = 7.0;
adUn[54] = 3.0;
adUn[55] = 0.0;
adUn[56] = 1.0;
adUn[57] = 0.0;
memcpy(pDetail->adAn, adAn, sizeof(adAn)); memcpy(pDetail->adAn, adAn, sizeof(adAn));
memcpy(pDetail->adUn, adUn, sizeof(adUn)); memcpy(pDetail->adUn, adUn, sizeof(adUn));
for (int j = 0; j < NUMBEROFCOMPONENTS; j++) { for (int j = 0; j < NUMBEROFCOMPONENTS; j++) {
for (int k = j; k < NUMBEROFCOMPONENTS; k++) { for (int k = j; k < NUMBEROFCOMPONENTS; k++) {
pDetail->adTable6Eij[j][k] = 1.0; pDetail->adTable6Eij[j][k] = 1.0;
@ -242,30 +387,64 @@ void Detail_table(Detail* pDetail)
pDetail->adTable6Gij[2][5] = 1.673090; pDetail->adTable6Gij[2][5] = 1.673090;
double adTableHhvMol[4][NUMBEROFCOMPONENTS] = { double adTableHhvMol[4][NUMBEROFCOMPONENTS] = {
{892.97,0,0,1564.34,2224.01,45.074,562.94,286.63,282.8,0,2874.2,2883.82,3535.98,3542.89,4203.23,4862.87,5522.4,6182.91,6842.69,0,0}, {
{891.56,0,0,1562.14,2221.1,44.433,562.38,286.15,282.91,0,2870.58,2879.76,3531.68,3538.6,4198.24,4857.18,5516.01,6175.82,6834.9,0,0}, 892.97, 0, 0, 1564.34, 2224.01, 45.074, 562.94, 286.63, 282.8, 0, 2874.2, 2883.82, 3535.98, 3542.89,
{891.09,0,0,1561.41,2220.13,44.224,562.19,285.99,282.95,0,2869.38,2878.57,3530.24,3537.17,4196.58,4855.29,5513.88,6173.46,6832.31,0,0}, 4203.23, 4862.87, 5522.4, 6182.91, 6842.69, 0, 0
{890.63,0,0,1560.69,2219.17,44.016,562.01,285.83,282.98,0,2868.2,2877.4,3528.83,3535.77,4194.95,4853.43,5511.8,6171.15,6829.77,0,0} },
{
891.56, 0, 0, 1562.14, 2221.1, 44.433, 562.38, 286.15, 282.91, 0, 2870.58, 2879.76, 3531.68, 3538.6,
4198.24, 4857.18, 5516.01, 6175.82, 6834.9, 0, 0
},
{
891.09, 0, 0, 1561.41, 2220.13, 44.224, 562.19, 285.99, 282.95, 0, 2869.38, 2878.57, 3530.24, 3537.17,
4196.58, 4855.29, 5513.88, 6173.46, 6832.31, 0, 0
},
{
890.63, 0, 0, 1560.69, 2219.17, 44.016, 562.01, 285.83, 282.98, 0, 2868.2, 2877.4, 3528.83, 3535.77,
4194.95, 4853.43, 5511.8, 6171.15, 6829.77, 0, 0
}
}; };
memcpy(pDetail->adTableHhvMol, adTableHhvMol, sizeof(adTableHhvMol)); memcpy(pDetail->adTableHhvMol, adTableHhvMol, sizeof(adTableHhvMol));
double adTableLhvMol[4][NUMBEROFCOMPONENTS] = { double adTableLhvMol[4][NUMBEROFCOMPONENTS] = {
{802.82,0,0,1429.12,2043.71,0,517.87,241.56,282.8,0,2648.83,2658.45,3265.54,3272.45,3887.71,4502.28,5116.73,5732.17,6346.88,0,0}, {
{802.69,0,0,1428.84,2043.37,0,517.95,241.72,282.91,0,2648.42,2657.6,3265.08,3272,3887.21,4501.72,5116.11,5731.49,6346.14,0,0}, 802.82, 0, 0, 1429.12, 2043.71, 0, 517.87, 241.56, 282.8, 0, 2648.83, 2658.45, 3265.54, 3272.45, 3887.71,
{802.65,0,0,1428.74,2043.23,0,517.97,241.76,282.95,0,2648.26,2657.45,3264.89,3271.83,3887.01,4501.49,5115.87,5731.22,6345.85,0,0}, 4502.28, 5116.73, 5732.17, 6346.88, 0, 0
{802.6,0,0,1428.64,2043.11,0,517.99,241.81,282.98,0,2648.12,2657.32,3264.73,3271.67,3886.84,4501.3,5115.66,5730.99,6345.59,0,0} },
{
802.69, 0, 0, 1428.84, 2043.37, 0, 517.95, 241.72, 282.91, 0, 2648.42, 2657.6, 3265.08, 3272, 3887.21,
4501.72, 5116.11, 5731.49, 6346.14, 0, 0
},
{
802.65, 0, 0, 1428.74, 2043.23, 0, 517.97, 241.76, 282.95, 0, 2648.26, 2657.45, 3264.89, 3271.83, 3887.01,
4501.49, 5115.87, 5731.22, 6345.85, 0, 0
},
{
802.6, 0, 0, 1428.64, 2043.11, 0, 517.99, 241.81, 282.98, 0, 2648.12, 2657.32, 3264.73, 3271.67, 3886.84,
4501.3, 5115.66, 5730.99, 6345.59, 0, 0
}
}; };
memcpy(pDetail->adTableLhvMol, adTableLhvMol, sizeof(adTableLhvMol)); memcpy(pDetail->adTableLhvMol, adTableLhvMol, sizeof(adTableLhvMol));
return 0; // 初始化成功
} }
void Detail_paramdl(Detail* pDetail)
{ void Detail_paramdl(Detail *pDetail) {
const double adTable5Mri[21] = { const double adTable5Mri[21] = {
16.0430, 28.0135, 44.0100, 30.0700, 44.0970, 18.0153, 34.0820, 2.0159, 28.0100, 31.9988, 58.1230, 58.1230, 72.1500, 72.1500, 86.1770, 100.2040,114.2310,128.2580,142.2850,4.0026, 39.9480 16.0430, 28.0135, 44.0100, 30.0700, 44.0970, 18.0153, 34.0820, 2.0159, 28.0100, 31.9988, 58.1230, 58.1230,
72.1500, 72.1500, 86.1770, 100.2040, 114.2310, 128.2580, 142.2850, 4.0026, 39.9480
}; };
const double adTable5Ei[21] = {151.318300, 99.737780, 241.960600, 244.166700, 298.118300, 514.015600, 296.355000, 26.957940, 105.534800, 122.766700, 324.068900, 337.638900, 365.599900, 370.682300, 402.636293, 427.722630, 450.325022, 470.840891, 489.558373, 2.610111, 119.629900 const double adTable5Ei[21] = {
151.318300, 99.737780, 241.960600, 244.166700, 298.118300, 514.015600, 296.355000, 26.957940, 105.534800,
122.766700, 324.068900, 337.638900, 365.599900, 370.682300, 402.636293, 427.722630, 450.325022, 470.840891,
489.558373, 2.610111, 119.629900
}; };
const double adTable5Ki[21] = {0.4619255, 0.4479153, 0.4557489, 0.5279209, 0.5837490, 0.3825868, 0.4618263, 0.3514916, 0.4533894, 0.4186954, 0.6406937, 0.6341423, 0.6738577, 0.6798307, 0.7175118, 0.7525189, 0.7849550, 0.8152731, 0.8437826, 0.3589888, 0.4216551 const double adTable5Ki[21] = {
0.4619255, 0.4479153, 0.4557489, 0.5279209, 0.5837490, 0.3825868, 0.4618263, 0.3514916, 0.4533894, 0.4186954,
0.6406937, 0.6341423, 0.6738577, 0.6798307, 0.7175118, 0.7525189, 0.7849550, 0.8152731, 0.8437826, 0.3589888,
0.4216551
}; };
const double adTable5Gi[21] = {0.000000,0.027815,0.189065,0.079300,0.141239, 0.332500,0.088500,0.034369,0.038953,0.021000, 0.256692,0.281835,0.332267,0.366911,0.289731, 0.337542,0.383381,0.427354,0.469659,0.000000, 0.000000 const double adTable5Gi[21] = {
0.000000, 0.027815, 0.189065, 0.079300, 0.141239, 0.332500, 0.088500, 0.034369, 0.038953, 0.021000, 0.256692,
0.281835, 0.332267, 0.366911, 0.289731, 0.337542, 0.383381, 0.427354, 0.469659, 0.000000, 0.000000
}; };
for (int j = 0; j < NUMBEROFCOMPONENTS; j++) { for (int j = 0; j < NUMBEROFCOMPONENTS; j++) {
pDetail->adTable5Qi[j] = 0.0; pDetail->adTable5Qi[j] = 0.0;
@ -280,28 +459,23 @@ void Detail_paramdl(Detail* pDetail)
pDetail->adTable5Si[5] = 1.5822; pDetail->adTable5Si[5] = 1.5822;
pDetail->adTable5Si[6] = 0.3900; pDetail->adTable5Si[6] = 0.3900;
pDetail->adTable5Wi[5] = 1.0000; pDetail->adTable5Wi[5] = 1.0000;
for (int j= pDetail->iNCC-1; j >= 0; j--) for (int j = pDetail->iNCC - 1; j >= 0; j--) {
{
pDetail->dMri[j] = adTable5Mri[pDetail->aiCID[j]]; pDetail->dMri[j] = adTable5Mri[pDetail->aiCID[j]];
pDetail->dKi[j] = adTable5Ki[pDetail->aiCID[j]]; pDetail->dKi[j] = adTable5Ki[pDetail->aiCID[j]];
} }
for (int j=0; j < pDetail->iNCC; j++) for (int j = 0; j < pDetail->iNCC; j++) {
{
pDetail->dGi[j] = adTable5Gi[pDetail->aiCID[j]]; pDetail->dGi[j] = adTable5Gi[pDetail->aiCID[j]];
pDetail->dEi[j] = adTable5Ei[pDetail->aiCID[j]]; pDetail->dEi[j] = adTable5Ei[pDetail->aiCID[j]];
} }
for (int j=0; j < pDetail->iNCC; j++) for (int j = 0; j < pDetail->iNCC; j++) {
{
pDetail->dQi[j] = pDetail->adTable5Qi[pDetail->aiCID[j]]; pDetail->dQi[j] = pDetail->adTable5Qi[pDetail->aiCID[j]];
pDetail->dFi[j] = 0.0; pDetail->dFi[j] = 0.0;
if (pDetail->aiCID[j] == 7) pDetail->dFi[j] = pDetail->adTable5Fi[7]; if (pDetail->aiCID[j] == 7) pDetail->dFi[j] = pDetail->adTable5Fi[7];
pDetail->dSi[j] = pDetail->adTable5Si[pDetail->aiCID[j]]; pDetail->dSi[j] = pDetail->adTable5Si[pDetail->aiCID[j]];
pDetail->dWi[j] = pDetail->adTable5Wi[pDetail->aiCID[j]]; pDetail->dWi[j] = pDetail->adTable5Wi[pDetail->aiCID[j]];
} }
for (int j=0; j < pDetail->iNCC; j++) for (int j = 0; j < pDetail->iNCC; j++) {
{ for (int k = j; k < pDetail->iNCC; k++) {
for (int k=j; k < pDetail->iNCC; k++)
{
pDetail->dUij[j][k] = pDetail->adTable6Uij[pDetail->aiCID[j]][pDetail->aiCID[k]]; pDetail->dUij[j][k] = pDetail->adTable6Uij[pDetail->aiCID[j]][pDetail->aiCID[k]];
pDetail->dKij[j][k] = pDetail->adTable6Kij[pDetail->aiCID[j]][pDetail->aiCID[k]]; pDetail->dKij[j][k] = pDetail->adTable6Kij[pDetail->aiCID[j]][pDetail->aiCID[k]];
pDetail->dEij[j][k] = pDetail->adTable6Eij[pDetail->aiCID[j]][pDetail->aiCID[k]]; pDetail->dEij[j][k] = pDetail->adTable6Eij[pDetail->aiCID[j]][pDetail->aiCID[k]];
@ -309,8 +483,8 @@ void Detail_paramdl(Detail* pDetail)
} }
} }
} }
void Detail_chardl(Detail* pDetail, NGParSTRUCT *ptNGPar)
{ void Detail_chardl(Detail *pDetail, NGParSTRUCT *ptNGPar) {
double tmfrac = 0.0; double tmfrac = 0.0;
for (int j = 0; j < pDetail->iNCC; j++) { for (int j = 0; j < pDetail->iNCC; j++) {
tmfrac += pDetail->dXi[j]; tmfrac += pDetail->dXi[j];
@ -408,8 +582,8 @@ void Detail_chardl(Detail* pDetail, NGParSTRUCT *ptNGPar)
pDetail->dU = pow(u5p0 + pow(u2p5, 2.0), 0.2); pDetail->dU = pow(u5p0 + pow(u2p5, 2.0), 0.2);
pDetail->dQp2 = q1p0 * q1p0; pDetail->dQp2 = q1p0 * q1p0;
} }
void Detail_bvir(Detail* pDetail)
{ void Detail_bvir(Detail *pDetail) {
pDetail->dB = pDetail->ddBdT = pDetail->dd2BdT2 = 0.0; pDetail->dB = pDetail->ddBdT = pDetail->dd2BdT2 = 0.0;
double t = pDetail->dT; double t = pDetail->dT;
double t0p5 = sqrt(t); double t0p5 = sqrt(t);
@ -429,24 +603,42 @@ void Detail_bvir(Detail* pDetail)
for (int i = 0; i < 18; i++) { for (int i = 0; i < 18; i++) {
double bcoef = pDetail->adBcoef[i]; double bcoef = pDetail->adBcoef[i];
switch (i) { switch (i) {
case 0: Bx[i] = bcoef; break; case 0: Bx[i] = bcoef;
case 1: Bx[i] = bcoef / t0p5; break; break;
case 2: Bx[i] = bcoef / t; break; case 1: Bx[i] = bcoef / t0p5;
case 3: Bx[i] = bcoef / t3p5; break; break;
case 4: Bx[i] = bcoef * t0p5; break; case 2: Bx[i] = bcoef / t;
case 5: Bx[i] = bcoef / t4p5; break; break;
case 6: Bx[i] = bcoef / t0p5; break; case 3: Bx[i] = bcoef / t3p5;
case 7: Bx[i] = bcoef / t7p5; break; break;
case 8: Bx[i] = bcoef / t9p5; break; case 4: Bx[i] = bcoef * t0p5;
case 9: Bx[i] = bcoef / t6p0; break; break;
case 10: Bx[i] = bcoef / t12p0; break; case 5: Bx[i] = bcoef / t4p5;
case 11: Bx[i] = bcoef / t12p5; break; break;
case 12: Bx[i] = bcoef * t6p0; break; case 6: Bx[i] = bcoef / t0p5;
case 13: Bx[i] = bcoef / t2p0; break; break;
case 14: Bx[i] = bcoef / t3p0; break; case 7: Bx[i] = bcoef / t7p5;
case 15: Bx[i] = bcoef / t2p0; break; break;
case 16: Bx[i] = bcoef / t2p0; break; case 8: Bx[i] = bcoef / t9p5;
case 17: Bx[i] = bcoef / t11p0; break; break;
case 9: Bx[i] = bcoef / t6p0;
break;
case 10: Bx[i] = bcoef / t12p0;
break;
case 11: Bx[i] = bcoef / t12p5;
break;
case 12: Bx[i] = bcoef * t6p0;
break;
case 13: Bx[i] = bcoef / t2p0;
break;
case 14: Bx[i] = bcoef / t3p0;
break;
case 15: Bx[i] = bcoef / t2p0;
break;
case 16: Bx[i] = bcoef / t2p0;
break;
case 17: Bx[i] = bcoef / t11p0;
break;
default: Bx[i] = 0.0; default: Bx[i] = 0.0;
} }
pDetail->dB += Bx[i]; pDetail->dB += Bx[i];
@ -472,8 +664,8 @@ void Detail_bvir(Detail* pDetail)
} }
} }
} }
void Detail_temp(Detail* pDetail)
{ void Detail_temp(Detail *pDetail) {
Detail_bvir(pDetail); Detail_bvir(pDetail);
double tr = pDetail->dT / pDetail->dU; double tr = pDetail->dT / pDetail->dU;
double tr0p5 = sqrt(tr); double tr0p5 = sqrt(tr);
@ -498,8 +690,8 @@ void Detail_temp(Detail* pDetail)
pDetail->adFn[i] = an * tr_exp; pDetail->adFn[i] = an * tr_exp;
} }
} }
void Detail_ddetail(Detail* pDetail,NGParSTRUCT *ptNGPar)
{ void Detail_ddetail(Detail *pDetail, NGParSTRUCT *ptNGPar) {
int imax, i; int imax, i;
double epsp, epsr, epsmin; double epsp, epsr, epsmin;
double x1, x2, x3, y1, y2, y3; double x1, x2, x3, y1, y2, y3;
@ -512,8 +704,7 @@ void Detail_ddetail(Detail* pDetail,NGParSTRUCT *ptNGPar)
pDetail->dRho = 0.0; pDetail->dRho = 0.0;
Detail_braket(pDetail, ptNGPar); Detail_braket(pDetail, ptNGPar);
if (ptNGPar->lStatus == MAX_NUM_OF_ITERATIONS_EXCEEDED || if (ptNGPar->lStatus == MAX_NUM_OF_ITERATIONS_EXCEEDED ||
ptNGPar->lStatus == NEGATIVE_DENSITY_DERIVATIVE) ptNGPar->lStatus == NEGATIVE_DENSITY_DERIVATIVE) {
{
return; return;
} }
x1 = pDetail->dRhoL; x1 = pDetail->dRhoL;
@ -524,17 +715,14 @@ void Detail_ddetail(Detail* pDetail,NGParSTRUCT *ptNGPar)
delprv = delx; delprv = delx;
x3 = x1; x3 = x1;
y3 = y1; y3 = y1;
for (i=0; i < imax; i++) for (i = 0; i < imax; i++) {
{ if (y2 * y3 > 0.0) {
if (y2 * y3 > 0.0)
{
x3 = x1; x3 = x1;
y3 = y1; y3 = y1;
delx = x1 - x2; delx = x1 - x2;
delprv = delx; delprv = delx;
} }
if (fabs(y3) < fabs(y2)) if (fabs(y3) < fabs(y2)) {
{
x1 = x2; x1 = x2;
x2 = x3; x2 = x3;
x3 = x1; x3 = x1;
@ -547,8 +735,7 @@ void Detail_ddetail(Detail* pDetail,NGParSTRUCT *ptNGPar)
if (fabs(delprv) < delmin || fabs(y1) < fabs(y2)) { if (fabs(delprv) < delmin || fabs(y1) < fabs(y2)) {
delx = delbis; delx = delbis;
delprv = delbis; delprv = delbis;
} else } else {
{
if (x3 != x1) { if (x3 != x1) {
y2my3 = y2 - y3; y2my3 = y2 - y3;
y3my1 = y3 - y1; y3my1 = y3 - y1;
@ -573,15 +760,13 @@ void Detail_ddetail(Detail* pDetail,NGParSTRUCT *ptNGPar)
pDetail->dRho = x2 + delx; pDetail->dRho = x2 + delx;
return; return;
} }
if (fabs(delx) < delmin) if (fabs(delx) < delmin) {
{
sgndel = delbis / fabs(delbis); sgndel = delbis / fabs(delbis);
delx = 1.0000009 * sgndel * delmin; delx = 1.0000009 * sgndel * delmin;
delprv = delx; delprv = delx;
} }
boundn = delx * (x2 + delx - x3); boundn = delx * (x2 + delx - x3);
if (boundn > 0.0) if (boundn > 0.0) {
{
delx = delbis; delx = delbis;
delprv = delbis; delprv = delbis;
} }
@ -594,8 +779,8 @@ void Detail_ddetail(Detail* pDetail,NGParSTRUCT *ptNGPar)
ptNGPar->lStatus = MAX_NUM_OF_ITERATIONS_EXCEEDED; ptNGPar->lStatus = MAX_NUM_OF_ITERATIONS_EXCEEDED;
pDetail->dRho = x2; pDetail->dRho = x2;
} }
void Detail_braket(Detail* pDetail,NGParSTRUCT *ptNGPar)
{ void Detail_braket(Detail *pDetail, NGParSTRUCT *ptNGPar) {
int imax, it; int imax, it;
double del, rhomax, videal; double del, rhomax, videal;
double rho1, rho2, p1, p2; double rho1, rho2, p1, p2;
@ -606,19 +791,14 @@ void Detail_braket(Detail* pDetail,NGParSTRUCT *ptNGPar)
if (pDetail->dT > 1.2593 * pDetail->dU) if (pDetail->dT > 1.2593 * pDetail->dU)
rhomax = 20.0 * rhomax; rhomax = 20.0 * rhomax;
videal = RGASKJ * pDetail->dT / pDetail->dP; videal = RGASKJ * pDetail->dT / pDetail->dP;
if (fabs(pDetail->dB) < (0.167 * videal)) if (fabs(pDetail->dB) < (0.167 * videal)) {
{
rho2 = 0.95 / (videal + pDetail->dB); rho2 = 0.95 / (videal + pDetail->dB);
} } else {
else
{
rho2 = 1.15 / videal; rho2 = 1.15 / videal;
} }
del = rho2 / 20.0; del = rho2 / 20.0;
for (it = 0; it < imax; it++) for (it = 0; it < imax; it++) {
{ if (rho2 > rhomax && ptNGPar->lStatus != MAX_DENSITY_IN_BRAKET_EXCEEDED) {
if (rho2 > rhomax && ptNGPar->lStatus != MAX_DENSITY_IN_BRAKET_EXCEEDED)
{
ptNGPar->lStatus = MAX_DENSITY_IN_BRAKET_EXCEEDED; ptNGPar->lStatus = MAX_DENSITY_IN_BRAKET_EXCEEDED;
del = 0.01 * (rhomax - rho1) + (pDetail->dP / (RGASKJ * pDetail->dT)) / 20.0; del = 0.01 * (rhomax - rho1) + (pDetail->dP / (RGASKJ * pDetail->dT)) / 20.0;
rho2 = rho1 + del; rho2 = rho1 + del;
@ -626,26 +806,21 @@ void Detail_braket(Detail* pDetail,NGParSTRUCT *ptNGPar)
} }
Detail_pdetail(pDetail, rho2); Detail_pdetail(pDetail, rho2);
p2 = pDetail->dPCalc; p2 = pDetail->dPCalc;
if (p2 > pDetail->dP) if (p2 > pDetail->dP) {
{
pDetail->dRhoL = rho1; pDetail->dRhoL = rho1;
pDetail->dPRhoL = p1; pDetail->dPRhoL = p1;
pDetail->dRhoH = rho2; pDetail->dRhoH = rho2;
pDetail->dPRhoH = p2; pDetail->dPRhoH = p2;
ptNGPar->lStatus = NORMAL; ptNGPar->lStatus = NORMAL;
return; return;
} } else if (p2 > p1) {
else if (p2 > p1)
{
if (ptNGPar->lStatus == MAX_DENSITY_IN_BRAKET_EXCEEDED) if (ptNGPar->lStatus == MAX_DENSITY_IN_BRAKET_EXCEEDED)
del *= 2.0; del *= 2.0;
rho1 = rho2; rho1 = rho2;
p1 = p2; p1 = p2;
rho2 = rho1 + del; rho2 = rho1 + del;
continue; continue;
} } else {
else
{
ptNGPar->lStatus = NEGATIVE_DENSITY_DERIVATIVE; ptNGPar->lStatus = NEGATIVE_DENSITY_DERIVATIVE;
pDetail->dRho = rho1; pDetail->dRho = rho1;
return; return;
@ -655,12 +830,12 @@ void Detail_braket(Detail* pDetail,NGParSTRUCT *ptNGPar)
pDetail->dRho = rho2; pDetail->dRho = rho2;
return; return;
} }
void Detail_pdetail(Detail* pDetail,double dD)
{ void Detail_pdetail(Detail *pDetail, double dD) {
pDetail->dPCalc = Detail_zdetail(pDetail, dD) * dD * RGASKJ * pDetail->dT; pDetail->dPCalc = Detail_zdetail(pDetail, dD) * dD * RGASKJ * pDetail->dT;
} }
double Detail_zdetail(Detail* pDetail,double d)
{ double Detail_zdetail(Detail *pDetail, double d) {
double D1, D2, D3, D4, D5, D6, D7, D8, D9, exp1, exp2, exp3, exp4; double D1, D2, D3, D4, D5, D6, D7, D8, D9, exp1, exp2, exp3, exp4;
D1 = pDetail->dKp3 * d; D1 = pDetail->dKp3 * d;
D2 = D1 * D1; D2 = D1 * D1;
@ -703,8 +878,8 @@ double Detail_zdetail(Detail* pDetail,double d)
+ (pDetail->adFn[56] + pDetail->adFn[57]) * D9 * (9.0 - 2.0 * D2) * exp2; + (pDetail->adFn[56] + pDetail->adFn[57]) * D9 * (9.0 - 2.0 * D2) * exp2;
return pDetail->dZ; return pDetail->dZ;
} }
double Detail_dZdT(Detail* pDetail,double d)
{ double Detail_dZdT(Detail *pDetail, double d) {
double tmp; double tmp;
int i; int i;
double D1, D2, D3, D4, D5, D6, D7, D8, exp1, exp2, exp3, exp4; double D1, D2, D3, D4, D5, D6, D7, D8, exp1, exp2, exp3, exp4;
@ -720,14 +895,10 @@ double Detail_dZdT(Detail* pDetail,double d)
exp2 = exp(-D2); exp2 = exp(-D2);
exp3 = exp(-D3); exp3 = exp(-D3);
exp4 = exp(-D4); exp4 = exp(-D4);
for (i=12; i < 58; i++) for (i = 12; i < 58; i++) {
{ if (pDetail->adUn[i] && pDetail->adFn[i]) {
if (pDetail->adUn[i] && pDetail->adFn[i])
{
pDetail->fx[i] = (pDetail->adFn[i] * pDetail->adUn[i] * D1) / pDetail->dT; pDetail->fx[i] = (pDetail->adFn[i] * pDetail->adUn[i] * D1) / pDetail->dT;
} } else {
else
{
pDetail->fx[i] = 0.0; pDetail->fx[i] = 0.0;
} }
} }
@ -765,8 +936,8 @@ double Detail_dZdT(Detail* pDetail,double d)
- pDetail->fx[56] * D8 * (9.0 - 2.0 * D2) * exp2; - pDetail->fx[56] * D8 * (9.0 - 2.0 * D2) * exp2;
return pDetail->ddZdT; return pDetail->ddZdT;
} }
double Detail_d2ZdT2(Detail* pDetail,double d)
{ double Detail_d2ZdT2(Detail *pDetail, double d) {
double tmp; double tmp;
int i; int i;
double D1, D2, D3, D4, D5, D6, D7, D8, exp1, exp2, exp3, exp4; double D1, D2, D3, D4, D5, D6, D7, D8, exp1, exp2, exp3, exp4;
@ -782,14 +953,11 @@ double Detail_d2ZdT2(Detail* pDetail,double d)
exp2 = exp(-D2); exp2 = exp(-D2);
exp3 = exp(-D3); exp3 = exp(-D3);
exp4 = exp(-D4); exp4 = exp(-D4);
for (i=12; i < 58; i++) for (i = 12; i < 58; i++) {
{ if (pDetail->adUn[i] && pDetail->adFn[i]) {
if (pDetail->adUn[i] && pDetail->adFn[i]) pDetail->fx[i] = (pDetail->adFn[i] * D1 * pDetail->adUn[i] * (pDetail->adUn[i] + 1.0)) / (
{ pDetail->dT * pDetail->dT);
pDetail->fx[i] = (pDetail->adFn[i] * D1 * pDetail->adUn[i] * (pDetail->adUn[i] + 1.0)) / (pDetail->dT * pDetail->dT); } else {
}
else
{
pDetail->fx[i] = 0.0; pDetail->fx[i] = 0.0;
} }
} }
@ -827,8 +995,8 @@ double Detail_d2ZdT2(Detail* pDetail,double d)
+ pDetail->fx[56] * D8 * (9.0 - 2.0 * D2) * exp2; + pDetail->fx[56] * D8 * (9.0 - 2.0 * D2) * exp2;
return pDetail->dd2ZdT2; return pDetail->dd2ZdT2;
} }
double Detail_dZdD(Detail* pDetail,double d)
{ double Detail_dZdD(Detail *pDetail, double d) {
double temp, temp1, temp2, temp3; double temp, temp1, temp2, temp3;
int i; int i;
double D1, D2, D3, D4, D5, D6, D7, D8, exp1, exp2, exp3, exp4; double D1, D2, D3, D4, D5, D6, D7, D8, exp1, exp2, exp3, exp4;
@ -844,13 +1012,11 @@ double Detail_dZdD(Detail* pDetail,double d)
exp2 = exp(-D2); exp2 = exp(-D2);
exp3 = exp(-D3); exp3 = exp(-D3);
exp4 = exp(-D4); exp4 = exp(-D4);
for (i=12; i < 58; i++) for (i = 12; i < 58; i++) {
{
pDetail->fx[i] = pDetail->adFn[i]; pDetail->fx[i] = pDetail->adFn[i];
} }
pDetail->ddZdD = pDetail->dB / pDetail->dKp3; pDetail->ddZdD = pDetail->dB / pDetail->dKp3;
if (pDetail->dF) if (pDetail->dF) {
{
temp1 = -9.0 * D3 * exp3; temp1 = -9.0 * D3 * exp3;
temp2 = (1.0 - 3.0 * D3) * exp3; temp2 = (1.0 - 3.0 * D3) * exp3;
temp3 = -temp2 * 3.0 * D6; temp3 = -temp2 * 3.0 * D6;
@ -858,13 +1024,20 @@ double Detail_dZdD(Detail* pDetail,double d)
pDetail->ddZdD += -pDetail->fx[12] + pDetail->fx[12] * temp; pDetail->ddZdD += -pDetail->fx[12] + pDetail->fx[12] * temp;
} }
temp1 = -4.0 * D2 * exp2; temp1 = -4.0 * D2 * exp2;
temp2 = (1.0 - 2.0 * D2) * exp2 ; temp3 = -temp2 * 2.0 * D2; temp2 = (1.0 - 2.0 * D2) * exp2;
temp = temp1 + temp2 + temp3 ; pDetail->ddZdD += -pDetail->fx[13] + pDetail->fx[13] * temp ; pDetail->ddZdD += -pDetail->fx[14] + pDetail->fx[14] * temp ; pDetail->ddZdD += -pDetail->fx[15] + pDetail->fx[15] * temp ; temp3 = -temp2 * 2.0 * D2;
temp = temp1 + temp2 + temp3;
pDetail->ddZdD += -pDetail->fx[13] + pDetail->fx[13] * temp;
pDetail->ddZdD += -pDetail->fx[14] + pDetail->fx[14] * temp;
pDetail->ddZdD += -pDetail->fx[15] + pDetail->fx[15] * temp;
temp1 = -16.0 * D4 * exp4; temp1 = -16.0 * D4 * exp4;
temp2 = (1.0 - 4.0 * D4) * exp4; temp2 = (1.0 - 4.0 * D4) * exp4;
temp3 = -temp2 * 4.0 * D4; temp3 = -temp2 * 4.0 * D4;
temp = temp1 + temp2 + temp3 ; pDetail->ddZdD += -pDetail->fx[16] + pDetail->fx[16] * temp ; pDetail->ddZdD += -pDetail->fx[17] + pDetail->fx[17] * temp ; temp = temp1 + temp2 + temp3;
pDetail->ddZdD += pDetail->fx[18] * temp ; pDetail->ddZdD += pDetail->fx[19] * temp ; pDetail->ddZdD += -pDetail->fx[16] + pDetail->fx[16] * temp;
pDetail->ddZdD += -pDetail->fx[17] + pDetail->fx[17] * temp;
pDetail->ddZdD += pDetail->fx[18] * temp;
pDetail->ddZdD += pDetail->fx[19] * temp;
temp1 = -4.0 * D3 * exp2; temp1 = -4.0 * D3 * exp2;
temp2 = (2.0 - 2.0 * D2) * 2.0 * D1 * exp2; temp2 = (2.0 - 2.0 * D2) * 2.0 * D1 * exp2;
temp3 = -temp2 * D2; temp3 = -temp2 * D2;
@ -893,39 +1066,67 @@ double Detail_dZdD(Detail* pDetail,double d)
pDetail->ddZdD += pDetail->fx[30] * temp; pDetail->ddZdD += pDetail->fx[30] * temp;
pDetail->ddZdD += pDetail->fx[31] * temp; pDetail->ddZdD += pDetail->fx[31] * temp;
temp1 = -9.0 * D5 * exp3; temp1 = -9.0 * D5 * exp3;
temp2 = (3.0 - 3.0 * D3) * 3.0 * D2 * exp3 ; temp3 = -(3.0 - 3.0 * D3) * 3.0 * D5 * exp3 ; temp = temp1 + temp2 + temp3 ; temp2 = (3.0 - 3.0 * D3) * 3.0 * D2 * exp3;
pDetail->ddZdD += pDetail->fx[32] * temp ; pDetail->ddZdD += pDetail->fx[33] * temp ; temp3 = -(3.0 - 3.0 * D3) * 3.0 * D5 * exp3;
temp = temp1 + temp2 + temp3;
pDetail->ddZdD += pDetail->fx[32] * temp;
pDetail->ddZdD += pDetail->fx[33] * temp;
temp1 = -16.0 * D6 * exp4; temp1 = -16.0 * D6 * exp4;
temp2 = (3.0 - 4.0 * D4) * 3.0 * D2 * exp4 ; temp3 = -(3.0 - 4.0 * D4) * D6 * 4.0 * exp4 ; temp = temp1 + temp2 + temp3 ; temp2 = (3.0 - 4.0 * D4) * 3.0 * D2 * exp4;
pDetail->ddZdD += pDetail->fx[34] * temp ; pDetail->ddZdD += pDetail->fx[35] * temp ; pDetail->ddZdD += pDetail->fx[36] * temp ; temp3 = -(3.0 - 4.0 * D4) * D6 * 4.0 * exp4;
pDetail->ddZdD += pDetail->fx[37] * temp ; pDetail->ddZdD += pDetail->fx[38] * temp ; temp = temp1 + temp2 + temp3;
pDetail->ddZdD += pDetail->fx[34] * temp;
pDetail->ddZdD += pDetail->fx[35] * temp;
pDetail->ddZdD += pDetail->fx[36] * temp;
pDetail->ddZdD += pDetail->fx[37] * temp;
pDetail->ddZdD += pDetail->fx[38] * temp;
temp1 = -4.0 * D5 * exp2; temp1 = -4.0 * D5 * exp2;
temp2 = (4.0 - 2.0 * D2) * 4.0 * D3 * exp2 ; temp3 = -(4.0 - 2.0 * D2) * 2.0 * D5 * exp2 ; temp = temp1 + temp2 + temp3 ; temp2 = (4.0 - 2.0 * D2) * 4.0 * D3 * exp2;
pDetail->ddZdD += pDetail->fx[39] * temp ; pDetail->ddZdD += pDetail->fx[40] * temp ; pDetail->ddZdD += pDetail->fx[41] * temp ; temp3 = -(4.0 - 2.0 * D2) * 2.0 * D5 * exp2;
temp = -16.0 * D7 * exp4 + (4.0 - 4.0 * D4) * 4.0 * D3 * exp4 ; temp -= (4.0 - 4.0 * D4) * D7 * 4.0 * exp4 ; temp = temp1 + temp2 + temp3;
pDetail->ddZdD += pDetail->fx[42] * temp ; pDetail->ddZdD += pDetail->fx[43] * temp ; pDetail->ddZdD += pDetail->fx[39] * temp;
temp = 25.0 * D4 ; pDetail->ddZdD += pDetail->fx[44] * temp ; pDetail->ddZdD += pDetail->fx[40] * temp;
temp = -4.0 * D6 * exp2 + (5.0 - 2.0 * D2) * 5.0 * D4 * exp2 ; temp -= (5.0 - 2.0 * D2) * D6 * 2.0 * exp2 ; pDetail->ddZdD += pDetail->fx[41] * temp;
pDetail->ddZdD += pDetail->fx[45] * temp ; pDetail->ddZdD += pDetail->fx[46] * temp ; temp = -16.0 * D7 * exp4 + (4.0 - 4.0 * D4) * 4.0 * D3 * exp4;
temp = -16.0 * D8 * exp4 + (5.0 - 4.0 * D4) * 5.0 * D4 * exp4 ; temp -= (5.0 - 4.0 * D4) * D8 * 4.0 * exp4 ; temp -= (4.0 - 4.0 * D4) * D7 * 4.0 * exp4;
pDetail->ddZdD += pDetail->fx[47] * temp ; pDetail->ddZdD += pDetail->fx[48] * temp ; pDetail->ddZdD += pDetail->fx[42] * temp;
temp = 36.0 * D5 ; pDetail->ddZdD += pDetail->fx[49] * temp ; pDetail->ddZdD += pDetail->fx[43] * temp;
temp = -4.0 * D7 * exp2 + (6.0 - 2.0 * D2) * 6.0 * D5 * exp2 ; temp -= (6.0 - 2.0 * D2) * D7 * 2.0 * exp2 ; temp = 25.0 * D4;
pDetail->ddZdD += pDetail->fx[44] * temp;
temp = -4.0 * D6 * exp2 + (5.0 - 2.0 * D2) * 5.0 * D4 * exp2;
temp -= (5.0 - 2.0 * D2) * D6 * 2.0 * exp2;
pDetail->ddZdD += pDetail->fx[45] * temp;
pDetail->ddZdD += pDetail->fx[46] * temp;
temp = -16.0 * D8 * exp4 + (5.0 - 4.0 * D4) * 5.0 * D4 * exp4;
temp -= (5.0 - 4.0 * D4) * D8 * 4.0 * exp4;
pDetail->ddZdD += pDetail->fx[47] * temp;
pDetail->ddZdD += pDetail->fx[48] * temp;
temp = 36.0 * D5;
pDetail->ddZdD += pDetail->fx[49] * temp;
temp = -4.0 * D7 * exp2 + (6.0 - 2.0 * D2) * 6.0 * D5 * exp2;
temp -= (6.0 - 2.0 * D2) * D7 * 2.0 * exp2;
pDetail->ddZdD += pDetail->fx[50] * temp; pDetail->ddZdD += pDetail->fx[50] * temp;
temp = 49.0 * D6 ; pDetail->ddZdD += pDetail->fx[51] * temp ; temp = 49.0 * D6;
temp = -4.0 * D8 * exp2 + (7.0 - 2.0 * D2) * 7.0 * D6 * exp2 ; temp -= (7.0 - 2.0 * D2) * D8 * 2.0 * exp2 ; pDetail->ddZdD += pDetail->fx[51] * temp;
temp = -4.0 * D8 * exp2 + (7.0 - 2.0 * D2) * 7.0 * D6 * exp2;
temp -= (7.0 - 2.0 * D2) * D8 * 2.0 * exp2;
pDetail->ddZdD += pDetail->fx[52] * temp; pDetail->ddZdD += pDetail->fx[52] * temp;
temp = -1.0 * D8 * exp1 + (8.0 - D1) * 8.0 * D7 * exp1 ; temp -= (8.0 - D1) * D8 * exp1 ; temp = -1.0 * D8 * exp1 + (8.0 - D1) * 8.0 * D7 * exp1;
temp -= (8.0 - D1) * D8 * exp1;
pDetail->ddZdD += pDetail->fx[53] * temp; pDetail->ddZdD += pDetail->fx[53] * temp;
temp = -4.0 * D1 * D8 * exp2 + (8.0 - 2.0 * D2) * 8.0 * D7 * exp2 ; temp -= (8.0 - 2.0 * D2) * D8 * 2.0 * D1 * exp2 ; temp = -4.0 * D1 * D8 * exp2 + (8.0 - 2.0 * D2) * 8.0 * D7 * exp2;
pDetail->ddZdD += pDetail->fx[54] * temp ; pDetail->ddZdD += pDetail->fx[55] * temp ; temp -= (8.0 - 2.0 * D2) * D8 * 2.0 * D1 * exp2;
temp = -4.0 * D2 * D8 * exp2 + (9.0 - 2.0 * D2) * 9.0 * D8 * exp2 ; temp -= (9.0 - 2.0 * D2) * D2 * D8 * 2.0 * exp2 ; pDetail->ddZdD += pDetail->fx[54] * temp;
pDetail->ddZdD += pDetail->fx[56] * temp ; pDetail->ddZdD += pDetail->fx[57] * temp ; pDetail->ddZdD += pDetail->fx[55] * temp;
temp = -4.0 * D2 * D8 * exp2 + (9.0 - 2.0 * D2) * 9.0 * D8 * exp2;
temp -= (9.0 - 2.0 * D2) * D2 * D8 * 2.0 * exp2;
pDetail->ddZdD += pDetail->fx[56] * temp;
pDetail->ddZdD += pDetail->fx[57] * temp;
pDetail->ddZdD *= pDetail->dKp3; pDetail->ddZdD *= pDetail->dKp3;
return pDetail->ddZdD; return pDetail->ddZdD;
} }
void Detail_relativedensity(Detail* pDetail,NGParSTRUCT *ptNGPar)
{ void Detail_relativedensity(Detail *pDetail, NGParSTRUCT *ptNGPar) {
double dBX, dZa; double dBX, dZa;
const double dMWair = 28.96256; const double dMWair = 28.96256;
dBX = -0.12527 + 5.91e-4 * ptNGPar->dTb - 6.62e-7 * ptNGPar->dTb * ptNGPar->dTb; dBX = -0.12527 + 5.91e-4 * ptNGPar->dTb - 6.62e-7 * ptNGPar->dTb * ptNGPar->dTb;

View File

@ -1,109 +1,122 @@
/************************************************************************* /*************************************************************************
* : detail.h * <EFBFBD>ļ<EFBFBD>: detail.h
**************************************************************************/ **************************************************************************/
#ifndef _DETAIL_H #ifndef _DETAIL_H
#define _DETAIL_H #define _DETAIL_H
#include "NGCal.h" #include "NGCal.h"
#include <stdbool.h> // 添加bool类型支持 #include <stdbool.h> // <EFBFBD><EFBFBD><EFBFBD>bool<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD>
// 使用结构体替代C++类 // ʹ<>ýṹ<C3BD><E1B9B9><EFBFBD><EFBFBD><EFBFBD>C++<2B><>
typedef struct Detail typedef struct Detail {
{ // ˽<>г<EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>
// 私有成员数据 int iNCC; // <20><><EFBFBD><EFBFBD><EFBFBD>Ŀ
int iNCC; // 组分数目
int aiCID[21]; // 组分ID int aiCID[21]; // <20><><EFBFBD>ID
// 五个历史变量用于提高重复计算时的效率 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD>
double dOldMixID; // 上一次计算的混合物ID double dOldMixID; // <20><>һ<EFBFBD>μ<EFBFBD><CEBC><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD>ID
double dOldPb; // 上一次计算的Pb double dOldPb; // <20><>һ<EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD>Pb
double dOldTb; // 上一次计算的Tb double dOldTb; // <20><>һ<EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD>Tb
double dOldPf; // 上一次计算的Pf double dOldPf; // <20><>һ<EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD>Pf
double dOldTf; // 上一次计算的Tf double dOldTf; // <20><>һ<EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD>Tf
// 表4第1列中的EOS参数 // <EFBFBD><EFBFBD>4<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>EOS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double adAn[58]; double adAn[58];
double adUn[58]; double adUn[58];
// 表5中的特征参数 // <EFBFBD><EFBFBD>5<EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double dMri[21]; // 第i组分的分子量 double dMri[21]; // <20><>i<EFBFBD><69>ֵķ<D6B5><C4B7><EFBFBD><EFBFBD><EFBFBD>
double dEi[21]; // 第i组分的特征能量参数 double dEi[21]; // <20><>i<EFBFBD><69>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double dKi[21]; // 第i组分的尺寸参数 - m^3/kg-mol ^1/3 double dKi[21]; // <20><>i<EFBFBD><69>ֵijߴ<C4B3><DFB4><EFBFBD><EFBFBD> - m^3/kg-mol ^1/3
double dGi[21]; // 第i组分的取向参数 double dGi[21]; // <20><>i<EFBFBD><69>ֵ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>
double dQi[21]; // 第i组分的四极参数 double dQi[21]; // <20><>i<EFBFBD><69>ֵ<EFBFBD><D6B5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
double dFi[21]; // 第i组分的高温参数 double dFi[21]; // <20><>i<EFBFBD><69>ֵĸ<D6B5><C4B8>²<EFBFBD><C2B2><EFBFBD>
double dSi[21]; // 第i组分的偶极参数 double dSi[21]; // <20><>i<EFBFBD><69>ֵ<EFBFBD>ż<EFBFBD><C5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double dWi[21]; // 第i组分的缔合参数 double dWi[21]; // <20><>i<EFBFBD><69>ֵĵ޺ϲ<DEBA><CFB2><EFBFBD>
double dEij[21][21]; // 维里系数能量二元相互作用参数 double dEij[21][21]; // ά<><CEAC>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><E0BBA5><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
double dUij[21][21]; // 共形能量的二元相互作用参数 double dUij[21][21]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD>Ԫ<EFBFBD><EFBFBD><E0BBA5><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
double dKij[21][21]; // 尺寸的二元相互作用参数 double dKij[21][21]; // <20>ߴ<EFBFBD>Ķ<EFBFBD>Ԫ<EFBFBD><EFBFBD><E0BBA5><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
double dGij[21][21]; // 取向的二元相互作用参数 double dGij[21][21]; // ȡ<><C8A1>Ķ<EFBFBD>Ԫ<EFBFBD><EFBFBD><E0BBA5><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
double adTable6Eij[21][21]; // 表6常数 double adTable6Eij[21][21]; // <20><>6<EFBFBD><36><EFBFBD><EFBFBD>
double adTable6Uij[21][21]; // 表6常数 double adTable6Uij[21][21]; // <20><>6<EFBFBD><36><EFBFBD><EFBFBD>
double adTable6Kij[21][21]; // 表6常数 double adTable6Kij[21][21]; // <20><>6<EFBFBD><36><EFBFBD><EFBFBD>
double adTable6Gij[21][21]; // 表6常数 double adTable6Gij[21][21]; // <20><>6<EFBFBD><36><EFBFBD><EFBFBD>
double adTable5Qi[21]; // 表5常数 double adTable5Qi[21]; // <20><>5<EFBFBD><35><EFBFBD><EFBFBD>
double adTable5Fi[21]; // 表5常数 double adTable5Fi[21]; // <20><>5<EFBFBD><35><EFBFBD><EFBFBD>
double adTable5Si[21]; // 表5常数 double adTable5Si[21]; // <20><>5<EFBFBD><35><EFBFBD><EFBFBD>
double adTable5Wi[21]; // 表5常数 double adTable5Wi[21]; // <20><>5<EFBFBD><35><EFBFBD><EFBFBD>
double adTableHhvMol[4][21]; //GB/T11062 摩尔高位发热量 double adTableHhvMol[4][21]; //GB/T11062 Ħ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double adTableLhvMol[4][21]; //GB/T11062 摩尔低位发热量 double adTableLhvMol[4][21]; //GB/T11062 Ħ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double dXi[21]; // 第i组分的摩尔分数 double dXi[21]; // <20><>i<EFBFBD><69>ֵ<EFBFBD>Ħ<EFBFBD><C4A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double dPCalc; // 由pdetail()计算的压力 double dPCalc; // <20><>pdetail()<29><><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>
double dT; // 当前温度 double dT; // <20><>ǰ<EFBFBD><EFBFBD>
double dP; // 当前压力 double dP; // <20><>ǰѹ<C7B0><D1B9>
double dRhoTP; // 在T和P下的摩尔密度 double dRhoTP; // <20><>T<EFBFBD><54>P<EFBFBD>µ<EFBFBD>Ħ<EFBFBD><C4A6><EFBFBD>ܶ<EFBFBD>
double dB; // 第二维里系数B double dB; // <20>ڶ<EFBFBD>ά<EFBFBD><CEAC>ϵ<EFBFBD><CFB5>B
double adBcoef[18]; // 计算B的18个系数 double adBcoef[18]; // <20><><EFBFBD><EFBFBD>B<EFBFBD><42>18<31><38>ϵ<EFBFBD><CFB5>
double adFn[58]; // 密度系数的函数 double adFn[58]; // <20>ܶ<EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD>ĺ<EFBFBD><C4BA><EFBFBD>
double fx[58]; // 用于3个导数的修改系数 double fx[58]; // <20><><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>ϵ<EFBFBD><CFB5>
double dU; // 混合物能量参数 double dU; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double dKp3; // 混合物尺寸参数的立方 double dKp3; // <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double dW; // 混合物取向参数 double dW; // <20><><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>
double dQp2; // 混合物四极参数的平方 double dQp2; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>
double dF; // 高温参数 double dF; // <20><><EFBFBD>²<EFBFBD><C2B2><EFBFBD>
double dRho; // 摩尔密度 double dRho; // Ħ<><C4A6><EFBFBD>ܶ<EFBFBD>
double dRhoL; // 用于braket函数的低密度 double dRhoL; // <20><><EFBFBD><EFBFBD>braket<65><74><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>ܶ<EFBFBD>
double dRhoH; // 用于braket函数的高密度 double dRhoH; // <20><><EFBFBD><EFBFBD>braket<65><74><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8>ܶ<EFBFBD>
double dPRhoL; // 用于braket函数的低压 double dPRhoL; // <20><><EFBFBD><EFBFBD>braket<65><74><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ѹ
double dPRhoH; // 用于braket函数的高压 double dPRhoH; // <20><><EFBFBD><EFBFBD>braket<65><74><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD>ѹ
// 公共变量,也用于高级流体性质计算 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD>ڸ߼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD>
double dZ; // 当前压缩因子 double dZ; // <20><>ǰѹ<C7B0><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double ddZdT; // Z对T的一阶偏导数 double ddZdT; // Z<><5A>T<EFBFBD><54>һ<EFBFBD><D2BB>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
double dd2ZdT2; // Z对T的二阶偏导数 double dd2ZdT2; // Z<><5A>T<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
double ddZdD; // Z对摩尔密度的一阶偏导数 double ddZdD; // Z<><5A>Ħ<EFBFBD><C4A6><EFBFBD>ܶȵ<DCB6>һ<EFBFBD><D2BB>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
double ddBdT; // B对T的一阶偏导数 double ddBdT; // B<><42>T<EFBFBD><54>һ<EFBFBD><D2BB>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
double dd2BdT2; // B对T的二阶偏导数 double dd2BdT2; // B<><42>T<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
} Detail; } Detail;
// 构造函数和析构函数 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Detail *Detail_Construct(void); Detail *Detail_Construct(void);
void Detail_Destroy(Detail *pDetail); void Detail_Destroy(Detail *pDetail);
// 私有方法 // ˽<EFBFBD>з<EFBFBD><EFBFBD><EFBFBD>
int Detail_compositionchange(Detail *pDetail, NGParSTRUCT *pAGA10); int Detail_compositionchange(Detail *pDetail, NGParSTRUCT *pAGA10);
void Detail_table(Detail* pDetail);
int Detail_table(Detail *pDetail);
void Detail_paramdl(Detail *pDetail); void Detail_paramdl(Detail *pDetail);
void Detail_chardl(Detail *pDetail, NGParSTRUCT *pAGA10); void Detail_chardl(Detail *pDetail, NGParSTRUCT *pAGA10);
void Detail_bvir(Detail *pDetail); void Detail_bvir(Detail *pDetail);
void Detail_temp(Detail *pDetail); void Detail_temp(Detail *pDetail);
void Detail_braket(Detail *pDetail, NGParSTRUCT *pAGA10); void Detail_braket(Detail *pDetail, NGParSTRUCT *pAGA10);
void Detail_pdetail(Detail *pDetail, double dRho); void Detail_pdetail(Detail *pDetail, double dRho);
void Detail_ddetail(Detail *pDetail, NGParSTRUCT *pAGA10); void Detail_ddetail(Detail *pDetail, NGParSTRUCT *pAGA10);
void Detail_relativedensity(Detail *pDetail, NGParSTRUCT *pAGA10); void Detail_relativedensity(Detail *pDetail, NGParSTRUCT *pAGA10);
// 公共方法 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double Detail_zdetail(Detail *pDetail, double dRho); double Detail_zdetail(Detail *pDetail, double dRho);
double Detail_dZdT(Detail *pDetail, double dRho); double Detail_dZdT(Detail *pDetail, double dRho);
double Detail_d2ZdT2(Detail *pDetail, double dRho); double Detail_d2ZdT2(Detail *pDetail, double dRho);
double Detail_dZdD(Detail *pDetail, double dRho); double Detail_dZdD(Detail *pDetail, double dRho);
void Detail_Run(Detail* pDetail, NGParSTRUCT* pAGA10);
void Detail_Run(Detail *pDetail, NGParSTRUCT *ptNGPar);
#endif #endif

493
User/NG/FlowCal.c Normal file
View File

@ -0,0 +1,493 @@
#include "NGCal.h"
#include "FlowCal.h"
void OFlowCal(FlowParSTRUCT *ptFlowPar, NGParSTRUCT *ptNGPar) {
//<2F><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>Pa
double tempPatm = ptFlowPar->dPatm * 1000000;
//ѹ<><D1B9>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>Pa
double tempPf = ptFlowPar->dPf * 1000000;
//<2F><>ѹת<D1B9><D7AA><EFBFBD><EFBFBD>Pa
double tempDP = ptFlowPar->dDp * 1000;
//<2F><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>K
double tempTf = ptFlowPar->dTf + 273.15;
if (ptFlowPar->dPfType == 0) //0<>DZ<EFBFBD>ѹ
{
ptFlowPar->dPf = tempPatm + tempPf;
ptNGPar->dPf = tempPatm + tempPf;
} else {
ptFlowPar->dPf = tempPf;
ptNGPar->dPf = tempPf;
}
ptFlowPar->dDp = tempDP;
ptFlowPar->dTf = tempTf;
ptNGPar->dTf = tempTf;
ptNGPar->dCbtj = ptFlowPar->dCbtj;
switch (ptNGPar->dCbtj) {
case 2:
ptNGPar->dPb = 101325;
ptNGPar->dTb = 273.15;
ptFlowPar->dPb_M = (101325);
ptFlowPar->dTb_M = (273.15);
break;
case 1:
ptNGPar->dPb = (101325);
ptNGPar->dTb = (288.15);
ptFlowPar->dPb_M = (101325);
ptFlowPar->dTb_M = (288.15);
break;
case 0:
ptNGPar->dPb = (101325);
ptNGPar->dTb = (293.15);
ptFlowPar->dPb_M = (101325);
ptFlowPar->dTb_M = (293.15);
break;
}
double ngArray[NUMBEROFCOMPONENTS];
for (int i = 0; i < NUMBEROFCOMPONENTS; i++) {
ngArray[i] = ptFlowPar->dNG_Compents[i] / 100;
ptNGPar->adMixture[i] = ngArray[i];
}
Crit(ptNGPar, 0); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD>
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD>
ptFlowPar->dFpv = ptNGPar->dFpv;
// 1. <20><><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD>
ptFlowPar->dOrificeD = ptFlowPar->dOrificeD * (
1 + 0.000001 * CaiLiaoPzxs(ptFlowPar->dOrificeMaterial) * (ptFlowPar->dTf - 293.15));
ptFlowPar->dPipeD = ptFlowPar->dPipeD * (1 + 0.000001 * CaiLiaoPzxs(ptFlowPar->dPipeMaterial) * (
ptFlowPar->dTf - 293.15));
ptFlowPar->dBeta = ptFlowPar->dOrificeD / ptFlowPar->dPipeD;
ptFlowPar->dE = calculateE(ptFlowPar->dBeta);
ptFlowPar->dFG = calculateFG(ptNGPar->dRD_Real);
ptFlowPar->dFT = calculateFT(ptFlowPar->dTb_M, ptFlowPar->dTf);
ptFlowPar->dKappa = calculateKappa(ptNGPar->dZf);
ptFlowPar->dDViscosity = Dlndjs(ptFlowPar->dPf / 1e6, ptFlowPar->dTf);
ptFlowPar->dDExpCoefficient = calculateEpsilon(ptFlowPar->dPf, ptFlowPar->dDp,
ptFlowPar->dBeta, ptFlowPar->dKappa);
double D = ptFlowPar->dPipeD / 1000.0; // <20>ܵ<EFBFBD><DCB5>ھ<EFBFBD>(m)
double d = ptFlowPar->dOrificeD / 1000.0; // <20>װ<EFBFBD>׾<EFBFBD>(m)
double beta = ptFlowPar->dBeta;
double P1 = ptFlowPar->dPf; // <20><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>(Pa)
double deltaP = ptFlowPar->dDp; // <20><>ѹ(Pa)
double Tf = ptFlowPar->dTf;
// 2. <20><>ʼ<EFBFBD><CABC>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A3A8><EFBFBD><EFBFBD><EFBFBD>ʼC=0.6<EFBFBD><EFBFBD>
double C_initial = 0.6;
double Qf_initial = (C_initial * ptFlowPar->dE * ptFlowPar->dDExpCoefficient * M_PI * pow(d, 2) / 4)
* sqrt(2 * deltaP / (ptNGPar->dRhof * (1 - pow(beta, 4))));
ptFlowPar->dVFlowf = Qf_initial; // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(m3/s)
// 3. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double tolerance = 1e-6;
int maxIter = 100;
double currentC = C_initial;
double currentReD = calculateReD(Qf_initial, D, ptNGPar->dRhof, ptFlowPar->dDViscosity);
int iter = 0;
double prevC = 0;
// 4. <20><><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>
do {
prevC = currentC;
// 4.1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>C<EFBFBD><43>GB/T 21446-2008 <20><>¼A<C2BC><41>
currentC = calculateCd(beta, currentReD, ptFlowPar->dPipeD, ptFlowPar->dPtmode);
// 4.2 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double Qf = (currentC * ptFlowPar->dDExpCoefficient * M_PI * pow(d, 2) / 4)
* sqrt(2 * deltaP / (ptNGPar->dRhof * (1 - pow(beta, 4))));
ptFlowPar->dVFlowf = Qf;
// 4.3 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><C5B5>
currentReD = calculateReD(Qf, D, ptNGPar->dRhof, ptFlowPar->dDViscosity);
iter++;
if (iter > maxIter) {
fprintf(stderr, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n");
}
} while (fabs(currentC - prevC) / currentC > tolerance);
// 5. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD>
// <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵֲڶ<D6B2><DAB6><EFBFBD><EFBFBD><EFBFBD>
double K = calculateK(ptFlowPar->dPipeType); // <20><><EFBFBD><EFBFBD>ʵ<EFBFBD>ʹܵ<CAB9><DCB5><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>
double G_me = calculateRoughnessFactor(ptFlowPar->dPipeD, K, currentC);
double C_corrected = currentC * G_me;
ptFlowPar->dCd = C_corrected;
ptFlowPar->dRoughNessPipe = G_me;
ptFlowPar->dRnPipe = currentReD;
// 6. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GB/T 21446-2008 ʽ(1)<29><>
double Qn = ptFlowPar->dVFlowf * (ptFlowPar->dFpv * ptFlowPar->dFpv * P1 / ptFlowPar->dPb_M)
* (ptFlowPar->dTb_M) / Tf;
ptFlowPar->dVFlowb = Qn;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ptFlowPar->dMFlowb = ptFlowPar->dVFlowb * ptNGPar->dRhob;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ptFlowPar->dEFlowb = ptFlowPar->dVFlowb * ptNGPar->dHhvMol;
// <20>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ptFlowPar->dVelocityFlow = ptFlowPar->dVFlowf / (M_PI * pow((ptFlowPar->dPipeD / 2000), 2));
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="tempCaiLiao"></param>
/// <returns></returns>
double CaiLiaoPzxs(int tempCaiLiao) {
double CaiLiaoPzxs = 0;
// <20>װ<EFBFBD>͹ܵ<CDB9><DCB5><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>
// 0 A3<41><33>15<31>Ÿ<EFBFBD>
// 1 10 <20>Ÿ<EFBFBD>
// 2 20 <20>Ÿ<EFBFBD>
// 3 45 <20>Ÿ<EFBFBD>
// 4 1 Cr13?2Cr13
// 5 Cr17
// 6 12 CrMoV
// 7 10 CrMo910
// 8 Cr6SiMo
// 9 X20CrMoV121
// 10 1 Cr18Ni9Ti
// 11 <20><>̼ͨ<CDA8><CCBC>
// 12 <20><>ҵ<EFBFBD><D2B5>ͭ
// 13 <20><>ͭ
// 14 <20><>ͭ
switch (tempCaiLiao) {
case 0:
CaiLiaoPzxs = 11.75;
break;
case 1:
CaiLiaoPzxs = 11.6;
break;
case 2:
CaiLiaoPzxs = 11.16;
break;
case 3:
CaiLiaoPzxs = 11.59;
break;
case 4:
CaiLiaoPzxs = 10.5;
break;
case 5:
CaiLiaoPzxs = 10.0;
break;
case 6:
CaiLiaoPzxs = 10.2;
break;
case 7:
CaiLiaoPzxs = 15.5;
break;
case 8:
CaiLiaoPzxs = 11.5;
break;
case 9:
CaiLiaoPzxs = 10.8;
break;
case 10:
CaiLiaoPzxs = 16.6;
break;
case 11:
CaiLiaoPzxs = 11.4;
break;
case 12:
CaiLiaoPzxs = 16.55;
break;
case 13:
CaiLiaoPzxs = 17.8;
break;
case 14:
CaiLiaoPzxs = 17.2;
break;
}
return CaiLiaoPzxs;
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դֲڶ<EFBFBD> K (GB/T 21446-2008 <EFBFBD><EFBFBD>¼C)
* @param dPipeType <EFBFBD>ܵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return <EFBFBD>ֲڶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD> K (<EFBFBD><EFBFBD><EFBFBD><EFBFBD>4λС<EFBFBD><EFBFBD>)
*/
double calculateK(int dPipeType) {
double Jdccd;
switch (dPipeType) {
case 0:
Jdccd = 0.029;
break;
case 1:
case 2:
case 3:
Jdccd = 0.075;
break;
case 4:
Jdccd = 0.1;
break;
case 5:
Jdccd = 0.15;
break;
case 6:
Jdccd = 1;
break;
case 7:
Jdccd = 2.1;
break;
case 8:
Jdccd = 0.04;
break;
case 9:
Jdccd = 0.15;
break;
case 10:
Jdccd = 0.13;
break;
case 11:
Jdccd = 0.25;
break;
default:
// <20><><EFBFBD><EFBFBD>δ֪<CEB4><D6AA><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD>ѡ<EFBFBD><D1A1>
fprintf(stderr, "δ֪<EFBFBD>Ĺܵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: %d\n", dPipeType);
return FLOW_CALC_ERROR;
}
return Jdccd;
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܵ<EFBFBD><EFBFBD>ֲڶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD> G_me (GB/T 21446-2008 <EFBFBD><EFBFBD>¼C)
* @param D_pipe <EFBFBD>ܵ<EFBFBD><EFBFBD>ھ<EFBFBD> (mm)
* @param K <EFBFBD><EFBFBD><EFBFBD>Դֲڶ<EFBFBD> (mm)
* @param C δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD>
* @return <EFBFBD>ֲڶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD> G_me (<EFBFBD><EFBFBD><EFBFBD><EFBFBD>4λС<EFBFBD><EFBFBD>)
*/
double calculateRoughnessFactor(double D_pipe, double K, double C) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դֲڶ<D6B2> K/D
double K_over_D = K / D_pipe;
// <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
if (K_over_D <= 0.0004) {
return 1.0000;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double term = (K_over_D * 1e6) - 400; // ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (term < 0) {
fprintf(stderr, "K/D <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD>÷<EFBFBD>Χ\n");
return FLOW_CALC_ERROR;
}
double G_me = 1 + (0.011 / C) * sqrt(term);
return G_me; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λС<CEBB><D0A1>
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>ϵ<EFBFBD><EFBFBD>E<EFBFBD><EFBFBD>GB/T 21446-2008 ʽ(8)<EFBFBD><EFBFBD>
* @param beta ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>ϵ<EFBFBD><EFBFBD>E
*/
double calculateE(double beta) {
return 1 / sqrt(1 - pow(beta, 4));
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܶ<EFBFBD>ϵ<EFBFBD><EFBFBD>FG<EFBFBD><EFBFBD>GB/T 21446-2008 ʽ(9)<EFBFBD><EFBFBD>
* @param dRD_Real <EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܶ<EFBFBD>
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܶ<EFBFBD>ϵ<EFBFBD><EFBFBD>FG
*/
double calculateFG(double dRD_Real) {
return 1 / sqrt(dRD_Real);
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD>FT<EFBFBD><EFBFBD>GB/T 21446-2008 ʽ(10)<EFBFBD><EFBFBD>
* @param dTb_M <EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>(K)
* @param dTf <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(K)
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD>FT
*/
double calculateFT(double dTb_M, double dTf) {
return sqrt(dTb_M / dTf);
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>GB/T 21446-2008 ʽ(11)<EFBFBD><EFBFBD>
* @param dPf <EFBFBD><EFBFBD><EFBFBD>ξ<EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD>(Pa)
* @param dDp <EFBFBD><EFBFBD>ѹ(Pa)
* @param beta ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param dKappa <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
double calculateEpsilon(double dPf, double dDp, double beta, double dKappa) {
double tau = (dPf - dDp) / dPf; // ѹ<><D1B9><EFBFBD><EFBFBD>
double epsilon = 1 - (0.351 + 0.256 * pow(beta, 4) + 0.93 * pow(beta, 8)) * (1 - pow(tau, 1 / dKappa));
return epsilon;
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>GB/T 21446-2008 <EFBFBD>Ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param dZf <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
double calculateKappa(double dZf) {
// <20><><EFBFBD>ƹ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȱȺ<C8B1>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double gamma = 1.3; // <20><>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><CDB1>ȱȣ<C8B1>Cp/Cv<43><76>1.3<EFBFBD><EFBFBD>
double Z = dZf; // <20><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>
double kappa = gamma / (1 - (gamma - 1) * (1 / Z - 1));
return kappa;
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><EFBFBD>ReD<EFBFBD><EFBFBD>GB/T 21446-2008 ʽ(5)<EFBFBD><EFBFBD>
* @param Qf <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(m3/s)
* @param D <EFBFBD>ܵ<EFBFBD><EFBFBD>ھ<EFBFBD>(m)
* @param rho <EFBFBD>ܶ<EFBFBD>(kg/m3)
* @param mu <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ճ<EFBFBD><EFBFBD>(Pa<EFBFBD><EFBFBD>s)
* @return <EFBFBD><EFBFBD>ŵ<EFBFBD><EFBFBD>
*/
double calculateReD(double Qf, double D, double rho, double mu) {
return (4 * Qf * rho) / (M_PI * D * mu);
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD>C<EFBFBD><EFBFBD>GB/T 21446-2008 <EFBFBD><EFBFBD>¼A<EFBFBD><EFBFBD>
* @param beta ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param ReD <EFBFBD><EFBFBD>ŵ<EFBFBD><EFBFBD>
* @param D_mm <EFBFBD>ܵ<EFBFBD><EFBFBD>ھ<EFBFBD>(mm)
* @param ptMode ȡѹ<EFBFBD><EFBFBD>ʽ
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD>C
*/
double calculateCd(double beta, double ReD, double D_mm, int ptMode) {
double L1, L2;
// <20><><EFBFBD><EFBFBD>ȡѹ<C8A1><D1B9>ʽȷ<CABD><C8B7>L1/L2<4C><32><EFBFBD>ǽ<EFBFBD>ȡѹ<C8A1><D1B9>
switch (ptMode) {
case 1: // <20>ǽ<EFBFBD>ȡѹ
L1 = L2 = 0; // D<><44>λΪmm
break;
case 0: // <20><><EFBFBD><EFBFBD>ȡѹ
L1 = L2 = 25.4 / D_mm;
break;
case 2: // D-D/2ȡѹ
L1 = 1.0;
L2 = 0.47;
break;
default:
fprintf(stderr, "<EFBFBD><EFBFBD>֧<EFBFBD>ֵ<EFBFBD>ȡѹ<EFBFBD><EFBFBD>ʽ: %d\n", ptMode);
return FLOW_CALC_ERROR;
}
double term1 = 0.5961 + 0.0261 * pow(beta, 2) - 0.216 * pow(beta, 8);
double term2 = 0.000521 * pow(1e6 * beta / ReD, 0.7);
double A = pow(19000 * beta / ReD, 0.8);
double term3 = (0.0188 + 0.0063 * A) * pow(beta, 3.5) * pow(1e6 / ReD, 0.3);
double term4 = (0.043 + 0.08 * exp(-10 * L1) - 0.123 * exp(-7 * L1))
* (1 - 0.11 * A) * pow(beta, 4) / (1 - pow(beta, 4));
double term5 = -0.031 * (2 * L2 / (1 - beta) - 0.8 * pow(2 * L2 / (1 - beta), 1.1))
* pow(beta, 1.3);
double Cd = term1 + term2 + term3 + term4 + term5;
// <20>׾<EFBFBD><71.12mm<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (D_mm < 71.12) {
Cd += 0.011 * (0.75 - beta) * (2.8 - D_mm / 25.4);
}
return Cd;
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ճ<EFBFBD>Ȧ<EFBFBD>
* @param tempP_jy ѹ<EFBFBD><EFBFBD>(MPa)
* @param tempT <EFBFBD><EFBFBD>(K)
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ճ<EFBFBD><EFBFBD>(Pa<EFBFBD><EFBFBD>s)
*/
double Dlndjs(double tempP_jy, double tempT) {
double Dlndjs_Dlnd_Data[8][11] = {
{976, 991, 1014, 1044, 1073, 1114, 1156, 1207, 1261, 1331, 1405},
{1027, 1040, 1063, 1091, 1118, 1151, 1185, 1230, 1276, 1331, 1389},
{1071, 1082, 1106, 1127, 1149, 1180, 1211, 1250, 1289, 1335, 1383},
{1123, 1135, 1153, 1174, 1195, 1224, 1253, 1289, 1324, 1366, 1409},
{1167, 1178, 1196, 1216, 1236, 1261, 1287, 1318, 1350, 1385, 1421},
{1213, 1224, 1239, 1257, 1275, 1297, 1320, 1346, 1373, 1403, 1435},
{1260, 1270, 1281, 1297, 1313, 1333, 1352, 1374, 1396, 1424, 1451},
{1303, 1312, 1323, 1338, 1352, 1372, 1391, 1412, 1432, 1456, 1482}
};
double Dlndjs_Dlnd_T[8] = {
-15 + 273.15, 0 + 273.15, 15 + 273.15, 30 + 273.15,
45 + 273.15, 60 + 273.15, 75 + 273.15, 90 + 273.15
};
double Dlndjs_Dlnd_P[11] = {0.1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
double s1, s2, ky, kx;
int i, m = 0, n = 0;
if (tempT < Dlndjs_Dlnd_T[0]) {
tempT = Dlndjs_Dlnd_T[0];
}
if (tempT > Dlndjs_Dlnd_T[7]) {
tempT = Dlndjs_Dlnd_T[7];
}
if (tempP_jy < Dlndjs_Dlnd_P[0]) {
tempP_jy = Dlndjs_Dlnd_P[0];
}
if (tempP_jy > Dlndjs_Dlnd_P[10]) {
tempP_jy = Dlndjs_Dlnd_P[10];
}
for (i = 0; i <= 6; i++) {
if (tempT >= Dlndjs_Dlnd_T[i] && tempT <= Dlndjs_Dlnd_T[i + 1]) {
m = i;
break;
}
}
for (i = 0; i <= 9; i++) {
if (tempP_jy >= Dlndjs_Dlnd_P[i] && tempP_jy <= Dlndjs_Dlnd_P[i + 1]) {
n = i;
break;
}
}
if (Dlndjs_Dlnd_P[n + 1] - Dlndjs_Dlnd_P[n] != 0) {
ky = (tempP_jy - Dlndjs_Dlnd_P[n]) / (Dlndjs_Dlnd_P[n + 1] - Dlndjs_Dlnd_P[n]);
} else {
ky = 0;
}
if (Dlndjs_Dlnd_T[m + 1] - Dlndjs_Dlnd_T[m] != 0) {
kx = (tempT - Dlndjs_Dlnd_T[m]) / (Dlndjs_Dlnd_T[m + 1] - Dlndjs_Dlnd_T[m]);
} else {
kx = 0;
}
s1 = Dlndjs_Dlnd_Data[m][n] + (Dlndjs_Dlnd_Data[m][n + 1] - Dlndjs_Dlnd_Data[m][n]) * ky;
s2 = Dlndjs_Dlnd_Data[m + 1][n] + (Dlndjs_Dlnd_Data[m + 1][n + 1] - Dlndjs_Dlnd_Data[m + 1][n]) * ky;
return (s1 + (s2 - s1) * kx) / 100000.0;
}

View File

@ -1,67 +1,64 @@
#ifndef _FLOWCAL_H #ifndef FLOWCAL_H
#define _FLOWCAL_H #define FLOWCAL_H
#include "NGCal.h" #include "NGCal.h"
#include "Detail.h"
/* 天然气物性参数的数据结构 */ /* <20><>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ */
typedef struct FlowParSTRUCT typedef struct FlowParSTRUCT {
{ //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
//流量计算输入参数信息
int dCbtj; //计量参比条件压力 int dCbtj; //<2F><><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>
double dPb_M; //计量参比条件压力 double dPb_M; //<2F><><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>
double dTb_M; //计量参比条件温度 double dTb_M; //<2F><><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double dPb_E; //燃烧参比条件压力 double dPb_E; //ȼ<>ղα<D5B2><CEB1><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>
double dTb_E; //燃烧参比条件温度 double dTb_E; //ȼ<>ղα<D5B2><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double dPatm;//当地大气压 Pa double dPatm; //<2F><><EFBFBD>ش<EFBFBD><D8B4><EFBFBD>ѹ Pa
double dNG_Compents[21] ;//天然气组分 double dNG_Compents[21]; //<2F><>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD>
int dMeterType;// 流量计类别 int dMeterType; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int dCoreType;//节流装置类型 int dCoreType; //<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int dPtmode; //取压方式 int dPtmode; //ȡѹ<C8A1><D1B9>ʽ
int dPipeType; // 管道类型 int dPipeType; // <20>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD>
double dPipeD; //管道内径 mm double dPipeD; //<2F>ܵ<EFBFBD><DCB5>ھ<EFBFBD> mm
int dPipeMaterial; //管道材料 int dPipeMaterial; //<2F>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD>
double dOrificeD; //孔板孔径mm double dOrificeD; //<2F>װ<EFBFBD>׾<EFBFBD>mm
int dOrificeMaterial; //孔板材料 int dOrificeMaterial; //<2F>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>
double dPf;//输入压力 Pa double dPf; //<2F><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9> Pa
int dPfType; //压力类型 int dPfType; //ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double dTf; //输入温度 K double dTf; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> K
double dDp; //输入差压 Pa double dDp; //<2F><><EFBFBD><EFBFBD><EFBFBD>ѹ Pa
double dMeterFactor;//仪表系数 double dMeterFactor; //<2F>DZ<EFBFBD>ϵ<EFBFBD><CFB5>
double dPulseNum;//脉冲数 double dPulseNum; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//流量计算输出参数
double dE; //'求渐近速度系数 E
double dFG; //'求相对密度系数 FG
double dFT; //'求流动温度系数 'FT
double dDViscosity; //'求动力粘度 dlnd
double dDExpCoefficient; //'求可膨胀系数
double dRnPipe; //'管道雷诺数
double dBk; //'孔板锐利度系数Bk
double dRoughNessPipe; //'管道粗糙度系数 Gme
double dCd; //'修正后的流出系数
double dCdCorrect; //'修正后的流出系数
double dCdNozell; //'喷嘴的流出系数
double dVFlowb;//'标况体积流量 Nm3/s
double dVFlowf; //'工况体积流量 m3/s
double dMFlowb;//'标况质量流量 t/s
double dEFlowb;//'标况能量流量 MJ/s
double dVelocityFlow;//'管道内天然气流速
double dPressLost;//'压力损失
double dBeta;//'直径比
double dKappa;//'等熵指数
double dFpv;//超压缩因子
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double dE; //'<27>󽥽<EFBFBD><F3BDA5BD>ٶ<EFBFBD>ϵ<EFBFBD><CFB5> E
double dFG; //'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܶ<EFBFBD>ϵ<EFBFBD><CFB5> FG
double dFT; //'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5> 'FT
double dDViscosity; //'<27><><EFBFBD><EFBFBD>ճ<EFBFBD><D5B3> dlnd
double dDExpCoefficient; //'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>
double dRnPipe; //'<27>ܵ<EFBFBD><DCB5><EFBFBD>ŵ<EFBFBD><C5B5>
double dBk; //'<27>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>Bk
double dRoughNessPipe; //'<27>ܵ<EFBFBD><DCB5>ֲڶ<D6B2>ϵ<EFBFBD><CFB5> Gme
double dCd; //'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>
double dCdCorrect; //'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>
double dCdNozell; //'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>
double dVFlowb; //'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Nm3/s
double dVFlowf; //'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m3/s
double dMFlowb; //'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> t/s
double dEFlowb; //'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MJ/s
double dVelocityFlow; //'<27>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double dPressLost; //'ѹ<><D1B9><EFBFBD><EFBFBD>ʧ
double dBeta; //'ֱ<><D6B1><EFBFBD><EFBFBD>
double dKappa; //'<27><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
double dFpv; //<2F><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
} FlowParSTRUCT; } FlowParSTRUCT;
double CaiLiaoPzxs(int tempCaiLiao); double CaiLiaoPzxs(int tempCaiLiao);
double calculateK(int dPipeType); double calculateK(int dPipeType);
double calculateRoughnessFactor(double D_pipe, double K, double C); double calculateRoughnessFactor(double D_pipe, double K, double C);

View File

View File

@ -1,55 +1,59 @@
#include "NGCal.h" #include "NGCal.h"
#include "Therm.h" #include "Therm.h"
#include "Detail.h" #include "Detail.h"
#include "String.h"
static Therm *ptTherm; static Therm *ptTherm;
static Detail *ptDetail; static Detail *ptDetail;
int NGCal_Init(void)
{ int NGCal_Init(NGParSTRUCT *ptNGPar) {
ptDetail = (Detail *)malloc(sizeof(Detail)); //ptDetail = (Detail *)malloc(sizeof(Detail));
if (NULL == ptDetail ) ptDetail = Detail_Construct();
{ if (NULL == ptDetail) {
return MEMORY_ALLOCATION_ERROR; return MEMORY_ALLOCATION_ERROR;
} }
// Detail_Run(ptDetail,ptNGPar);
// Detail_compositionchange(ptDetail,ptNGPar);
ptTherm = (Therm *) malloc(sizeof(Therm)); ptTherm = (Therm *) malloc(sizeof(Therm));
if (NULL == ptTherm ) Therm_Init(ptTherm);
{ if (NULL == ptTherm) {
return MEMORY_ALLOCATION_ERROR; return MEMORY_ALLOCATION_ERROR;
} }
return NGCal_NGCal; return NGCal_NGCal;
} }
int NGCal_UnInit(void)
{ int NGCal_UnInit(void) {
if (ptDetail) free(ptDetail); if (ptDetail) free(ptDetail);
if (ptTherm) free(ptTherm); if (ptTherm) free(ptTherm);
return 0; return 0;
} }
double SOS(NGParSTRUCT *ptNGPar)
{ double SOS(NGParSTRUCT *ptNGPar) {
if (NULL == ptDetail || NULL == ptTherm) if (NULL == ptDetail || NULL == ptTherm) {
{
NGCal_UnInit(); NGCal_UnInit();
NGCal_Init(); NGCal_Init(ptNGPar);
} }
ptTherm->Run(ptTherm,ptNGPar, ptDetail); Therm_Run(ptTherm, ptNGPar, ptDetail);
ptNGPar->dCstar = 0.0; ptNGPar->dCstar = 0.0;
return ptNGPar->dSOS; return ptNGPar->dSOS;
} }
double Crit(NGParSTRUCT *ptNGPar, double dPlenumVelocity)
{ double Crit(NGParSTRUCT *ptNGPar, double dPlenumVelocity) {
double DH, DDH, S, H; double DH, DDH, S, H;
double tolerance = 1.0; double tolerance = 1.0;
double R, P, T, Z; double R, P, T, Z;
int i; int i;
if (NULL == ptDetail || NULL == ptTherm) if (NULL == ptDetail || NULL == ptTherm) {
{
NGCal_UnInit(); NGCal_UnInit();
if (NGCal_NGCal != NGCal_Init()) if (NGCal_NGCal != NGCal_Init(ptNGPar)) {
{
ptNGPar->lStatus = MEMORY_ALLOCATION_ERROR; ptNGPar->lStatus = MEMORY_ALLOCATION_ERROR;
return 0.0; return 0.0;
} }
} }
ptTherm->Run(ptTherm,ptNGPar, ptDetail);
Therm_Run(ptTherm, ptNGPar, ptDetail);
DH = (ptNGPar->dSOS * ptNGPar->dSOS - dPlenumVelocity * dPlenumVelocity) / 2.0; DH = (ptNGPar->dSOS * ptNGPar->dSOS - dPlenumVelocity * dPlenumVelocity) / 2.0;
S = ptNGPar->dS; S = ptNGPar->dS;
H = ptNGPar->dH; H = ptNGPar->dH;
@ -58,10 +62,9 @@ double Crit(NGParSTRUCT *ptNGPar, double dPlenumVelocity)
Z = ptNGPar->dZf; Z = ptNGPar->dZf;
T = ptNGPar->dTf; T = ptNGPar->dTf;
DDH = 10.0; DDH = 10.0;
for (i = 1; i < MAX_NUM_OF_ITERATIONS; i++) for (i = 1; i < MAX_NUM_OF_ITERATIONS; i++) {
{ Therm_HS_Mode(ptTherm, ptNGPar, ptDetail, H - DH, S, true);
ptTherm->HS_Mode(ptTherm,ptNGPar, ptDetail, H - DH, S, true); Therm_Run(ptTherm, ptNGPar, ptDetail);
ptTherm->Run(ptTherm,ptNGPar, ptDetail);
DDH = DH; DDH = DH;
DH = (ptNGPar->dSOS * ptNGPar->dSOS - dPlenumVelocity * dPlenumVelocity) / 2.0; DH = (ptNGPar->dSOS * ptNGPar->dSOS - dPlenumVelocity * dPlenumVelocity) / 2.0;
if (fabs(DDH - DH) < tolerance) break; if (fabs(DDH - DH) < tolerance) break;
@ -69,18 +72,18 @@ double Crit(NGParSTRUCT *ptNGPar, double dPlenumVelocity)
ptNGPar->dCstar = (ptNGPar->dRhof * ptNGPar->dSOS) / sqrt(R * P * Z); ptNGPar->dCstar = (ptNGPar->dRhof * ptNGPar->dSOS) / sqrt(R * P * Z);
ptNGPar->dPf = P; ptNGPar->dPf = P;
ptNGPar->dTf = T; ptNGPar->dTf = T;
ptTherm->Run(ptTherm,ptNGPar, ptDetail); Therm_Run(ptTherm, ptNGPar, ptDetail);
return ptNGPar->dCstar; return ptNGPar->dCstar;
} }
double Cperf(NGParSTRUCT *ptNGPar)
{ double Cperf(NGParSTRUCT *ptNGPar) {
double k, root, exponent; double k, root, exponent;
k = ptNGPar->dKappa; k = ptNGPar->dKappa;
root = 2.0 / (k + 1.0); root = 2.0 / (k + 1.0);
exponent = (k + 1.0) / (k - 1.0); exponent = (k + 1.0) / (k - 1.0);
return (sqrt(k * pow(root, exponent))); return (sqrt(k * pow(root, exponent)));
} }
double CRi(NGParSTRUCT *ptNGPar)
{ double CRi(NGParSTRUCT *ptNGPar) {
return (Cperf(ptNGPar) / sqrt(ptNGPar->dZf)); return (Cperf(ptNGPar) / sqrt(ptNGPar->dZf));
} }

View File

@ -1,5 +1,5 @@
/************************************************************************* /*************************************************************************
* : NGCal.h * <EFBFBD>ļ<EFBFBD>: NGCal.h
**************************************************************************/ **************************************************************************/
@ -8,13 +8,13 @@
/* 其他包含文件 */ /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD> */
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <math.h> #include <math.h>
/* 状态码 */ /* ״̬<EFBFBD><EFBFBD> */
#define NORMAL 9000 #define NORMAL 9000
#define NGCal_NGCal 9001 #define NGCal_NGCal 9001
#define MEMORY_ALLOCATION_ERROR 9002 #define MEMORY_ALLOCATION_ERROR 9002
@ -26,73 +26,73 @@
#define FLOW_CALC_DIEDAI_ERROR 9008 #define FLOW_CALC_DIEDAI_ERROR 9008
/* 组分数 */ /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
#define NUMBEROFCOMPONENTS 21 #define NUMBEROFCOMPONENTS 21
#define M_PI 3.14159265358972 //圆周率 #define M_PI 3.14159265897932
/* 搜索例程中的最大尝试次数 */ /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD> */
#define MAX_NUM_OF_ITERATIONS 100 #define MAX_NUM_OF_ITERATIONS 100
/* 默认容差限制 */ /* Ĭ<EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
#define P_CHG_TOL 0.001 /* 0.001 Pa */ #define P_CHG_TOL 0.001 /* 0.001 Pa */
#define T_CHG_TOL 0.001 /* 0.001 开尔文 */ #define T_CHG_TOL 0.001 /* 0.001 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
/* 最大允许P和T */ /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>P<EFBFBD><EFBFBD>T */
#define P_MAX 1.379e8 /* 最大压力(Pa) ~= 20,000 psi */ #define P_MAX 1.379e8 /* <EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD>(Pa) ~= 20,000 psi */
#define P_MIN 0.0 /* 最小压力 = 0 */ #define P_MIN 0.0 /* <EFBFBD><EFBFBD>Сѹ<EFBFBD><EFBFBD> = 0 */
#define T_MAX 473.15 /* 最高温度(K) ~= 392 F */ #define T_MAX 473.15 /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(K) ~= 392 F */
#define T_MIN 143.0 /* 最低温度(K) ~= -200 F */ #define T_MIN 143.0 /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(K) ~= -200 F */
/* 通用气体常数,两种配置 */ /* ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
#define RGASKJ 8.314510e-3 /* 单位: kJ mol^-1 K^-1 */ #define RGASKJ 8.314510e-3 /* <EFBFBD><EFBFBD>λ: kJ mol^-1 K^-1 */
#define RGAS 8.314510 /* 单位: J mol^-1 K^-1 */ #define RGAS 8.314510 /* <EFBFBD><EFBFBD>λ: J mol^-1 K^-1 */
/* 天然气物性参数的数据结构 */ /* <EFBFBD><EFBFBD>Ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ */
typedef struct tagNGParSTRUCT typedef struct tagNGParSTRUCT
{ {
long lStatus; /* 计算状态 */ long lStatus; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ */
int bForceUpdate; /* 执行完整计算的信号 */ int bForceUpdate; /* ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD> */
double adMixture[21]; /* 摩尔分数组成 */ double adMixture[21]; /* Ħ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
int dCbtj; /* 参比条件 0 101.325MPa 20℃1:101325MPa15℃2:101325MPa0℃ */ int dCbtj; /* <EFBFBD>α<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 101.325MPa 20<32>棻1:101325MPa<50><61>15<31>棻2:101325MPa<50><61>0<EFBFBD><30> */
double dPb; /* 合同基准压力(Pa) */ double dPb; /* <EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD>׼ѹ<EFBFBD><EFBFBD>(Pa) */
double dTb; /* 合同基准温度(K) */ double dTb; /* <EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD>׼<EFBFBD><EFBFBD>(K) */
double dPf; /* 绝对压力(Pa) */ double dPf; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD>(Pa) */
double dTf; /* 流动温度(K) */ double dTf; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(K) */
/* AGA 8 Detail方法的基本输出 */ /* AGA 8 Detail<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
double dMrx; /* 混合物摩尔质量 */ double dMrx; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ħ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
double dZb; /* 合同基准条件下的压缩系数 */ double dZb; /* <EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>ѹ<EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD> */
double dZf; /* 流动条件下的压缩系数 */ double dZf; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>ѹ<EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD> */
double dFpv; /* 超压缩系数 */ double dFpv; /* <EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD> */
double dDb; /* 合同基准条件下的摩尔密度(moles/dm3) */ double dDb; /* <EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>Ħ<EFBFBD><EFBFBD><EFBFBD>ܶ<EFBFBD>(moles/dm3) */
double dDf; /* 流动条件下的摩尔密度(moles/dm3) */ double dDf; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>Ħ<EFBFBD><EFBFBD><EFBFBD>ܶ<EFBFBD>(moles/dm3) */
double dRhob; /* 合同基准条件下的质量密度(kg/m3) */ double dRhob; /* <EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܶ<EFBFBD>(kg/m3) */
double dRhof; /* 流动条件下的质量密度(kg/m3) */ double dRhof; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܶ<EFBFBD>(kg/m3) */
double dRD_Ideal; /* 理想气体相对密度 */ double dRD_Ideal; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܶ<EFBFBD> */
double dRD_Real; /* 真实气体相对密度 */ double dRD_Real; /* <EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܶ<EFBFBD> */
/* 附加输出 */ /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
double dHo; /* 理想气体比焓 */ double dHo; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
double dH; /* 真实气体比焓(J/kg) */ double dH; /* <EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(J/kg) */
double dS; /* 真实气体比熵(J/kg-mol.K) */ double dS; /* <EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(J/kg-mol.K) */
double dCpi; /* 理想气体定压热容(J/kg-mol.K) */ double dCpi; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嶨ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(J/kg-mol.K) */
double dCp; /* 真实气体定压热容(J/kg-mol.K) */ double dCp; /* <EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD>嶨ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(J/kg-mol.K) */
double dCv; /* 真实气体定容热容(J/kg-mol.K) */ double dCv; /* <EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(J/kg-mol.K) */
double dk; /* 比热比 */ double dk; /* <EFBFBD><EFBFBD><EFBFBD>ȱ<EFBFBD> */
double dKappa; /* 等熵指数用希腊字母kappa表示 */ double dKappa; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸkappa<EFBFBD><EFBFBD>ʾ */
double dSOS; /* 声速(m/s) */ double dSOS; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>(m/s) */
double dCstar; /* 临界流系数C* */ double dCstar; /* <EFBFBD>ٽ<EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD>C* */
/*11062 计算高位发热量和低位发热量*/ /*11062 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
double dHhvMol; /*高位摩尔发热量*/ double dHhvMol; /*<EFBFBD><EFBFBD>λĦ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
double dLhvMol; /*低位摩尔发热量*/ double dLhvMol; /*<EFBFBD><EFBFBD>λĦ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
} NGParSTRUCT; } NGParSTRUCT;
/* 用于跟踪气体组分的枚举 */ /* <EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ö<EFBFBD><EFBFBD> */
enum gascomp { enum gascomp {
XiC1=0, XiN2, XiCO2, XiC2, XiC3, XiC1=0, XiN2, XiCO2, XiC2, XiC3,
XiH2O, XiH2S, XiH2, XiCO, XiO2, XiH2O, XiH2S, XiH2, XiCO, XiO2,
@ -100,14 +100,14 @@ enum gascomp {
XiNC7, XiNC8, XiNC9, XiNC10, XiHe, XiAr XiNC7, XiNC8, XiNC9, XiNC10, XiHe, XiAr
}; };
/* 初始化函数原型 */ /* <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD> */
int AGA10_Init(void); /* 初始化 */ int NGCal_Init(NGParSTRUCT * ptNGPar); /* <20><>ʼ<EFBFBD><CABC> */
int AGA10_UnInit(void); /* 反初始化 */ int NGCal_UnInit(void); /* <20><><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC> */
/* 基本VOS计算的函数原型 */ /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>VOS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD> */
double SOS(NGParSTRUCT *); double SOS(NGParSTRUCT *);
/* C*计算的函数原型 */ /* C*<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD> */
double Crit(NGParSTRUCT *, double); double Crit(NGParSTRUCT *, double);
#endif #endif

View File

@ -2,21 +2,22 @@
#include "Therm.h" #include "Therm.h"
#include "Detail.h" #include "Detail.h"
#include "FlowCal.h" #include "FlowCal.h"
#include "math.h"
void OFlowCal(FlowParSTRUCT * ptFlowPar,NGParSTRUCT * ptNGPar) void OFlowCal(FlowParSTRUCT * ptFlowPar,NGParSTRUCT * ptNGPar)
{ {
//大气压力转换成Pa //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Pa
double tempPatm = ptFlowPar->dPatm*1000000; double tempPatm = ptFlowPar->dPatm*1000000;
//压力转换成Pa //ѹ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Pa
double tempPf = ptFlowPar->dPf*1000000; double tempPf = ptFlowPar->dPf*1000000;
//差压转换成Pa //<EFBFBD><EFBFBD>ѹת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Pa
double tempDP = ptFlowPar->dDp*1000; double tempDP = ptFlowPar->dDp*1000;
//温度转换成K //<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>K
double tempTf = ptFlowPar->dTf+273.15; double tempTf = ptFlowPar->dTf+273.15;
if (ptFlowPar->dPfType == 0) //0是表压 if (ptFlowPar->dPfType == 0) //0<EFBFBD>DZ<EFBFBD>ѹ
{ {
ptFlowPar->dPf = tempPatm + tempPf; ptFlowPar->dPf = tempPatm + tempPf;
ptNGPar ->dPf=tempPatm + tempPf; ptNGPar ->dPf=tempPatm + tempPf;
@ -62,12 +63,12 @@ void OFlowCal(FlowParSTRUCT * ptFlowPar,NGParSTRUCT * ptNGPar)
ptNGPar->adMixture[i] = ngArray[i]; ptNGPar->adMixture[i] = ngArray[i];
} }
Crit(ptNGPar,0); //计算天然气物性参数 Crit(ptNGPar,0); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD><EFBFBD><EFBFBD>
//开始计算孔板流量 //<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ptFlowPar->dFpv=ptNGPar->dFpv; ptFlowPar->dFpv=ptNGPar->dFpv;
// 1. 计算中间参数 // 1. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ptFlowPar->dOrificeD = ptFlowPar->dOrificeD * (1 + 0.000001 * CaiLiaoPzxs(ptFlowPar->dOrificeMaterial) * (ptFlowPar->dTf - 293.15)); ptFlowPar->dOrificeD = ptFlowPar->dOrificeD * (1 + 0.000001 * CaiLiaoPzxs(ptFlowPar->dOrificeMaterial) * (ptFlowPar->dTf - 293.15));
ptFlowPar->dPipeD = ptFlowPar->dPipeD * (1 + 0.000001 * CaiLiaoPzxs(ptFlowPar->dPipeMaterial) * (ptFlowPar->dTf - 293.15)); ptFlowPar->dPipeD = ptFlowPar->dPipeD * (1 + 0.000001 * CaiLiaoPzxs(ptFlowPar->dPipeMaterial) * (ptFlowPar->dTf - 293.15));
@ -82,20 +83,20 @@ void OFlowCal(FlowParSTRUCT * ptFlowPar,NGParSTRUCT * ptNGPar)
ptFlowPar->dDExpCoefficient = calculateEpsilon(ptFlowPar->dPf, ptFlowPar->dDp, ptFlowPar->dDExpCoefficient = calculateEpsilon(ptFlowPar->dPf, ptFlowPar->dDp,
ptFlowPar->dBeta, ptFlowPar->dKappa); ptFlowPar->dBeta, ptFlowPar->dKappa);
double D = ptFlowPar->dPipeD / 1000.0; // 管道内径(m) double D = ptFlowPar->dPipeD / 1000.0; // <EFBFBD>ܵ<EFBFBD><EFBFBD>ھ<EFBFBD>(m)
double d = ptFlowPar->dOrificeD / 1000.0; // 孔板孔径(m) double d = ptFlowPar->dOrificeD / 1000.0; // <EFBFBD>װ<EFBFBD>׾<EFBFBD>(m)
double beta = ptFlowPar->dBeta; double beta = ptFlowPar->dBeta;
double P1 = ptFlowPar->dPf; // 绝对压力(Pa) double P1 = ptFlowPar->dPf; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD>(Pa)
double deltaP = ptFlowPar->dDp; // 差压(Pa) double deltaP = ptFlowPar->dDp; // <EFBFBD><EFBFBD>ѹ(Pa)
double Tf = ptFlowPar->dTf; double Tf = ptFlowPar->dTf;
// 2. 初始雷诺数估算假设初始C=0.6 // 2. <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ŵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼC=0.6<EFBFBD><EFBFBD>
double C_initial = 0.6; double C_initial = 0.6;
double Qf_initial = (C_initial * ptFlowPar->dE * ptFlowPar->dDExpCoefficient * M_PI * pow(d, 2) / 4) double Qf_initial = (C_initial * ptFlowPar->dE * ptFlowPar->dDExpCoefficient * M_PI * pow(d, 2) / 4)
* sqrt(2 * deltaP / (ptNGPar->dRhof * (1 - pow(beta, 4)))); * sqrt(2 * deltaP / (ptNGPar->dRhof * (1 - pow(beta, 4))));
ptFlowPar->dVFlowf = Qf_initial; // 初始工况流量(m3/s) ptFlowPar->dVFlowf = Qf_initial; // <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(m3/s)
// 3. 迭代参数 // 3. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double tolerance = 1e-6; double tolerance = 1e-6;
int maxIter = 100; int maxIter = 100;
double currentC = C_initial; double currentC = C_initial;
@ -103,30 +104,30 @@ void OFlowCal(FlowParSTRUCT * ptFlowPar,NGParSTRUCT * ptNGPar)
int iter = 0; int iter = 0;
double prevC = 0; double prevC = 0;
// 4. 迭代循环 // 4. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD>
do { do {
prevC = currentC; prevC = currentC;
// 4.1 计算流出系数CGB/T 21446-2008 附录A // 4.1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD>C<EFBFBD><EFBFBD>GB/T 21446-2008 <20><>¼A<C2BC><41>
currentC = calculateCd(beta, currentReD, ptFlowPar->dPipeD, ptFlowPar->dPtmode); currentC = calculateCd(beta, currentReD, ptFlowPar->dPipeD, ptFlowPar->dPtmode);
// 4.2 更新流量 // 4.2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double Qf = (currentC * ptFlowPar->dDExpCoefficient * M_PI * pow(d, 2) / 4) double Qf = (currentC * ptFlowPar->dDExpCoefficient * M_PI * pow(d, 2) / 4)
* sqrt(2 * deltaP / (ptNGPar->dRhof * (1 - pow(beta, 4)))); * sqrt(2 * deltaP / (ptNGPar->dRhof * (1 - pow(beta, 4))));
ptFlowPar->dVFlowf = Qf; ptFlowPar->dVFlowf = Qf;
// 4.3 更新雷诺数 // 4.3 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><EFBFBD>
currentReD = calculateReD(Qf, D, ptNGPar->dRhof, ptFlowPar->dDViscosity); currentReD = calculateReD(Qf, D, ptNGPar->dRhof, ptFlowPar->dDViscosity);
iter++; iter++;
if (iter > maxIter) { if (iter > maxIter) {
fprintf(stderr, "迭代未收敛,超过最大迭代次数!\n"); fprintf(stderr, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n");
} }
} while (fabs(currentC - prevC) / currentC > tolerance); } while (fabs(currentC - prevC) / currentC > tolerance);
// 5. 保存最终结果 // 5. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><EFBFBD>
// 在迭代计算流出系数后,添加粗糙度修正 // <EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵֲڶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double K = calculateK(ptFlowPar->dPipeType); // 根据实际管道类型选择 double K = calculateK(ptFlowPar->dPipeType); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ʹܵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>
double G_me = calculateRoughnessFactor(ptFlowPar->dPipeD, K, currentC); double G_me = calculateRoughnessFactor(ptFlowPar->dPipeD, K, currentC);
double C_corrected = currentC * G_me; double C_corrected = currentC * G_me;
@ -134,33 +135,33 @@ void OFlowCal(FlowParSTRUCT * ptFlowPar,NGParSTRUCT * ptNGPar)
ptFlowPar->dRoughNessPipe = G_me; ptFlowPar->dRoughNessPipe = G_me;
ptFlowPar->dRnPipe = currentReD; ptFlowPar->dRnPipe = currentReD;
// 6. 计算标况流量GB/T 21446-2008 式(1) // 6. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GB/T 21446-2008 ʽ(1)<29><>
double Qn = ptFlowPar->dVFlowf * (ptFlowPar->dFpv * ptFlowPar->dFpv * P1 / ptFlowPar->dPb_M) double Qn = ptFlowPar->dVFlowf * (ptFlowPar->dFpv * ptFlowPar->dFpv * P1 / ptFlowPar->dPb_M)
* (ptFlowPar->dTb_M) / Tf; * (ptFlowPar->dTb_M) / Tf;
ptFlowPar->dVFlowb = Qn; ptFlowPar->dVFlowb = Qn;
// 标况质量流量 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ptFlowPar->dMFlowb = ptFlowPar->dVFlowb * ptNGPar->dRhob; ptFlowPar->dMFlowb = ptFlowPar->dVFlowb * ptNGPar->dRhob;
// 标况能量流量 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ptFlowPar->dEFlowb = ptFlowPar->dVFlowb * ptNGPar->dHhvMol; ptFlowPar->dEFlowb = ptFlowPar->dVFlowb * ptNGPar->dHhvMol;
// 管道内天然气流速 // <EFBFBD>ܵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ptFlowPar->dVelocityFlow = ptFlowPar->dVFlowf / (M_PI * pow((ptFlowPar->dPipeD / 2000), 2)); ptFlowPar->dVelocityFlow = ptFlowPar->dVFlowf / (M_PI * pow((ptFlowPar->dPipeD / 2000), 2));
} }
/// <summary> /// <summary>
/// 材料膨胀系数计算 /// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary> /// </summary>
/// <param name="tempCaiLiao"></param> /// <param name="tempCaiLiao"></param>
/// <returns></returns> /// <returns></returns>
double CaiLiaoPzxs(int tempCaiLiao) double CaiLiaoPzxs(int tempCaiLiao)
{ {
double CaiLiaoPzxs = 0; double CaiLiaoPzxs = 0;
// 孔板和管道材料的膨胀系数 // <EFBFBD>װ<EFBFBD>͹ܵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD>
// 0 A3、15号钢 // 0 A3<EFBFBD><EFBFBD>15<EFBFBD>Ÿ<EFBFBD>
// 1 10 号钢 // 1 10 <EFBFBD>Ÿ<EFBFBD>
// 2 20 号钢 // 2 20 <EFBFBD>Ÿ<EFBFBD>
// 3 45 号钢 // 3 45 <EFBFBD>Ÿ<EFBFBD>
// 4 1 Cr13?2Cr13 // 4 1 Cr13?2Cr13
// 5 Cr17 // 5 Cr17
// 6 12 CrMoV // 6 12 CrMoV
@ -168,10 +169,10 @@ void OFlowCal(FlowParSTRUCT * ptFlowPar,NGParSTRUCT * ptNGPar)
// 8 Cr6SiMo // 8 Cr6SiMo
// 9 X20CrMoV121 // 9 X20CrMoV121
// 10 1 Cr18Ni9Ti // 10 1 Cr18Ni9Ti
// 11 普通碳钢 // 11 <EFBFBD><EFBFBD>̼ͨ<EFBFBD><EFBFBD>
// 12 工业用铜 // 12 <EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD>ͭ
// 13 黄铜 // 13 <EFBFBD><EFBFBD>ͭ
// 14 红铜 // 14 <EFBFBD><EFBFBD>ͭ
switch (tempCaiLiao) switch (tempCaiLiao)
{ {
case 0: case 0:
@ -237,9 +238,9 @@ void OFlowCal(FlowParSTRUCT * ptFlowPar,NGParSTRUCT * ptNGPar)
return CaiLiaoPzxs; return CaiLiaoPzxs;
} }
/** /**
* K (GB/T 21446-2008 C) * <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դֲڶ<EFBFBD> K (GB/T 21446-2008 <EFBFBD><EFBFBD>¼C)
* @param dPipeType * @param dPipeType <EFBFBD>ܵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return K (4) * @return <EFBFBD>ֲڶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD> K (<EFBFBD><EFBFBD><EFBFBD><EFBFBD>4λС<EFBFBD><EFBFBD>)
*/ */
double calculateK(int dPipeType) { double calculateK(int dPipeType) {
double Jdccd; double Jdccd;
@ -277,8 +278,8 @@ double calculateK(int dPipeType) {
Jdccd = 0.25; Jdccd = 0.25;
break; break;
default: default:
// 处理未知类型(可选) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ֪<EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>
fprintf(stderr, "未知的管道类型: %d\n", dPipeType); fprintf(stderr, "δ֪<EFBFBD>Ĺܵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: %d\n", dPipeType);
return FLOW_CALC_ERROR; return FLOW_CALC_ERROR;
} }
return Jdccd; return Jdccd;
@ -286,119 +287,119 @@ double calculateK(int dPipeType) {
/** /**
* G_me (GB/T 21446-2008 C) * <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܵ<EFBFBD><EFBFBD>ֲڶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD> G_me (GB/T 21446-2008 <EFBFBD><EFBFBD>¼C)
* @param D_pipe (mm) * @param D_pipe <EFBFBD>ܵ<EFBFBD><EFBFBD>ھ<EFBFBD> (mm)
* @param K (mm) * @param K <EFBFBD><EFBFBD><EFBFBD>Դֲڶ<EFBFBD> (mm)
* @param C * @param C δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD>
* @return G_me (4) * @return <EFBFBD>ֲڶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD> G_me (<EFBFBD><EFBFBD><EFBFBD><EFBFBD>4λС<EFBFBD><EFBFBD>)
*/ */
double calculateRoughnessFactor(double D_pipe, double K, double C) { double calculateRoughnessFactor(double D_pipe, double K, double C) {
// 计算相对粗糙度 K/D // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դֲڶ<EFBFBD> K/D
double K_over_D = K / D_pipe; double K_over_D = K / D_pipe;
// 判断是否需要修正 // <EFBFBD>ж<EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (K_over_D <= 0.0004) { if (K_over_D <= 0.0004) {
return 1.0000; return 1.0000;
} }
// 计算修正项 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double term = (K_over_D * 1e6) - 400; // 转换为无量纲项 double term = (K_over_D * 1e6) - 400; // ת<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (term < 0) { if (term < 0) {
fprintf(stderr, "K/D 超出修正公式适用范围\n"); fprintf(stderr, "K/D <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD>Χ\n");
return FLOW_CALC_ERROR; return FLOW_CALC_ERROR;
} }
double G_me = 1 + (0.011 / C) * sqrt(term); double G_me = 1 + (0.011 / C) * sqrt(term);
return G_me; // 保留四位小数 return G_me; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λС<EFBFBD><EFBFBD>
} }
/** /**
* EGB/T 21446-2008 (8) * <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>ϵ<EFBFBD><EFBFBD>E<EFBFBD><EFBFBD>GB/T 21446-2008 ʽ(8)<EFBFBD><EFBFBD>
* @param beta * @param beta ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return E * @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>ϵ<EFBFBD><EFBFBD>E
*/ */
double calculateE(double beta) { double calculateE(double beta) {
return 1 / sqrt(1 - pow(beta, 4)); return 1 / sqrt(1 - pow(beta, 4));
} }
/** /**
* FGGB/T 21446-2008 (9) * <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܶ<EFBFBD>ϵ<EFBFBD><EFBFBD>FG<EFBFBD><EFBFBD>GB/T 21446-2008 ʽ(9)<EFBFBD><EFBFBD>
* @param dRD_Real * @param dRD_Real <EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܶ<EFBFBD>
* @return FG * @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܶ<EFBFBD>ϵ<EFBFBD><EFBFBD>FG
*/ */
double calculateFG(double dRD_Real) { double calculateFG(double dRD_Real) {
return 1 / sqrt(dRD_Real); return 1 / sqrt(dRD_Real);
} }
/** /**
* FTGB/T 21446-2008 (10) * <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD>FT<EFBFBD><EFBFBD>GB/T 21446-2008 ʽ(10)<EFBFBD><EFBFBD>
* @param dTb_M (K) * @param dTb_M <EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>(K)
* @param dTf (K) * @param dTf <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(K)
* @return FT * @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD>FT
*/ */
double calculateFT(double dTb_M, double dTf) { double calculateFT(double dTb_M, double dTf) {
return sqrt(dTb_M / dTf); return sqrt(dTb_M / dTf);
} }
/** /**
* εGB/T 21446-2008 (11) * <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>GB/T 21446-2008 ʽ(11)<EFBFBD><EFBFBD>
* @param dPf (Pa) * @param dPf <EFBFBD><EFBFBD><EFBFBD>ξ<EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD>(Pa)
* @param dDp (Pa) * @param dDp <EFBFBD><EFBFBD>ѹ(Pa)
* @param beta * @param beta ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param dKappa * @param dKappa <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
* @return ε * @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/ */
double calculateEpsilon(double dPf, double dDp, double beta, double dKappa) { double calculateEpsilon(double dPf, double dDp, double beta, double dKappa) {
double tau = (dPf - dDp) / dPf; // 压力比 double tau = (dPf - dDp) / dPf; // ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double epsilon = 1 - (0.351 + 0.256 * pow(beta, 4) + 0.93 * pow(beta, 8)) * (1 - pow(tau, 1/dKappa)); double epsilon = 1 - (0.351 + 0.256 * pow(beta, 4) + 0.93 * pow(beta, 8)) * (1 - pow(tau, 1/dKappa));
return epsilon; return epsilon;
} }
/** /**
* κGB/T 21446-2008 * <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>GB/T 21446-2008 <EFBFBD>Ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param dZf * @param dZf <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return κ * @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/ */
double calculateKappa(double dZf) { double calculateKappa(double dZf) {
// 近似公式:基于理想气体比热比和压缩因子修正 // <EFBFBD><EFBFBD><EFBFBD>ƹ<EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȱȺ<EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double gamma = 1.3; // 天然气典型比热比Cp/Cv≈1.3 double gamma = 1.3; // <EFBFBD><EFBFBD>Ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD>ȱȣ<EFBFBD>Cp/Cv<43><76>1.3<EFBFBD><EFBFBD>
double Z = dZf; // 工况压缩因子 double Z = dZf; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 修正公式(经验关系) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD>
double kappa = gamma / (1 - (gamma - 1) * (1 / Z - 1)); double kappa = gamma / (1 - (gamma - 1) * (1 / Z - 1));
return kappa; return kappa;
} }
/** /**
* ReDGB/T 21446-2008 (5) * <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><EFBFBD>ReD<EFBFBD><EFBFBD>GB/T 21446-2008 ʽ(5)<EFBFBD><EFBFBD>
* @param Qf (m3/s) * @param Qf <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(m3/s)
* @param D (m) * @param D <EFBFBD>ܵ<EFBFBD><EFBFBD>ھ<EFBFBD>(m)
* @param rho (kg/m3) * @param rho <EFBFBD>ܶ<EFBFBD>(kg/m3)
* @param mu (Pa·s) * @param mu <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ճ<EFBFBD><EFBFBD>(Pa<EFBFBD><EFBFBD>s)
* @return * @return <EFBFBD><EFBFBD>ŵ<EFBFBD><EFBFBD>
*/ */
double calculateReD(double Qf, double D, double rho, double mu) { double calculateReD(double Qf, double D, double rho, double mu) {
return (4 * Qf * rho) / (M_PI * D * mu); return (4 * Qf * rho) / (M_PI * D * mu);
} }
/** /**
* CGB/T 21446-2008 A * <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD>C<EFBFBD><EFBFBD>GB/T 21446-2008 <EFBFBD><EFBFBD>¼A<EFBFBD><EFBFBD>
* @param beta * @param beta ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param ReD * @param ReD <EFBFBD><EFBFBD>ŵ<EFBFBD><EFBFBD>
* @param D_mm (mm) * @param D_mm <EFBFBD>ܵ<EFBFBD><EFBFBD>ھ<EFBFBD>(mm)
* @param ptMode * @param ptMode ȡѹ<EFBFBD><EFBFBD>ʽ
* @return C * @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD>C
*/ */
double calculateCd(double beta, double ReD, double D_mm, int ptMode) { double calculateCd(double beta, double ReD, double D_mm, int ptMode) {
double L1, L2; double L1, L2;
// 根据取压方式确定L1/L2角接取压 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡѹ<EFBFBD><EFBFBD>ʽȷ<EFBFBD><EFBFBD>L1/L2<4C><32><EFBFBD>ǽ<EFBFBD>ȡѹ<C8A1><D1B9>
switch (ptMode) { switch (ptMode) {
case 1: // 角接取压 case 1: // <EFBFBD>ǽ<EFBFBD>ȡѹ
L1 = L2 = 0; // D单位为mm L1 = L2 = 0; // D<EFBFBD><EFBFBD>λΪmm
break; break;
case 0: // 法兰取压 case 0: // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡѹ
L1 = L2 = 25.4 / D_mm; L1 = L2 = 25.4 / D_mm;
break; break;
case 2: // D-D/2ȡѹ case 2: // D-D/2ȡѹ
@ -406,7 +407,7 @@ double calculateCd(double beta, double ReD, double D_mm, int ptMode) {
L2 = 0.47; L2 = 0.47;
break; break;
default: default:
fprintf(stderr, "不支持的取压方式: %d\n", ptMode); fprintf(stderr, "<EFBFBD><EFBFBD>֧<EFBFBD>ֵ<EFBFBD>ȡѹ<EFBFBD><EFBFBD>ʽ: %d\n", ptMode);
return FLOW_CALC_ERROR; return FLOW_CALC_ERROR;
} }
@ -421,7 +422,7 @@ double calculateCd(double beta, double ReD, double D_mm, int ptMode) {
double Cd = term1 + term2 + term3 + term4 + term5; double Cd = term1 + term2 + term3 + term4 + term5;
// 孔径<71.12mm修正 // <EFBFBD>׾<EFBFBD><71.12mm<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (D_mm < 71.12) { if (D_mm < 71.12) {
Cd += 0.011 * (0.75 - beta) * (2.8 - D_mm / 25.4); Cd += 0.011 * (0.75 - beta) * (2.8 - D_mm / 25.4);
} }
@ -429,10 +430,10 @@ double calculateCd(double beta, double ReD, double D_mm, int ptMode) {
} }
/** /**
* μ * <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ճ<EFBFBD>Ȧ<EFBFBD>
* @param tempP_jy (MPa) * @param tempP_jy ѹ<EFBFBD><EFBFBD>(MPa)
* @param tempT (K) * @param tempT <EFBFBD><EFBFBD>(K)
* @return (Pa·s) * @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ճ<EFBFBD><EFBFBD>(Pa<EFBFBD><EFBFBD>s)
*/ */
double Dlndjs(double tempP_jy, double tempT) { double Dlndjs(double tempP_jy, double tempT) {
double Dlndjs_Dlnd_Data[8][11] = { double Dlndjs_Dlnd_Data[8][11] = {

View File

@ -1,30 +1,46 @@
#include "therm.h"
#include "NGCal.h"
#include "Detail.h"
#include "Therm.h"
#include <math.h> #include <math.h>
#include <stdbool.h> #include "Detail.h"
static void CprCvrHS(NGParSTRUCT *ptNGPar, Detail *ptD);
static double H(NGParSTRUCT *ptNGPar, Detail *ptD); // 初始化Therm实例
static double S(NGParSTRUCT *ptNGPar, Detail *ptD); void Therm_Init(Therm *therm) {
static void HS_Mode(NGParSTRUCT *ptNGPar, Detail *ptD, double H_target, double S_target, bool bGuess); therm->CAL_TH = 4.1840;
double CalTH = 4.1840; therm->coefA = 0;
double GK_root[5] = { therm->coefB = 1;
0.14887433898163121088, therm->coefC = 2;
0.43339539412924719080, therm->coefD = 3;
0.67940956829902440263, therm->coefE = 4;
0.86506336668898451073, therm->coefF = 5;
0.97390652851717172008 therm->coefG = 6;
}; therm->coefH = 7;
double GK_weight[5] = { therm->coefI = 8;
0.29552422471475286217, therm->coefJ = 9;
0.26926671930999634918, therm->coefK = 10;
0.21908636251598204295,
0.14945134915058059038, therm->dPdD = 0.0;
0.066671344308688137179 therm->dPdT = 0.0;
}; therm->dSi = 0.0;
int GK_points = 5; therm->dTold = 0.0;
double ThermConstants[NUMBEROFCOMPONENTS][11] = { therm->dMrxold = 0.0;
therm->GK_points = 5;
// 初始化GK_root数组
therm->GK_root[0] = 0.14887433898163121088;
therm->GK_root[1] = 0.43339539412924719080;
therm->GK_root[2] = 0.67940956829902440263;
therm->GK_root[3] = 0.86506336668898451073;
therm->GK_root[4] = 0.97390652851717172008;
// 初始化GK_weight数组
therm->GK_weight[0] = 0.29552422471475286217;
therm->GK_weight[1] = 0.26926671930999634918;
therm->GK_weight[2] = 0.21908636251598204295;
therm->GK_weight[3] = 0.14945134915058059038;
therm->GK_weight[4] = 0.066671344308688137179;
// 初始化ThermConstants数组
double thermConstants[21][11] = {
{-29776.4, 7.95454, 43.9417, 1037.09, 1.56373, 813.205, -24.9027, 1019.98, -10.1601, 1070.14, -20.0615}, {-29776.4, 7.95454, 43.9417, 1037.09, 1.56373, 813.205, -24.9027, 1019.98, -10.1601, 1070.14, -20.0615},
{-3495.34, 6.95587, 0.272892, 662.738, -0.291318, -680.562, 1.78980, 1740.06, 0.0, 100.0, 4.49823}, {-3495.34, 6.95587, 0.272892, 662.738, -0.291318, -680.562, 1.78980, 1740.06, 0.0, 100.0, 4.49823},
{20.7307, 6.96237, 2.68645, 500.371, -2.56429, -530.443, 3.91921, 500.198, 2.13290, 2197.22, 5.81381}, {20.7307, 6.96237, 2.68645, 500.371, -2.56429, -530.443, 3.91921, 500.198, 2.13290, 2197.22, 5.81381},
@ -32,356 +48,427 @@ double CalTH = 4.1840;
{-56072.1, 8.14319, 37.0629, 735.402, 9.38159, 247.190, 13.4556, 1454.78, -11.7342, 984.518, -24.0426}, {-56072.1, 8.14319, 37.0629, 735.402, 9.38159, 247.190, 13.4556, 1454.78, -11.7342, 984.518, -24.0426},
{-13773.1, 7.97183, 6.27078, 2572.63, 2.05010, 1156.72, 0.0, 100.0, 0.0, 100.0, -3.24989}, {-13773.1, 7.97183, 6.27078, 2572.63, 2.05010, 1156.72, 0.0, 100.0, 0.0, 100.0, -3.24989},
{-10085.4, 7.94680, -0.08380, 433.801, 2.85539, 843.792, 6.31595, 1481.43, -2.88457, 1102.23, -0.51551}, {-10085.4, 7.94680, -0.08380, 433.801, 2.85539, 843.792, 6.31595, 1481.43, -2.88457, 1102.23, -0.51551},
{-5565.60, 6.66789, 2.33458, 2584.98, .749019, 559.656, 0.0, 100.0, 0.0, 100.0, -7.94821}, {-5565.60, 6.66789, 2.33458, 2584.98, 0.749019, 559.656, 0.0, 100.0, 0.0, 100.0, -7.94821},
{-2753.49, 6.95854, 2.02441, 1541.22, .096774, 3674.81, 0.0, 100.0, 0.0, 100.0, 6.23387}, {-2753.49, 6.95854, 2.02441, 1541.22, 0.096774, 3674.81, 0.0, 100.0, 0.0, 100.0, 6.23387},
{-3497.45, 6.96302, 2.40013, 2522.05, 2.21752, 1154.15, 0.0, 100.0, 0.0, 100.0, 9.19749}, {-3497.45, 6.96302, 2.40013, 2522.05, 2.21752, 1154.15, 0.0, 100.0, 0.0, 100.0, 9.19749},
{-72387.0, 17.8143, 58.2062, 1787.39, 40.7621, 808.645, 0.0, 100.0, 0.0, 100.0, -44.1341}, {-72387.0, 17.8143, 58.2062, 1787.39, 40.7621, 808.645, 0.0, 100.0, 0.0, 100.0, -44.1341},
{-72674.8, 18.6383, 57.4178, 1792.73, 38.6599, 814.151, 0.0, 100.0, 0.0, 100.0, -46.1938}, {-72674.8, 18.6383, 57.4178, 1792.73, 38.6599, 814.151, 0.0, 100.0, 0.0, 100.0, -46.1938},
{-91505.5, 21.3861, 74.3410, 1701.58, 47.0587, 775.899, 0.0, 100.0, 0.0, 100.0, -60.2474}, {-91505.5, 21.3861, 74.3410, 1701.58, 47.0587, 775.899, 0.0, 100.0, 0.0, 100.0, -60.2474},
{-83845.2, 22.5012, 69.5789, 1719.58, 46.2164, 802.174, 0.0, 100.0, 0.0, 100.0, -62.2197}, {-83845.2, 22.5012, 69.5789, 1719.58, 46.2164, 802.174, 0.0, 100.0, 0.0, 100.0, -62.2197},
{-94982.5, 26.6225, 80.3819, 1718.49, 55.6598, 802.069, 0.0, 100.0, 0.0, 100.0, -77.5366}, {-94982.5, 26.6225, 80.3819, 1718.49, 55.6598, 802.069, 0.0, 100.0, 0.0, 100.0, -77.5366},
{-103353., 30.4029, 90.6941, 1669.32, 63.2028, 786.001, 0.0, 100.0, 0.0, 100.0, -92.0164}, {-103353.0, 30.4029, 90.6941, 1669.32, 63.2028, 786.001, 0.0, 100.0, 0.0, 100.0, -92.0164},
{-109674., 34.0847, 100.253, 1611.55, 69.7675, 768.847, 0.0, 100.0, 0.0, 100.0, -106.149}, {-109674.0, 34.0847, 100.253, 1611.55, 69.7675, 768.847, 0.0, 100.0, 0.0, 100.0, -106.149},
{-122599., 38.5014, 111.446, 1646.48, 80.5015, 781.588, 0.0, 100.0, 0.0, 100.0, -122.444}, {-122599.0, 38.5014, 111.446, 1646.48, 80.5015, 781.588, 0.0, 100.0, 0.0, 100.0, -122.444},
{-133564., 42.7143, 122.173, 1654.85, 90.2255, 785.564, 0.0, 100.0, 0.0, 100.0, -138.006}, {-133564.0, 42.7143, 122.173, 1654.85, 90.2255, 785.564, 0.0, 100.0, 0.0, 100.0, -138.006},
{0.0, 4.9680, 0.0, 100.0, 0.0, 100.0, 0.0, 100.0, 0.0, 100.0, 0.0}, {0.0, 4.9680, 0.0, 100.0, 0.0, 100.0, 0.0, 100.0, 0.0, 100.0, 0.0},
{0.0, 4.9680, 0.0, 100.0, 0.0, 100.0, 0.0, 100.0, 0.0, 100.0, 0.0} {0.0, 4.9680, 0.0, 100.0, 0.0, 100.0, 0.0, 100.0, 0.0, 100.0, 0.0}
}; };
static double dSi = 0.0;
static double dTold = 0.0;
static double dMrxold = 0.0;
void ThermInit(void) // 复制常量数组
{ for (int i = 0; i < 21; i++) {
dSi = 0.0; for (int j = 0; j < 11; j++) {
dTold = 0.0; therm->ThermConstants[i][j] = thermConstants[i][j];
dMrxold = 0.0; }
}
} }
void ThermDestroy(void) // 实现Run方法
{ void Therm_Run(Therm *therm, NGParSTRUCT *ptNGPar, Detail *detail) {
} // local variables
double coth(double x)
{
return cosh(x)/sinh(x);
}
void Run(NGParSTRUCT *ptNGPar, Detail *ptD)
{
double c, x, y, z; double c, x, y, z;
Detail_Run(ptD, ptNGPar);
Detail_dZdD(ptD, ptNGPar->dDf); // first run basic set of functions within AGA 8 (1994) Detail Method
CprCvrHS(ptNGPar, ptD); Detail_Run(detail, ptNGPar);
// find first partial derivative of Z wrt D
Detail_dZdD(detail, ptNGPar->dDf);
// find real gas cv, cp, specific enthalpy and entropy
Therm_CprCvrHS(therm, ptNGPar, detail);
// ratio of real gas specific heats
ptNGPar->dk = ptNGPar->dCp / ptNGPar->dCv; ptNGPar->dk = ptNGPar->dCp / ptNGPar->dCv;
// solve c in three steps, for clarity and ease of debugging
x = ptNGPar->dk * RGAS * 1000.0 * ptNGPar->dTf; x = ptNGPar->dk * RGAS * 1000.0 * ptNGPar->dTf;
y = ptNGPar->dMrx; y = ptNGPar->dMrx;
z = ptNGPar->dZf + ptNGPar->dDf * ptD->ddZdD; z = ptNGPar->dZf + ptNGPar->dDf * detail->ddZdD;
// calculate c, which is SOS^2
c = (x / y) * z; c = (x / y) * z;
// speed of sound
ptNGPar->dSOS = sqrt(c); ptNGPar->dSOS = sqrt(c);
// calculate the real gas isentropic exponent
// using expression functionally equivalent to Equation 3.2
ptNGPar->dKappa = (c * ptNGPar->dRhof) / ptNGPar->dPf; ptNGPar->dKappa = (c * ptNGPar->dRhof) / ptNGPar->dPf;
} }
double CpiMolar(NGParSTRUCT *ptNGPar) // 实现CpiMolar方法
{ double Therm_CpiMolar(Therm *therm, NGParSTRUCT *ptNGPar) {
double Cp = 0.0; double cp = 0.0;
double Cpx; double Cpx;
double DT, FT, HT, JT; double DT, FT, HT, JT;
double Dx, Fx, Hx, Jx; double Dx, Fx, Hx, Jx;
double T; double T;
int i;
T = ptNGPar->dTf; T = ptNGPar->dTf;
for (i = 0; i < NUMBEROFCOMPONENTS; i++)
{ for (int i = 0; i < NUMBEROFCOMPONENTS; i++) {
if (ptNGPar->adMixture[i] <= 0.0) continue; if (ptNGPar->adMixture[i] > 0) {
// 计算每个组分的贡献
Cpx = 0.0; Cpx = 0.0;
DT = ThermConstants[i][coefD] / T;
FT = ThermConstants[i][coefF] / T; // calculate species intermediate terms
HT = ThermConstants[i][coefH] / T; DT = therm->ThermConstants[i][therm->coefD] / T;
JT = ThermConstants[i][coefJ] / T; FT = therm->ThermConstants[i][therm->coefF] / T;
HT = therm->ThermConstants[i][therm->coefH] / T;
JT = therm->ThermConstants[i][therm->coefJ] / T;
// use intermediate terms to avoid redundant calcs
Dx = DT / sinh(DT); Dx = DT / sinh(DT);
Fx = FT / cosh(FT); Fx = FT / cosh(FT);
Hx = HT / sinh(HT); Hx = HT / sinh(HT);
Jx = JT / cosh(JT); Jx = JT / cosh(JT);
Cpx += ThermConstants[i][coefB];
Cpx += ThermConstants[i][coefC] * Dx * Dx; Cpx += therm->ThermConstants[i][therm->coefB];
Cpx += ThermConstants[i][coefE] * Fx * Fx; Cpx += therm->ThermConstants[i][therm->coefC] * Dx * Dx;
Cpx += ThermConstants[i][coefG] * Hx * Hx; Cpx += therm->ThermConstants[i][therm->coefE] * Fx * Fx;
Cpx += ThermConstants[i][coefI] * Jx * Jx; Cpx += therm->ThermConstants[i][therm->coefG] * Hx * Hx;
Cpx += therm->ThermConstants[i][therm->coefI] * Jx * Jx;
// use current mole fraction to weight the contribution
Cpx *= ptNGPar->adMixture[i]; Cpx *= ptNGPar->adMixture[i];
Cp += Cpx;
// add this contribution to the sum
cp += Cpx;
} }
Cp *= CalTH;
return Cp;
} }
double Ho(NGParSTRUCT *ptNGPar) return cp * therm->CAL_TH;
{ }
// 实现coth方法
double Therm_coth(double x) {
return 1.0 / tanh(x);
}
// 实现Ho方法
double Therm_Ho(Therm *therm, NGParSTRUCT *ptNGPar) {
double H = 0.0; double H = 0.0;
double Hx; double Hx;
double DT, FT, HT, JT; double DT, FT, HT, JT;
double cothDT, tanhFT, cothHT, tanhJT; double cothDT, tanhFT, cothHT, tanhJT;
double T; double T = ptNGPar->dTf;
int i;
T = ptNGPar->dTf; for (int i = 0; i < NUMBEROFCOMPONENTS; i++) {
for (i = 0; i < NUMBEROFCOMPONENTS; i++)
{
if (ptNGPar->adMixture[i] <= 0.0) continue; if (ptNGPar->adMixture[i] <= 0.0) continue;
Hx = 0.0; Hx = 0.0;
DT = ThermConstants[i][coefD] / T;
FT = ThermConstants[i][coefF] / T; DT = therm->ThermConstants[i][therm->coefD] / T;
HT = ThermConstants[i][coefH] / T; FT = therm->ThermConstants[i][therm->coefF] / T;
JT = ThermConstants[i][coefJ] / T; HT = therm->ThermConstants[i][therm->coefH] / T;
cothDT = coth(DT); JT = therm->ThermConstants[i][therm->coefJ] / T;
cothDT = Therm_coth(DT);
tanhFT = tanh(FT); tanhFT = tanh(FT);
cothHT = coth(HT); cothHT = Therm_coth(HT);
tanhJT = tanh(JT); tanhJT = tanh(JT);
Hx += ThermConstants[i][coefA];
Hx += ThermConstants[i][coefB] * T; Hx += therm->ThermConstants[i][therm->coefA];
Hx += ThermConstants[i][coefC] * ThermConstants[i][coefD] * cothDT; Hx += therm->ThermConstants[i][therm->coefB] * T;
Hx -= ThermConstants[i][coefE] * ThermConstants[i][coefF] * tanhFT; Hx += therm->ThermConstants[i][therm->coefC] * therm->ThermConstants[i][therm->coefD] * cothDT;
Hx += ThermConstants[i][coefG] * ThermConstants[i][coefH] * cothHT; Hx -= therm->ThermConstants[i][therm->coefE] * therm->ThermConstants[i][therm->coefF] * tanhFT;
Hx -= ThermConstants[i][coefI] * ThermConstants[i][coefJ] * tanhJT; Hx += therm->ThermConstants[i][therm->coefG] * therm->ThermConstants[i][therm->coefH] * cothHT;
Hx -= therm->ThermConstants[i][therm->coefI] * therm->ThermConstants[i][therm->coefJ] * tanhJT;
Hx *= ptNGPar->adMixture[i]; Hx *= ptNGPar->adMixture[i];
H += Hx; H += Hx;
} }
H *= CalTH;
H *= therm->CAL_TH;
H /= ptNGPar->dMrx; H /= ptNGPar->dMrx;
return H * 1.e3; return H * 1000.0;
} }
double So(NGParSTRUCT *ptNGPar) // 实现So方法
{ double Therm_So(Therm *therm, NGParSTRUCT *ptNGPar) {
double S = 0.0; double S = 0.0;
double Sx; double Sx;
double DT, FT, HT, JT; double DT, FT, HT, JT;
double cothDT, tanhFT, cothHT, tanhJT; double cothDT, tanhFT, cothHT, tanhJT;
double sinhDT, coshFT, sinhHT, coshJT; double sinhDT, coshFT, sinhHT, coshJT;
double T; double T = ptNGPar->dTf;
int i;
T = ptNGPar->dTf; for (int i = 0; i < NUMBEROFCOMPONENTS; i++) {
for (i = 0; i < NUMBEROFCOMPONENTS; i++)
{
if (ptNGPar->adMixture[i] <= 0.0) continue; if (ptNGPar->adMixture[i] <= 0.0) continue;
Sx = 0.0; Sx = 0.0;
DT = ThermConstants[i][coefD] / T;
FT = ThermConstants[i][coefF] / T; DT = therm->ThermConstants[i][therm->coefD] / T;
HT = ThermConstants[i][coefH] / T; FT = therm->ThermConstants[i][therm->coefF] / T;
JT = ThermConstants[i][coefJ] / T; HT = therm->ThermConstants[i][therm->coefH] / T;
cothDT = coth(DT); JT = therm->ThermConstants[i][therm->coefJ] / T;
cothDT = Therm_coth(DT);
tanhFT = tanh(FT); tanhFT = tanh(FT);
cothHT = coth(HT); cothHT = Therm_coth(HT);
tanhJT = tanh(JT); tanhJT = tanh(JT);
sinhDT = sinh(DT); sinhDT = sinh(DT);
coshFT = cosh(FT); coshFT = cosh(FT);
sinhHT = sinh(HT); sinhHT = sinh(HT);
coshJT = cosh(JT); coshJT = cosh(JT);
Sx += ThermConstants[i][coefK];
Sx += ThermConstants[i][coefB] * log(T); Sx += therm->ThermConstants[i][therm->coefK];
Sx += ThermConstants[i][coefC] * (DT * cothDT - log(sinhDT)); Sx += therm->ThermConstants[i][therm->coefB] * log(T);
Sx -= ThermConstants[i][coefE] * (FT * tanhFT - log(coshFT)); Sx += therm->ThermConstants[i][therm->coefC] * (DT * cothDT - log(sinhDT));
Sx += ThermConstants[i][coefG] * (HT * cothHT - log(sinhHT)); Sx -= therm->ThermConstants[i][therm->coefE] * (FT * tanhFT - log(coshFT));
Sx -= ThermConstants[i][coefI] * (JT * tanhJT - log(coshJT)); Sx += therm->ThermConstants[i][therm->coefG] * (HT * cothHT - log(sinhHT));
Sx -= therm->ThermConstants[i][therm->coefI] * (JT * tanhJT - log(coshJT));
Sx *= ptNGPar->adMixture[i]; Sx *= ptNGPar->adMixture[i];
S += Sx; S += Sx;
} }
S *= CalTH;
S *= therm->CAL_TH;
S /= ptNGPar->dMrx; S /= ptNGPar->dMrx;
return S * 1.e3; return S * 1000.0;
} }
void CprCvrHS(NGParSTRUCT *ptNGPar, Detail *ptD) // 实现CprCvrHS方法
{ void Therm_CprCvrHS(Therm *therm, NGParSTRUCT *ptNGPar, Detail *detail) {
double Cvinc, Cvr, Cpr; double Cvinc = 0.0;
double Hinc; double Cvr, Cpr;
double Sinc; double Hinc = 0.0;
double Smixing; double Sinc = 0.0;
double Cp, Si; double Smixing = 0.0;
double a, b, x; double Cp = Therm_CpiMolar(therm, ptNGPar);
int i; double Si;
Cvinc = 0.0;
Hinc = 0.0; ptNGPar->dHo = Therm_Ho(therm, ptNGPar);
Sinc = 0.0; Si = Therm_So(therm, ptNGPar);
Smixing = 0.0;
Cp = CpiMolar(ptNGPar);
ptNGPar->dHo = Ho(ptNGPar);
Si = So(ptNGPar);
ptNGPar->dCpi = (Cp * 1000.0) / ptNGPar->dMrx; ptNGPar->dCpi = (Cp * 1000.0) / ptNGPar->dMrx;
for (i = 0; i < GK_points; i++)
{ for (int i = 0; i < therm->GK_points; i++) {
x = ptNGPar->dDf * (1.0 + GK_root[i]) / 2.0; double x = ptNGPar->dDf * (1.0 + therm->GK_root[i]) / 2.0;
Detail_zdetail(ptD, x); Detail_zdetail(detail, x);
Detail_dZdT(ptD, x); Detail_dZdT(detail, x);
Detail_d2ZdT2(ptD, x); Detail_d2ZdT2(detail, x);
Hinc += GK_weight[i] * ptD->ddZdT / x;
Cvinc += GK_weight[i] * (2.0 * ptD->ddZdT + ptNGPar->dTf * ptD->dd2ZdT2) / x; Hinc += therm->GK_weight[i] * detail->ddZdT / x;
Sinc += GK_weight[i] * (ptD->dZ + ptNGPar->dTf * ptD->ddZdT - 1.0) / x; Cvinc += therm->GK_weight[i] * (2.0 * detail->ddZdT + ptNGPar->dTf * detail->dd2ZdT2) / x;
x = ptNGPar->dDf * (1.0 - GK_root[i]) / 2.0; Sinc += therm->GK_weight[i] * (detail->dZ + ptNGPar->dTf * detail->ddZdT - 1.0) / x;
Detail_zdetail(ptD, x);
Detail_dZdT(ptD, x); x = ptNGPar->dDf * (1.0 - therm->GK_root[i]) / 2.0;
Detail_d2ZdT2(ptD, x); Detail_zdetail(detail, x);
Hinc += GK_weight[i] * ptD->ddZdT / x; Detail_dZdT(detail, x);
Cvinc += GK_weight[i] * (2.0 * ptD->ddZdT + ptNGPar->dTf * ptD->dd2ZdT2) / x; Detail_d2ZdT2(detail, x);
Sinc += GK_weight[i] * (ptD->dZ + ptNGPar->dTf * ptD->ddZdT - 1.0) / x;
Hinc += therm->GK_weight[i] * detail->ddZdT / x;
Cvinc += therm->GK_weight[i] * (2.0 * detail->ddZdT + ptNGPar->dTf * detail->dd2ZdT2) / x;
Sinc += therm->GK_weight[i] * (detail->dZ + ptNGPar->dTf * detail->ddZdT - 1.0) / x;
} }
Detail_zdetail(ptD, ptNGPar->dDf);
Detail_dZdT(ptD, ptNGPar->dDf); Detail_zdetail(detail, ptNGPar->dDf);
Detail_d2ZdT2(ptD, ptNGPar->dDf); Detail_dZdT(detail, ptNGPar->dDf);
Detail_d2ZdT2(detail, ptNGPar->dDf);
Cvr = Cp - RGAS * (1.0 + ptNGPar->dTf * Cvinc * 0.5 * ptNGPar->dDf); Cvr = Cp - RGAS * (1.0 + ptNGPar->dTf * Cvinc * 0.5 * ptNGPar->dDf);
a = (ptNGPar->dZf + ptNGPar->dTf * ptD->ddZdT);
b = (ptNGPar->dZf + ptNGPar->dDf * ptD->ddZdD); double a = (ptNGPar->dZf + ptNGPar->dTf * detail->ddZdT);
double b = (ptNGPar->dZf + ptNGPar->dDf * detail->ddZdD);
double dPdT = RGAS * ptNGPar->dDf * a;
double dPdD = RGAS * ptNGPar->dTf * b;
Cpr = Cvr + RGAS * ((a * a) / b); Cpr = Cvr + RGAS * ((a * a) / b);
Cpr /= ptNGPar->dMrx; Cpr /= ptNGPar->dMrx;
Cvr /= ptNGPar->dMrx; Cvr /= ptNGPar->dMrx;
ptNGPar->dCv = Cvr * 1000.0; ptNGPar->dCp = Cpr * 1000.0;
ptNGPar->dH = ptNGPar->dHo + 1000.0 * RGAS * ptNGPar->dTf * ptNGPar->dCv = Cvr * 1000.0;
(ptNGPar->dZf - 1.0 - ptNGPar->dTf * Hinc * 0.5 * ptNGPar->dDf) / ptNGPar->dMrx; ptNGPar->dCp = Cpr * 1000.0;
for (i = 0; i < NUMBEROFCOMPONENTS; i++)
{ ptNGPar->dH = ptNGPar->dHo + 1000.0 * RGAS * ptNGPar->dTf * (
if (ptNGPar->adMixture[i] > 0.0) Smixing += ptNGPar->adMixture[i] * log(ptNGPar->adMixture[i]); ptNGPar->dZf - 1.0 - ptNGPar->dTf * Hinc * 0.5 * ptNGPar->dDf) / ptNGPar->dMrx;
for (int i = 0; i < NUMBEROFCOMPONENTS; i++) {
if (ptNGPar->adMixture[i] != 0) Smixing += ptNGPar->adMixture[i] * log(ptNGPar->adMixture[i]);
} }
Smixing *= RGAS; Smixing *= RGAS;
ptNGPar->dS = Si - Smixing - 1000.0 * RGAS *
(log(ptNGPar->dPf/101325.0) - log(ptNGPar->dZf) + Sinc * 0.5 * ptNGPar->dDf) / ptNGPar->dMrx; ptNGPar->dS = Si - Smixing - 1000.0 * RGAS * (
log(ptNGPar->dPf / 101325.0) - log(ptNGPar->dZf) + Sinc * 0.5 * ptNGPar->dDf) / ptNGPar->dMrx;
} }
void HS_Mode(NGParSTRUCT *ptNGPar, Detail *ptD, double H_target, double S_target, bool bGuess) // 实现HS_Mode方法
{ void Therm_HS_Mode(Therm *therm, NGParSTRUCT *ptNGPar, Detail *detail, double H, double S, bool bGuess) {
double s0, s1, s2, t0, t1, t2, tmin, tmax; double s0 = S;
double h0, h1, h2, p0, p1, p2, px, pmin, pmax; double h0 = H;
double t1, t2, tmin, tmax;
double p1, p2, px, pmin, pmax;
double delta1, delta2; double delta1, delta2;
double tolerance = 0.001; int i, j; double tolerance = 0.001;
s0 = S_target;
h0 = H_target; if (bGuess) {
if (bGuess)
{
t1 = ptNGPar->dTf; t1 = ptNGPar->dTf;
px = ptNGPar->dPf; px = ptNGPar->dPf;
pmax = px * 2.0; pmax = px * 2.0;
pmin = px * 0.1; pmin = px * 0.1;
tmax = t1 * 1.5; tmax = t1 * 1.5;
tmin = t1 * 0.67; tmin = t1 * 0.67;
} } else {
else {
t1 = 273.15; t1 = 273.15;
px = 1013250.0; pmax = P_MAX; px = 1013250.0;
pmin = 10000.0; tmax = T_MAX; pmax = P_MAX;
pmin = 10000.0;
tmax = T_MAX;
tmin = T_MIN; tmin = T_MIN;
} }
t2 = t1 + 10.0; t2 = t1 + 10.0;
Detail_Run(ptD, ptNGPar);
h1 = H(ptNGPar, ptD) - h0; Detail_Run(detail, ptNGPar);
for (i = 0; i < MAX_NUM_OF_ITERATIONS; i++) double h1 = Therm_H(therm, ptNGPar, detail) - h0;
{
for (int i = 0; i < MAX_NUM_OF_ITERATIONS; i++) {
ptNGPar->dTf = t2; ptNGPar->dTf = t2;
p1 = px; p2 = px * 0.1; ptNGPar->dPf = p1; p1 = px;
Detail_Run(ptD, ptNGPar); p2 = px * 0.1;
s1 = S(ptNGPar, ptD) - s0; ptNGPar->dPf = p1;
for (j = 0; j < MAX_NUM_OF_ITERATIONS; j++) Detail_Run(detail, ptNGPar);
{ double s1 = Therm_S(therm, ptNGPar, detail) - s0;
for (int j = 0; j < MAX_NUM_OF_ITERATIONS; j++) {
ptNGPar->dPf = p2; ptNGPar->dPf = p2;
Detail_Run(ptD, ptNGPar); Detail_Run(detail, ptNGPar);
s2 = S(ptNGPar, ptD) - s0; double s2 = Therm_S(therm, ptNGPar, detail) - s0;
delta2 = fabs(s1 - s2) / s0; delta2 = fabs(s1 - s2) / s0;
if (delta2 < tolerance) break; if (delta2 < tolerance) break;
p0 = p2;
double p0 = p2;
p2 = (p1 * s2 - p2 * s1) / (s2 - s1); p2 = (p1 * s2 - p2 * s1) / (s2 - s1);
if (p2 <= pmin)
{ if (p2 <= pmin) p2 = pmin;
p2 = pmin;
}
if (p2 >= pmax) p2 = pmax; if (p2 >= pmax) p2 = pmax;
p1 = p0; p1 = p0;
s1 = s2; s1 = s2;
} }
if (j >= MAX_NUM_OF_ITERATIONS)
ptNGPar->lStatus = MAX_NUM_OF_ITERATIONS_EXCEEDED; if (ptNGPar->lStatus == MAX_NUM_OF_ITERATIONS_EXCEEDED) break;
h2 = H(ptNGPar, ptD) - h0;
double h2 = Therm_H(therm, ptNGPar, detail) - h0;
delta1 = fabs(h1 - h2) / h0; delta1 = fabs(h1 - h2) / h0;
if (delta1 < tolerance && i > 0) break; if (delta1 < tolerance && i > 0) break;
t0 = t2;
double t0 = t2;
t2 = (t1 * h2 - t2 * h1) / (h2 - h1); t2 = (t1 * h2 - t2 * h1) / (h2 - h1);
if (t2 >= tmax) t2 = tmax; if (t2 >= tmax) t2 = tmax;
if (t2 <= tmin) if (t2 <= tmin) {
{
t2 = t0 + 10.0; t2 = t0 + 10.0;
ptNGPar->dTf = t2; ptNGPar->dTf = t2;
Detail_Run(ptD, ptNGPar); Detail_Run(detail, ptNGPar);
h2 = H(ptNGPar, ptD) - h0; h2 = Therm_H(therm, ptNGPar, detail) - h0;
} }
t1 = t0; t1 = t0;
h1 = h2; h1 = h2;
} }
if (i >= MAX_NUM_OF_ITERATIONS)
if (ptNGPar->lStatus == MAX_NUM_OF_ITERATIONS_EXCEEDED) {
ptNGPar->lStatus = MAX_NUM_OF_ITERATIONS_EXCEEDED; ptNGPar->lStatus = MAX_NUM_OF_ITERATIONS_EXCEEDED;
} }
double H(NGParSTRUCT *ptNGPar, Detail *ptD)
{
double Hinc;
double x;
int i;
Hinc = 0.0;
ptNGPar->dHo = Ho(ptNGPar);
for (i = 0; i < GK_points; i++)
{
x = ptNGPar->dDf * (1.0 + GK_root[i]) / 2.0;
Detail_zdetail(ptD, x);
Detail_dZdT(ptD, x);
Detail_d2ZdT2(ptD, x);
Hinc += GK_weight[i] * ptD->ddZdT / x;
if (i == 10) break;
x = ptNGPar->dDf * (1.0 - GK_root[i]) / 2.0;
Detail_zdetail(ptD, x);
Detail_dZdT(ptD, x);
Detail_d2ZdT2(ptD, x);
Hinc += GK_weight[i] * ptD->ddZdT / x;
} }
Detail_zdetail(ptD, ptNGPar->dDf);
Detail_dZdT(ptD, ptNGPar->dDf); // 实现H方法
Detail_d2ZdT2(ptD, ptNGPar->dDf); double Therm_H(Therm *therm, NGParSTRUCT *ptNGPar, Detail *detail) {
ptNGPar->dH = ptNGPar->dHo + 1000.0 * RGAS * ptNGPar->dTf * double Hinc = 0.0;
(ptNGPar->dZf - 1.0 - ptNGPar->dTf * Hinc * 0.5 * ptNGPar->dDf) / ptNGPar->dMrx; ptNGPar->dHo = Therm_Ho(therm, ptNGPar);
for (int i = 0; i < therm->GK_points; i++) {
double x = ptNGPar->dDf * (1.0 + therm->GK_root[i]) / 2.0;
Detail_zdetail(detail, x);
Detail_dZdT(detail, x);
Detail_d2ZdT2(detail, x);
Hinc += therm->GK_weight[i] * detail->ddZdT / x;
if (i == 10) break;
x = ptNGPar->dDf * (1.0 - therm->GK_root[i]) / 2.0;
Detail_zdetail(detail, x);
Detail_dZdT(detail, x);
Detail_d2ZdT2(detail, x);
Hinc += therm->GK_weight[i] * detail->ddZdT / x;
}
Detail_zdetail(detail, ptNGPar->dDf);
Detail_dZdT(detail, ptNGPar->dDf);
Detail_d2ZdT2(detail, ptNGPar->dDf);
ptNGPar->dH = ptNGPar->dHo + 1000.0 * RGAS * ptNGPar->dTf * (
ptNGPar->dZf - 1.0 - ptNGPar->dTf * Hinc * 0.5 * ptNGPar->dDf) / ptNGPar->dMrx;
return ptNGPar->dH; return ptNGPar->dH;
} }
double S(NGParSTRUCT *ptNGPar, Detail *ptD) // 实现S方法
{ double Therm_S(Therm *therm, NGParSTRUCT *ptNGPar, Detail *detail) {
double Sinc; double Sinc;
double Smixing; double Smixing;
double x; double x;
int i; int i;
// initialize integral
Sinc = 0.0; Sinc = 0.0;
// initialize entropy of mixing
Smixing = 0.0; Smixing = 0.0;
for (i = 0; i < GK_points; i++)
{ // integrate partial derivatives from D=0 to D=D, applying Gauss-Kronrod quadrature
x = ptNGPar->dDf * (1.0 + GK_root[i]) / 2.0; for (i = 0; i < therm->GK_points; i++) {
Detail_zdetail(ptD, x); // calculate 1st and 2nd partial derivatives of Z wrt T
Detail_dZdT(ptD, x); x = ptNGPar->dDf * (1.0 + therm->GK_root[i]) / 2.0;
Detail_d2ZdT2(ptD, x); Detail_zdetail(detail, x);
Sinc += GK_weight[i] * (ptD->dZ + ptNGPar->dTf * ptD->ddZdT - 1.0) / x; Detail_dZdT(detail, x);
Detail_d2ZdT2(detail, x);
Sinc += therm->GK_weight[i] * (detail->dZ + ptNGPar->dTf * detail->ddZdT - 1.0) / x;
if (i == 10) break; if (i == 10) break;
x = ptNGPar->dDf * (1.0 - GK_root[i]) / 2.0;
Detail_zdetail(ptD, x); x = ptNGPar->dDf * (1.0 - therm->GK_root[i]) / 2.0;
Detail_dZdT(ptD, x); Detail_zdetail(detail, x);
Detail_d2ZdT2(ptD, x); Detail_dZdT(detail, x);
Sinc += GK_weight[i] * (ptD->dZ + ptNGPar->dTf * ptD->ddZdT - 1.0) / x; Detail_d2ZdT2(detail, x);
Sinc += therm->GK_weight[i] * (detail->dZ + ptNGPar->dTf * detail->ddZdT - 1.0) / x;
} }
Detail_zdetail(ptD, ptNGPar->dDf);
Detail_dZdT(ptD, ptNGPar->dDf); // reset Z and partial deivatives dZdT and d2ZdT2
Detail_d2ZdT2(ptD, ptNGPar->dDf); Detail_zdetail(detail, ptNGPar->dDf);
if (ptNGPar->dTf != dTold || ptNGPar->dMrx != dMrxold) Detail_dZdT(detail, ptNGPar->dDf);
{ Detail_d2ZdT2(detail, ptNGPar->dDf);
dSi = So(ptNGPar);
dTold = ptNGPar->dTf; // find ideal gas entropy, but only if temperature or composition have changed
dMrxold = ptNGPar->dMrx; if (ptNGPar->dTf != therm->dTold || ptNGPar->dMrx != therm->dMrxold) {
therm->dSi = Therm_So(therm, ptNGPar);
therm->dTold = ptNGPar->dTf;
therm->dMrxold = ptNGPar->dMrx;
} }
for (i = 0; i < NUMBEROFCOMPONENTS; i++)
{ // calculate entropy of mixing
if (ptNGPar->adMixture[i] > 0.0) Smixing += ptNGPar->adMixture[i] * log(ptNGPar->adMixture[i]); for (i = 0; i < NUMBEROFCOMPONENTS; i++) {
if (ptNGPar->adMixture[i] != 0) Smixing += ptNGPar->adMixture[i] * log(ptNGPar->adMixture[i]);
} }
Smixing *= RGAS; Smixing *= RGAS;
ptNGPar->dS = dSi - Smixing - 1000.0 * RGAS *
(log(ptNGPar->dPf/101325.0) - log(ptNGPar->dZf) + Sinc * 0.5 * ptNGPar->dDf) / ptNGPar->dMrx; // calculate specific entropy
return ptNGPar->dS; ptNGPar->dS = therm->dSi - Smixing - 1000.0 * RGAS * (
log(ptNGPar->dPf / 101325.0) - log(ptNGPar->dZf) + Sinc * 0.5 * ptNGPar->dDf) / ptNGPar->dMrx;
return (ptNGPar->dS);
} }

View File

@ -1,7 +1,6 @@
/************************************************************************* /*************************************************************************
* : therm.h * <EFBFBD>ļ<EFBFBD>: therm.h
* : Therm类的头文件 * <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Therm<EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>ļ<EFBFBD>
**************************************************************************/ **************************************************************************/
#ifndef _THERM_H #ifndef _THERM_H
@ -10,64 +9,52 @@
#include "NGCal.h" #include "NGCal.h"
#include "Detail.h" #include "Detail.h"
// Therm类
typedef struct Therm { typedef struct Therm {
// 成员数据 double CAL_TH;
double dT; // 当前温度,单位开尔文(K) int coefA;
double dP; // 当前压力,单位帕斯卡(Pa) int coefB;
double dD; // 摩尔密度单位mol/dm3 int coefC;
double dRho; // 质量密度单位kg/m3 int coefD;
int coefE;
int coefF;
int coefG;
int coefH;
int coefI;
int coefJ;
int coefK;
double dPdD; // P对D的偏导数 double dPdD; // partial deriv of P wrt D
double dPdT; // partial deriv of P wrt T
double dSi; // ideal gas specific entropy, kJ/kg.K
double dTold; // temperature previously used
double dMrxold; // mixture molar mass previously used
double dPdT; // P对T的偏导数 int GK_points; // set the number of points for quadrature
double dSi; // 理想气体比熵单位kJ/kg.K double GK_root[5];
double dTold; // 之前使用的温度 double GK_weight[5];
double dMrxold; // 之前使用的混合物摩尔质量 double ThermConstants[21][11];
// 方法指针
double (*CpiMolar)(struct Therm*, NGParSTRUCT*);
void (*Run)(struct Therm*, NGParSTRUCT*, Detail*);
double (*Ho)(struct Therm*, NGParSTRUCT*);
double (*So)(struct Therm*, NGParSTRUCT*);
void (*CprCvrHS)(struct Therm*, NGParSTRUCT*, Detail*);
double (*H)(struct Therm*, NGParSTRUCT*, Detail*);
double (*S)(struct Therm*, NGParSTRUCT*, Detail*);
void (*HS_Mode)(struct Therm*, NGParSTRUCT*, Detail*, double, double, int);
} Therm; } Therm;
// Therm类的构造函数和析构函数 // 函数声明
Therm* Therm_construct(void); void Therm_Init(Therm *therm);
void Therm_destruct(Therm* obj);
// Therm类使用的其他数据 void Therm_Run(Therm *therm, NGParSTRUCT *ptNGPar, Detail *detail);
// 使用 extern 声明变量 double Therm_CpiMolar(Therm *therm, NGParSTRUCT *ptNGPar);
extern int GK_points;
extern double GK_root[5];
extern double GK_weight[5];
extern double ThermConstants[21][11];
// 热化学卡路里到焦耳的转换常数: 1 cal(IT) = 4.1840 J double Therm_coth(double x);
extern double CalTH ;
double Therm_Ho(Therm *therm, NGParSTRUCT *ptNGPar);
// 系数索引的枚举 double Therm_So(Therm *therm, NGParSTRUCT *ptNGPar);
enum CoefficientList {
coefA = 0,
coefB,
coefC,
coefD,
coefE,
coefF,
coefG,
coefH,
coefI,
coefJ,
coefK
};
void Therm_CprCvrHS(Therm *therm, NGParSTRUCT *ptNGPar, Detail *detail);
#endif void Therm_HS_Mode(Therm *therm, NGParSTRUCT *ptNGPar, Detail *detail, double H, double S, bool bGuess);
double Therm_H(Therm *therm, NGParSTRUCT *ptNGPar, Detail *detail);
double Therm_S(Therm *therm, NGParSTRUCT *ptNGPar, Detail *detail);
#endif // THERM__H

157
User/NG/main.c Normal file
View File

@ -0,0 +1,157 @@
#include <stdio.h>
#include "NGCal.h"
#include "FlowCal.h"
int main() {
// 定义并初始化 FlowParSTRUCT 结构体变量
FlowParSTRUCT flowParams = {0};
NGParSTRUCT ngParams = {0};
// 设置基本参数
flowParams.dPatm = 0.0981; // 标准大气压(bar)
flowParams.dPf = 1.48; // 压力(MPa)
flowParams.dPfType = 0; // 0=表压1=绝压
flowParams.dDp = 12.50; // 差压(kPa)
flowParams.dTf = 15.0; // 温度(°C)
flowParams.dCbtj = 0; // 参比条件类型(0=标准状态)
// 设置管道参数
flowParams.dPipeD = 259.38; // 管道内径(mm)
flowParams.dOrificeD = 150.25; // 孔板孔径(mm)
flowParams.dPipeType = 0; // 管道类型
flowParams.dPtmode = 0; // 取压方式(0=法兰取压1=角接取压)
// 设置材料参数
flowParams.dPipeMaterial = 2; // 20号钢
flowParams.dOrificeMaterial = 10; // 镍铬合金
// 设置天然气组分(示例: 95%甲烷5%其他)
// 初始化天然气组分数组(GB/T 21446-2008 典型示例组成)
for (int i = 0; i < NUMBEROFCOMPONENTS; i++) {
flowParams.dNG_Compents[i] = 0.0; // 先全部初始化为0
}
// 按照GB/T 21446-2008标准中典型天然气组分赋值(体积百分比)
flowParams.dNG_Compents[0] = 88.36; // 甲烷(CH4)
flowParams.dNG_Compents[1] = 0.68; // 氮气(N2)
flowParams.dNG_Compents[2] = 1.57; // 二氧化碳(CO2)
flowParams.dNG_Compents[3] = 6.25; // 乙烷(C2H6)
flowParams.dNG_Compents[4] = 2.4; // 丙烷(C3H8)
flowParams.dNG_Compents[5] = 0.00; // 水(H2O)
flowParams.dNG_Compents[6] = 0.00; // 硫化氢(H2S)
flowParams.dNG_Compents[7] = 0.04; // 氢气(H2)
flowParams.dNG_Compents[8] = 0.00; // 一氧化碳(CO)
flowParams.dNG_Compents[9] = 0.00; // 氧气(O2)
flowParams.dNG_Compents[10] = 0.15; // 异丁烷(i-C4H10)
flowParams.dNG_Compents[11] = 0.35; // 正丁烷(n-C4H10)
flowParams.dNG_Compents[12] = 0.05; // 异戊烷(i-C5H12)
flowParams.dNG_Compents[13] = 0.1; // 正戊烷(n-C5H12)
flowParams.dNG_Compents[14] = 0.01; // 己烷(C6H14)
flowParams.dNG_Compents[15] = 0.0; // 庚烷(C7H16)
flowParams.dNG_Compents[16] = 0.0; // 辛烷(C8H18)
flowParams.dNG_Compents[17] = 0.0; // 壬烷(C9H20)
flowParams.dNG_Compents[18] = 0.0; // 癸烷(C10H22)
flowParams.dNG_Compents[19] = 0.04; // 氦气(He)
flowParams.dNG_Compents[20] = 0.0; // 其他组分
// // 显式调用 NGCal_Init 初始化模块
// if (NGCal_NGCal != NGCal_Init()) {
// printf("错误NGCal 初始化失败!\n");
// return -1; // 退出程序
// }
// 调用流量计算函数
OFlowCal(&flowParams, &ngParams);
// 打印计算结果
printf("工况条件信息:\n");
printf("标准参比条件: %d\n", flowParams.dCbtj);
printf("计量参比压力: %.2f\n", flowParams.dPb_M);
printf("计量参比温度: %.2f\n", flowParams.dTb_M);
printf("能量参比压力: %.2f\n", flowParams.dPb_E);
printf("能量参比温度: %.2f\n", flowParams.dTb_E);
printf("大气压力: %.2f Pa\n", flowParams.dPatm);
printf("天然气组分:\n");
for (int i = 0; i < 21; i++) {
printf(" 组分 %d: %.6f\n", i, flowParams.dNG_Compents[i]);
}
printf("\n仪表参数:\n");
printf("仪表类型: %d\n", flowParams.dMeterType);
printf("核心类型: %d\n", flowParams.dCoreType);
printf("取压方式: %d\n", flowParams.dPtmode);
printf("管道类型: %d\n", flowParams.dPipeType);
printf("管道内径: %.2f mm\n", flowParams.dPipeD);
printf("管道材质: %d\n", flowParams.dPipeMaterial);
printf("孔板直径: %.2f mm\n", flowParams.dOrificeD);
printf("孔板材质: %d\n", flowParams.dOrificeMaterial);
printf("\n测量值:\n");
printf("压力: %.2f Pa\n", flowParams.dPf);
printf("压力类型: %d\n", flowParams.dPfType);
printf("温度: %.2f K\n", flowParams.dTf);
printf("差压: %.2f Pa\n", flowParams.dDp);
printf("仪表系数: %.6f\n", flowParams.dMeterFactor);
printf("脉冲数: %.2f\n", flowParams.dPulseNum);
printf("\n计算结果:\n");
printf("膨胀系数: %.6f\n", flowParams.dE);
printf("相对密度系数: %.6f\n", flowParams.dFG);
printf("超压缩系数: %.6f\n", flowParams.dFT);
printf("动力粘度: %.6f\n", flowParams.dDViscosity);
printf("热膨胀系数: %.6f\n", flowParams.dDExpCoefficient);
printf("管道雷诺数: %.2f\n", flowParams.dRnPipe);
printf("孔板弯曲系数: %.6f\n", flowParams.dBk);
printf("管道粗糙度: %.6f\n", flowParams.dRoughNessPipe);
printf("流出系数: %.6f\n", flowParams.dCd);
printf("流出系数修正: %.6f\n", flowParams.dCdCorrect);
printf("喷嘴流出系数: %.6f\n", flowParams.dCdNozell);
printf("标况体积流量: %.6f Nm3/s\n", flowParams.dVFlowb);
printf("工况体积流量: %.6f m3/s\n", flowParams.dVFlowf);
printf("质量流量: %.6f t/s\n", flowParams.dMFlowb);
printf("能量流量: %.6f MJ/s\n", flowParams.dEFlowb);
printf("流速: %.6f m/s\n", flowParams.dVelocityFlow);
printf("压力损失: %.6f\n", flowParams.dPressLost);
printf("直径比: %.6f\n", flowParams.dBeta);
printf("等熵指数: %.6f\n", flowParams.dKappa);
printf("压缩因子: %.6f\n", flowParams.dFpv);
printf("状态: %ld\n", ngParams.lStatus);
printf("强制更新标志: %d\n", ngParams.bForceUpdate);
printf("混合比:\n");
for (int i = 0; i < 21; i++) {
printf(" 组分 %d: %.6f\n", i, ngParams.adMixture[i]);
}
printf("参比条件: %d\n", ngParams.dCbtj);
printf("标准压力: %.2f Pa\n", ngParams.dPb);
printf("标准温度: %.2f K\n", ngParams.dTb);
printf("工作压力: %.2f Pa\n", ngParams.dPf);
printf("工作温度: %.2f K\n", ngParams.dTf);
printf("\nAGA 8 详细计算结果:\n");
printf("平均分子量: %.6f\n", ngParams.dMrx);
printf("标准条件下压缩因子: %.6f\n", ngParams.dZb);
printf("工作条件下压缩因子: %.6f\n", ngParams.dZf);
printf("超压缩因子: %.6f\n", ngParams.dFpv);
printf("标准条件下摩尔密度: %.6f moles/dm3\n", ngParams.dDb);
printf("工作条件下摩尔密度: %.6f moles/dm3\n", ngParams.dDf);
printf("标准条件下密度: %.6f kg/m3\n", ngParams.dRhob);
printf("工作条件下密度: %.6f kg/m3\n", ngParams.dRhof);
printf("理想相对密度: %.6f\n", ngParams.dRD_Ideal);
printf("实际相对密度: %.6f\n", ngParams.dRD_Real);
printf("\n热力学性质:\n");
printf("理想焓: %.6f\n", ngParams.dHo);
printf("实际焓: %.6f J/kg\n", ngParams.dH);
printf("实际熵: %.6f J/kg-mol.K\n", ngParams.dS);
printf("理想定压比热: %.6f J/kg-mol.K\n", ngParams.dCpi);
printf("实际定压比热: %.6f J/kg-mol.K\n", ngParams.dCp);
printf("实际定容比热: %.6f J/kg-mol.K\n", ngParams.dCv);
printf("比热比: %.6f\n", ngParams.dk);
printf("等熵指数: %.6f\n", ngParams.dKappa);
printf("声速: %.6f m/s\n", ngParams.dSOS);
printf("临界流函数: %.6f\n", ngParams.dCstar);
printf("\n单位摩尔高热值: %.6f\n", ngParams.dHhvMol);
printf("单位摩尔低热值: %.6f\n", ngParams.dLhvMol);
}

BIN
User/NG/main.obj Normal file

Binary file not shown.

View File

@ -184,7 +184,7 @@ static void key_thread_entry(void* parameter)
if( Key_Scan(KEY1_GPIO_PORT,KEY1_PIN) == KEY_ON )/* K1 被按下 */ if( Key_Scan(KEY1_GPIO_PORT,KEY1_PIN) == KEY_ON )/* K1 被按下 */
{ {
printf("挂起LED1线程\n"); printf("挂起LED1线程\n");
uwRet = rt_thread_suspend(led1_thread);/* 挂起LED1线程 */ uwRet = rt_thread_suspend(OFlowCal_thread);/* 挂起LED1线程 */
if(RT_EOK == uwRet) if(RT_EOK == uwRet)
{ {
rt_kprintf("挂起LED1线程成功\n"); rt_kprintf("挂起LED1线程成功\n");
@ -197,7 +197,7 @@ static void key_thread_entry(void* parameter)
if( Key_Scan(KEY2_GPIO_PORT,KEY2_PIN) == KEY_ON )/* K1 被按下 */ if( Key_Scan(KEY2_GPIO_PORT,KEY2_PIN) == KEY_ON )/* K1 被按下 */
{ {
printf("恢复LED1线程\n"); printf("恢复LED1线程\n");
uwRet = rt_thread_resume(led1_thread);/* 恢复LED1线程 */ uwRet = rt_thread_resume(OFlowCal_thread);/* 恢复LED1线程 */
if(RT_EOK == uwRet) if(RT_EOK == uwRet)
{ {
rt_kprintf("恢复LED1线程成功\n"); rt_kprintf("恢复LED1线程成功\n");