source: codes/icosagcm/devel/src/diagnostics/compute_divergence.F90 @ 1057

Last change on this file since 1057 was 1052, checked in by dubos, 4 years ago

devel : diagnose divergence and vorticity

File size: 2.3 KB
Line 
1MODULE compute_divergence_mod
2  USE grid_param
3  USE prec, ONLY : rstd
4  IMPLICIT NONE
5  PRIVATE
6
7#include "../unstructured/unstructured.h90"
8
9  PUBLIC :: divergence, compute_divergence_hex, compute_divergence_unst
10
11CONTAINS
12
13#ifdef BEGIN_DYSL
14
15KERNEL(compute_divergence)
16
17  FORALL_CELLS_EXT()
18    ON_PRIMAL
19      div_ij = 0.d0
20      FORALL_EDGES
21         div_ij = div_ij + SIGN*ue(EDGE)*LE
22      END_BLOCK
23      div(CELL) = div_ij / AI
24    END_BLOCK
25  END_BLOCK
26
27END_BLOCK
28
29#endif END_DYSL
30
31  SUBROUTINE divergence(f_ue,f_div)
32    USE icosa
33    USE compute_diagnostics_mod, ONLY : compute_divergence
34    TYPE(t_field), POINTER :: f_ue(:)
35    TYPE(t_field), POINTER :: f_div(:)
36 
37    REAL(rstd), POINTER :: ue(:,:)
38    REAL(rstd), POINTER :: div(:,:)
39    INTEGER :: ind
40
41    CALL transfert_request(f_ue,req_e1_vect)
42   
43    DO ind=1,ndomain
44      IF (.NOT. assigned_domain(ind)) CYCLE
45      CALL swap_dimensions(ind)
46      CALL swap_geometry(ind)
47      ue=f_ue(ind)
48      div=f_div(ind)
49      CALL compute_divergence(ue, div)
50    ENDDO
51   
52  END SUBROUTINE divergence
53
54!-------------- Wrappers for F2008 conformity -----------------
55
56  SUBROUTINE compute_divergence_unst(ue,div)
57    REAL(rstd),INTENT(IN)  :: ue(:,:)
58    REAL(rstd),INTENT(OUT) :: div(:,:)
59    CALL compute_divergence_unst_(ue,div)
60  END SUBROUTINE compute_divergence_unst
61
62  SUBROUTINE compute_divergence_hex(ue,div)
63    REAL(rstd),INTENT(IN)  :: ue(:,:)
64    REAL(rstd),INTENT(OUT) :: div(:,:)
65    CALL compute_divergence_hex_(ue,div)
66  END SUBROUTINE compute_divergence_hex
67
68!--------------------------------------------------------------
69
70  SUBROUTINE compute_divergence_unst_(ue,div)
71    USE ISO_C_BINDING, only : C_DOUBLE, C_FLOAT
72    USE geometry, ONLY : le, Ai
73    USE data_unstructured_mod, ONLY : primal_deg, primal_edge, primal_ne
74    FIELD_U    :: ue
75    FIELD_MASS :: div
76    DECLARE_INDICES
77    DECLARE_EDGES
78    DECLARE_VERTICES
79    NUM :: div_ij
80#include "../kernels_unst/compute_divergence.k90"
81  END SUBROUTINE compute_divergence_unst_
82
83  SUBROUTINE compute_divergence_hex_(ue,div)
84    USE icosa
85    USE omp_para
86    REAL(rstd),INTENT(IN)  :: ue(3*iim*jjm,llm)
87    REAL(rstd),INTENT(OUT) :: div(iim*jjm,llm)
88    REAL(rstd) :: div_ij
89    INTEGER :: ij,l
90
91#include "../kernels_hex/compute_divergence.k90"
92  END SUBROUTINE compute_divergence_hex_
93
94END MODULE compute_divergence_mod
Note: See TracBrowser for help on using the repository browser.