Andrew Moa Blog Site

使用VSCode开发STAR-CCM+用户程序:通过Fortran构建动态库

虽然STAR-CCM+官方文档专门说明,Windows下不支持 FORTRAN1。但实际上,只要编译器支持,在Windows下使用Fortran编译出来的用户程序一样能正常在STAR-CCM+中正常加载运行。

1. 构建CMake工程

首先我们参考官方文档当中的教程案例2,编写CMake项目,项目结构如下:

STARCCM_FORTRAN_SAMPLE
   CMakeLists.txt	# CMake配置文件
   README.md	# 说明文件,非必须
├───.vscode
      launch.json	# 启动调试模式时自动生成的文件,非必须
      settings.json	# 定义CMake相关变量
└───src
        initVelocity.f
        StarReal.f.in
        sutherlandViscosity.f
        uflib.f
        zeroGradT.f

CMake配置文件CMakeLists.txt主要内容如下:

cmake_minimum_required(VERSION 3.10)

# Project name
project(UserFortran LANGUAGES Fortran)

set(CMAKE_Fortran_STANDARD 2008)

# Check for STARCCM_USER_LIB_DIR
if(NOT DEFINED STARCCM_USER_LIB_DIR)
    message(FATAL_ERROR "STARCCM_USER_LIB_DIR is not defined. Please specify the path to the STAR-CCM+ UserFunctions library directory.")
    # For example, in Windows : C:/Program Files/Siemens/19.06.009-R8/STAR-CCM+19.06.009-R8/star/lib/win64/clang17.0vc14.2-r8/lib
    # In Linux : /opt/Siemens/19.06.009-R8/STAR-CCM+19.06.009-R8/star/lib/linux-x86_64-2.28/gnu11.4-r8/lib"
else()
    message(STATUS "STARCCM_USER_LIB_DIR location : " ${STARCCM_USER_LIB_DIR})
endif()

# Check for STARCCM_STD_LIB_DIR
if(NOT DEFINED STARCCM_STD_LIB_DIR)
    message(STATUS "STARCCM_STD_LIB_DIR undefined. using system standard library. ")
    # For example, in Linux : /opt/Siemens/19.06.009-R8/STAR-CCM+19.06.009-R8/star/lib/linux-x86_64-2.28/system/gnu11.4-64"
else()
    message(STATUS "STARCCM_STD_LIB_DIR location : " ${STARCCM_STD_LIB_DIR})
endif()

# STAR-CCM+ output precision
if(USE_DOUBLE_PRECISION)
    message(STATUS "Using double precision for STAR-CCM+")
    set(STAR_REAL "1D0")
else()
    message(STATUS "Using float precision for STAR-CCM+")
    set(STAR_REAL "1.0")
endif()

# generate the StarReal.f file
configure_file(src/StarReal.f.in ${CMAKE_BINARY_DIR}/StarReal.f @ONLY)

# Include directories
include_directories(${PROJECT_SOURCE_DIR}/include
)

# Link with STARCCM LIB directory
link_directories(${STARCCM_USER_LIB_DIR}
    ${STARCCM_STD_LIB_DIR}
)

# Specify the source files
set(SOURCES
    ${CMAKE_BINARY_DIR}/StarReal.f
    src/initVelocity.f
    src/sutherlandViscosity.f
    src/zeroGradT.f
    src/uflib.f
)

# Add library
add_library(${CMAKE_PROJECT_NAME} SHARED
    ${SOURCES}
)

# Link library
target_link_libraries(${CMAKE_PROJECT_NAME} UserFunctions)

# Install target
install(TARGETS ${CMAKE_PROJECT_NAME}
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib/static
    )

其中有两个关键设置:

阅读时长4分钟
Andrew Moa

使用VSCode开发STAR-CCM+用户程序:通过CoolProp计算物性参数

STAR-CCM+用户程序(用户库)1是通过外部编译器(通常是C/C++,也支持Fortran)按一定的规则编译构建的动态链接库,将构建好的动态链接库注册到sim文件中,可以实现某些自定义功能。一个用户程序通常包含一个或多个用户自定义的函数,这些自定义函数一般用于实现特殊的配置或场函数。

用户程序需要先注册动态链接库才能调用,而动态链接库的格式往往与操作系统、硬件平台等密切相关,因此用户程序通常都是针对特定平台进行编译,无法实现跨平台运行。

