Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parallel processing 英特尔visual#fortran中具有指针属性#问题的派生类型变量_Parallel Processing_Fortran_Intel_Derived Types_Fortran Coarrays - Fatal编程技术网

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
  • 这对我很有效。但如果我只对主单元格值更新使用do循环,则结果会出错

  • 这里应该没有错误,因为我只是更改指针指向的内存的所有实际部分。但我不知道为什么会这样

    由于加速计算和进一步开发的需要,我使用co数组将串行代码转换为并行代码。但是我没有得到正确的结果。我检查了代码的所有部分,发现上面提到的代码存在问题。因为不允许co数组变量具有pointer属性。我为每一个定义了一个目标co数组,称为
    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