source: codes/icosagcm/devel/src/vertical/vertical_remap.f90 @ 913

Last change on this file since 913 was 913, checked in by dubos, 5 years ago

devel : compute_pression for unstructured mesh

File size: 2.8 KB
Line 
1MODULE vertical_remap_mod
2  USE icosa
3  USE omp_para
4  IMPLICIT NONE
5  PRIVATE
6
7  PUBLIC :: vertical_remap
8
9CONTAINS
10
11   
12  SUBROUTINE vertical_remap(pressure_level,field_in,f_ps,field_out)
13    USE compute_pression_mod, ONLY : pression
14    REAL(rstd), INTENT(IN) :: pressure_level(:)
15    TYPE(t_field),POINTER :: field_in(:)
16    TYPE(t_field),POINTER :: f_ps(:)
17    TYPE(t_field),POINTER :: field_out(:)
18
19    TYPE(t_field),POINTER,SAVE :: f_p(:)
20    REAL(rstd),POINTER :: in(:,:)
21    REAL(rstd),POINTER :: out(:,:)
22    REAL(rstd),POINTER :: p(:,:)
23   
24    INTEGER :: ind
25
26    CALL allocate_field(f_p,field_t,type_real,llm+1)
27    CALL pression(f_ps,f_p)
28 
29    DO ind=1,ndomain
30      IF (.NOT. assigned_domain(ind)) CYCLE
31      CALL swap_dimensions(ind)
32      CALL swap_geometry(ind)
33      p=f_p(ind)
34      in=field_in(ind)
35      out=field_out(ind)
36      CALL compute_vertical_remap(pressure_level,in,p,out)
37    ENDDO
38   
39  END SUBROUTINE  vertical_remap
40
41  SUBROUTINE compute_vertical_remap(pressure_level,in,p,out)
42    REAL(rstd),INTENT(IN)  :: pressure_level(:)
43    REAL(rstd),INTENT(IN)  :: in(:,:)
44    REAL(rstd),INTENT(IN)  :: p(iim*jjm,llm+1)
45    REAL(rstd),INTENT(OUT) :: out(iim*jjm,llm)
46    REAL(rstd) :: coeff, pmid
47    INTEGER :: i,j,ij,l,n,nb_level
48    INTEGER :: a
49    INTEGER :: b
50    LOGICAL :: positive
51   
52    nb_level=size(pressure_level)
53    IF (pressure_level(1)>=pressure_level(nb_level)) THEN
54      positive=.FALSE.
55    ELSE
56      positive=.TRUE.
57    ENDIF
58     
59 !$OMP BARRIER   
60    IF (is_omp_level_master) THEN
61   
62    DO l=1,llm
63      DO j=jj_begin,jj_end
64        DO i=ii_begin,ii_end
65          ij=(j-1)*iim+i
66          pmid=0.5*(p(ij,l)+p(ij,l+1))
67          IF (positive) THEN
68            a=0
69            DO n=1,nb_level-1
70              IF ( (pmid>=pressure_level(n) .AND. pmid<pressure_level(n+1))) THEN
71               a=n ; b=n+1 ; EXIT
72              ENDIF
73            ENDDO
74            IF (a==0) THEN
75              IF (pmid<=pressure_level(1)) THEN
76                a=1 ; b=2
77              ELSE
78                a=nb_level-1 ; b=nb_level
79              ENDIF
80            ENDIF
81          ELSE
82            a=0
83            DO n=1,nb_level-1
84              IF ( (pmid<=pressure_level(n) .AND. pmid>pressure_level(n+1))) THEN
85               a=n ; b=n+1 ; EXIT
86              ENDIF
87            ENDDO
88           
89            IF (a==0) THEN
90              IF (pmid >= pressure_level(1)) THEN
91                a=1 ; b=2
92              ELSE
93                a=nb_level-1 ; b=nb_level
94              ENDIF
95            ENDIF
96          ENDIF
97                 
98          coeff=(pmid-pressure_level(a))/(pressure_level(a)-pressure_level(b))
99          out(ij,l)=in(ij,a)+coeff*(in(ij,a)-in(ij,b))
100        ENDDO
101      ENDDO
102    ENDDO
103 
104    ENDIF
105 !$OMP BARRIER   
106       
107  END SUBROUTINE compute_vertical_remap
108
109END MODULE vertical_remap_mod
Note: See TracBrowser for help on using the repository browser.