qlearner的个人博客分享 http://blog.sciencenet.cn/u/qlearner

博文

OpenDX Compute模块详解

已有 2914 次阅读 2015-3-7 17:05 |个人分类:编程学习|系统分类:科研笔记

Compute是OpenDX中最强大的一个模块,其可以实现任意操作原有数据的功能,因此带来了极大的灵活性。
Compute仅能作用在data组件中,但可以通过Mark和Unmark的组合运用使其作用在其他组件上。
用于在一个特定场field或列表List的每个数据点(data point)上计算一个表达式,语法为:
Output=Compute(expression,input,...)
单个Compute模块可以操作最多21input值。默认开启的input标签有2个,更多的标签可以通过Edit菜单进行添加。
对于变量的使用,图形界面和脚本语言中略有不同:在图形界面中变量有名字,如sample,那么使用这个变量的组件时可以用sample.x, sample.y, sample.z或者sample.0, sample.1, sample.2(注意使用数字编号时从0开始计数);在编程中,使用$n来进行索引变量,n从0开始,如果从多个输入构造一个矢量,则语法为[$0,$1,$2,...],注意逗号

几个脚本语言算例:
1. 将摄氏温度转换为华氏温度:
tempf = Compute("$0*(9.0/5.0)+32",tempc);
2.输入值为一个9维的矢量,输出值是一个标量,为输入值的第6个组件:
new_field = Compute("$0.5",field);
3.输入值是一个矢量,输出值也是一个矢量,其x组件是输入值对应组件的2倍:
new_field = Compute("[2*$0.x,$0.y,$0.z]",field);
new_field = Compute("[2,1,1]*$0",field);
4.filed1是一个矢量,field2和field3是标量,输出值是field1各点的强度值加上field2除以4.5倍的field3:
new_field = Compute("mag($0)+$1/(4.5*$2)",field1,field2,field3);
5.Mark模块将二维对象slice的positions组件转换成data组件,从而允许Compute模块能对positions进行操作,此时原来的data组件存储为saved data组件
具体操作是将slice的二维坐标值变换为三维坐标:
变换完成后,使用Unmark模块将现在的data组件变回positions组件,将saved data组件变回data组件。
slice = Slice(electrondensity, "z", 5);
markedslice = Mark(slice,"positions");
pi = 3.14159;
exp = "[sin(2*$1*($0.x+1)/3.9), $0.y, -cos(2*$1*($0.x+1)/3.9)]";
warped = Compute(exp, markedslice, pi);
warped = Unmark(warped, "positions");  

附件:
表达式expression是对于输入input进行操作的数学式子。操作符可以有:
函数                                                                                                       操作数类型
三角函数(弧度为单位)                                                          
sin(a), cos(a), tan(a), asin(a), acos(a), atan(a), atan2(a, b)             float, double
双曲函数
sinh(a), cosh(a), tanh(a)                                                                       float, double
对数函数(包括指数函数)
log(a), In(a), log10(a), exp(a)                                                               float, double
一元函数
+a, a                                                                                                     任意类型
二元函数
a+b, ab, a*b, a/b, a%b, a^b or a**b                                                  任意类型
矢量函数
a dot b or dot(a, b)                                                                                float vector
a cross b or cross(a,b)                                                                         float 3-vector
mag(a)                                                                                                   double, float vector
norm(a)                                                                                                  float vector
其他函数
sqrt(a)                                                                                                    float, double, complex
pow(a, b)                                                                                               float, double, complex  
abs(a)                                                                                                    double, float, integer, complex
arg(a)                                                                                                     complex only
sign(a)                                                                                                    all real types
min(a, b, ...), max(a, b, ...)                                                                    scalar
invalid(a)                                                                                                any type
random(a,seed)                                                                                    对a的每个点产生0到1的随机数
类型操作函数
int(a), float(a), byte(a), char(a), double(a), short(a),                          float, integer, byte,
sbyte, ubyte, ushort, uint                                                                       short, double
trunc(a), floor(a), ceil(a), rint(a)                                                            float, double
complex(a,b) or complex(a),                                                                float, integer, byte, short, double
real(a)                                                                                                     complex only
imag(a)                                                                                                   complex only
矢量构建
[a, b, ...]                                                                                                   any type
矢量选择函数
a.x or a.0, a.y or a.1, and so on                                                            vector
select(a,b)                                                                                              选择a的第b个值,从0计数
条件函数
a?b:c                                                                                                       a是整数。
                                                                                                                如果a不等于0,选b,否则选c

逻辑操作
二元: <, >, <=, >= (true = 1; false = 0)                                                  any scalar type
二元: ==, !=                                                                                             any type
一元: ! (not), 二元: && (and), || (or)                                                       integer
按位操作
and(a,b), xor(a,b), or(a,b), not(a) (one’s complement)                       byte, int
字符串函数
strcmp(a,b)                                                                                              strings,对比a和b,如果a==b,返回0,如果a<b,返回一个负整数,如果a>b,返回正整数
strlen(a)                                                                                                    strings,返回a的长度
strstr(a,b)                                                                                                  strings,找到a中的子串b,并返回偏移量




https://blog.sciencenet.cn/blog-441611-872683.html

上一篇:ubuntu 更改ssh 端口
下一篇:OpenDX 数据类型详解
收藏 IP: 210.72.136.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-16 21:52

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部