Parallel processing 英特尔visual#fortran中具有指针属性#问题的派生类型变量
在过去的两年里,我一直在写计算流体动力学代码。在我的串行代码中,我定义了一个派生类型,如下所示:Parallel processing 英特尔visual#fortran中具有指针属性#问题的派生类型变量,parallel-processing,fortran,intel,derived-types,fortran-coarrays,Parallel Processing,Fortran,Intel,Derived Types,Fortran Coarrays,在过去的两年里,我一直在写计算流体动力学代码。在我的串行代码中,我定义了一个派生类型,如下所示: type ptr_SCL real(8), pointer :: Q end type ptr_SCL type arr_nod real(8) :: Q type(ptr_SCL)::p0(5) type(ptr_SCL)::pj(5,5) end type arr_nod type(arr_nod ),target,allocatabl
type ptr_SCL
real(8), pointer :: Q
end type ptr_SCL
type arr_nod
real(8) :: Q
type(ptr_SCL)::p0(5)
type(ptr_SCL)::pj(5,5)
end type arr_nod
type(arr_nod ),target,allocatable :: Ucv(:) , Ustcv(:)
这种声明背后的原因是,每个计算公式都是为一个计算单元编写的,该计算单元有四个邻居,每个单元本身有四个邻居。这样,我就不需要在每个迭代步骤中定义从何处读取值或将结果写入何处。无论采用哪种方式,我都应该定义一个第三秩数组来存储相邻位置的数量,我认为这可能会加快代码的速度
----------
-------+--
------+*+-
-------+--
----------
(假设每行有10个单元格)
例如,28号小区的邻居是18、29、38和27
在循环所有单元之前的每个迭代步骤中,前一步骤的结果应存储在类似于ustcv
的数组中,并在求解方程后比较两个数组以测量收敛性。因为两个数组都是我刚才使用的同一类型
ustcv=ucv
uco
和ustco
,并将ucv
和ustcv
指向它们,它们不是co数组,并且是它们图像的本地对象。我对ustcv
和ucv
进行计算。我尝试使用(1)和(2)得到错误的结果
我上面解释的是我复杂的CFD代码中实际发生的事情的简要形式。1)和2)是不同的,因为它们在RHS上有不同的阵列,ust在1)中,ucv在2)中。这是问题中的错误,还是代码中的错误?不要使用Real(8),学会使用Selected_Real_kind或ISO_FORTRAN_ENV。感谢我修复了它1)和2)的不同之处,因为它们在RHS上有不同的阵列,在1)中有ust,在2)中有ucv。这是问题中的错误,还是代码中的错误?不要使用Real(8),学会使用Selected_Real_kind或ISO_FORTRAN_ENV。谢谢,我修好了
DO K=1,kmx
ustcv(k)%q=ucv(k)%q
END DO