求助编译(Compile)的问题,附代码
mathematica吧
全部回复
仅看楼主
level 2
请求各位大佬帮忙,万分感谢
代码功能:对Eigensystem函数进行编译,求解矩阵特征值
所遇问题:编译时开并行化就出错 (错误提示,附图)
Parallelization -> True 出错
Parallelization -> False 不报错
附代码:
ClearAll["Global`*"]
Needs["CompiledFunctionTools`"]
{eval, evec} = With[{v1 = 5.922,
v2 = 1.25,
v3 = 0.1974,
m0 = -0.0047,
mp = 15,
mz = 0.15,
\[Mu]B = 5.788*10.^-5,
gbpd = 33.75,
gbmd = 11.25},
Compile[{{bx, _Real, 0}, {kx, _Real, 0}, {ky, _Real,
0}, {kz, _Real, 0}}, #, Parallelization -> True,
CompilationTarget -> "C", RuntimeAttributes -> {Listable}]] & /@
Eigensystem[{{m0 + (kx^2 + ky^2) mp +
kz^2 mz, -(1/2) bx gbpd \[Mu]B, kx v1 - I ky v2,
kz v3}, {-(1/2) bx gbpd \[Mu]B, m0 + (kx^2 + ky^2) mp + kz^2 mz,
kz v3, -kx v1 - I ky v2}, {kx v1 + I ky v2,
kz v3, -m0 - (kx^2 + ky^2) mp -
kz^2 mz, -(1/2) bx gbmd \[Mu]B}, {kz v3, -kx v1 +
I ky v2, -(1/2) bx gbmd \[Mu]B, -m0 - (kx^2 + ky^2) mp -
kz^2 mz}}];
n = 30;
bx = 5.;
dk = 6.283/n;
kk = Range[-0.12, 0.12, dk];
surface = Tuples[kk, 3];
range = Length[surface];
bbx = ConstantArray[bx, range];
data = Partition[Flatten[Transpose[{bbx, surface}]], 4];
eval @@ Transpose[data]
2020年12月28日 05点12分 1
吧务
level 12
关于编译,强烈推荐这个帖子:https://tieba.baidu.com/p/4246953053,仔细看一下能解决绝大部分编译问题
具体到你这个例子,问题不是出在Parallelization,而是编译本身就没有成功
根据原则〇,先用CompilePrint[eval]检查一下,发现一上来就是一个巨大的MainEvaluate,仔细看下发现MainEvaluate中主要是Root函数。
根据原则一,检查一下Root函数是否可编译:MemberQ[Compile`CompilerFunctions[], Root],答案是False。所以这时候要想办法把Root去掉,对于这种阶数不算太高的情况,直接用ToRadicals就可以,ToRadicals@Eigensystem[XXXXX],看下输出确实变成根式不再有Root了,再CompilePrint[eval]也没有MainEvaluate了。
但是这时运行还是会报错:“CompiledFunction::cfne: 碰到数值错误;继续使用未编译的计算.”看下输出,第一项是0.840782 - 6.39709*10^-20 I,说明计算过程中浮点数精度导致出现了复数,而函数的输入参数都是Real,违反了原则四“Compile内部的变量的类型不能中途改变”。解决方法也很简单,把输入参数的类型指定为Complex就OK了
最后改好的代码如下,n=1000的情况在我这里运行时间0.07s左右
In[76]:= ClearAll["Global`*"]
Needs["CompiledFunctionTools`"]
{eval, evec} =
With[{v1 = 5.922, v2 = 1.25, v3 = 0.1974, m0 = -0.0047, mp = 15,
mz = 0.15, \[Mu]B = 5.788*10.^-5, gbpd = 33.75, gbmd = 11.25},
Compile[{{bx, _Complex, 0}, {kx, _Complex, 0}, {ky, _Complex,
0}, {kz, _Complex, 0}}, #, Parallelization -> True,
CompilationTarget -> "C", RuntimeAttributes -> {Listable}]] & /@
ToRadicals@
Eigensystem[{{m0 + (kx^2 + ky^2) mp +
kz^2 mz, -(1/2) bx gbpd \[Mu]B, kx v1 - I ky v2,
kz v3}, {-(1/2) bx gbpd \[Mu]B,
m0 + (kx^2 + ky^2) mp + kz^2 mz,
kz v3, -kx v1 - I ky v2}, {kx v1 + I ky v2,
kz v3, -m0 - (kx^2 + ky^2) mp -
kz^2 mz, -(1/2) bx gbmd \[Mu]B}, {kz v3, -kx v1 +
I ky v2, -(1/2) bx gbmd \[Mu]B, -m0 - (kx^2 + ky^2) mp -
kz^2 mz}}];
n = 1000;
bx = 5.;
dk = 6.283/n;
kk = Range[-0.12, 0.12, dk];
surface = Tuples[kk, 3];
range = Length[surface];
bbx = ConstantArray[bx, range];
data = Partition[Flatten[Transpose[{bbx, surface}]], 4];
(eval @@ Transpose[data])[[;; 5]] // Chop // AbsoluteTiming
Out[87]= {0.0685714, {{0.840782,
0.847429, -0.844613, -0.843597}, {0.840637,
0.847282, -0.844467, -0.843452}, {0.840499,
0.847143, -0.844328, -0.843314}, {0.84037,
0.847013, -0.844198, -0.843185}, {0.840248,
0.84689, -0.844075, -0.843063}}}
2020年12月28日 12点12分 2
实在非常感谢,,,真的没问题了[献花]
2020年12月29日 04点12分
1