本文尝试用VSCode编写STAR-CCM+动态链接库,利用开源的热力学库CoolProp为STAR-CCM+拓展物性参数计算功能;通过CMake构建用户程序,确保在不同平台下能正确生成动态链接库文件。

1. CoolProp介绍

CoolProp 是一个开源跨平台的热力学库,定位上类似于NIST的REFPROP,包含各种流体物性参数,同时支持多种编程语言,也支持通过MATLAB、Excel甚至javascript调用进行物性参数计算2

Windows平台通过以下命令下载编译、安装CoolProp3

# 推荐使用PowerShell,需要先安装cmake、git及clang-cl编译器
# 下载CoolProp源码及其依赖
git clone https://github.com/CoolProp/CoolProp --recursive
cd CoolProp
# 建立工作目录
mkdir build && cd build
# 配置静态库编译文件
cmake .. -DCOOLPROP_STATIC_LIBRARY=ON -G "Visual Studio 17 2022" -T ClangCL,host=x64 -A x64 
# 编译静态库
cmake --build . --config Release
# 安装静态库
cmake --install . --prefix $PWD/../../CoolPropLib

Linux平台通过以下命令编译、安装CoolProp:

# 需要先安装cmake、git及gcc编译器
# 下载CoolProp源码及其依赖
git clone https://github.com/CoolProp/CoolProp --recursive
cd CoolProp
# 建立工作目录
mkdir -p build && cd build
# 配置静态库编译文件,默认架构为64位
cmake .. -DCOOLPROP_STATIC_LIBRARY=ON -DCOOLPROP_FPIC=ON -G "Ninja"
# 编译静态库,使用32个核心加速编译
cmake --build . --config Release -- -j32
# 安装静态库
cmake --install . --prefix $PWD/../../CoolPropLib

得益于软件良好的封装,CoolProp相关函数的调用十分简单,以下是官方示例代码4

阅读时长5分钟
Andrew Moa

使用VSCode开发STAR-CCM+模拟助手

STAR-CCM+模拟助手(Simulation Assistant)相当于一个插件,在插件内部封装了java宏命令。使用的时候,通过调用宏命令,执行一些流程性的操作。相比于直接执行java宏文件,可以更好地与用户进行交互,对不熟悉java的用户来说明显更加友好。因为模拟助手大多应用于前后处理当中,许多咨询公司针对这方面开发的定制化插件也更倾向于采用相同的方式。

官方文档采用NetBeans演示了创建模拟助手项目的流程,但是演示的NetBeans版本已经很老旧了。官方文档更新缓慢,描述又过于笼统。这里采用VSCode重新实现并演示一遍,相关配置可以参考使用VSCode调试STAR-CCM+宏 ,以下演示材料来自于STAR-CCM+官方的教程文件。

1. 建立模拟助手项目

参考使用VSCode调试STAR-CCM+宏 中的内容建立java项目,项目类型一样选择No build tools,名称根据自己需要起一个。

项目创建完成后,编辑[项目文件夹]/.vscode下的settings.json文件,将下面这些目录添加到项目依赖中1

  • [STAR-CCM+_Installation]/star/lib/java/platform/core
  • [STAR-CCM+_Installation]/star/lib/java/platform/core/locale
  • [STAR-CCM+_Installation]/star/lib/java/platform/lib
  • [STAR-CCM+_Installation]/star/lib/java/platform/modules
  • [STAR-CCM+_Installation]/star/lib/java/platform/modules/ext
  • [STAR-CCM+_Installation]/star/lib/java/platform/modules/locale
    7f5cd0780c9474a6fedde666d32345f9.png

因为模拟助手需要加载到STAR-CCM+中,需要保证两者jdk版本一致。编辑[项目文件夹]/.vscode下的settings.json文件,增加一行设置,指定jdk为STAR-CCM+自带的版本。

"java.jdt.ls.java.home": "[STAR-CCM+_Installation]/jdk/[platform]/jdk[version]"

2d65d65d95dd1c70148bd6d3e1799ac0.png

JAVA PROJECTS里确认jdk版本,确保和STAR-CCM+自带的版本一致。

faa980ab915d9e4f8cc472f9fe54167a.png

2. 项目开发

将自动生成的[项目文件夹]/src下面的源文件删除,创建文件夹Assistant,将官方教程中的java源文件复制粘贴到其中2

70cc6904b31e239e7da1853d42eb9941.png

阅读时长1分钟
Andrew Moa