Fortran Coder

查看: 13238|回复: 6
打印 上一主题 下一主题

[求助] 求问 error#6366,matmul问题

[复制链接]

8

帖子

2

主题

0

精华

入门

F 币
55 元
贡献
26 点
跳转到指定楼层
楼主
发表于 2021-7-1 09:56:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
001module K_Hill48Module
002   implicit none;
003 
004   ! 定义函数重载接口,后缀为dp为双精度函数,后缀为sp为单精度函数
005   interface K_getEquStress
006       module procedure K_getEquStress_dp;
007       module procedure K_getEquStress_sp;
008   end interface
009 
010   interface K_getDelF_DelSigma
011       module procedure K_getDelF_DelSigma_dp;
012       module procedure K_getDelF_DelSigma_sp;
013   end interface
014 
015   interface K_getDelF_DelSigma_fast
016       module procedure K_getDelF_DelSigma_fast_dp;
017       module procedure K_getDelF_DelSigma_fast_sp;
018   end interface
019 
020  
021    
022 
023 contains
024 
025 
026  
027  
028 ! Stress为行向量,3个分量
029 real(8) function K_getP(param_r0, param_r45, param_r90)
030   implicit none;
031   real(8) :: param_r0;
032   real(8) :: param_r45;
033   real(8) :: param_r90;
034   real(8) :: P12;
035   real(8) :: P22;
036   real(8) :: P66;
037   dimension K_getP(3, 3);
038 
039   P12 = param_r0 / (1.d0 + param_r90);
040   P22 = param_r0 *(1.d0 + param_r90) / (param_r90
041&                               * (1.d0 + param_r0));
042   P66 = (1.d0 +2.d0 * param_r45) * (param_r0 + param_r90) 
043&              / ((param_r0 + 1.d0)*param_r90);
044    ! reshape前的数组构造器必须是列优先的
045    K_getP = reshape((/  1.d0,           -P12,      0d0,
046&                        -P12,         P22,      0d0,
047&                        0d0,          0d0,      P66/)
048&                      , (/3, 3/));
049   
050 end function
051 
052 
053 
054 
055 
056 ! 求Hill48等效应力(双精度)
057 ! Stress为行向量,3个分量
058 real(8) function K_getEquStress_dp(param_r0, param_r45, param_r90
059&                                   ,Stress)
060   implicit none;
061   real(8) :: param_r0;
062   real(8) :: param_r45;
063   real(8) :: param_r90;
064   real(8) :: P(3, 3);
065   real(8) :: Stress_T(1, 3);
066   real(8) :: Stress_V(3, 1);
067   real(8) :: Stress(3);
068   real(8) :: temp1(1, 3);
069   real(8) :: temp2;
070    
071   P = K_getP(param_r0, param_r45, param_r90);
072    Stress_T = reshape((/Stress(1), Stress(2), Stress(3)/)
073&                          , (/1, 3/));
074    Stress_V = reshape((/Stress(1), Stress(2), Stress(3)/)
075&                          , (/3, 1/));
076   temp1 = matmul(Stress_T, P);
077   temp2 = matmul(temp1, Stress_V);
078   K_getEquStress_dp = sqrt(temp2 / 2.d0);
079    
080 end function
081 
082 
083 ! 求Hill48等效应力(单精度)
084 ! Stress为行向量,3个分量
085 real function K_getEquStress_sp(param_r0_sp, param_r45_sp,
086&                                param_r90_sp, Stress_sp)
087   implicit none;
088   real :: param_r0_sp;
089   real :: param_r45_sp;
090   real :: param_r90_sp;
091   real :: Stress_sp(3);
092   real(8) :: Stress_dp(3);
093   real(8) :: equStress_dp;
094   real(8) :: param_r0_dp;
095   real(8) :: param_r45_dp;
096   real(8) :: param_r90_dp;
097    
098   param_r0_dp = param_r0_sp;
099   param_r45_dp = param_r45_sp;
100   param_r90_dp = param_r90_sp;
101   Stress_dp = Stress_sp;
102   equStress_dp = K_getEquStress_dp(param_r0_dp, param_r45_dp
103&                              , param_r90_dp, Stress_dp);
104   K_getEquStress_sp = equStress_dp;
105 end function
106 
107 ! 求屈服函数f对应力Sigma(k)的偏导数df/dSigma(k); k = 1, 2, 3(双精度)
108 ! Stress为行向量,3个分量
109 ! df/dSigma也存储为行向量
110 real(8) function K_getDelF_DelSigma_dp(param_r0, param_r45,
111&                                    param_r90, Stress)
112   implicit none;
113   real(8) :: param_r0;
114   real(8) :: param_r45;
115   real(8) :: param_r90;
116   real(8) :: Stress_V(3, 1);
117   real(8) :: Stress(3);
118   real(8) :: P(3, 3);
119   real(8) :: equStress;
120   real(8) :: temp;
121   dimension K_getDelF_DelSigma_dp(3,1);
122 
123   P = K_getP(param_r0, param_r45, param_r90);
124   Stress_V = reshape((/Stress(1), Stress(2), Stress(3)/)
125&                          , (/3, 1/));
126   equStress = K_getEquStress_dp(param_r0, param_r45, param_r90,
127&                                       Stress);
128   temp = 2.d0 * equStress;
129   K_getDelF_DelSigma_dp = matmul(P, Stress_V) / temp;
130 end function
131 
132 ! 求屈服函数f对应力Sigma(k)的偏导数df/dSigma(k); k = 1, 2, 3(单精度)
133 ! Stress为行向量,3个分量
134 ! df/dSigma也存储为行向量
135 real function K_getDelF_DelSigma_sp(param_r0_sp, param_r45_sp,
136&                                    param_r90_sp, Stress_sp)
137   implicit none;
138   real :: param_r0_sp;
139   real :: param_r45_sp;
140   real :: param_r90_sp;
141   real :: Stress_sp(3);
142   real(8) :: Stress_dp(3);
143   real(8) :: param_r0_dp;
144   real(8) :: param_r45_dp;
145   real(8) :: param_r90_dp;
146   real(8) :: DelF_DelSigma_dp(3,1);
147   dimension K_getDelF_DelSigma_sp(3,1);
148   param_r0_dp = param_r0_sp;
149   param_r45_dp = param_r45_sp;
150   param_r90_dp = param_r90_sp;
151 
152   Stress_dp = Stress_sp;
153 
154   DelF_DelSigma_dp = K_getDelF_DelSigma_dp(param_r0_dp,
155&        param_r45_dp, param_r90_dp, Stress_dp);
156   K_getDelF_DelSigma_sp = DelF_DelSigma_dp;
157 end function
158 
159 
160 ! 快速求屈服函数f对应力Sigma(k)的偏导数df/dSigma(k); k = 1, 2, 3(双精度)
161 ! 给定equStress,减少计算量
162 ! Stress为行向量,3个分量
163 ! df/dSigma也存储为行向量
164 real(8) function K_getDelF_DelSigma_fast_dp(param_r0, param_r45,
165&                                  param_r90, Stress, equStress)
166   implicit none;
167   real(8) :: param_r0;
168   real(8) :: param_r45;
169   real(8) :: param_r90;
170   real(8) :: Stress_V(3, 1);
171   real(8) :: Stress(3);
172   real(8) :: P(3, 3);
173   real(8) :: equStress;
174   real(8) :: temp;
175   dimension K_getDelF_DelSigma_fast_dp(3,1);
176 
177   P = K_getP(param_r0, param_r45, param_r90);
178   Stress_V = reshape((/Stress(1), Stress(2), Stress(3)/)
179&                          , (/3, 1/));
180   temp = 2.d0 * equStress;
181    
182   K_getDelF_DelSigma_fast_dp = matmul(P, Stress_V) / temp;
183 end function
184 
185 
186 ! 快速求屈服函数f对应力Sigma(k)的偏导数df/dSigma(k); k = 1, 2, 3(单精度)
187 ! 给定equStress,减少计算量
188 ! Stress采用Voigt标记,为行向量,3个分量
189 ! df/dSigma也存储为行向量
190 real function K_getDelF_DelSigma_fast_sp(param_r0_sp,
191&         param_r45_sp, param_r90_sp  ,Stress_sp, equStress_sp)
192   implicit none;
193   real :: param_r0_sp;
194   real :: param_r45_sp;
195   real :: param_r90_sp;
196   real :: Stress_sp(3);
197   real :: equStress_sp;
198    
199   real(8) :: Stress_dp(3);
200   real(8) :: param_r0_dp;
201   real(8) :: param_r45_dp;
202   real(8) :: param_r90_dp;
203   real(8) :: equStress_dp;
204   real(8) :: DelF_DelSigma_dp(3,1);
205   dimension K_getDelF_DelSigma_fast_sp(3,1);
206   param_r0_dp = param_r0_sp;
207   param_r45_dp = param_r45_sp;
208   param_r90_dp = param_r90_sp;
209   Stress_dp = Stress_sp;
210   equStress_dp = equStress_sp;
211 
212   DelF_DelSigma_dp = K_getDelF_DelSigma_fast_dp(param_r0_dp,
213&      param_r45_dp, param_r90_dp, Stress_dp, equStress_dp);
214   K_getDelF_DelSigma_fast_sp = DelF_DelSigma_dp;
215 end function
216 
217 
218 
219 
220 
221 end module K_Hill48Module



