使用靜態變量在子例程中存儲狀態是否是一種好的做法?我心裏有類似以下內容:「一些東西」使用靜態變量在子例程中存儲狀態是否是一種好的做法?
subroutine somesub()
logical, save :: first_call = .true.
if (first_call) then
! do some stuff
first_call = .false.
end if
! ... perform standard work
end subroutine somesub
例子包括:
- 分配工作陣列。這可能是最好的自動數組。
- 初始化需要某種運行時評估的物理/數學常量。一個很好的例子是
pi = datan(1.0)*4d0
。 - 從名單或文本文件中讀取一些參數和物理名稱。
根據this question,在使用多線程的情況下,使用靜態變量來存儲這樣的狀態將被忽略。這是一個典型的fortran物理模擬代碼中的openmp或mpi問題嗎?
對於特定於子程序的物理常數和用戶可修改參數,您還推薦了哪些替代方法?
這似乎是基於對我相當的意見。我建議使用模塊或派生類型並將數據存儲在那裏。並使用單獨的初始化或配置過程。 –
借調。正如你暗示的那樣,在與OpenMP並行時,這種風格會成爲一種正確的皇家痛苦,它只是要求競爭條件;有一個單獨的初始化程序,並將其粘貼在一個模塊中。哦,datan是Fortran 66風格的,atan很好,現在你可以在參數聲明中使用這個表達式。 –
你是否嚴格談論固定參數?使用「狀態」這個詞讓我覺得sub可能會改變它的值(在初始調用後) – agentp