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

This commit is contained in:
廖德云 2025-07-06 22:29:58 +08:00
parent 562e7cd440
commit 63b930d4f6
38 changed files with 4936 additions and 5270 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'
Build target 'Fire_RT-Thread'
linking...
Program Size: Code=17398 RO-data=1042 RW-data=164 ZI-data=5852
FromELF: creating hex file...
"..\..\Output\Fire_RT-Thread.axf" - 0 Error(s), 0 Warning(s).
..\..\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.
Finished: 0 information, 0 warning, 0 error and 1 fatal error messages.
"..\..\Output\Fire_RT-Thread.axf" - 1 Error(s), 0 Warning(s).
<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
<h2>Collection of Component Files used:</h2>
Build Time Elapsed: 00:00:02
Target not created.
Build Time Elapsed: 00:00:04
</pre>
</body>
</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_usart.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 (..\..\Libraries\CMSIS\Device\ST\STM32H7xx\Include\stm32h7xx.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\rtservice.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)
I (..\..\Libraries\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal.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_usart.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)
I (..\..\User\NG\NGCal.h)(0x686A1BCB)
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)(0x686A87C2)
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\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\string.h)(0x6025237E)
F (..\..\User\NG\Detail.h)(0x686A0183)()
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)
I (..\..\User\NG\NGCal.h)(0x686A1BCB)
F (..\..\User\NG\Detail.h)(0x686A8399)()
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)(0x686A87C2)
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\math.h)(0x60252378)
I (..\..\User\NG\Therm.h)(0x686A0183)
I (..\..\User\NG\Detail.h)(0x686A0183)
I (..\..\User\NG\Therm.h)(0x686A839A)
I (..\..\User\NG\Detail.h)(0x686A8399)
I (d:\Keil_v5\ARM\ARMCC\include\stdbool.h)(0x6025237C)
F (..\..\User\NG\NGCal.h)(0x686A1BCB)()
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)
I (..\..\User\NG\NGCal.h)(0x686A1BCB)
I (d:\Keil_v5\ARM\ARMCC\include\String.h)(0x6025237E)
F (..\..\User\NG\NGCal.h)(0x686A87C2)()
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\stdlib.h)(0x60252374)
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 (..\..\User\NG\Therm.h)(0x686A0183)
F (..\..\User\NG\Therm.h)(0x686A0183)()
F (..\..\User\NG\FlowCal.h)(0x686A19F6)()
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)(0x686A1BCB)
F (..\..\User\NG\Therm.h)(0x686A839A)()
F (..\..\User\NG\FlowCal.h)(0x686A839A)()
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)
I (..\..\User\NG\NGCal.h)(0x686A87C2)
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\math.h)(0x60252378)
I (..\..\User\NG\Therm.h)(0x686A0183)
I (..\..\User\NG\Detail.h)(0x686A0183)
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)(0x686A19F6)
I (..\..\User\NG\FlowCal.h)(0x686A839A)
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)
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\rtm.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\Detail.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.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\stdlib.h
..\..\output\therm.o: d:\Keil_v5\ARM\ARMCC\Bin\..\include\math.h
..\..\output\therm.o: ..\..\User\NG\Detail.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 <stdlib.h>
#include <string.h>
Detail* Detail_Construct(void)
{
#define NUMBEROFCOMPONENTS 21
Detail *Detail_Construct(void) {
Detail *pDetail = (Detail *) malloc(sizeof(Detail));
if (!pDetail) return NULL;
if (!pDetail) {
return NULL; // 内存分配失败返回NULL
}
// 首先使用memset进行基础初始化
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->dOldPb = 0.0;
pDetail->dOldTb = 0.0;
pDetail->dOldPf = 0.0;
pDetail->dOldTf = 0.0;
for (int i = 0; i < NUMBEROFCOMPONENTS; i++)
pDetail->dXi[i] = 0;
Detail_table(pDetail);
// 初始化dXi数组
for (int i = 0; i < NUMBEROFCOMPONENTS; i++) {
pDetail->dXi[i] = 0.0;
}
// 调用表格初始化函数
if (Detail_table(pDetail) != 0) {
free(pDetail);
return NULL; // 表格初始化失败释放内存并返回NULL
}
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;
int i;
for (i = 0; i < NUMBEROFCOMPONENTS; i++)
dMixID += ((i + 2) * ptNGPar->adMixture[i]);
if (dMixID != pDetail->dOldMixID)
{
if (dMixID != pDetail->dOldMixID) {
pDetail->dOldMixID = dMixID;
return true;
}
else
{
} else {
return false;
}
}
void Detail_Run(Detail* pDetail, NGParSTRUCT *ptNGPar)
{
void Detail_Run(Detail *pDetail, NGParSTRUCT *ptNGPar) {
int i;
bool bCompChange = Detail_compositionchange(pDetail, ptNGPar);
ptNGPar->bForceUpdate = ptNGPar->bForceUpdate || bCompChange;
if (ptNGPar->bForceUpdate)
{
if (ptNGPar->bForceUpdate) {
pDetail->iNCC = 0;
for (i = 0; i < NUMBEROFCOMPONENTS; i++)
{
if (ptNGPar->adMixture[i] > 0.0)
{
for (i = 0; i < NUMBEROFCOMPONENTS; i++) {
if (ptNGPar->adMixture[i] > 0.0) {
pDetail->aiCID[pDetail->iNCC] = i;
pDetail->dXi[pDetail->iNCC] = ptNGPar->adMixture[i];
pDetail->iNCC++;
@ -56,9 +79,9 @@ void Detail_Run(Detail* pDetail, NGParSTRUCT *ptNGPar)
}
if ((fabs(ptNGPar->dPb - pDetail->dOldPb) > P_CHG_TOL) ||
(fabs(ptNGPar->dTb - pDetail->dOldTb) > T_CHG_TOL) ||
(ptNGPar->bForceUpdate))
{
pDetail->dP = ptNGPar->dPb * 1.0e-6; pDetail->dT = ptNGPar->dTb;
(ptNGPar->bForceUpdate)) {
pDetail->dP = ptNGPar->dPb * 1.0e-6;
pDetail->dT = ptNGPar->dTb;
Detail_temp(pDetail);
Detail_ddetail(pDetail, ptNGPar);
ptNGPar->dDb = pDetail->dRho;
@ -72,13 +95,11 @@ void Detail_Run(Detail* pDetail, NGParSTRUCT *ptNGPar)
}
pDetail->dP = ptNGPar->dPf * 1.0e-6;
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);
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);
ptNGPar->dDf = 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->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);
else
} else {
ptNGPar->lStatus = GENERAL_CALCULATION_FAILURE;
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 };
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};
}
int Detail_table(Detail *pDetail) {
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->adUn, adUn, sizeof(adUn));
for (int j = 0; j < NUMBEROFCOMPONENTS; j++) {
for (int k = j; k < NUMBEROFCOMPONENTS; k++) {
pDetail->adTable6Eij[j][k] = 1.0;
@ -242,30 +387,64 @@ void Detail_table(Detail* pDetail)
pDetail->adTable6Gij[2][5] = 1.673090;
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},
{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}
{
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
},
{
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));
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.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}
{
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.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));
return 0; // 初始化成功
}
void Detail_paramdl(Detail* pDetail)
{
void Detail_paramdl(Detail *pDetail) {
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++) {
pDetail->adTable5Qi[j] = 0.0;
@ -280,28 +459,23 @@ void Detail_paramdl(Detail* pDetail)
pDetail->adTable5Si[5] = 1.5822;
pDetail->adTable5Si[6] = 0.3900;
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->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->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->dFi[j] = 0.0;
if (pDetail->aiCID[j] == 7) pDetail->dFi[j] = pDetail->adTable5Fi[7];
pDetail->dSi[j] = pDetail->adTable5Si[pDetail->aiCID[j]];
pDetail->dWi[j] = pDetail->adTable5Wi[pDetail->aiCID[j]];
}
for (int j=0; j < pDetail->iNCC; j++)
{
for (int k=j; k < pDetail->iNCC; k++)
{
for (int j = 0; j < pDetail->iNCC; j++) {
for (int k = j; k < pDetail->iNCC; 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->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;
for (int j = 0; j < pDetail->iNCC; 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->dQp2 = q1p0 * q1p0;
}
void Detail_bvir(Detail* pDetail)
{
void Detail_bvir(Detail *pDetail) {
pDetail->dB = pDetail->ddBdT = pDetail->dd2BdT2 = 0.0;
double t = pDetail->dT;
double t0p5 = sqrt(t);
@ -429,24 +603,42 @@ void Detail_bvir(Detail* pDetail)
for (int i = 0; i < 18; i++) {
double bcoef = pDetail->adBcoef[i];
switch (i) {
case 0: Bx[i] = bcoef; break;
case 1: Bx[i] = bcoef / t0p5; break;
case 2: Bx[i] = bcoef / t; break;
case 3: Bx[i] = bcoef / t3p5; break;
case 4: Bx[i] = bcoef * t0p5; break;
case 5: Bx[i] = bcoef / t4p5; break;
case 6: Bx[i] = bcoef / t0p5; break;
case 7: Bx[i] = bcoef / t7p5; break;
case 8: Bx[i] = bcoef / t9p5; 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;
case 0: Bx[i] = bcoef;
break;
case 1: Bx[i] = bcoef / t0p5;
break;
case 2: Bx[i] = bcoef / t;
break;
case 3: Bx[i] = bcoef / t3p5;
break;
case 4: Bx[i] = bcoef * t0p5;
break;
case 5: Bx[i] = bcoef / t4p5;
break;
case 6: Bx[i] = bcoef / t0p5;
break;
case 7: Bx[i] = bcoef / t7p5;
break;
case 8: Bx[i] = bcoef / t9p5;
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;
}
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);
double tr = pDetail->dT / pDetail->dU;
double tr0p5 = sqrt(tr);
@ -498,8 +690,8 @@ void Detail_temp(Detail* pDetail)
pDetail->adFn[i] = an * tr_exp;
}
}
void Detail_ddetail(Detail* pDetail,NGParSTRUCT *ptNGPar)
{
void Detail_ddetail(Detail *pDetail, NGParSTRUCT *ptNGPar) {
int imax, i;
double epsp, epsr, epsmin;
double x1, x2, x3, y1, y2, y3;
@ -512,8 +704,7 @@ void Detail_ddetail(Detail* pDetail,NGParSTRUCT *ptNGPar)
pDetail->dRho = 0.0;
Detail_braket(pDetail, ptNGPar);
if (ptNGPar->lStatus == MAX_NUM_OF_ITERATIONS_EXCEEDED ||
ptNGPar->lStatus == NEGATIVE_DENSITY_DERIVATIVE)
{
ptNGPar->lStatus == NEGATIVE_DENSITY_DERIVATIVE) {
return;
}
x1 = pDetail->dRhoL;
@ -524,17 +715,14 @@ void Detail_ddetail(Detail* pDetail,NGParSTRUCT *ptNGPar)
delprv = delx;
x3 = x1;
y3 = y1;
for (i=0; i < imax; i++)
{
if (y2 * y3 > 0.0)
{
for (i = 0; i < imax; i++) {
if (y2 * y3 > 0.0) {
x3 = x1;
y3 = y1;
delx = x1 - x2;
delprv = delx;
}
if (fabs(y3) < fabs(y2))
{
if (fabs(y3) < fabs(y2)) {
x1 = x2;
x2 = x3;
x3 = x1;
@ -547,8 +735,7 @@ void Detail_ddetail(Detail* pDetail,NGParSTRUCT *ptNGPar)
if (fabs(delprv) < delmin || fabs(y1) < fabs(y2)) {
delx = delbis;
delprv = delbis;
} else
{
} else {
if (x3 != x1) {
y2my3 = y2 - y3;
y3my1 = y3 - y1;
@ -573,15 +760,13 @@ void Detail_ddetail(Detail* pDetail,NGParSTRUCT *ptNGPar)
pDetail->dRho = x2 + delx;
return;
}
if (fabs(delx) < delmin)
{
if (fabs(delx) < delmin) {
sgndel = delbis / fabs(delbis);
delx = 1.0000009 * sgndel * delmin;
delprv = delx;
}
boundn = delx * (x2 + delx - x3);
if (boundn > 0.0)
{
if (boundn > 0.0) {
delx = delbis;
delprv = delbis;
}
@ -594,8 +779,8 @@ void Detail_ddetail(Detail* pDetail,NGParSTRUCT *ptNGPar)
ptNGPar->lStatus = MAX_NUM_OF_ITERATIONS_EXCEEDED;
pDetail->dRho = x2;
}
void Detail_braket(Detail* pDetail,NGParSTRUCT *ptNGPar)
{
void Detail_braket(Detail *pDetail, NGParSTRUCT *ptNGPar) {
int imax, it;
double del, rhomax, videal;
double rho1, rho2, p1, p2;
@ -606,19 +791,14 @@ void Detail_braket(Detail* pDetail,NGParSTRUCT *ptNGPar)
if (pDetail->dT > 1.2593 * pDetail->dU)
rhomax = 20.0 * rhomax;
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);
}
else
{
} else {
rho2 = 1.15 / videal;
}
del = rho2 / 20.0;
for (it = 0; it < imax; it++)
{
if (rho2 > rhomax && ptNGPar->lStatus != MAX_DENSITY_IN_BRAKET_EXCEEDED)
{
for (it = 0; it < imax; it++) {
if (rho2 > rhomax && 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;
rho2 = rho1 + del;
@ -626,26 +806,21 @@ void Detail_braket(Detail* pDetail,NGParSTRUCT *ptNGPar)
}
Detail_pdetail(pDetail, rho2);
p2 = pDetail->dPCalc;
if (p2 > pDetail->dP)
{
if (p2 > pDetail->dP) {
pDetail->dRhoL = rho1;
pDetail->dPRhoL = p1;
pDetail->dRhoH = rho2;
pDetail->dPRhoH = p2;
ptNGPar->lStatus = NORMAL;
return;
}
else if (p2 > p1)
{
} else if (p2 > p1) {
if (ptNGPar->lStatus == MAX_DENSITY_IN_BRAKET_EXCEEDED)
del *= 2.0;
rho1 = rho2;
p1 = p2;
rho2 = rho1 + del;
continue;
}
else
{
} else {
ptNGPar->lStatus = NEGATIVE_DENSITY_DERIVATIVE;
pDetail->dRho = rho1;
return;
@ -655,12 +830,12 @@ void Detail_braket(Detail* pDetail,NGParSTRUCT *ptNGPar)
pDetail->dRho = rho2;
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;
}
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;
D1 = pDetail->dKp3 * d;
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;
return pDetail->dZ;
}
double Detail_dZdT(Detail* pDetail,double d)
{
double Detail_dZdT(Detail *pDetail, double d) {
double tmp;
int i;
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);
exp3 = exp(-D3);
exp4 = exp(-D4);
for (i=12; i < 58; i++)
{
if (pDetail->adUn[i] && pDetail->adFn[i])
{
for (i = 12; i < 58; i++) {
if (pDetail->adUn[i] && pDetail->adFn[i]) {
pDetail->fx[i] = (pDetail->adFn[i] * pDetail->adUn[i] * D1) / pDetail->dT;
}
else
{
} else {
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;
return pDetail->ddZdT;
}
double Detail_d2ZdT2(Detail* pDetail,double d)
{
double Detail_d2ZdT2(Detail *pDetail, double d) {
double tmp;
int i;
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);
exp3 = exp(-D3);
exp4 = exp(-D4);
for (i=12; i < 58; 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);
}
else
{
for (i = 12; i < 58; 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);
} else {
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;
return pDetail->dd2ZdT2;
}
double Detail_dZdD(Detail* pDetail,double d)
{
double Detail_dZdD(Detail *pDetail, double d) {
double temp, temp1, temp2, temp3;
int i;
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);
exp3 = exp(-D3);
exp4 = exp(-D4);
for (i=12; i < 58; i++)
{
for (i = 12; i < 58; i++) {
pDetail->fx[i] = pDetail->adFn[i];
}
pDetail->ddZdD = pDetail->dB / pDetail->dKp3;
if (pDetail->dF)
{
if (pDetail->dF) {
temp1 = -9.0 * D3 * exp3;
temp2 = (1.0 - 3.0 * D3) * exp3;
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;
}
temp1 = -4.0 * D2 * exp2;
temp2 = (1.0 - 2.0 * D2) * exp2 ; 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 ;
temp2 = (1.0 - 2.0 * D2) * exp2;
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;
temp2 = (1.0 - 4.0 * D4) * exp4;
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 ;
pDetail->ddZdD += pDetail->fx[18] * temp ; pDetail->ddZdD += pDetail->fx[19] * temp ;
temp = temp1 + temp2 + temp3;
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;
temp2 = (2.0 - 2.0 * D2) * 2.0 * D1 * exp2;
temp3 = -temp2 * D2;
@ -893,39 +1066,67 @@ double Detail_dZdD(Detail* pDetail,double d)
pDetail->ddZdD += pDetail->fx[30] * temp;
pDetail->ddZdD += pDetail->fx[31] * temp;
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 ;
pDetail->ddZdD += pDetail->fx[32] * temp ; pDetail->ddZdD += pDetail->fx[33] * temp ;
temp2 = (3.0 - 3.0 * D3) * 3.0 * D2 * exp3;
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;
temp2 = (3.0 - 4.0 * D4) * 3.0 * D2 * exp4 ; temp3 = -(3.0 - 4.0 * D4) * D6 * 4.0 * exp4 ; 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 ;
temp2 = (3.0 - 4.0 * D4) * 3.0 * D2 * exp4;
temp3 = -(3.0 - 4.0 * D4) * D6 * 4.0 * exp4;
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;
temp2 = (4.0 - 2.0 * D2) * 4.0 * D3 * exp2 ; temp3 = -(4.0 - 2.0 * D2) * 2.0 * D5 * exp2 ; temp = temp1 + temp2 + temp3 ;
pDetail->ddZdD += pDetail->fx[39] * temp ; pDetail->ddZdD += pDetail->fx[40] * temp ; pDetail->ddZdD += pDetail->fx[41] * temp ;
temp = -16.0 * D7 * exp4 + (4.0 - 4.0 * D4) * 4.0 * D3 * exp4 ; temp -= (4.0 - 4.0 * D4) * D7 * 4.0 * exp4 ;
pDetail->ddZdD += pDetail->fx[42] * temp ; pDetail->ddZdD += pDetail->fx[43] * temp ;
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 ;
temp2 = (4.0 - 2.0 * D2) * 4.0 * D3 * exp2;
temp3 = -(4.0 - 2.0 * D2) * 2.0 * D5 * exp2;
temp = temp1 + temp2 + temp3;
pDetail->ddZdD += pDetail->fx[39] * temp;
pDetail->ddZdD += pDetail->fx[40] * temp;
pDetail->ddZdD += pDetail->fx[41] * temp;
temp = -16.0 * D7 * exp4 + (4.0 - 4.0 * D4) * 4.0 * D3 * exp4;
temp -= (4.0 - 4.0 * D4) * D7 * 4.0 * exp4;
pDetail->ddZdD += pDetail->fx[42] * temp;
pDetail->ddZdD += pDetail->fx[43] * temp;
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;
temp = 49.0 * D6 ; 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 ;
temp = 49.0 * D6;
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;
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;
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 ;
pDetail->ddZdD += pDetail->fx[54] * 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 ;
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;
pDetail->ddZdD += pDetail->fx[54] * 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;
return pDetail->ddZdD;
}
void Detail_relativedensity(Detail* pDetail,NGParSTRUCT *ptNGPar)
{
void Detail_relativedensity(Detail *pDetail, NGParSTRUCT *ptNGPar) {
double dBX, dZa;
const double dMWair = 28.96256;
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
#define _DETAIL_H
#include "NGCal.h"
#include <stdbool.h> // 添加bool类型支持
#include <stdbool.h> // <EFBFBD><EFBFBD><EFBFBD>bool<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD>
// 使用结构体替代C++类
typedef struct Detail
{
// 私有成员数据
int iNCC; // 组分数目
// ʹ<>ýṹ<C3BD><E1B9B9><EFBFBD><EFBFBD><EFBFBD>C++<2B><>
typedef struct Detail {
// ˽<>г<EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>
int iNCC; // <20><><EFBFBD><EFBFBD><EFBFBD>Ŀ
int aiCID[21]; // 组分ID
// 五个历史变量用于提高重复计算时的效率
double dOldMixID; // 上一次计算的混合物ID
double dOldPb; // 上一次计算的Pb
double dOldTb; // 上一次计算的Tb
double dOldPf; // 上一次计算的Pf
double dOldTf; // 上一次计算的Tf
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; // <20><>һ<EFBFBD>μ<EFBFBD><CEBC><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD>ID
double dOldPb; // <20><>һ<EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD>Pb
double dOldTb; // <20><>һ<EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD>Tb
double dOldPf; // <20><>һ<EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD>Pf
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 adUn[58];
// 表5中的特征参数
double dMri[21]; // 第i组分的分子量
double dEi[21]; // 第i组分的特征能量参数
double dKi[21]; // 第i组分的尺寸参数 - m^3/kg-mol ^1/3
double dGi[21]; // 第i组分的取向参数
double dQi[21]; // 第i组分的四极参数
double dFi[21]; // 第i组分的高温参数
double dSi[21]; // 第i组分的偶极参数
double dWi[21]; // 第i组分的缔合参数
// <EFBFBD><EFBFBD>5<EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double dMri[21]; // <20><>i<EFBFBD><69>ֵķ<D6B5><C4B7><EFBFBD><EFBFBD><EFBFBD>
double dEi[21]; // <20><>i<EFBFBD><69>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double dKi[21]; // <20><>i<EFBFBD><69>ֵijߴ<C4B3><DFB4><EFBFBD><EFBFBD> - m^3/kg-mol ^1/3
double dGi[21]; // <20><>i<EFBFBD><69>ֵ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>
double dQi[21]; // <20><>i<EFBFBD><69>ֵ<EFBFBD><D6B5>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
double dFi[21]; // <20><>i<EFBFBD><69>ֵĸ<D6B5><C4B8>²<EFBFBD><C2B2><EFBFBD>
double dSi[21]; // <20><>i<EFBFBD><69>ֵ<EFBFBD>ż<EFBFBD><C5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double dWi[21]; // <20><>i<EFBFBD><69>ֵĵ޺ϲ<DEBA><CFB2><EFBFBD>
double dEij[21][21]; // 维里系数能量二元相互作用参数
double dUij[21][21]; // 共形能量的二元相互作用参数
double dKij[21][21]; // 尺寸的二元相互作用参数
double dGij[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]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD>Ԫ<EFBFBD><EFBFBD><E0BBA5><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
double dKij[21][21]; // <20>ߴ<EFBFBD>Ķ<EFBFBD>Ԫ<EFBFBD><EFBFBD><E0BBA5><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
double dGij[21][21]; // ȡ<><C8A1>Ķ<EFBFBD>Ԫ<EFBFBD><EFBFBD><E0BBA5><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
double adTable6Eij[21][21]; // 表6常数
double adTable6Uij[21][21]; // 表6常数
double adTable6Kij[21][21]; // 表6常数
double adTable6Gij[21][21]; // 表6常数
double adTable6Eij[21][21]; // <20><>6<EFBFBD><36><EFBFBD><EFBFBD>
double adTable6Uij[21][21]; // <20><>6<EFBFBD><36><EFBFBD><EFBFBD>
double adTable6Kij[21][21]; // <20><>6<EFBFBD><36><EFBFBD><EFBFBD>
double adTable6Gij[21][21]; // <20><>6<EFBFBD><36><EFBFBD><EFBFBD>
double adTable5Qi[21]; // 表5常数
double adTable5Fi[21]; // 表5常数
double adTable5Si[21]; // 表5常数
double adTable5Wi[21]; // 表5常数
double adTable5Qi[21]; // <20><>5<EFBFBD><35><EFBFBD><EFBFBD>
double adTable5Fi[21]; // <20><>5<EFBFBD><35><EFBFBD><EFBFBD>
double adTable5Si[21]; // <20><>5<EFBFBD><35><EFBFBD><EFBFBD>
double adTable5Wi[21]; // <20><>5<EFBFBD><35><EFBFBD><EFBFBD>
double adTableHhvMol[4][21]; //GB/T11062 摩尔高位发热量
double adTableLhvMol[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 Ħ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double dXi[21]; // 第i组分的摩尔分数
double dPCalc; // 由pdetail()计算的压力
double dT; // 当前温度
double dP; // 当前压力
double dRhoTP; // 在T和P下的摩尔密度
double dB; // 第二维里系数B
double adBcoef[18]; // 计算B的18个系数
double adFn[58]; // 密度系数的函数
double fx[58]; // 用于3个导数的修改系数
double dU; // 混合物能量参数
double dKp3; // 混合物尺寸参数的立方
double dW; // 混合物取向参数
double dQp2; // 混合物四极参数的平方
double dF; // 高温参数
double dRho; // 摩尔密度
double dRhoL; // 用于braket函数的低密度
double dRhoH; // 用于braket函数的高密度
double dPRhoL; // 用于braket函数的低压
double dPRhoH; // 用于braket函数的高压
double dXi[21]; // <20><>i<EFBFBD><69>ֵ<EFBFBD>Ħ<EFBFBD><C4A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double dPCalc; // <20><>pdetail()<29><><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>
double dT; // <20><>ǰ<EFBFBD><EFBFBD>
double dP; // <20><>ǰѹ<C7B0><D1B9>
double dRhoTP; // <20><>T<EFBFBD><54>P<EFBFBD>µ<EFBFBD>Ħ<EFBFBD><C4A6><EFBFBD>ܶ<EFBFBD>
double dB; // <20>ڶ<EFBFBD>ά<EFBFBD><CEAC>ϵ<EFBFBD><CFB5>B
double adBcoef[18]; // <20><><EFBFBD><EFBFBD>B<EFBFBD><42>18<31><38>ϵ<EFBFBD><CFB5>
double adFn[58]; // <20>ܶ<EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD>ĺ<EFBFBD><C4BA><EFBFBD>
double fx[58]; // <20><><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>ϵ<EFBFBD><CFB5>
double dU; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double dKp3; // <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double dW; // <20><><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>
double dQp2; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>
double dF; // <20><><EFBFBD>²<EFBFBD><C2B2><EFBFBD>
double dRho; // Ħ<><C4A6><EFBFBD>ܶ<EFBFBD>
double dRhoL; // <20><><EFBFBD><EFBFBD>braket<65><74><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>ܶ<EFBFBD>
double dRhoH; // <20><><EFBFBD><EFBFBD>braket<65><74><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8>ܶ<EFBFBD>
double dPRhoL; // <20><><EFBFBD><EFBFBD>braket<65><74><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ѹ
double dPRhoH; // <20><><EFBFBD><EFBFBD>braket<65><74><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD>ѹ
// 公共变量,也用于高级流体性质计算
double dZ; // 当前压缩因子
double ddZdT; // Z对T的一阶偏导数
double dd2ZdT2; // Z对T的二阶偏导数
double ddZdD; // Z对摩尔密度的一阶偏导数
double ddBdT; // B对T的一阶偏导数
double dd2BdT2; // B对T的二阶偏导数
// <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; // <20><>ǰѹ<C7B0><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double ddZdT; // Z<><5A>T<EFBFBD><54>һ<EFBFBD><D2BB>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
double dd2ZdT2; // Z<><5A>T<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
double ddZdD; // Z<><5A>Ħ<EFBFBD><C4A6><EFBFBD>ܶȵ<DCB6>һ<EFBFBD><D2BB>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
double ddBdT; // B<><42>T<EFBFBD><54>һ<EFBFBD><D2BB>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
double dd2BdT2; // B<><42>T<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD>
} Detail;
// 构造函数和析构函数
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Detail *Detail_Construct(void);
void Detail_Destroy(Detail *pDetail);
// 私有方法
// ˽<EFBFBD>з<EFBFBD><EFBFBD><EFBFBD>
int Detail_compositionchange(Detail *pDetail, NGParSTRUCT *pAGA10);
void Detail_table(Detail* pDetail);
int Detail_table(Detail *pDetail);
void Detail_paramdl(Detail *pDetail);
void Detail_chardl(Detail *pDetail, NGParSTRUCT *pAGA10);
void Detail_bvir(Detail *pDetail);
void Detail_temp(Detail *pDetail);
void Detail_braket(Detail *pDetail, NGParSTRUCT *pAGA10);
void Detail_pdetail(Detail *pDetail, double dRho);
void Detail_ddetail(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_dZdT(Detail *pDetail, double dRho);
double Detail_d2ZdT2(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

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
#define _FLOWCAL_H
#ifndef FLOWCAL_H
#define FLOWCAL_H
#include "NGCal.h"
#include "Detail.h"
/* 天然气物性参数的数据结构 */
typedef struct FlowParSTRUCT
{
//流量计算输入参数信息
/* <20><>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ */
typedef struct FlowParSTRUCT {
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
int dCbtj; //计量参比条件压力
double dPb_M; //计量参比条件压力
double dTb_M; //计量参比条件温度
double dPb_E; //燃烧参比条件压力
double dTb_E; //燃烧参比条件温度
double dPatm;//当地大气压 Pa
double dNG_Compents[21] ;//天然气组分
int dCbtj; //<2F><><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>
double dPb_M; //<2F><><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>
double dTb_M; //<2F><><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double dPb_E; //ȼ<>ղα<D5B2><CEB1><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>
double dTb_E; //ȼ<>ղα<D5B2><CEB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double dPatm; //<2F><><EFBFBD>ش<EFBFBD><D8B4><EFBFBD>ѹ Pa
double dNG_Compents[21]; //<2F><>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD>
int dMeterType;// 流量计类别
int dCoreType;//节流装置类型
int dPtmode; //取压方式
int dPipeType; // 管道类型
double dPipeD; //管道内径 mm
int dPipeMaterial; //管道材料
int dMeterType; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int dCoreType; //<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int dPtmode; //ȡѹ<C8A1><D1B9>ʽ
int dPipeType; // <20>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD>
double dPipeD; //<2F>ܵ<EFBFBD><DCB5>ھ<EFBFBD> mm
int dPipeMaterial; //<2F>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD>
double dOrificeD; //孔板孔径mm
int dOrificeMaterial; //孔板材料
double dOrificeD; //<2F>װ<EFBFBD>׾<EFBFBD>mm
int dOrificeMaterial; //<2F>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>
double dPf;//输入压力 Pa
int dPfType; //压力类型
double dTf; //输入温度 K
double dDp; //输入差压 Pa
double dPf; //<2F><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9> Pa
int dPfType; //ѹ<><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double dTf; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> K
double dDp; //<2F><><EFBFBD><EFBFBD><EFBFBD>ѹ Pa
double dMeterFactor;//仪表系数
double dPulseNum;//脉冲数
//流量计算输出参数
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;//超压缩因子
double dMeterFactor; //<2F>DZ<EFBFBD>ϵ<EFBFBD><CFB5>
double dPulseNum; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<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;
double CaiLiaoPzxs(int tempCaiLiao);
double calculateK(int dPipeType);
double calculateRoughnessFactor(double D_pipe, double K, double C);

View File

View File

@ -1,55 +1,59 @@
#include "NGCal.h"
#include "Therm.h"
#include "Detail.h"
#include "String.h"
static Therm *ptTherm;
static Detail *ptDetail;
int NGCal_Init(void)
{
ptDetail = (Detail *)malloc(sizeof(Detail));
if (NULL == ptDetail )
{
int NGCal_Init(NGParSTRUCT *ptNGPar) {
//ptDetail = (Detail *)malloc(sizeof(Detail));
ptDetail = Detail_Construct();
if (NULL == ptDetail) {
return MEMORY_ALLOCATION_ERROR;
}
// Detail_Run(ptDetail,ptNGPar);
// Detail_compositionchange(ptDetail,ptNGPar);
ptTherm = (Therm *) malloc(sizeof(Therm));
if (NULL == ptTherm )
{
Therm_Init(ptTherm);
if (NULL == ptTherm) {
return MEMORY_ALLOCATION_ERROR;
}
return NGCal_NGCal;
}
int NGCal_UnInit(void)
{
int NGCal_UnInit(void) {
if (ptDetail) free(ptDetail);
if (ptTherm) free(ptTherm);
return 0;
}
double SOS(NGParSTRUCT *ptNGPar)
{
if (NULL == ptDetail || NULL == ptTherm)
{
double SOS(NGParSTRUCT *ptNGPar) {
if (NULL == ptDetail || NULL == ptTherm) {
NGCal_UnInit();
NGCal_Init();
NGCal_Init(ptNGPar);
}
ptTherm->Run(ptTherm,ptNGPar, ptDetail);
Therm_Run(ptTherm, ptNGPar, ptDetail);
ptNGPar->dCstar = 0.0;
return ptNGPar->dSOS;
}
double Crit(NGParSTRUCT *ptNGPar, double dPlenumVelocity)
{
double Crit(NGParSTRUCT *ptNGPar, double dPlenumVelocity) {
double DH, DDH, S, H;
double tolerance = 1.0;
double R, P, T, Z;
int i;
if (NULL == ptDetail || NULL == ptTherm)
{
if (NULL == ptDetail || NULL == ptTherm) {
NGCal_UnInit();
if (NGCal_NGCal != NGCal_Init())
{
if (NGCal_NGCal != NGCal_Init(ptNGPar)) {
ptNGPar->lStatus = MEMORY_ALLOCATION_ERROR;
return 0.0;
}
}
ptTherm->Run(ptTherm,ptNGPar, ptDetail);
Therm_Run(ptTherm, ptNGPar, ptDetail);
DH = (ptNGPar->dSOS * ptNGPar->dSOS - dPlenumVelocity * dPlenumVelocity) / 2.0;
S = ptNGPar->dS;
H = ptNGPar->dH;
@ -58,10 +62,9 @@ double Crit(NGParSTRUCT *ptNGPar, double dPlenumVelocity)
Z = ptNGPar->dZf;
T = ptNGPar->dTf;
DDH = 10.0;
for (i = 1; i < MAX_NUM_OF_ITERATIONS; i++)
{
ptTherm->HS_Mode(ptTherm,ptNGPar, ptDetail, H - DH, S, true);
ptTherm->Run(ptTherm,ptNGPar, ptDetail);
for (i = 1; i < MAX_NUM_OF_ITERATIONS; i++) {
Therm_HS_Mode(ptTherm, ptNGPar, ptDetail, H - DH, S, true);
Therm_Run(ptTherm, ptNGPar, ptDetail);
DDH = DH;
DH = (ptNGPar->dSOS * ptNGPar->dSOS - dPlenumVelocity * dPlenumVelocity) / 2.0;
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->dPf = P;
ptNGPar->dTf = T;
ptTherm->Run(ptTherm,ptNGPar, ptDetail);
Therm_Run(ptTherm, ptNGPar, ptDetail);
return ptNGPar->dCstar;
}
double Cperf(NGParSTRUCT *ptNGPar)
{
double Cperf(NGParSTRUCT *ptNGPar) {
double k, root, exponent;
k = ptNGPar->dKappa;
root = 2.0 / (k + 1.0);
exponent = (k + 1.0) / (k - 1.0);
return (sqrt(k * pow(root, exponent)));
}
double CRi(NGParSTRUCT *ptNGPar)
{
double CRi(NGParSTRUCT *ptNGPar) {
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 <stdlib.h>
#include <math.h>
/* 状态码 */
/* ״̬<EFBFBD><EFBFBD> */
#define NORMAL 9000
#define NGCal_NGCal 9001
#define MEMORY_ALLOCATION_ERROR 9002
@ -26,73 +26,73 @@
#define FLOW_CALC_DIEDAI_ERROR 9008
/* 组分数 */
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
#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
/* 默认容差限制 */
/* Ĭ<EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
#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 */
#define P_MAX 1.379e8 /* 最大压力(Pa) ~= 20,000 psi */
#define P_MIN 0.0 /* 最小压力 = 0 */
#define T_MAX 473.15 /* 最高温度(K) ~= 392 F */
#define T_MIN 143.0 /* 最低温度(K) ~= -200 F */
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>P<EFBFBD><EFBFBD>T */
#define P_MAX 1.379e8 /* <EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD>(Pa) ~= 20,000 psi */
#define P_MIN 0.0 /* <EFBFBD><EFBFBD>Сѹ<EFBFBD><EFBFBD> = 0 */
#define T_MAX 473.15 /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(K) ~= 392 F */
#define T_MIN 143.0 /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(K) ~= -200 F */
/* 通用气体常数,两种配置 */
#define RGASKJ 8.314510e-3 /* 单位: kJ mol^-1 K^-1 */
#define RGAS 8.314510 /* 单位: J mol^-1 K^-1 */
/* ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
#define RGASKJ 8.314510e-3 /* <EFBFBD><EFBFBD>λ: kJ 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
{
long lStatus; /* 计算状态 */
int bForceUpdate; /* 执行完整计算的信号 */
double adMixture[21]; /* 摩尔分数组成 */
int dCbtj; /* 参比条件 0 101.325MPa 20℃1:101325MPa15℃2:101325MPa0℃ */
double dPb; /* 合同基准压力(Pa) */
double dTb; /* 合同基准温度(K) */
double dPf; /* 绝对压力(Pa) */
double dTf; /* 流动温度(K) */
long lStatus; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ */
int bForceUpdate; /* ִ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD> */
double adMixture[21]; /* Ħ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
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; /* <EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD>׼ѹ<EFBFBD><EFBFBD>(Pa) */
double dTb; /* <EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD>׼<EFBFBD><EFBFBD>(K) */
double dPf; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD>(Pa) */
double dTf; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(K) */
/* AGA 8 Detail方法的基本输出 */
double dMrx; /* 混合物摩尔质量 */
double dZb; /* 合同基准条件下的压缩系数 */
double dZf; /* 流动条件下的压缩系数 */
double dFpv; /* 超压缩系数 */
double dDb; /* 合同基准条件下的摩尔密度(moles/dm3) */
double dDf; /* 流动条件下的摩尔密度(moles/dm3) */
double dRhob; /* 合同基准条件下的质量密度(kg/m3) */
double dRhof; /* 流动条件下的质量密度(kg/m3) */
double dRD_Ideal; /* 理想气体相对密度 */
double dRD_Real; /* 真实气体相对密度 */
/* AGA 8 Detail<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
double dMrx; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ħ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
double dZb; /* <EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>ѹ<EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD> */
double dZf; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>ѹ<EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD> */
double dFpv; /* <EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD> */
double dDb; /* <EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>Ħ<EFBFBD><EFBFBD><EFBFBD>ܶ<EFBFBD>(moles/dm3) */
double dDf; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>Ħ<EFBFBD><EFBFBD><EFBFBD>ܶ<EFBFBD>(moles/dm3) */
double dRhob; /* <EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD>׼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܶ<EFBFBD>(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; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܶ<EFBFBD> */
double dRD_Real; /* <EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܶ<EFBFBD> */
/* 附加输出 */
double dHo; /* 理想气体比焓 */
double dH; /* 真实气体比焓(J/kg) */
double dS; /* 真实气体比熵(J/kg-mol.K) */
double dCpi; /* 理想气体定压热容(J/kg-mol.K) */
double dCp; /* 真实气体定压热容(J/kg-mol.K) */
double dCv; /* 真实气体定容热容(J/kg-mol.K) */
double dk; /* 比热比 */
double dKappa; /* 等熵指数用希腊字母kappa表示 */
double dSOS; /* 声速(m/s) */
double dCstar; /* 临界流系数C* */
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
double dHo; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
double dH; /* <EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(J/kg) */
double dS; /* <EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(J/kg-mol.K) */
double dCpi; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嶨ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(J/kg-mol.K) */
double dCp; /* <EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD>嶨ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(J/kg-mol.K) */
double dCv; /* <EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(J/kg-mol.K) */
double dk; /* <EFBFBD><EFBFBD><EFBFBD>ȱ<EFBFBD> */
double dKappa; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸkappa<EFBFBD><EFBFBD>ʾ */
double dSOS; /* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>(m/s) */
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 dLhvMol; /*低位摩尔发热量*/
double dHhvMol; /*<EFBFBD><EFBFBD>λĦ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
double dLhvMol; /*<EFBFBD><EFBFBD>λĦ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
} NGParSTRUCT;
/* 用于跟踪气体组分的枚举 */
/* <EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ö<EFBFBD><EFBFBD> */
enum gascomp {
XiC1=0, XiN2, XiCO2, XiC2, XiC3,
XiH2O, XiH2S, XiH2, XiCO, XiO2,
@ -100,14 +100,14 @@ enum gascomp {
XiNC7, XiNC8, XiNC9, XiNC10, XiHe, XiAr
};
/* 初始化函数原型 */
int AGA10_Init(void); /* 初始化 */
int AGA10_UnInit(void); /* 反初始化 */
/* <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD> */
int NGCal_Init(NGParSTRUCT * ptNGPar); /* <20><>ʼ<EFBFBD><CABC> */
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 *);
/* C*计算的函数原型 */
/* C*<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĺ<EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD> */
double Crit(NGParSTRUCT *, double);
#endif

View File

@ -2,21 +2,22 @@
#include "Therm.h"
#include "Detail.h"
#include "FlowCal.h"
#include "math.h"
void OFlowCal(FlowParSTRUCT * ptFlowPar,NGParSTRUCT * ptNGPar)
{
//大气压力转换成Pa
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Pa
double tempPatm = ptFlowPar->dPatm*1000000;
//压力转换成Pa
//ѹ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Pa
double tempPf = ptFlowPar->dPf*1000000;
//差压转换成Pa
//<EFBFBD><EFBFBD>ѹת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Pa
double tempDP = ptFlowPar->dDp*1000;
//温度转换成K
//<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>K
double tempTf = ptFlowPar->dTf+273.15;
if (ptFlowPar->dPfType == 0) //0是表压
if (ptFlowPar->dPfType == 0) //0<EFBFBD>DZ<EFBFBD>ѹ
{
ptFlowPar->dPf = tempPatm + tempPf;
ptNGPar ->dPf=tempPatm + tempPf;
@ -62,12 +63,12 @@ void OFlowCal(FlowParSTRUCT * ptFlowPar,NGParSTRUCT * ptNGPar)
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;
// 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->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->dBeta, ptFlowPar->dKappa);
double D = ptFlowPar->dPipeD / 1000.0; // 管道内径(m)
double d = ptFlowPar->dOrificeD / 1000.0; // 孔板孔径(m)
double D = ptFlowPar->dPipeD / 1000.0; // <EFBFBD>ܵ<EFBFBD><EFBFBD>ھ<EFBFBD>(m)
double d = ptFlowPar->dOrificeD / 1000.0; // <EFBFBD>װ<EFBFBD>׾<EFBFBD>(m)
double beta = ptFlowPar->dBeta;
double P1 = ptFlowPar->dPf; // 绝对压力(Pa)
double deltaP = ptFlowPar->dDp; // 差压(Pa)
double P1 = ptFlowPar->dPf; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD>(Pa)
double deltaP = ptFlowPar->dDp; // <EFBFBD><EFBFBD>ѹ(Pa)
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 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; // 初始工况流量(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;
int maxIter = 100;
double currentC = C_initial;
@ -103,30 +104,30 @@ void OFlowCal(FlowParSTRUCT * ptFlowPar,NGParSTRUCT * ptNGPar)
int iter = 0;
double prevC = 0;
// 4. 迭代循环
// 4. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD>
do {
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);
// 4.2 更新流量
// 4.2 <EFBFBD><EFBFBD><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 更新雷诺数
// 4.3 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><EFBFBD>
currentReD = calculateReD(Qf, D, ptNGPar->dRhof, ptFlowPar->dDViscosity);
iter++;
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);
// 5. 保存最终结果
// 在迭代计算流出系数后,添加粗糙度修正
double K = calculateK(ptFlowPar->dPipeType); // 根据实际管道类型选择
// 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); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ʹܵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>
double G_me = calculateRoughnessFactor(ptFlowPar->dPipeD, K, currentC);
double C_corrected = currentC * G_me;
@ -134,33 +135,33 @@ void OFlowCal(FlowParSTRUCT * ptFlowPar,NGParSTRUCT * ptNGPar)
ptFlowPar->dRoughNessPipe = G_me;
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)
* (ptFlowPar->dTb_M) / Tf;
ptFlowPar->dVFlowb = Qn;
// 标况质量流量
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ptFlowPar->dMFlowb = ptFlowPar->dVFlowb * ptNGPar->dRhob;
// 标况能量流量
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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));
}
/// <summary>
/// 材料膨胀系数计算
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="tempCaiLiao"></param>
/// <returns></returns>
double CaiLiaoPzxs(int tempCaiLiao)
{
double CaiLiaoPzxs = 0;
// 孔板和管道材料的膨胀系数
// 0 A3、15号钢
// 1 10 号钢
// 2 20 号钢
// 3 45 号钢
// <EFBFBD>װ<EFBFBD>͹ܵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD>
// 0 A3<EFBFBD><EFBFBD>15<EFBFBD>Ÿ<EFBFBD>
// 1 10 <EFBFBD>Ÿ<EFBFBD>
// 2 20 <EFBFBD>Ÿ<EFBFBD>
// 3 45 <EFBFBD>Ÿ<EFBFBD>
// 4 1 Cr13?2Cr13
// 5 Cr17
// 6 12 CrMoV
@ -168,10 +169,10 @@ void OFlowCal(FlowParSTRUCT * ptFlowPar,NGParSTRUCT * ptNGPar)
// 8 Cr6SiMo
// 9 X20CrMoV121
// 10 1 Cr18Ni9Ti
// 11 普通碳钢
// 12 工业用铜
// 13 黄铜
// 14 红铜
// 11 <EFBFBD><EFBFBD>̼ͨ<EFBFBD><EFBFBD>
// 12 <EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD>ͭ
// 13 <EFBFBD><EFBFBD>ͭ
// 14 <EFBFBD><EFBFBD>ͭ
switch (tempCaiLiao)
{
case 0:
@ -237,9 +238,9 @@ void OFlowCal(FlowParSTRUCT * ptFlowPar,NGParSTRUCT * ptNGPar)
return CaiLiaoPzxs;
}
/**
* K (GB/T 21446-2008 C)
* @param dPipeType
* @return K (4)
* <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;
@ -277,8 +278,8 @@ double calculateK(int dPipeType) {
Jdccd = 0.25;
break;
default:
// 处理未知类型(可选)
fprintf(stderr, "未知的管道类型: %d\n", dPipeType);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ֪<EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>
fprintf(stderr, "δ֪<EFBFBD>Ĺܵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: %d\n", dPipeType);
return FLOW_CALC_ERROR;
}
return Jdccd;
@ -286,119 +287,119 @@ double calculateK(int dPipeType) {
/**
* G_me (GB/T 21446-2008 C)
* @param D_pipe (mm)
* @param K (mm)
* @param C
* @return G_me (4)
* <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) {
// 计算相对粗糙度 K/D
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դֲڶ<EFBFBD> K/D
double K_over_D = K / D_pipe;
// 判断是否需要修正
// <EFBFBD>ж<EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (K_over_D <= 0.0004) {
return 1.0000;
}
// 计算修正项
double term = (K_over_D * 1e6) - 400; // 转换为无量纲项
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double term = (K_over_D * 1e6) - 400; // ת<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
}
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)
* @param beta
* @return E
* <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));
}
/**
* FGGB/T 21446-2008 (9)
* @param dRD_Real
* @return FG
* <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);
}
/**
* FTGB/T 21446-2008 (10)
* @param dTb_M (K)
* @param dTf (K)
* @return FT
* <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);
}
/**
* εGB/T 21446-2008 (11)
* @param dPf (Pa)
* @param dDp (Pa)
* @param beta
* @param dKappa
* @return ε
* <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; // 压力比
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));
return epsilon;
}
/**
* κGB/T 21446-2008
* @param dZf
* @return κ
* <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) {
// 近似公式:基于理想气体比热比和压缩因子修正
double gamma = 1.3; // 天然气典型比热比Cp/Cv≈1.3
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><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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; // <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));
return kappa;
}
/**
* ReDGB/T 21446-2008 (5)
* @param Qf (m3/s)
* @param D (m)
* @param rho (kg/m3)
* @param mu (Pa·s)
* @return
* <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);
}
/**
* CGB/T 21446-2008 A
* @param beta
* @param ReD
* @param D_mm (mm)
* @param ptMode
* @return C
* <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;
// 根据取压方式确定L1/L2角接取压
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡѹ<EFBFBD><EFBFBD>ʽȷ<EFBFBD><EFBFBD>L1/L2<4C><32><EFBFBD>ǽ<EFBFBD>ȡѹ<C8A1><D1B9>
switch (ptMode) {
case 1: // 角接取压
L1 = L2 = 0; // D单位为mm
case 1: // <EFBFBD>ǽ<EFBFBD>ȡѹ
L1 = L2 = 0; // D<EFBFBD><EFBFBD>λΪmm
break;
case 0: // 法兰取压
case 0: // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡѹ
L1 = L2 = 25.4 / D_mm;
break;
case 2: // D-D/2ȡѹ
@ -406,7 +407,7 @@ double calculateCd(double beta, double ReD, double D_mm, int ptMode) {
L2 = 0.47;
break;
default:
fprintf(stderr, "不支持的取压方式: %d\n", ptMode);
fprintf(stderr, "<EFBFBD><EFBFBD>֧<EFBFBD>ֵ<EFBFBD>ȡѹ<EFBFBD><EFBFBD>ʽ: %d\n", ptMode);
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;
// 孔径<71.12mm修正
// <EFBFBD>׾<EFBFBD><71.12mm<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (D_mm < 71.12) {
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) {
}
/**
* μ
* @param tempP_jy (MPa)
* @param tempT (K)
* @return (Pa·s)
* <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] = {

View File

@ -1,30 +1,46 @@
#include "NGCal.h"
#include "Detail.h"
#include "Therm.h"
#include "therm.h"
#include <math.h>
#include <stdbool.h>
static void CprCvrHS(NGParSTRUCT *ptNGPar, Detail *ptD);
static double H(NGParSTRUCT *ptNGPar, Detail *ptD);
static double S(NGParSTRUCT *ptNGPar, Detail *ptD);
static void HS_Mode(NGParSTRUCT *ptNGPar, Detail *ptD, double H_target, double S_target, bool bGuess);
double CalTH = 4.1840;
double GK_root[5] = {
0.14887433898163121088,
0.43339539412924719080,
0.67940956829902440263,
0.86506336668898451073,
0.97390652851717172008
};
double GK_weight[5] = {
0.29552422471475286217,
0.26926671930999634918,
0.21908636251598204295,
0.14945134915058059038,
0.066671344308688137179
};
int GK_points = 5;
double ThermConstants[NUMBEROFCOMPONENTS][11] = {
#include "Detail.h"
// 初始化Therm实例
void Therm_Init(Therm *therm) {
therm->CAL_TH = 4.1840;
therm->coefA = 0;
therm->coefB = 1;
therm->coefC = 2;
therm->coefD = 3;
therm->coefE = 4;
therm->coefF = 5;
therm->coefG = 6;
therm->coefH = 7;
therm->coefI = 8;
therm->coefJ = 9;
therm->coefK = 10;
therm->dPdD = 0.0;
therm->dPdT = 0.0;
therm->dSi = 0.0;
therm->dTold = 0.0;
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},
{-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},
@ -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},
{-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},
{-5565.60, 6.66789, 2.33458, 2584.98, .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},
{-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, 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},
{-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},
{-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},
{-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},
{-109674., 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},
{-133564., 42.7143, 122.173, 1654.85, 90.2255, 785.564, 0.0, 100.0, 0.0, 100.0, -138.006},
{-103353.0, 30.4029, 90.6941, 1669.32, 63.2028, 786.001, 0.0, 100.0, 0.0, 100.0, -92.0164},
{-109674.0, 34.0847, 100.253, 1611.55, 69.7675, 768.847, 0.0, 100.0, 0.0, 100.0, -106.149},
{-122599.0, 38.5014, 111.446, 1646.48, 80.5015, 781.588, 0.0, 100.0, 0.0, 100.0, -122.444},
{-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}
};
static double dSi = 0.0;
static double dTold = 0.0;
static double dMrxold = 0.0;
void ThermInit(void)
{
dSi = 0.0;
dTold = 0.0;
dMrxold = 0.0;
// 复制常量数组
for (int i = 0; i < 21; i++) {
for (int j = 0; j < 11; j++) {
therm->ThermConstants[i][j] = thermConstants[i][j];
}
}
}
void ThermDestroy(void)
{
}
double coth(double x)
{
return cosh(x)/sinh(x);
}
void Run(NGParSTRUCT *ptNGPar, Detail *ptD)
{
// 实现Run方法
void Therm_Run(Therm *therm, NGParSTRUCT *ptNGPar, Detail *detail) {
// local variables
double c, x, y, z;
Detail_Run(ptD, ptNGPar);
Detail_dZdD(ptD, ptNGPar->dDf);
CprCvrHS(ptNGPar, ptD);
// first run basic set of functions within AGA 8 (1994) Detail Method
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;
// solve c in three steps, for clarity and ease of debugging
x = ptNGPar->dk * RGAS * 1000.0 * ptNGPar->dTf;
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;
// speed of sound
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;
}
double CpiMolar(NGParSTRUCT *ptNGPar)
{
double Cp = 0.0;
// 实现CpiMolar方法
double Therm_CpiMolar(Therm *therm, NGParSTRUCT *ptNGPar) {
double cp = 0.0;
double Cpx;
double DT, FT, HT, JT;
double Dx, Fx, Hx, Jx;
double T;
int i;
T = ptNGPar->dTf;
for (i = 0; i < NUMBEROFCOMPONENTS; i++)
{
if (ptNGPar->adMixture[i] <= 0.0) continue;
for (int i = 0; i < NUMBEROFCOMPONENTS; i++) {
if (ptNGPar->adMixture[i] > 0) {
// 计算每个组分的贡献
Cpx = 0.0;
DT = ThermConstants[i][coefD] / T;
FT = ThermConstants[i][coefF] / T;
HT = ThermConstants[i][coefH] / T;
JT = ThermConstants[i][coefJ] / T;
// calculate species intermediate terms
DT = therm->ThermConstants[i][therm->coefD] / 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);
Fx = FT / cosh(FT);
Hx = HT / sinh(HT);
Jx = JT / cosh(JT);
Cpx += ThermConstants[i][coefB];
Cpx += ThermConstants[i][coefC] * Dx * Dx;
Cpx += ThermConstants[i][coefE] * Fx * Fx;
Cpx += ThermConstants[i][coefG] * Hx * Hx;
Cpx += ThermConstants[i][coefI] * Jx * Jx;
Cpx += therm->ThermConstants[i][therm->coefB];
Cpx += therm->ThermConstants[i][therm->coefC] * Dx * Dx;
Cpx += therm->ThermConstants[i][therm->coefE] * Fx * Fx;
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];
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 Hx;
double DT, FT, HT, JT;
double cothDT, tanhFT, cothHT, tanhJT;
double T;
int i;
T = ptNGPar->dTf;
for (i = 0; i < NUMBEROFCOMPONENTS; i++)
{
double T = ptNGPar->dTf;
for (int i = 0; i < NUMBEROFCOMPONENTS; i++) {
if (ptNGPar->adMixture[i] <= 0.0) continue;
Hx = 0.0;
DT = ThermConstants[i][coefD] / T;
FT = ThermConstants[i][coefF] / T;
HT = ThermConstants[i][coefH] / T;
JT = ThermConstants[i][coefJ] / T;
cothDT = coth(DT);
DT = therm->ThermConstants[i][therm->coefD] / T;
FT = therm->ThermConstants[i][therm->coefF] / T;
HT = therm->ThermConstants[i][therm->coefH] / T;
JT = therm->ThermConstants[i][therm->coefJ] / T;
cothDT = Therm_coth(DT);
tanhFT = tanh(FT);
cothHT = coth(HT);
cothHT = Therm_coth(HT);
tanhJT = tanh(JT);
Hx += ThermConstants[i][coefA];
Hx += ThermConstants[i][coefB] * T;
Hx += ThermConstants[i][coefC] * ThermConstants[i][coefD] * cothDT;
Hx -= ThermConstants[i][coefE] * ThermConstants[i][coefF] * tanhFT;
Hx += ThermConstants[i][coefG] * ThermConstants[i][coefH] * cothHT;
Hx -= ThermConstants[i][coefI] * ThermConstants[i][coefJ] * tanhJT;
Hx += therm->ThermConstants[i][therm->coefA];
Hx += therm->ThermConstants[i][therm->coefB] * T;
Hx += therm->ThermConstants[i][therm->coefC] * therm->ThermConstants[i][therm->coefD] * cothDT;
Hx -= therm->ThermConstants[i][therm->coefE] * therm->ThermConstants[i][therm->coefF] * tanhFT;
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];
H += Hx;
}
H *= CalTH;
H *= therm->CAL_TH;
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 Sx;
double DT, FT, HT, JT;
double cothDT, tanhFT, cothHT, tanhJT;
double sinhDT, coshFT, sinhHT, coshJT;
double T;
int i;
T = ptNGPar->dTf;
for (i = 0; i < NUMBEROFCOMPONENTS; i++)
{
double T = ptNGPar->dTf;
for (int i = 0; i < NUMBEROFCOMPONENTS; i++) {
if (ptNGPar->adMixture[i] <= 0.0) continue;
Sx = 0.0;
DT = ThermConstants[i][coefD] / T;
FT = ThermConstants[i][coefF] / T;
HT = ThermConstants[i][coefH] / T;
JT = ThermConstants[i][coefJ] / T;
cothDT = coth(DT);
DT = therm->ThermConstants[i][therm->coefD] / T;
FT = therm->ThermConstants[i][therm->coefF] / T;
HT = therm->ThermConstants[i][therm->coefH] / T;
JT = therm->ThermConstants[i][therm->coefJ] / T;
cothDT = Therm_coth(DT);
tanhFT = tanh(FT);
cothHT = coth(HT);
cothHT = Therm_coth(HT);
tanhJT = tanh(JT);
sinhDT = sinh(DT);
coshFT = cosh(FT);
sinhHT = sinh(HT);
coshJT = cosh(JT);
Sx += ThermConstants[i][coefK];
Sx += ThermConstants[i][coefB] * log(T);
Sx += ThermConstants[i][coefC] * (DT * cothDT - log(sinhDT));
Sx -= ThermConstants[i][coefE] * (FT * tanhFT - log(coshFT));
Sx += ThermConstants[i][coefG] * (HT * cothHT - log(sinhHT));
Sx -= ThermConstants[i][coefI] * (JT * tanhJT - log(coshJT));
Sx += therm->ThermConstants[i][therm->coefK];
Sx += therm->ThermConstants[i][therm->coefB] * log(T);
Sx += therm->ThermConstants[i][therm->coefC] * (DT * cothDT - log(sinhDT));
Sx -= therm->ThermConstants[i][therm->coefE] * (FT * tanhFT - log(coshFT));
Sx += therm->ThermConstants[i][therm->coefG] * (HT * cothHT - log(sinhHT));
Sx -= therm->ThermConstants[i][therm->coefI] * (JT * tanhJT - log(coshJT));
Sx *= ptNGPar->adMixture[i];
S += Sx;
}
S *= CalTH;
S *= therm->CAL_TH;
S /= ptNGPar->dMrx;
return S * 1.e3;
return S * 1000.0;
}
void CprCvrHS(NGParSTRUCT *ptNGPar, Detail *ptD)
{
double Cvinc, Cvr, Cpr;
double Hinc;
double Sinc;
double Smixing;
double Cp, Si;
double a, b, x;
int i;
Cvinc = 0.0;
Hinc = 0.0;
Sinc = 0.0;
Smixing = 0.0;
Cp = CpiMolar(ptNGPar);
ptNGPar->dHo = Ho(ptNGPar);
Si = So(ptNGPar);
// 实现CprCvrHS方法
void Therm_CprCvrHS(Therm *therm, NGParSTRUCT *ptNGPar, Detail *detail) {
double Cvinc = 0.0;
double Cvr, Cpr;
double Hinc = 0.0;
double Sinc = 0.0;
double Smixing = 0.0;
double Cp = Therm_CpiMolar(therm, ptNGPar);
double Si;
ptNGPar->dHo = Therm_Ho(therm, ptNGPar);
Si = Therm_So(therm, ptNGPar);
ptNGPar->dCpi = (Cp * 1000.0) / ptNGPar->dMrx;
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;
Cvinc += GK_weight[i] * (2.0 * ptD->ddZdT + ptNGPar->dTf * ptD->dd2ZdT2) / x;
Sinc += GK_weight[i] * (ptD->dZ + ptNGPar->dTf * ptD->ddZdT - 1.0) / x;
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;
Cvinc += GK_weight[i] * (2.0 * ptD->ddZdT + ptNGPar->dTf * ptD->dd2ZdT2) / x;
Sinc += GK_weight[i] * (ptD->dZ + ptNGPar->dTf * ptD->ddZdT - 1.0) / x;
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;
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;
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;
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_d2ZdT2(ptD, ptNGPar->dDf);
Detail_zdetail(detail, ptNGPar->dDf);
Detail_dZdT(detail, ptNGPar->dDf);
Detail_d2ZdT2(detail, 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 /= 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->dZf - 1.0 - ptNGPar->dTf * Hinc * 0.5 * ptNGPar->dDf) / ptNGPar->dMrx;
for (i = 0; i < NUMBEROFCOMPONENTS; i++)
{
if (ptNGPar->adMixture[i] > 0.0) Smixing += ptNGPar->adMixture[i] * log(ptNGPar->adMixture[i]);
ptNGPar->dCv = Cvr * 1000.0;
ptNGPar->dCp = Cpr * 1000.0;
ptNGPar->dH = ptNGPar->dHo + 1000.0 * RGAS * ptNGPar->dTf * (
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;
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)
{
double s0, s1, s2, t0, t1, t2, tmin, tmax;
double h0, h1, h2, p0, p1, p2, px, pmin, pmax;
// 实现HS_Mode方法
void Therm_HS_Mode(Therm *therm, NGParSTRUCT *ptNGPar, Detail *detail, double H, double S, bool bGuess) {
double s0 = S;
double h0 = H;
double t1, t2, tmin, tmax;
double p1, p2, px, pmin, pmax;
double delta1, delta2;
double tolerance = 0.001; int i, j;
s0 = S_target;
h0 = H_target;
if (bGuess)
{
double tolerance = 0.001;
if (bGuess) {
t1 = ptNGPar->dTf;
px = ptNGPar->dPf;
pmax = px * 2.0;
pmin = px * 0.1;
tmax = t1 * 1.5;
tmin = t1 * 0.67;
}
else {
} else {
t1 = 273.15;
px = 1013250.0; pmax = P_MAX;
pmin = 10000.0; tmax = T_MAX;
px = 1013250.0;
pmax = P_MAX;
pmin = 10000.0;
tmax = T_MAX;
tmin = T_MIN;
}
t2 = t1 + 10.0;
Detail_Run(ptD, ptNGPar);
h1 = H(ptNGPar, ptD) - h0;
for (i = 0; i < MAX_NUM_OF_ITERATIONS; i++)
{
Detail_Run(detail, ptNGPar);
double h1 = Therm_H(therm, ptNGPar, detail) - h0;
for (int i = 0; i < MAX_NUM_OF_ITERATIONS; i++) {
ptNGPar->dTf = t2;
p1 = px; p2 = px * 0.1; ptNGPar->dPf = p1;
Detail_Run(ptD, ptNGPar);
s1 = S(ptNGPar, ptD) - s0;
for (j = 0; j < MAX_NUM_OF_ITERATIONS; j++)
{
p1 = px;
p2 = px * 0.1;
ptNGPar->dPf = p1;
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;
Detail_Run(ptD, ptNGPar);
s2 = S(ptNGPar, ptD) - s0;
Detail_Run(detail, ptNGPar);
double s2 = Therm_S(therm, ptNGPar, detail) - s0;
delta2 = fabs(s1 - s2) / s0;
if (delta2 < tolerance) break;
p0 = p2;
double p0 = p2;
p2 = (p1 * s2 - p2 * s1) / (s2 - s1);
if (p2 <= pmin)
{
p2 = pmin;
}
if (p2 <= pmin) p2 = pmin;
if (p2 >= pmax) p2 = pmax;
p1 = p0;
s1 = s2;
}
if (j >= MAX_NUM_OF_ITERATIONS)
ptNGPar->lStatus = MAX_NUM_OF_ITERATIONS_EXCEEDED;
h2 = H(ptNGPar, ptD) - h0;
if (ptNGPar->lStatus == MAX_NUM_OF_ITERATIONS_EXCEEDED) break;
double h2 = Therm_H(therm, ptNGPar, detail) - h0;
delta1 = fabs(h1 - h2) / h0;
if (delta1 < tolerance && i > 0) break;
t0 = t2;
double t0 = t2;
t2 = (t1 * h2 - t2 * h1) / (h2 - h1);
if (t2 >= tmax) t2 = tmax;
if (t2 <= tmin)
{
if (t2 <= tmin) {
t2 = t0 + 10.0;
ptNGPar->dTf = t2;
Detail_Run(ptD, ptNGPar);
h2 = H(ptNGPar, ptD) - h0;
Detail_Run(detail, ptNGPar);
h2 = Therm_H(therm, ptNGPar, detail) - h0;
}
t1 = t0;
h1 = h2;
}
if (i >= MAX_NUM_OF_ITERATIONS)
if (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);
Detail_d2ZdT2(ptD, ptNGPar->dDf);
ptNGPar->dH = ptNGPar->dHo + 1000.0 * RGAS * ptNGPar->dTf *
(ptNGPar->dZf - 1.0 - ptNGPar->dTf * Hinc * 0.5 * ptNGPar->dDf) / ptNGPar->dMrx;
// 实现H方法
double Therm_H(Therm *therm, NGParSTRUCT *ptNGPar, Detail *detail) {
double Hinc = 0.0;
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;
}
double S(NGParSTRUCT *ptNGPar, Detail *ptD)
{
// 实现S方法
double Therm_S(Therm *therm, NGParSTRUCT *ptNGPar, Detail *detail) {
double Sinc;
double Smixing;
double x;
int i;
// initialize integral
Sinc = 0.0;
// initialize entropy of mixing
Smixing = 0.0;
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);
Sinc += GK_weight[i] * (ptD->dZ + ptNGPar->dTf * ptD->ddZdT - 1.0) / x;
// integrate partial derivatives from D=0 to D=D, applying Gauss-Kronrod quadrature
for (i = 0; i < therm->GK_points; i++) {
// calculate 1st and 2nd partial derivatives of Z wrt T
x = ptNGPar->dDf * (1.0 + therm->GK_root[i]) / 2.0;
Detail_zdetail(detail, 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;
x = ptNGPar->dDf * (1.0 - GK_root[i]) / 2.0;
Detail_zdetail(ptD, x);
Detail_dZdT(ptD, x);
Detail_d2ZdT2(ptD, x);
Sinc += GK_weight[i] * (ptD->dZ + ptNGPar->dTf * ptD->ddZdT - 1.0) / x;
x = ptNGPar->dDf * (1.0 - therm->GK_root[i]) / 2.0;
Detail_zdetail(detail, x);
Detail_dZdT(detail, 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);
Detail_d2ZdT2(ptD, ptNGPar->dDf);
if (ptNGPar->dTf != dTold || ptNGPar->dMrx != dMrxold)
{
dSi = So(ptNGPar);
dTold = ptNGPar->dTf;
dMrxold = ptNGPar->dMrx;
// reset Z and partial deivatives dZdT and d2ZdT2
Detail_zdetail(detail, ptNGPar->dDf);
Detail_dZdT(detail, ptNGPar->dDf);
Detail_d2ZdT2(detail, ptNGPar->dDf);
// find ideal gas entropy, but only if temperature or composition have changed
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++)
{
if (ptNGPar->adMixture[i] > 0.0) Smixing += ptNGPar->adMixture[i] * log(ptNGPar->adMixture[i]);
// calculate entropy of mixing
for (i = 0; i < NUMBEROFCOMPONENTS; i++) {
if (ptNGPar->adMixture[i] != 0) Smixing += ptNGPar->adMixture[i] * log(ptNGPar->adMixture[i]);
}
Smixing *= RGAS;
ptNGPar->dS = dSi - Smixing - 1000.0 * RGAS *
(log(ptNGPar->dPf/101325.0) - log(ptNGPar->dZf) + Sinc * 0.5 * ptNGPar->dDf) / ptNGPar->dMrx;
return ptNGPar->dS;
// calculate specific entropy
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
* : Therm类的头文件
* <EFBFBD>ļ<EFBFBD>: therm.h
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Therm<EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>ļ<EFBFBD>
**************************************************************************/
#ifndef _THERM_H
@ -10,64 +9,52 @@
#include "NGCal.h"
#include "Detail.h"
// Therm类
typedef struct Therm {
// 成员数据
double dT; // 当前温度,单位开尔文(K)
double dP; // 当前压力,单位帕斯卡(Pa)
double dD; // 摩尔密度单位mol/dm3
double dRho; // 质量密度单位kg/m3
double CAL_TH;
int coefA;
int coefB;
int coefC;
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的偏导数
double dSi; // 理想气体比熵单位kJ/kg.K
double dTold; // 之前使用的温度
int GK_points; // set the number of points for quadrature
double GK_root[5];
double GK_weight[5];
double dMrxold; // 之前使用的混合物摩尔质量
// 方法指针
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);
double ThermConstants[21][11];
} Therm;
// Therm类的构造函数和析构函数
Therm* Therm_construct(void);
void Therm_destruct(Therm* obj);
// 函数声明
void Therm_Init(Therm *therm);
// Therm类使用的其他数据
void Therm_Run(Therm *therm, NGParSTRUCT *ptNGPar, Detail *detail);
// 使用 extern 声明变量
extern int GK_points;
extern double GK_root[5];
extern double GK_weight[5];
extern double ThermConstants[21][11];
double Therm_CpiMolar(Therm *therm, NGParSTRUCT *ptNGPar);
// 热化学卡路里到焦耳的转换常数: 1 cal(IT) = 4.1840 J
extern double CalTH ;
double Therm_coth(double x);
double Therm_Ho(Therm *therm, NGParSTRUCT *ptNGPar);
// 系数索引的枚举
enum CoefficientList {
coefA = 0,
coefB,
coefC,
coefD,
coefE,
coefF,
coefG,
coefH,
coefI,
coefJ,
coefK
};
double Therm_So(Therm *therm, NGParSTRUCT *ptNGPar);
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 被按下 */
{
printf("挂起LED1线程\n");
uwRet = rt_thread_suspend(led1_thread);/* 挂起LED1线程 */
uwRet = rt_thread_suspend(OFlowCal_thread);/* 挂起LED1线程 */
if(RT_EOK == uwRet)
{
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 被按下 */
{
printf("恢复LED1线程\n");
uwRet = rt_thread_resume(led1_thread);/* 恢复LED1线程 */
uwRet = rt_thread_resume(OFlowCal_thread);/* 恢复LED1线程 */
if(RT_EOK == uwRet)
{
rt_kprintf("恢复LED1线程成功\n");