错误    1     error #6366: The shapes of the array expressions do not conform.   [TEMP2]    求问大神们,在算等效应力时temp2为什么会出错呢   



分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

8

帖子

2

主题

0

精华

入门

F 币
55 元
贡献
26 点
沙发
 楼主| 发表于 2021-7-1 09:58:25 | 只看该作者
是因为matmul只能赋给数组,而real(8)::temp2是一个变量吗

174

帖子

2

主题

1

精华

大师

Vim

F 币
1061 元
贡献
497 点

规矩勋章

板凳
发表于 2021-7-1 10:39:38 | 只看该作者
本帖最后由 Transpose 于 2021-7-1 10:46 编辑

[Fortran] 纯文本查看 复制代码
1real(8) :: P(3, 3);
2real(8) :: Stress_T(1, 3);
3real(8) :: Stress_V(3, 1);
4real(8) :: Stress(3);
5real(8) :: temp1(1, 3);
6real(8) :: temp2;
7temp1 = matmul(Stress_T, P);
8temp2 = matmul(temp1, Stress_V);


维度不匹配
(1 ,3) * (3, 1) =(1,1)
是一个二维数组,不是一个数

在使用matmul时,如果输入一维数数组,Fortran会自动判断
对于c=matmul(a,b)
如果a是一维数组,b是二维数组,会自动解析为 a(1,n) b(n,m) 返回一维数组 c(m)
如果a是二维数组,b是一维数组,会自动解析为 a(m,n) b(n,1) 返回一维数组 c(m)
不需要定义为 a(1,3)这种数组
最后的是两个向量乘法,使用dot_product即可
[Fortran] 纯文本查看 复制代码
1temp2=dot_product(matmul(stress,P),stress)


