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

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

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -28,9 +28,9 @@ Project File Date: 07/06/2025
*** Using Compiler 'V5.06 update 7 (build 960)', folder: 'd:\Keil_v5\ARM\ARMCC\Bin'
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)

File diff suppressed because it is too large Load Diff

View File

@ -1,109 +1,122 @@
/*************************************************************************
* : detail.h
* <EFBFBD>ļ<EFBFBD>: detail.h
**************************************************************************/
#ifndef _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; // 组分数目
int aiCID[21]; // 组分ID
// 五个历史变量用于提高重复计算时的效率
double dOldMixID; // 上一次计算的混合物ID
double dOldPb; // 上一次计算的Pb
double dOldTb; // 上一次计算的Tb
double dOldPf; // 上一次计算的Pf
double dOldTf; // 上一次计算的Tf
// ʹ<>ýṹ<C3BD><E1B9B9><EFBFBD><EFBFBD><EFBFBD>C++<2B><>
typedef struct Detail {
// ˽<>г<EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>
int iNCC; // <20><><EFBFBD><EFBFBD><EFBFBD>Ŀ
// 表4第1列中的EOS参数
double adAn[58];
int aiCID[21]; // <20><><EFBFBD>ID
// <20><><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>Ч<EFBFBD><D0A7>
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
// <20><>4<EFBFBD><34>1<EFBFBD><31><EFBFBD>е<EFBFBD>EOS<4F><53><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 adTableHhvMol[4][21]; //GB/T11062 摩尔高位发热量
double adTableLhvMol[4][21]; //GB/T11062 摩尔低位发热量
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 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 adTableHhvMol[4][21]; //GB/T11062 Ħ<><C4A6><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double adTableLhvMol[4][21]; //GB/T11062 Ħ<><C4A6><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><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的二阶偏导数
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>ѹ
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD>ڸ߼<DAB8><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><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;
// 构造函数和析构函数
Detail* Detail_Construct(void);
void Detail_Destroy(Detail* pDetail);
// <20><><EFBFBD><EFBFBD><ECBAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Detail *Detail_Construct(void);
// 私有方法
int Detail_compositionchange(Detail* pDetail, NGParSTRUCT* pAGA10);
void 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);
void Detail_Destroy(Detail *pDetail);
// 公共方法
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);
// ˽<>з<EFBFBD><D0B7><EFBFBD>
int Detail_compositionchange(Detail *pDetail, NGParSTRUCT *pAGA10);
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);
// <20><><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 *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,74 +1,71 @@
#ifndef _FLOWCAL_H
#define _FLOWCAL_H
#ifndef FLOWCAL_H
#define FLOWCAL_H
#include "NGCal.h"
#include "Detail.h"
#include "NGCal.h"
/* 天然气物性参数的数据结构 */
typedef struct FlowParSTRUCT
{
//流量计算输入参数信息
int dCbtj; //计量参比条件压力
double dPb_M; //计量参比条件压力
double dTb_M; //计量参比条件温度
double dPb_E; //燃烧参比条件压力
double dTb_E; //燃烧参比条件温度
double dPatm;//当地大气压 Pa
double dNG_Compents[21] ;//天然气组分
int dMeterType;// 流量计类别
int dCoreType;//节流装置类型
int dPtmode; //取压方式
int dPipeType; // 管道类型
double dPipeD; //管道内径 mm
int dPipeMaterial; //管道材料
/* <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>Ϣ
double dOrificeD; //孔板孔径mm
int dOrificeMaterial; //孔板材料
double dPf;//输入压力 Pa
int dPfType; //压力类型
double dTf; //输入温度 K
double dDp; //输入差压 Pa
double dMeterFactor;//仪表系数
double dPulseNum;//脉冲数
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>
//流量计算输出参数
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;//超压缩因子
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; //<2F>װ<EFBFBD>׾<EFBFBD>mm
int dOrificeMaterial; //<2F>װ<EFBFBD><D7B0><EFBFBD><EFBFBD>
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; //<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);
void thermalExpansionCorrection(double dOrificeMaterial, double dOrificeD,
double dPipeMaterial, double dPipeD,
double dTf, double correctedValues[3]);
void thermalExpansionCorrection(double dOrificeMaterial, double dOrificeD,
double dPipeMaterial, double dPipeD,
double dTf, double correctedValues[3]);
double calculateE(double beta);
@ -84,10 +81,10 @@ double calculateReD(double Qf, double D, double rho, double mu);
double calculateCd(double beta, double ReD, double D_mm, int ptMode);
double Dlndjs(double tempP_jy, double tempT);
void OFlowCal(FlowParSTRUCT* ptFlowPar, NGParSTRUCT* ptNGPar);
void OFlowCal(FlowParSTRUCT *ptFlowPar, NGParSTRUCT *ptNGPar);
#endif

View File

View File

@ -1,86 +1,89 @@
#include "NGCal.h"
#include "Therm.h"
#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 )
{
return MEMORY_ALLOCATION_ERROR;
int NGCal_Init(NGParSTRUCT *ptNGPar) {
//ptDetail = (Detail *)malloc(sizeof(Detail));
ptDetail = Detail_Construct();
if (NULL == ptDetail) {
return MEMORY_ALLOCATION_ERROR;
}
ptTherm = (Therm *)malloc(sizeof(Therm));
if (NULL == ptTherm )
{
return MEMORY_ALLOCATION_ERROR;
// Detail_Run(ptDetail,ptNGPar);
// Detail_compositionchange(ptDetail,ptNGPar);
ptTherm = (Therm *) malloc(sizeof(Therm));
Therm_Init(ptTherm);
if (NULL == ptTherm) {
return MEMORY_ALLOCATION_ERROR;
}
return NGCal_NGCal;
return NGCal_NGCal;
}
int NGCal_UnInit(void)
{
if (ptDetail) free( ptDetail);
if (ptTherm) free (ptTherm);
return 0;
int NGCal_UnInit(void) {
if (ptDetail) free(ptDetail);
if (ptTherm) free(ptTherm);
return 0;
}
double SOS(NGParSTRUCT *ptNGPar)
{
if (NULL == ptDetail || NULL == ptTherm)
{
NGCal_UnInit();
NGCal_Init();
double SOS(NGParSTRUCT *ptNGPar) {
if (NULL == ptDetail || NULL == ptTherm) {
NGCal_UnInit();
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)
{
NGCal_UnInit();
if (NGCal_NGCal != NGCal_Init())
{
ptNGPar->lStatus = MEMORY_ALLOCATION_ERROR;
return 0.0;
double tolerance = 1.0;
double R, P, T, Z;
int i;
if (NULL == ptDetail || NULL == ptTherm) {
NGCal_UnInit();
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;
R = ptNGPar->dRhof;
P = ptNGPar->dPf;
Z = ptNGPar->dZf;
T = ptNGPar->dTf;
H = ptNGPar->dH;
R = ptNGPar->dRhof;
P = ptNGPar->dPf;
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;
}
ptNGPar->dCstar = (ptNGPar->dRhof * ptNGPar->dSOS) / sqrt(R * P * Z);
ptNGPar->dPf = P;
ptNGPar->dTf = T;
ptTherm->Run(ptTherm,ptNGPar, ptDetail);
ptNGPar->dTf = T;
Therm_Run(ptTherm, ptNGPar, ptDetail);
return ptNGPar->dCstar;
}
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 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)
{
return (Cperf(ptNGPar) / sqrt(ptNGPar->dZf));
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,387 +1,474 @@
#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] = {
{-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},
{-37524.4, 7.98139, 24.3668, 752.320, 3.53990, 272.846, 8.44724, 1020.13,-13.2732, 869.510,-22.4010},
{-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},
{-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},
{ 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;
#include "Detail.h"
void ThermInit(void)
{
dSi = 0.0;
dTold = 0.0;
dMrxold = 0.0;
}
// 初始化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;
void ThermDestroy(void)
{
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},
{-37524.4, 7.98139, 24.3668, 752.320, 3.53990, 272.846, 8.44724, 1020.13, -13.2732, 869.510, -22.4010},
{-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, 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.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}
};
// 复制常量数组
for (int i = 0; i < 21; i++) {
for (int j = 0; j < 11; j++) {
therm->ThermConstants[i][j] = thermConstants[i][j];
}
}
double coth(double x)
{
return cosh(x)/sinh(x);
}
void Run(NGParSTRUCT *ptNGPar, Detail *ptD)
{
double c, x, y, z;
Detail_Run(ptD, ptNGPar);
Detail_dZdD(ptD, ptNGPar->dDf);
CprCvrHS(ptNGPar, ptD);
ptNGPar->dk = ptNGPar->dCp / ptNGPar->dCv;
x = ptNGPar->dk * RGAS * 1000.0 * ptNGPar->dTf;
// 实现Run方法
void Therm_Run(Therm *therm, NGParSTRUCT *ptNGPar, Detail *detail) {
// local variables
double c, x, y, z;
// 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;
c = (x / y) * z;
ptNGPar->dSOS = sqrt(c);
ptNGPar->dKappa = (c * ptNGPar->dRhof) / ptNGPar->dPf;
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;
Cpx = 0.0;
DT = ThermConstants[i][coefD] / T;
FT = ThermConstants[i][coefF] / T;
HT = ThermConstants[i][coefH] / T;
JT = ThermConstants[i][coefJ] / T;
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 *= ptNGPar->adMixture[i];
Cp += Cpx;
T = ptNGPar->dTf;
for (int i = 0; i < NUMBEROFCOMPONENTS; i++) {
if (ptNGPar->adMixture[i] > 0) {
// 计算每个组分的贡献
Cpx = 0.0;
// 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 += 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];
// add this contribution to the sum
cp += Cpx;
}
}
Cp *= CalTH;
return Cp;
return cp * therm->CAL_TH;
}
double Ho(NGParSTRUCT *ptNGPar)
{
// 实现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++)
{
if (ptNGPar->adMixture[i] <= 0.0) continue;
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 *= ptNGPar->adMixture[i];
H += Hx;
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 /= ptNGPar->dMrx;
return H * 1.e3;
H *= therm->CAL_TH;
H /= ptNGPar->dMrx;
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++)
{
if (ptNGPar->adMixture[i] <= 0.0) continue;
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 *= ptNGPar->adMixture[i];
S += Sx;
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 /= ptNGPar->dMrx;
return S * 1.e3;
S *= therm->CAL_TH;
S /= ptNGPar->dMrx;
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);
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;
// 实现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 (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);
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);
Cpr = Cvr + RGAS * ((a * a)/b);
Cpr /= ptNGPar->dMrx;
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);
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++)
{
t2 = t1 + 10.0;
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;
delta2 = fabs(s1 - s2) / s0;
if (delta2 < tolerance) break;
p0 = p2;
Detail_Run(detail, ptNGPar);
double s2 = Therm_S(therm, ptNGPar, detail) - s0;
delta2 = fabs(s1 - s2) / s0;
if (delta2 < tolerance) break;
double p0 = p2;
p2 = (p1 * s2 - p2 * s1) / (s2 - s1);
if (p2 <= pmin)
{
p2 = pmin;
}
if (p2 >= pmax) p2 = pmax;
p1 = p0;
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;
delta1 = fabs(h1 - h2) / h0;
if (delta1 < tolerance && i > 0) break;
t0 = t2;
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;
double t0 = t2;
t2 = (t1 * h2 - t2 * h1) / (h2 - h1);
if (t2 >= tmax) t2 = tmax;
if (t2 <= tmin)
{
if (t2 >= tmax) t2 = tmax;
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;
// 实现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 - GK_root[i]) / 2.0;
Detail_zdetail(ptD, x);
Detail_dZdT(ptD, x);
Detail_d2ZdT2(ptD, x);
Hinc += GK_weight[i] * ptD->ddZdT / 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;
}
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;
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;
Sinc = 0.0;
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;
// initialize integral
Sinc = 0.0;
// initialize entropy of mixing
Smixing = 0.0;
// 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,73 +1,60 @@
/*************************************************************************
* : therm.h
* : Therm类的头文件
* <EFBFBD>ļ<EFBFBD>: therm.h
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: Therm<EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>ļ<EFBFBD>
**************************************************************************/
#ifndef _THERM_H
#ifndef _THERM_H
#define _THERM_H
#include "NGCal.h"
#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 dPdD; // P对D的偏导数
double dPdT; // P对T的偏导数
double dSi; // 理想气体比熵单位kJ/kg.K
double dTold; // 之前使用的温度
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 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; // 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
int GK_points; // set the number of points for quadrature
double GK_root[5];
double GK_weight[5];
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");