要计算很多配方的比冲。就想着用NASA CEA批量计算。但.bat调用CEAgui.jar包传不进去参数,也就是配方。有批量计算过的好人吗,求指教?
1条回答 默认 最新
关注
本答案参考 多次询问 ChatGPT-3.5 后选择的最佳回答,若是满意,还请采纳,谢谢
以下是关于使用NASA CEA进行批量计算的一些分析和可能的解决方案:
一、Python相关
使用
subprocess
模块(对于调用可执行文件或脚本的情况)- 如果CEA程序可以通过命令行调用,在Python中可以使用
subprocess
模块来实现批量调用。例如,如果CEA程序的可执行文件名为cea.exe
,并且接受配方文件作为参数(假设配方文件为.inp
格式):
import subprocess import os # 假设配方文件都在一个名为 'formulation_files' 的文件夹中 formulation_folder = 'formulation_files' for file in os.listdir(formulation_folder): if file.endswith('.inp'): file_path = os.path.join(formulation_folder, file) # 调用CEA程序,这里假设cea.exe在系统路径中可直接调用 subprocess.run(['cea.exe', file_path])
- 如果CEA程序可以通过命令行调用,在Python中可以使用
解析CEA输出(如果需要进一步处理结果)
- CEA程序运行后可能会输出一些结果文件(例如
.out
文件)。可以编写函数来解析这些文件以提取比冲等相关数据。
def parse_cea_output(file_path): with open(file_path, 'r') as f: lines = f.readlines() # 根据CEA输出文件的格式来查找比冲数据 for line in lines: if 'Specific Impulse' in line: parts = line.split() impulse = float(parts[-1]) return impulse return None formulation_folder = 'formulation_files' for file in os.listdir(formulation_folder): if file.endswith('.inp'): file_path = os.path.join(formulation_folder, file) subprocess.run(['cea.exe', file_path]) output_file = file.replace('.inp', '.out') impulse = parse_cea_output(output_file) if impulse is not None: print(f'For formulation {file}, specific impulse is {impulse}')
- CEA程序运行后可能会输出一些结果文件(例如
二、Java相关
使用
ProcessBuilder
(类似于Python的subprocess
)- 如果要在Java中调用CEA程序(假设是通过
CEAgui.jar
包相关的可执行文件或者脚本):
import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class CEABatch { public static void main(String[] args) { String formulationFolder = "formulation_files"; File folder = new File(formulationFolder); File[] listOfFiles = folder.listFiles(); if (listOfFiles!= null) { for (File file : listOfFiles) { if (file.isFile() && file.getName().endsWith(".inp")) { List<String> command = new ArrayList<>(); // 假设CEA可执行文件名为cea.exe,这里需要根据实际情况修改 command.add("cea.exe"); command.add(file.getAbsolutePath()); try { ProcessBuilder pb = new ProcessBuilder(command); pb.start(); } catch (IOException e) { e.printStackTrace(); } } } } } }
- 如果要在Java中调用CEA程序(假设是通过
处理CEA输出(如果有标准输出或者特定的输出文件)
- 如果CEA程序将结果输出到标准输出,可以使用
ProcessBuilder
的相关方法来读取输出流并解析比冲数据。
import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class CEABatch { public static void main(String[] args) { String formulationFolder = "formulation_files"; File folder = new File(formulationFolder); File[] listOfFiles = folder.listFiles(); if (listOfFiles!= null) { for (File file : listOfFiles) { if (file.isFile() && file.getName().endsWith(".inp")) { List<String> command = new ArrayList<>(); // 假设CEA可执行文件名为cea.exe,这里需要根据实际情况修改 command.add("cea.exe"); command.add(file.getAbsolutePath()); try { ProcessBuilder pb = new ProcessBuilder(command); Process process = pb.start(); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine())!= null) { if (line.contains("Specific Impulse")) { // 根据实际输出格式解析比冲数据 String[] parts = line.split(" "); double impulse = Double.parseDouble(parts[parts.length - 1]); System.out.println("For formulation " + file.getName() + ", specific impulse is " + impulse); } } reader.close(); } catch (IOException e) { e.printStackTrace(); } } } } } }
- 如果CEA程序将结果输出到标准输出,可以使用
关于在
.bat
文件中调用CEAgui.jar
传不进去参数的问题:- 可能是参数传递的格式不正确。如果
CEAgui.jar
是一个图形界面相关的Java程序,可能不适合直接通过命令行参数传递配方的方式。可以考虑将配方数据转换为CEAgui.jar
能够识别的输入格式(例如特定的配置文件),然后在调用CEAgui.jar
时指定这个配置文件的路径。 - 也有可能是
CEAgui.jar
内部对于命令行参数的解析存在问题。可以查看CEAgui.jar
的文档或者源代码(如果可获取)来确定正确的参数传递方式。
解决 无用评论 打赏 举报 编辑记录