8

帖子

2

主题

0

精华

入门

F 币
55 元
贡献
26 点
地板
 楼主| 发表于 2021-7-1 10:56:34 | 只看该作者
仔细看了一下,发现matmul必须有一个是二维数组,我这个是两个一维数组,需要dot_product,但是用了dot_product,temp2 = dot_product(temp1, Stress_V);
error #6372: One-dimensional array-valued arguments are required in this context.   [DOT_PRODUCT]       

213

帖子

2

主题

0

精华

宗师

F 币
2142 元
贡献
875 点

规矩勋章

5#
发表于 2021-7-1 21:14:36 | 只看该作者
本帖最后由 风平老涡 于 2021-7-1 21:20 编辑
marlene 发表于 2021-7-1 10:56
仔细看了一下,发现matmul必须有一个是二维数组,我这个是两个一维数组,需要dot_product,但是用了dot_prod ...

因为你的temp1和stress_V定义的都是二维数组,你可以定义temp2为二维数组temp2(1,1),用matmul;或者temp1和stress_V赋值给二个一维数组,用dot_product;又或者用temp2=dot_product(temp1(1,:), stress_v(:, 1))

8

帖子

2

主题

0

精华

入门

F 币
55 元
贡献
26 点
6#
 楼主| 发表于 2021-7-3 16:29:44 | 只看该作者
Transpose 发表于 2021-7-1 10:39
[mw_shl_code=fortran,true]   real(8) :: P(3, 3);
   real(8) :: Stress_T(1, 3);
   real(8) :: Stress_ ...

谢谢大佬,讲的很清楚,我明白啦

8

帖子

2

主题

0

精华

入门

F 币
55 元
贡献
26 点
7#
 楼主| 发表于 2021-7-3 16:30:19 | 只看该作者
风平老涡 发表于 2021-7-1 21:14
因为你的temp1和stress_V定义的都是二维数组,你可以定义temp2为二维数组temp2(1,1),用matmul;或者temp1 ...

谢谢大佬,讲的很清楚,我明白啦
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2025-4-29 01:13

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

快速回复 返回顶部 返回列表