source: codes/icosagcm/devel/src/diagnostics/compute_rhodz.F90 @ 1027

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

devel : towards conformity to F2008 standard

File size: 3.4 KB
Line 
1MODULE compute_rhodz_mod
2  USE icosa, ONLY : rstd
3  USE earth_const, ONLY : g
4  USE disvert_mod, ONLY : ap, bp
5  USE grid_param, ONLY : llm
6  USE ISO_C_BINDING, only : C_DOUBLE, C_FLOAT
7  IMPLICIT NONE
8  PRIVATE
9  SAVE
10
11#include "../unstructured/unstructured.h90"
12
13  PUBLIC :: compute_rhodz_hex, compute_rhodz_unst
14
15CONTAINS
16
17#if BEGIN_DYSL
18
19KERNEL(compute_rhodz)
20IF(comp) THEN
21   FORALL_CELLS()
22     ON_PRIMAL
23       m = ( AP(CELL)-AP(UP(CELL)) + (BP(CELL)-BP(UP(CELL)))*ps(HIDX(CELL)) )/g
24       rhodz(CELL)=m
25     END_BLOCK
26   END_BLOCK
27ELSE
28   err=0.
29   FORALL_CELLS_EXT()
30     ON_PRIMAL
31       m = ( AP(CELL)-AP(UP(CELL)) + (BP(CELL)-BP(UP(CELL)))*ps(HIDX(CELL)) )/g
32       err = MAX(err, ABS(m-rhodz(CELL)))
33     END_BLOCK
34   END_BLOCK
35   IF(err>1e-10) THEN
36      PRINT *, 'Discrepancy between ps and rhodz detected', err
37      STOP
38   END IF
39END IF
40END_BLOCK
41
42#endif END_DYSL
43
44!-------------- Wrappers for F2008 conformity -----------------
45!--------------------------------------------------------------
46
47  SUBROUTINE compute_rhodz_hex(comp, ps, rhodz)
48    LOGICAL, INTENT(IN) :: comp ! .TRUE. to compute, .FALSE. to check
49    REAL(rstd), INTENT(IN) :: ps(:)
50    REAL(rstd), INTENT(INOUT) :: rhodz(:,:)
51    CALL compute_rhodz_hex_(comp, ps, rhodz)
52  END SUBROUTINE compute_rhodz_hex
53
54  SUBROUTINE compute_rhodz_unst(comp, ps, rhodz)
55    LOGICAL, INTENT(IN) :: comp ! .TRUE. to compute, .FALSE. to check
56    REAL(rstd), INTENT(IN) :: ps(:)
57    REAL(rstd), INTENT(INOUT) :: rhodz(:,:)
58    CALL compute_rhodz_unst_(comp, ps, rhodz)
59  END SUBROUTINE compute_rhodz_unst
60
61!--------------------------------------------------------------
62
63  SUBROUTINE compute_rhodz_unst_(comp, ps, rhodz)
64    USE data_unstructured_mod, ONLY : primal_num
65    LOGICAL, INTENT(IN)  :: comp
66    FIELD_PS, INTENT(IN) :: ps
67    FIELD_MASS, INTENT(INOUT) :: rhodz
68    DECLARE_INDICES
69    NUM :: m, err
70#define AP(l,ij) ap(l)
71#define BP(l,ij) bp(l)
72#include "../kernels_unst/compute_rhodz.k90"
73#undef AP
74#undef BP
75  END SUBROUTINE compute_rhodz_unst_
76 
77  SUBROUTINE compute_rhodz_hex_(comp, ps, rhodz)
78    USE icosa
79    USE omp_para
80    LOGICAL, INTENT(IN) :: comp ! .TRUE. to compute, .FALSE. to check
81    REAL(rstd), INTENT(IN) :: ps(iim*jjm)
82    REAL(rstd), INTENT(INOUT) :: rhodz(iim*jjm,llm)
83    REAL(rstd) :: m, err
84    INTEGER :: ij,l
85#define AP(ij,l) ap(l)
86#define BP(ij,l) bp(l)
87#include "../kernels_hex/compute_rhodz.k90"
88#undef AP
89#undef BP
90  END SUBROUTINE compute_rhodz_hex_
91
92  SUBROUTINE compute_rhodz_handmade(comp, ps, rhodz)
93    USE icosa
94    USE omp_para
95    LOGICAL, INTENT(IN) :: comp ! .TRUE. to compute, .FALSE. to check
96    REAL(rstd), INTENT(IN) :: ps(iim*jjm)
97    REAL(rstd), INTENT(INOUT) :: rhodz(iim*jjm,llm)
98    REAL(rstd) :: m, err
99    INTEGER :: l,i,j,ij,dd
100    err=0.
101
102    IF(comp) THEN
103       dd=1
104    ELSE
105       dd=0
106    END IF
107
108    DO l = ll_begin, ll_end
109       DO j=jj_begin-dd,jj_end+dd
110          DO i=ii_begin-dd,ii_end+dd
111             ij=(j-1)*iim+i
112             m = ( ap(l) - ap(l+1) + (bp(l)-bp(l+1))*ps(ij) )/g 
113             IF(comp) THEN
114                rhodz(ij,l) = m
115             ELSE
116                err = MAX(err,abs(m-rhodz(ij,l)))
117             END IF
118          ENDDO
119       ENDDO
120    ENDDO
121
122    IF(.NOT. comp) THEN
123       IF(err>1e-10) THEN
124          PRINT *, 'Discrepancy between ps and rhodz detected', err
125          STOP
126       ELSE
127!          PRINT *, 'No discrepancy between ps and rhodz detected'
128       END IF
129    END IF
130
131  END SUBROUTINE compute_rhodz_handmade
132 
133END MODULE compute_rhodz_mod
Note: See TracBrowser for help on using the repository browser.