source: codes/icosagcm/devel/src/dynamics/compute_caldyn_Coriolis.F90

Last change on this file was 1027, checked in by dubos, 4 years ago

devel : towards conformity to F2008 standard

File size: 16.9 KB
Line 
1MODULE compute_caldyn_Coriolis_mod
2  USE prec, ONLY : rstd
3  USE caldyn_vars_mod, ONLY : caldyn_conserv, conserv_energy, conserv_enstrophy, conserv_gassmann
4  USE grid_param
5  USE earth_const
6  USE disvert_mod
7  USE omp_para
8  USE trace
9  IMPLICIT NONE
10  PRIVATE
11
12#include "../unstructured/unstructured.h90"
13
14  PUBLIC :: compute_caldyn_Coriolis_manual, &
15       compute_caldyn_Coriolis_unst, compute_caldyn_Coriolis_hex
16
17CONTAINS
18
19#ifdef BEGIN_DYSL
20
21KERNEL(coriolis)
22!
23  DO iq=1,nqdyn
24    FORALL_CELLS_EXT()
25      ON_EDGES
26        Ftheta(EDGE) = .5*(theta(CELL1,iq)+theta(CELL2,iq))*hflux(EDGE)
27      END_BLOCK
28    END_BLOCK
29    FORALL_CELLS()
30      ON_PRIMAL
31        divF=0.
32        FORALL_EDGES
33          divF = divF + Ftheta(EDGE)*SIGN
34        END_BLOCK
35        dtheta_rhodz(CELL,iq) = -divF / AI
36      END_BLOCK
37    END_BLOCK
38  END DO ! iq
39!
40  FORALL_CELLS()
41    ON_PRIMAL
42      divF=0.
43      FORALL_EDGES
44        divF = divF + hflux(EDGE)*SIGN
45      END_BLOCK
46      convm(CELL) = -divF / AI
47    END_BLOCK
48  END_BLOCK
49  !
50  SELECT CASE(caldyn_conserv)
51  CASE(conserv_energy) ! energy-conserving TRiSK
52     FORALL_CELLS()
53       ON_EDGES
54         du_trisk=0.
55         FORALL_TRISK
56           du_trisk = du_trisk + WEE*hflux(EDGE_TRISK)*(qu(EDGE)+qu(EDGE_TRISK))
57         END_BLOCK
58         du(EDGE) = du(EDGE) + .5*du_trisk
59       END_BLOCK
60     END_BLOCK
61  CASE(conserv_enstrophy) ! enstrophy-conserving TRiSK
62     FORALL_CELLS()
63       ON_EDGES
64         du_trisk=0.
65         FORALL_TRISK
66           du_trisk = du_trisk + WEE*hflux(EDGE_TRISK)
67         END_BLOCK
68         du(EDGE) = du(EDGE) + du_trisk*qu(EDGE)
69       END_BLOCK
70     END_BLOCK
71  END SELECT
72END_BLOCK
73
74#endif END_DYSL
75
76!-------------- Wrappers for F2008 conformity -----------------
77
78    SUBROUTINE compute_caldyn_coriolis_unst(hflux,theta,qu, Ftheta, convm,dtheta_rhodz,du)
79      REAL(rstd), INTENT(IN)    :: hflux(:,:), theta(:,:,:), qu(:,:)
80      REAL(rstd), INTENT(OUT)   :: Ftheta(:,:), convm(:,:), dtheta_rhodz(:,:,:)
81      REAL(rstd), INTENT(INOUT) :: du(:,:)
82      CALL compute_caldyn_coriolis_unst_(hflux,theta,qu, Ftheta, convm,dtheta_rhodz,du)
83    END SUBROUTINE compute_caldyn_coriolis_unst
84
85    SUBROUTINE compute_caldyn_coriolis_hex(hflux,theta,qu, Ftheta, convm,dtheta_rhodz,du)
86      REAL(rstd), INTENT(IN)    :: hflux(:,:), theta(:,:,:), qu(:,:)
87      REAL(rstd), INTENT(OUT)   :: Ftheta(:,:), convm(:,:), dtheta_rhodz(:,:,:)
88      REAL(rstd), INTENT(INOUT) :: du(:,:)
89      CALL compute_caldyn_coriolis_hex_(hflux,theta,qu, Ftheta, convm,dtheta_rhodz,du)
90    END SUBROUTINE compute_caldyn_coriolis_hex
91
92!--------------------------------------------------------------
93
94  SUBROUTINE compute_caldyn_coriolis_unst_(hflux,theta,qu, Ftheta, convm,dtheta_rhodz,du)
95    USE ISO_C_BINDING, only : C_DOUBLE, C_FLOAT
96    USE data_unstructured_mod, ONLY : enter_trace, exit_trace, &
97         id_coriolis, left, right, primal_deg, primal_edge, primal_ne, &
98         trisk_deg, trisk
99         
100    FIELD_U     :: hflux, Ftheta, qu, du ! IN, BUF, IN, INOUT
101    FIELD_MASS  :: convm                 ! BUF
102    FIELD_THETA :: theta, dtheta_rhodz   ! IN, OUT
103    DECLARE_INDICES
104    DECLARE_EDGES
105    NUM :: divF, du_trisk
106    START_TRACE(id_coriolis, 3,4,0) ! primal, dual, edge
107#include "../kernels_unst/coriolis.k90"
108    STOP_TRACE
109  END SUBROUTINE compute_caldyn_coriolis_unst_
110
111  SUBROUTINE compute_caldyn_Coriolis_hex_(hflux,theta,qu, Ftheta, convm,dtheta_rhodz,du)
112    USE icosa
113    REAL(rstd),INTENT(IN)    :: hflux(3*iim*jjm,llm)  ! hflux in kg/s
114    REAL(rstd),INTENT(IN)    :: theta(iim*jjm,llm,nqdyn) ! active scalars
115    REAL(rstd),INTENT(IN)    :: qu(3*iim*jjm,llm)
116    REAL(rstd), INTENT(OUT)  :: Ftheta(3*iim*jjm,llm)  ! potential temperature flux
117    REAL(rstd),INTENT(OUT)   :: convm(iim*jjm,llm)  ! mass flux convergence
118    REAL(rstd),INTENT(OUT)   :: dtheta_rhodz(iim*jjm,llm,nqdyn)
119    REAL(rstd),INTENT(INOUT) :: du(3*iim*jjm,llm)
120    REAL(rstd) :: uu_right, uu_lup, uu_ldown, du_trisk, divF
121    INTEGER :: ij,iq,l,kdown
122    CALL trace_start("compute_caldyn_Coriolis")
123
124#include "../kernels_hex/coriolis.k90"
125
126    CALL trace_end("compute_caldyn_Coriolis")
127  END SUBROUTINE compute_caldyn_Coriolis_hex_
128
129  SUBROUTINE compute_caldyn_Coriolis_manual(hflux,theta,qu, Ftheta, convm,dtheta_rhodz,du)
130    USE icosa
131    USE caldyn_vars_mod
132    REAL(rstd),INTENT(IN)    :: hflux(3*iim*jjm,llm)  ! hflux in kg/s
133    REAL(rstd),INTENT(IN)    :: theta(iim*jjm,llm,nqdyn) ! active scalars
134    REAL(rstd),INTENT(IN)    :: qu(3*iim*jjm,llm)
135    REAL(rstd),INTENT(IN)    :: Ftheta(3*iim*jjm,llm)  ! ignored in favor of local buffer
136    REAL(rstd),INTENT(OUT)   :: convm(iim*jjm,llm)  ! mass flux convergence
137    REAL(rstd),INTENT(OUT)   :: dtheta_rhodz(iim*jjm,llm,nqdyn)
138    REAL(rstd),INTENT(INOUT) :: du(3*iim*jjm,llm)
139    REAL(rstd)  :: buf_Ftheta(3*iim*jjm)  ! local buffer for potential temperature flux
140    REAL(rstd) :: uu_right, uu_lup, uu_ldown, du_trisk, divF
141    INTEGER :: ij,iq,l,kdown
142
143    CALL trace_start("compute_caldyn_Coriolis")
144
145#define FTHETA(ij) buf_Ftheta(ij)
146
147    DO l=ll_begin, ll_end
148       ! compute theta flux
149       DO iq=1,nqdyn
150       !DIR$ SIMD
151          DO ij=ij_begin_ext,ij_end_ext     
152             FTHETA(ij+u_right) = 0.5*(theta(ij,l,iq)+theta(ij+t_right,l,iq)) &
153                                  * hflux(ij+u_right,l)
154             FTHETA(ij+u_lup)   = 0.5*(theta(ij,l,iq)+theta(ij+t_lup,l,iq)) &
155                  * hflux(ij+u_lup,l)
156             FTHETA(ij+u_ldown) = 0.5*(theta(ij,l,iq)+theta(ij+t_ldown,l,iq)) &
157                  * hflux(ij+u_ldown,l)
158          END DO
159          ! horizontal divergence of fluxes
160       !DIR$ SIMD
161          DO ij=ij_begin,ij_end         
162             ! dtheta_rhodz =  -div(flux.theta)
163             dtheta_rhodz(ij,l,iq)= &
164                  -1./Ai(ij)*(ne_right*FTHETA(ij+u_right)    +  &
165                  ne_rup*FTHETA(ij+u_rup)        +  & 
166                  ne_lup*FTHETA(ij+u_lup)        +  & 
167                  ne_left*FTHETA(ij+u_left)      +  & 
168                  ne_ldown*FTHETA(ij+u_ldown)    +  &
169                  ne_rdown*FTHETA(ij+u_rdown) )
170          END DO
171       END DO
172
173       !DIR$ SIMD
174       DO ij=ij_begin,ij_end         
175          ! convm = -div(mass flux), sign convention as in Ringler et al. 2012, eq. 21
176          convm(ij,l)= -1./Ai(ij)*(ne_right*hflux(ij+u_right,l)   +  &
177               ne_rup*hflux(ij+u_rup,l)       +  & 
178               ne_lup*hflux(ij+u_lup,l)       +  & 
179               ne_left*hflux(ij+u_left,l)     +  & 
180               ne_ldown*hflux(ij+u_ldown,l)   +  & 
181               ne_rdown*hflux(ij+u_rdown,l))
182       END DO ! ij
183    END DO ! llm
184
185!!! Compute potential vorticity (Coriolis) contribution to du
186    SELECT CASE(caldyn_conserv)
187
188    CASE(conserv_energy) ! energy-conserving TRiSK
189
190       DO l=ll_begin,ll_end
191          !DIR$ SIMD
192          DO ij=ij_begin,ij_end         
193             uu_right = &
194                  wee(ij+u_right,1,1)*hflux(ij+u_rup,l)*(qu(ij+u_right,l)+qu(ij+u_rup,l))+                             &
195                  wee(ij+u_right,2,1)*hflux(ij+u_lup,l)*(qu(ij+u_right,l)+qu(ij+u_lup,l))+                             &
196                  wee(ij+u_right,3,1)*hflux(ij+u_left,l)*(qu(ij+u_right,l)+qu(ij+u_left,l))+                           &
197                  wee(ij+u_right,4,1)*hflux(ij+u_ldown,l)*(qu(ij+u_right,l)+qu(ij+u_ldown,l))+                         &
198                  wee(ij+u_right,5,1)*hflux(ij+u_rdown,l)*(qu(ij+u_right,l)+qu(ij+u_rdown,l))+                         & 
199                  wee(ij+u_right,1,2)*hflux(ij+t_right+u_ldown,l)*(qu(ij+u_right,l)+qu(ij+t_right+u_ldown,l))+         &
200                  wee(ij+u_right,2,2)*hflux(ij+t_right+u_rdown,l)*(qu(ij+u_right,l)+qu(ij+t_right+u_rdown,l))+         &
201                  wee(ij+u_right,3,2)*hflux(ij+t_right+u_right,l)*(qu(ij+u_right,l)+qu(ij+t_right+u_right,l))+         &
202                  wee(ij+u_right,4,2)*hflux(ij+t_right+u_rup,l)*(qu(ij+u_right,l)+qu(ij+t_right+u_rup,l))+             &
203                  wee(ij+u_right,5,2)*hflux(ij+t_right+u_lup,l)*(qu(ij+u_right,l)+qu(ij+t_right+u_lup,l))
204             uu_lup = &
205                  wee(ij+u_lup,1,1)*hflux(ij+u_left,l)*(qu(ij+u_lup,l)+qu(ij+u_left,l)) +                        &
206                  wee(ij+u_lup,2,1)*hflux(ij+u_ldown,l)*(qu(ij+u_lup,l)+qu(ij+u_ldown,l)) +                      &
207                  wee(ij+u_lup,3,1)*hflux(ij+u_rdown,l)*(qu(ij+u_lup,l)+qu(ij+u_rdown,l)) +                      &
208                  wee(ij+u_lup,4,1)*hflux(ij+u_right,l)*(qu(ij+u_lup,l)+qu(ij+u_right,l)) +                      &
209                  wee(ij+u_lup,5,1)*hflux(ij+u_rup,l)*(qu(ij+u_lup,l)+qu(ij+u_rup,l)) +                          & 
210                  wee(ij+u_lup,1,2)*hflux(ij+t_lup+u_right,l)*(qu(ij+u_lup,l)+qu(ij+t_lup+u_right,l)) +          &
211                  wee(ij+u_lup,2,2)*hflux(ij+t_lup+u_rup,l)*(qu(ij+u_lup,l)+qu(ij+t_lup+u_rup,l)) +              &
212                  wee(ij+u_lup,3,2)*hflux(ij+t_lup+u_lup,l)*(qu(ij+u_lup,l)+qu(ij+t_lup+u_lup,l)) +              &
213                  wee(ij+u_lup,4,2)*hflux(ij+t_lup+u_left,l)*(qu(ij+u_lup,l)+qu(ij+t_lup+u_left,l)) +            &
214                  wee(ij+u_lup,5,2)*hflux(ij+t_lup+u_ldown,l)*(qu(ij+u_lup,l)+qu(ij+t_lup+u_ldown,l))
215             uu_ldown = &
216                  wee(ij+u_ldown,1,1)*hflux(ij+u_rdown,l)*(qu(ij+u_ldown,l)+qu(ij+u_rdown,l)) +                      &
217                  wee(ij+u_ldown,2,1)*hflux(ij+u_right,l)*(qu(ij+u_ldown,l)+qu(ij+u_right,l)) +                      &
218                  wee(ij+u_ldown,3,1)*hflux(ij+u_rup,l)*(qu(ij+u_ldown,l)+qu(ij+u_rup,l)) +                          &
219                  wee(ij+u_ldown,4,1)*hflux(ij+u_lup,l)*(qu(ij+u_ldown,l)+qu(ij+u_lup,l)) +                          &
220                  wee(ij+u_ldown,5,1)*hflux(ij+u_left,l)*(qu(ij+u_ldown,l)+qu(ij+u_left,l)) +                        & 
221                  wee(ij+u_ldown,1,2)*hflux(ij+t_ldown+u_lup,l)*(qu(ij+u_ldown,l)+qu(ij+t_ldown+u_lup,l)) +          &
222                  wee(ij+u_ldown,2,2)*hflux(ij+t_ldown+u_left,l)*(qu(ij+u_ldown,l)+qu(ij+t_ldown+u_left,l)) +        &
223                  wee(ij+u_ldown,3,2)*hflux(ij+t_ldown+u_ldown,l)*(qu(ij+u_ldown,l)+qu(ij+t_ldown+u_ldown,l)) +      &
224                  wee(ij+u_ldown,4,2)*hflux(ij+t_ldown+u_rdown,l)*(qu(ij+u_ldown,l)+qu(ij+t_ldown+u_rdown,l)) +      &
225                  wee(ij+u_ldown,5,2)*hflux(ij+t_ldown+u_right,l)*(qu(ij+u_ldown,l)+qu(ij+t_ldown+u_right,l))
226             du(ij+u_right,l) = du(ij+u_right,l) + .5*uu_right
227             du(ij+u_lup,l)   = du(ij+u_lup,l)   + .5*uu_lup
228             du(ij+u_ldown,l) = du(ij+u_ldown,l)   + .5*uu_ldown
229          ENDDO
230       ENDDO
231
232    CASE(conserv_gassmann) ! energy-conserving TRiSK modified by Gassmann (2018)
233
234       DO l=ll_begin,ll_end
235          !DIR$ SIMD
236          DO ij=ij_begin,ij_end         
237             uu_right = &
238                  wee(ij+u_right,1,1)*hflux(ij+u_rup,l)  *qu(ij+t_right+u_lup,l)+                 &
239                  wee(ij+u_right,2,1)*hflux(ij+u_lup,l)  *qu(ij+u_rup,l)+                         &
240                .5*wee(ij+u_right,3,1)*hflux(ij+u_left,l)*(qu(ij+u_right,l)+qu(ij+u_left,l))+     &
241                  wee(ij+u_right,4,1)*hflux(ij+u_ldown,l)*qu(ij+u_rdown,l)+                       &
242                  wee(ij+u_right,5,1)*hflux(ij+u_rdown,l)*qu(ij+t_right+u_ldown,l)+               &
243                  wee(ij+u_right,1,2)*hflux(ij+t_right+u_ldown,l)*qu(ij+u_rdown,l)+               &
244                  wee(ij+u_right,2,2)*hflux(ij+t_right+u_rdown,l)*qu(ij+t_right+u_ldown,l)+       &
245               .5*wee(ij+u_right,3,2)*hflux(ij+t_right+u_right,l)*(qu(ij+u_right,l)+qu(ij+t_right+u_right,l))+         &
246                  wee(ij+u_right,4,2)*hflux(ij+t_right+u_rup,l)*qu(ij+t_right+u_lup,l)+           &
247                  wee(ij+u_right,5,2)*hflux(ij+t_right+u_lup,l)*qu(ij+u_rup,l)
248             uu_lup = &
249                  wee(ij+u_lup,1,1)*hflux(ij+u_left,l)*qu(ij+t_lup+u_ldown,l) +                   &
250                  wee(ij+u_lup,2,1)*hflux(ij+u_ldown,l)*qu(ij+u_left,l) +                         &
251               .5*wee(ij+u_lup,3,1)*hflux(ij+u_rdown,l)*(qu(ij+u_lup,l)+qu(ij+u_rdown,l)) +       &
252                  wee(ij+u_lup,4,1)*hflux(ij+u_right,l)*qu(ij+u_rup,l) +                          &
253                  wee(ij+u_lup,5,1)*hflux(ij+u_rup,l)*qu(ij+t_lup+u_right,l)+                     & 
254                  wee(ij+u_lup,1,2)*hflux(ij+t_lup+u_right,l)*qu(ij+u_rup,l) +                   &
255                  wee(ij+u_lup,2,2)*hflux(ij+t_lup+u_rup,l)*qu(ij+t_lup+u_right,l) +              &
256               .5*wee(ij+u_lup,3,2)*hflux(ij+t_lup+u_lup,l)*(qu(ij+u_lup,l)+qu(ij+t_lup+u_lup,l)) + &
257                  wee(ij+u_lup,4,2)*hflux(ij+t_lup+u_left,l)*qu(ij+t_lup+u_ldown,l) +            &
258                  wee(ij+u_lup,5,2)*hflux(ij+t_lup+u_ldown,l)*qu(ij+u_left,l)
259             uu_ldown = &
260                  wee(ij+u_ldown,1,1)*hflux(ij+u_rdown,l)*qu(ij+t_ldown,l+u_right) +               &
261                  wee(ij+u_ldown,2,1)*hflux(ij+u_right,l)*qu(ij+u_rdown,l) +                       &
262               .5*wee(ij+u_ldown,3,1)*hflux(ij+u_rup,l)*(qu(ij+u_ldown,l)+qu(ij+u_rup,l)) +        &
263                  wee(ij+u_ldown,4,1)*hflux(ij+u_lup,l)*qu(ij+u_left,l) +                          &
264                  wee(ij+u_ldown,5,1)*hflux(ij+u_left,l)*qu(ij+t_ldown+u_lup,l) +                  & 
265                  wee(ij+u_ldown,1,2)*hflux(ij+t_ldown+u_lup,l)*qu(ij+u_left,l) +                    &
266                  wee(ij+u_ldown,2,2)*hflux(ij+t_ldown+u_left,l)*qu(ij+t_ldown+u_lup,l) +          &
267               .5*wee(ij+u_ldown,3,2)*hflux(ij+t_ldown+u_ldown,l)*(qu(ij+u_ldown,l)+qu(ij+t_ldown+u_ldown,l)) +      &
268                  wee(ij+u_ldown,4,2)*hflux(ij+t_ldown+u_rdown,l)*qu(ij+t_ldown+u_right,l) +      &
269                  wee(ij+u_ldown,5,2)*hflux(ij+t_ldown+u_right,l)*qu(ij+u_rdown,l)
270             du(ij+u_right,l) = du(ij+u_right,l) + uu_right
271             du(ij+u_lup,l)   = du(ij+u_lup,l)   + uu_lup
272             du(ij+u_ldown,l) = du(ij+u_ldown,l)   + uu_ldown
273          ENDDO
274       ENDDO
275
276    CASE(conserv_enstrophy) ! enstrophy-conserving TRiSK
277
278       DO l=ll_begin,ll_end
279          !DIR$ SIMD
280          DO ij=ij_begin,ij_end         
281             uu_right = &
282                  wee(ij+u_right,1,1)*hflux(ij+u_rup,l)+                           &
283                  wee(ij+u_right,2,1)*hflux(ij+u_lup,l)+                           &
284                  wee(ij+u_right,3,1)*hflux(ij+u_left,l)+                          &
285                  wee(ij+u_right,4,1)*hflux(ij+u_ldown,l)+                         &
286                  wee(ij+u_right,5,1)*hflux(ij+u_rdown,l)+                         & 
287                  wee(ij+u_right,1,2)*hflux(ij+t_right+u_ldown,l)+                 &
288                  wee(ij+u_right,2,2)*hflux(ij+t_right+u_rdown,l)+                 &
289                  wee(ij+u_right,3,2)*hflux(ij+t_right+u_right,l)+                 &
290                  wee(ij+u_right,4,2)*hflux(ij+t_right+u_rup,l)+                   &
291                  wee(ij+u_right,5,2)*hflux(ij+t_right+u_lup,l)
292             uu_lup = &
293                  wee(ij+u_lup,1,1)*hflux(ij+u_left,l)+                        &
294                  wee(ij+u_lup,2,1)*hflux(ij+u_ldown,l)+                       &
295                  wee(ij+u_lup,3,1)*hflux(ij+u_rdown,l)+                       &
296                  wee(ij+u_lup,4,1)*hflux(ij+u_right,l)+                       &
297                  wee(ij+u_lup,5,1)*hflux(ij+u_rup,l)+                         & 
298                  wee(ij+u_lup,1,2)*hflux(ij+t_lup+u_right,l)+                 &
299                  wee(ij+u_lup,2,2)*hflux(ij+t_lup+u_rup,l)+                   &
300                  wee(ij+u_lup,3,2)*hflux(ij+t_lup+u_lup,l)+                   &
301                  wee(ij+u_lup,4,2)*hflux(ij+t_lup+u_left,l)+                  &
302                  wee(ij+u_lup,5,2)*hflux(ij+t_lup+u_ldown,l)
303             uu_ldown = &
304                  wee(ij+u_ldown,1,1)*hflux(ij+u_rdown,l)+                      &
305                  wee(ij+u_ldown,2,1)*hflux(ij+u_right,l)+                      &
306                  wee(ij+u_ldown,3,1)*hflux(ij+u_rup,l)+                        &
307                  wee(ij+u_ldown,4,1)*hflux(ij+u_lup,l)+                        &
308                  wee(ij+u_ldown,5,1)*hflux(ij+u_left,l)+                       & 
309                  wee(ij+u_ldown,1,2)*hflux(ij+t_ldown+u_lup,l)+                &
310                  wee(ij+u_ldown,2,2)*hflux(ij+t_ldown+u_left,l)+               &
311                  wee(ij+u_ldown,3,2)*hflux(ij+t_ldown+u_ldown,l)+              &
312                  wee(ij+u_ldown,4,2)*hflux(ij+t_ldown+u_rdown,l)+              &
313                  wee(ij+u_ldown,5,2)*hflux(ij+t_ldown+u_right,l)
314
315             du(ij+u_right,l) = du(ij+u_right,l) + uu_right*qu(ij+u_right,l)
316             du(ij+u_lup,l)   = du(ij+u_lup,l)   + uu_lup*qu(ij+u_lup,l)     
317             du(ij+u_ldown,l) = du(ij+u_ldown,l) + uu_ldown*qu(ij+u_ldown,l) 
318          END DO
319       END DO
320    CASE DEFAULT
321       STOP
322    END SELECT
323#undef FTHETA
324
325    CALL trace_end("compute_caldyn_Coriolis")
326
327  END SUBROUTINE compute_caldyn_Coriolis_manual
328 
329END MODULE compute_caldyn_Coriolis_mod
Note: See TracBrowser for help on using the repository browser.