首页/文章/ 详情

程序之间的相互通讯方法---FISH socket与Python

2年前浏览1863

1 引言

在打开FLAC3D时,偶然发现原来预加载PFC模块的信息不见了,于是想知道到底是把这个功能删除了,还是只是不显示信息了。经测试发现只是不显示信息了,功能还保留着。因此借此机会回顾一下程序之间的通讯方法。

5/18/2020的运行环境

8/07/2020的运行环境


2 FLAC3D与PFC之间的通讯

在《FLAC3D 7.0 新特性简介(P4)---软件集成》讨论过,FLAC3D集成了与PFC之间的通讯,但与其它程序还得通过socket进行通讯。当启动FLAC3D时,程序自动加载了PFC的DLL模块,用来实例化所有与PFC相关的模型分量。这些模块是:

program load module 'contact'

program load module 'pfc'

program load guimodule 'pfc'

program load module 'pfcthermal'

program load guimodule 'pfcthermal'

program load module 'ccfd'

program load guimodule 'ccfd'

program load module 'wallsel'

program load module 'wallzone'


3 通过FISH TCP Socket通讯

总的来说,程序之间的直接通讯是通过socket工具来实现的,socket工具是在FISH函数下运行的。FISH允许两个或多个程序作为独立的进程运行,使用socket连接(就像在互联网上的TCP/IP传输一样)交换数据。可以在同一程序的两个或多个实例之间传递数据(例如UDEC的两个实例),但主要用途是耦合不同的程序,FISH数组中包含的数据可以在两个程序之间任意方向传递。数据是以二进制方式传输的,因此没有精度损失。最多可以开放六个数据通道;这些通道可以存在于两个程序之间,也可以同时连接多个程序。这些工具包括:

  • socket.close

  • socket.create

  • socket.delete

  • socket.open

  • socket.read

  • socket.read.array

  • socket.write

  • socket.write.array

例如打开任一程序作为服务器端运行下面的代码:

fish def serve

  array arr(3)

  arr(1) = 1234

  arr(2) = 57.89

  arr(3) = 'hello from the server'

  oo = socket.open(1,1)

  oo = socket.write(arr,3,1)

  oo = socket.read(arr,1,1)

  oo = socket.close(1)

  oo = io.out(arr(1))

end

@serve

然后打开另外任一程序作为客户端运行下面的代码:

fish def client

  array arr(3)

  oo = socket.open(0,1)

  oo = socket.read(arr,3,1)

  oo = io.out(' Received values ... ')

  oo = io.out('   ' string(arr(1)))

  oo = io.out('   ' string(arr(2)))

  oo = io.out('   ' string(arr(3)))

  arr(1) = 'greetings from the client'

  oo = socket.write(arr,1,1)

  oo = socket.close(1)

end

@client

就会接收到来自服务器端的数据。

顺便说一下,PFC还可以通过cfd connect实现与CFD之间的通讯。


4 通过Python p2pLink类通讯

除了使用传统的FISH socket进行通讯之外,现在还可以通过Python的p2pLink类进行通讯。其中p2pLinkServer是服务器端的类,p2pLinkClient是客户端的类。但不幸的是系统总是提示"cannot import name 'p2pLinkServer'"的错误信息,也就是说p2pLinkServer这个模块没有输入到环境中,不知道啥原因,安装路径按理说没有问题,使用import itasca as it也没有问题。

from itasca import p2pLinkServer

import numpy as np

with p2pLinkServer() as s:

    s.start()

    while True:

        a = s.read_data()

        if type(a) is int and a ==-1:

            print("done")

            break

        print(f"got {a}")

        if type(a) is np.ndarray:

            print(a.shape)


本文相关文档:

FLAC3D 7.0 新特性简介(P4)---软件集成

FLAC3D与Python的集成 (1)---简述

Python 与 PLAXIS 的集成方法

清理Itasca软件的冗余数据

FISH: Loop语句的进化

来源:计算岩土力学
PFCFLAC3DPLAXIS
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2022-10-09
最近编辑:2年前
计算岩土力学
传播岩土工程教育理念、工程分析...
获赞 144粉丝 1047文章 1776课程 0
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