/[MITgcm]/MITgcm_contrib/heimbach/OpenAD/code_shallow_openad/active_module.f90
ViewVC logotype

Annotation of /MITgcm_contrib/heimbach/OpenAD/code_shallow_openad/active_module.f90

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.3 - (hide annotations) (download)
Sun Jan 29 06:11:02 2006 UTC (20 years, 9 months ago) by utke
Branch: MAIN
Changes since 1.2: +6 -6 lines
out only parameters goof up  the %d part of the active type

1 heimbach 1.1
2     module active_module
3     use w2f__types
4     implicit none
5     private
6     public :: active, saxpy, sax, setderiv, zero_deriv, &
7     &convert_p2a_scalar, convert_a2p_scalar, &
8     &convert_p2a_vector, convert_a2p_vector, &
9 utke 1.2 &convert_p2a_matrix, convert_a2p_matrix, &
10     &convert_p2a_three_tensor, convert_a2p_three_tensor, &
11     &convert_p2a_four_tensor, convert_a2p_four_tensor, &
12     &convert_p2a_five_tensor, convert_a2p_five_tensor
13 heimbach 1.1
14    
15     !
16     ! active needs to be a sequence type
17     ! with no initialization
18     !
19     type active
20     sequence
21     double precision :: v
22     ! initialization does not work for active variables
23     ! inside of common block, such as in boxmodel
24     ! initialization is required for correct adjoint
25     double precision :: d=0.0
26     ! double precision :: d
27     end type active
28    
29     interface saxpy
30     module procedure saxpy_a_a
31     end interface
32    
33     interface setderiv
34     module procedure setderiv_a_a
35     end interface
36    
37     interface zero_deriv
38     module procedure zero_deriv_a
39     end interface
40    
41     interface sax
42     module procedure sax_d_a_a, sax_i_a_a
43     end interface
44    
45     interface convert_p2a_scalar
46     module procedure convert_p2a_scalar_impl
47     end interface
48     interface convert_a2p_scalar
49     module procedure convert_a2p_scalar_impl
50     end interface
51 utke 1.2
52 heimbach 1.1 interface convert_p2a_vector
53     module procedure convert_sp2a_vector_impl
54     end interface
55     interface convert_a2p_vector
56     module procedure convert_a2sp_vector_impl
57     end interface
58 utke 1.2
59 heimbach 1.1 interface convert_p2a_matrix
60     module procedure convert_sp2a_matrix_impl
61     end interface
62     interface convert_a2p_matrix
63     module procedure convert_a2sp_matrix_impl
64     end interface
65    
66 utke 1.2 interface convert_p2a_three_tensor
67     module procedure convert_sp2a_three_tensor_impl
68     end interface
69     interface convert_a2p_three_tensor
70     module procedure convert_a2sp_three_tensor_impl
71     end interface
72    
73     interface convert_p2a_four_tensor
74     module procedure convert_sp2a_four_tensor_impl
75     end interface
76     interface convert_a2p_four_tensor
77     module procedure convert_a2sp_four_tensor_impl
78     end interface
79    
80     interface convert_p2a_five_tensor
81     module procedure convert_sp2a_five_tensor_impl
82     end interface
83     interface convert_a2p_five_tensor
84     module procedure convert_a2sp_five_tensor_impl
85     end interface
86    
87 heimbach 1.1 contains
88    
89     !
90     ! chain rule saxpy to be used in forward and reverse modes
91     !
92    
93     subroutine saxpy_a_a(a,x,y)
94     double precision, intent(in) :: a
95     type(active), intent(in) :: x
96     type(active), intent(inout) :: y
97    
98     y%d=y%d+x%d*a
99     end subroutine saxpy_a_a
100    
101     !
102     ! chain rule saxpy to be used in forward and reverse modes
103     ! derivative component of y is equal to zero initially
104     ! note: y needs to be inout as otherwise value component gets
105     ! zeroed out
106     !
107    
108     subroutine sax_d_a_a(a,x,y)
109     double precision, intent(in) :: a
110     type(active), intent(in) :: x
111     type(active), intent(inout) :: y
112    
113     y%d=x%d*a
114     end subroutine sax_d_a_a
115    
116     subroutine sax_i_a_a(a,x,y)
117     integer(kind=w2f__i8), intent(in) :: a
118     type(active), intent(in) :: x
119     type(active), intent(inout) :: y
120    
121     y%d=x%d*a
122     end subroutine sax_i_a_a
123    
124     !
125     ! set derivative of y to be equal to derivative of x
126     ! note: making y inout allows for already existing active
127     ! variables to become the target of a derivative assignment
128     !
129    
130     subroutine setderiv_a_a(y,x)
131     type(active), intent(inout) :: y
132     type(active), intent(in) :: x
133    
134     y%d=x%d
135     end subroutine setderiv_a_a
136    
137     !
138     ! set derivative components to 0.0
139     !
140     subroutine zero_deriv_a(x)
141     type(active), intent(out) :: x
142    
143     x%d=0.0d0
144     end subroutine zero_deriv_a
145    
146     subroutine convert_a2p_scalar_impl(convertTo, convertFrom)
147     double precision, intent(out) :: convertTo
148     type(active), intent(in) :: convertFrom
149     convertTo=convertFrom%v
150     end subroutine
151    
152     subroutine convert_p2a_scalar_impl(convertTo, convertFrom)
153     double precision, intent(in) :: convertFrom
154 utke 1.3 type(active), intent(inout) :: convertTo
155 heimbach 1.1 convertTo%v=convertFrom
156     end subroutine
157    
158     subroutine convert_a2sp_vector_impl(convertTo, convertFrom)
159     type(active), dimension(:), intent(in) :: convertFrom
160     real, dimension(:), intent(out) :: convertTo
161     integer i
162     do i=lbound(convertFrom,1),ubound(convertFrom,1)
163     convertTo(i)=convertFrom(i)%v
164     end do
165     end subroutine
166    
167     subroutine convert_sp2a_vector_impl(convertTo, convertFrom)
168     real, dimension(:), intent(in) :: convertFrom
169 utke 1.3 type(active), dimension(:), intent(inout) :: convertTo
170 heimbach 1.1 integer i
171     do i=lbound(convertFrom,1),ubound(convertFrom,1)
172     convertTo(i)%v=convertFrom(i)
173     end do
174     end subroutine
175    
176     subroutine convert_a2sp_matrix_impl(convertTo, convertFrom)
177     type(active), dimension(:,:), intent(in) :: convertFrom
178     real, dimension(:,:), intent(out) :: convertTo
179     integer i,j
180     do i=lbound(convertFrom,1),ubound(convertFrom,1)
181     do j=lbound(convertFrom,2),ubound(convertFrom,2)
182     convertTo(i,j)=convertFrom(i,j)%v
183     end do
184     end do
185     end subroutine
186    
187     subroutine convert_sp2a_matrix_impl(convertTo, convertFrom)
188     real, dimension(:,:), intent(in) :: convertFrom
189 utke 1.3 type(active), dimension(:,:), intent(inout) :: convertTo
190 heimbach 1.1 integer i,j
191     do i=lbound(convertFrom,1),ubound(convertFrom,1)
192     do j=lbound(convertFrom,2),ubound(convertFrom,2)
193     convertTo(i,j)%v=convertFrom(i,j)
194     end do
195     end do
196     end subroutine
197 utke 1.2
198     subroutine convert_a2sp_three_tensor_impl(convertTo, convertFrom)
199     type(active), dimension(:,:,:), intent(in) :: convertFrom
200     real, dimension(:,:,:), intent(out) :: convertTo
201     integer i,j,k
202     do i=lbound(convertFrom,1),ubound(convertFrom,1)
203     do j=lbound(convertFrom,2),ubound(convertFrom,2)
204     do k=lbound(convertFrom,3),ubound(convertFrom,3)
205     convertTo(i,j,k)=convertFrom(i,j,k)%v
206     end do
207     end do
208     end do
209     end subroutine
210    
211     subroutine convert_sp2a_three_tensor_impl(convertTo, convertFrom)
212     real, dimension(:,:,:), intent(in) :: convertFrom
213 utke 1.3 type(active), dimension(:,:,:), intent(inout) :: convertTo
214 utke 1.2 integer i,j,k
215     do i=lbound(convertFrom,1),ubound(convertFrom,1)
216     do j=lbound(convertFrom,2),ubound(convertFrom,2)
217     do k=lbound(convertFrom,3),ubound(convertFrom,3)
218     convertTo(i,j,k)%v=convertFrom(i,j,k)
219     end do
220     end do
221     end do
222     end subroutine
223    
224     subroutine convert_a2sp_four_tensor_impl(convertTo, convertFrom)
225     type(active), dimension(:,:,:,:), intent(in) :: convertFrom
226     real, dimension(:,:,:,:), intent(out) :: convertTo
227     integer i,j,k,l
228     do i=lbound(convertFrom,1),ubound(convertFrom,1)
229     do j=lbound(convertFrom,2),ubound(convertFrom,2)
230     do k=lbound(convertFrom,3),ubound(convertFrom,3)
231     do l=lbound(convertFrom,4),ubound(convertFrom,4)
232     convertTo(i,j,k,l)=convertFrom(i,j,k,l)%v
233     end do
234     end do
235     end do
236     end do
237     end subroutine
238    
239     subroutine convert_sp2a_four_tensor_impl(convertTo, convertFrom)
240     real, dimension(:,:,:,:), intent(in) :: convertFrom
241 utke 1.3 type(active), dimension(:,:,:,:), intent(inout) :: convertTo
242 utke 1.2 integer i,j,k,l
243     do i=lbound(convertFrom,1),ubound(convertFrom,1)
244     do j=lbound(convertFrom,2),ubound(convertFrom,2)
245     do k=lbound(convertFrom,3),ubound(convertFrom,3)
246     do l=lbound(convertFrom,4),ubound(convertFrom,4)
247     convertTo(i,j,k,l)%v=convertFrom(i,j,k,l)
248     end do
249     end do
250     end do
251     end do
252     end subroutine
253    
254     subroutine convert_a2sp_five_tensor_impl(convertTo, convertFrom)
255     type(active), dimension(:,:,:,:,:), intent(in) :: convertFrom
256     real, dimension(:,:,:,:,:), intent(out) :: convertTo
257     integer i,j,k,l,m
258     do i=lbound(convertFrom,1),ubound(convertFrom,1)
259     do j=lbound(convertFrom,2),ubound(convertFrom,2)
260     do k=lbound(convertFrom,3),ubound(convertFrom,3)
261     do l=lbound(convertFrom,4),ubound(convertFrom,4)
262     do m=lbound(convertFrom,5),ubound(convertFrom,5)
263     convertTo(i,j,k,l,m)=convertFrom(i,j,k,l,m)%v
264     end do
265     end do
266     end do
267     end do
268     end do
269     end subroutine
270    
271     subroutine convert_sp2a_five_tensor_impl(convertTo, convertFrom)
272     real, dimension(:,:,:,:,:), intent(in) :: convertFrom
273 utke 1.3 type(active), dimension(:,:,:,:,:), intent(inout) :: convertTo
274 utke 1.2 integer i,j,k,l,m
275     do i=lbound(convertFrom,1),ubound(convertFrom,1)
276     do j=lbound(convertFrom,2),ubound(convertFrom,2)
277     do k=lbound(convertFrom,3),ubound(convertFrom,3)
278     do l=lbound(convertFrom,4),ubound(convertFrom,4)
279     do m=lbound(convertFrom,5),ubound(convertFrom,5)
280     convertTo(i,j,k,l,m)%v=convertFrom(i,j,k,l,m)
281     end do
282     end do
283     end do
284     end do
285     end do
286     end subroutine
287 heimbach 1.1
288     end module
289    
290    

  ViewVC Help
Powered by ViewVC 1.1.22