Events 在TCL中运行外部程序

Events 在TCL中运行外部程序,events,tcl,Events,Tcl,在基于Gabriel Taubin的平滑而无形状收缩开发了一个复杂的TCL代码来进行平滑之后,代码运行速度非常慢。这可能是由于我正在平滑的非结构化网格的大小。我必须使用TCL,因为我使用的网格生成器是点式的,而点式的宏语言是基于TCL的。我对此还是有点陌生,但是有没有办法从TCL运行一个外部代码,TCL将数据发送到软件,软件运行平滑操作,然后将输出发送回TCL以更新逐点网格生成工具中的内部数据?我将用另一种速度更快的语言编写平滑工具。对于可加载模块,您可以编写一个Tcl扩展。例如: 或者,只需编

在基于Gabriel Taubin的平滑而无形状收缩开发了一个复杂的TCL代码来进行平滑之后,代码运行速度非常慢。这可能是由于我正在平滑的非结构化网格的大小。我必须使用TCL,因为我使用的网格生成器是点式的,而点式的宏语言是基于TCL的。我对此还是有点陌生,但是有没有办法从TCL运行一个外部代码,TCL将数据发送到软件,软件运行平滑操作,然后将输出发送回TCL以更新逐点网格生成工具中的内部数据?我将用另一种速度更快的语言编写平滑工具。

对于可加载模块,您可以编写一个Tcl扩展。例如:


或者,只需编写程序从文件中获取输入。让Tcl将输入数据写入文件,运行程序,然后从外部程序收集输出。

有许多选项可用于处理运行异常频繁的代码。我首先要确定它必须跑多快。我们说的是毫秒、秒、分钟、小时还是天。接下来,有必要确定哪一部分速度慢。时间命令在这里很有用

但是,假设您已经决定需要更高的性能,并且您对当前计划有一些衡量标准,这样您就可以知道您是否在改进,下面是一些可以尝试的事情:

尝试改进现有代码。如果使用expr命令,请确保将表达式作为大括号中的单个参数提供给该命令。初学者有时会忘记这一点,而改进可能是巨大的。 使用critcl包用C编写程序的部分代码。critcl允许您将C代码直接放入Tcl程序,并将代码取出、编译和加载到程序中。 编写一个传统的基于C的Tcl扩展。Tcl是非常可扩展的,并且有一个用于构建扩展的干净API。有扩展的示例代码,许多扩展的源代码都是现成的。 编写一个程序来完成作业中耗时的部分,并将其作为单独的进程执行,然后将输出返回到Tcl脚本中。这就是exec命令有用的地方。您可能需要将数据写到程序可以获取的地方,并将程序的输出读回Tcl脚本。如果您想获得更多乐趣,可以通过本地主机TCP端口进行双向通信。Tcl中的设置非常简单。在一个程序中使用C代码来做这件事有点乏味,但是在互联网上有很多例子。
选择哪个选项在很大程度上取决于需要改进的程度和需要改进的代码量。您没有给我们提供多少关于您的情况的信息,所以我只能提供一些模糊的一般解决方案。

当然可以。你有更具体的问题吗?我怎么做?你想用哪种语言,你打算把另一种语言作为一个单独的程序或DLL集成?顺便说一句,使用另一种语言是一个不错的决定。这是我的主要计算语言。由于我用于非结构网格平滑和形状保持的方法是Jacobi迭代的,因此它非常适合共享内存多线程操作。我将用开放的MP加速代码以获得更好的性能。SWIG可以用来生成一个C++或C++代码的TCL接口。界面不太自然,它仍然感觉像C或C++,但是它是一个很好的方式来快速地工作。我遵循了在TCL和TK的实际编程中提供的信息,由韦尔奇,琼斯和霍布斯。幸运的是,您列表中的第1项就是我使用的。实际上,我在第4项中,并且感到困惑。但我将尝试使用fileevent功能编写代码,并在失败时寻求帮助。