因此,我正在使用運算符重載在Fortran中使用自動差分工具箱。我以前在C++中實現過這個功能,但真的需要讓它在Fortran中運行。爲用戶定義類型分配被動值或常量
Fortran中我有以下模塊定義:
module adopov
integer :: indexcount
integer, parameter :: tape_size = 1000
!
!....... ADtype
public :: ADtype
type ADtype
integer :: index = -1
real :: v = 0.0
!
contains
procedure :: oo_asg
generic, public :: assignment(=) => oo_asg
end type ADtype
!
!....... class tape
public :: ADtape
type ADtape
real :: v = 0.0
end type ADtape
!
!....... interface(s)
interface assignment(=)
module procedure oo_asg
end interface
!
type (ADtape), dimension(tape_size) :: tape
!
!....... definitions
contains
!
!....... assignment
subroutine oo_asg (x,y)
implicit none
class(ADtype), intent(out) :: x
class(ADtype), intent(in) :: y
!
tape(indexcount)%v = y%v
indexcount = indexcount + 1
x%v = y%v
x%index = indexcount
end subroutine oo_asg
!
end module adopov
在C++中,我有一個類似的用戶定義類型爲
class ADType {
public:
int index;
double v;
ADType() : index(-1), v(0) {};
ADType(const double&);
ADType& operator=(const ADType&);
};
在構造函數設置的初始值的索引和價值的部分。接下來,我有一個被動值或常量(double類型)的構造函數,以便我可以在有雙變量時定義一個新的類變量(ADType
)。例如,當我有:
ADType x;
x = 2.0;
最初ADType
類型的新變量被設置爲2.0的值創建的,讓我們說var1 = 2.0
和next(根據在類ADType
定義的賦值運算符(=))我將該變量分配給x,即x = var1
。這整個過程被記錄在一個記錄操作並記錄值和索引的磁帶中。
現在,你可以說「爲什麼你必須這樣做?」。那麼,在使用運算符重載進行自動微分的伴隨方法中,這是一個必要的步驟。
我做C語言中的方式++是,我只是有以下兩個構造函數:
ADType:: ADType(const double& x): v(x) {
tape[indexcounter].v = x;
indexcounter++;
};
ADType& ADType::operator=(const ADType& x) {
if (this==&x) return *this;
tape[indexcounter].v = v = x.v;
indexcounter++;
return *this;
}
,但我不知道如何實現用Fortran被動值和常量構造函數。
這是你的計劃,但如果你用小字母C++爲什麼Fortran語言不使用它們呢?他們更可讀。而且你不需要'= 0.D0',即使你的變量是雙打,'= 0'也是非常好的。而且因爲你的變量是默認實數,所以根本就不需要D。 –
@VladimirF感謝您的提示。我想這只是一個老習慣 – FRJedi
@VladimirF只是編輯了這個問題,使它更具可讀性 – FRJedi