Multithreading 如何使使用Fortran模块在Abaqus子例程之间共享变量具有线程安全性?

Multithreading 如何使使用Fortran模块在Abaqus子例程之间共享变量具有线程安全性?,multithreading,fortran,abaqus,Multithreading,Fortran,Abaqus,我有一个Abaqus/显式模型,目前使用3个子例程:VEXTERNALDB、VUAMP和VDLOAD。VEXTERNALDB用于读取外部生成的文本文件并保存值,以便其他两个子例程可以读取这些值 我想为模型增加额外的复杂性,这要求现在导入的值之一将由内部确定,并根据每个增量中模型的状态而变化 我计划使用概述的模块实现此功能。然而,由于对Fortran/多线程的普遍无知,我担心线程安全。我的问题如下: 相同的模块变量是所有线程之间的全局变量,还是在每个线程的基础上定义的 如果变量在线程之间共享,那么

我有一个Abaqus/显式模型,目前使用3个子例程:VEXTERNALDB、VUAMP和VDLOAD。VEXTERNALDB用于读取外部生成的文本文件并保存值,以便其他两个子例程可以读取这些值

我想为模型增加额外的复杂性,这要求现在导入的值之一将由内部确定,并根据每个增量中模型的状态而变化

我计划使用概述的模块实现此功能。然而,由于对Fortran/多线程的普遍无知,我担心线程安全。我的问题如下:

  • 相同的模块变量是所有线程之间的全局变量,还是在每个线程的基础上定义的
  • 如果变量在线程之间共享,那么在任何写命令上都是互斥的,这是一个可接受的解决方案吗
  • 将变量定义为数组并只允许每个线程更改数组中的单个值是否更好

  • 根据定义,模块变量在其模块中是全局变量。如果您使用omp实现并行化,您可以
    在外部范围中使用它们,并显式地设置和定义它们的属性,例如通过
    私有、共享等。最好提供一个最小的工作示例。通过这种方式,我们可以给出更详细的答案。一般来说,您打算如何实现多线程?OpenMP?@IanBush我实际上不知道它在内部是如何处理的,我只是用一个参数来调用Abaqus解算器,指定要使用的处理器数量。我知道每个线程都会调用子例程,有时每次增量调用多次,但我自己并不定义多线程行为。进程还是线程?他们是不同的。这很重要。根据定义,模块变量在其模块中是全局的。如果您使用omp实现并行化,您可以
    在外部范围中使用它们,并显式地设置和定义它们的属性,例如通过
    私有、共享等。最好提供一个最小的工作示例。通过这种方式,我们可以给出更详细的答案。一般来说,您打算如何实现多线程?OpenMP?@IanBush我实际上不知道它在内部是如何处理的,我只是用一个参数来调用Abaqus解算器,指定要使用的处理器数量。我知道每个线程都会调用子例程,有时每次增量调用多次,但我自己并不定义多线程行为。进程还是线程?他们是不同的。这很重要。