source: codes/icosagcm/devel/src/vertical/vertical_interp.f90

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

devel : towards conformity to F2008 standard

File size: 3.1 KB
Line 
1MODULE vertical_interp_mod
2  USE icosa
3  USE omp_para
4  USE compute_diagnostics_mod
5  IMPLICIT NONE
6  PRIVATE
7 
8!  TYPE(t_field),SAVE, POINTER :: f_p(:)
9 
10
11  PUBLIC init_vertical_interp, vertical_interp, &
12       compute_vertical_interp_hex, compute_vertical_interp_unst
13
14CONTAINS
15
16  SUBROUTINE init_vertical_interp   
17!    CALL allocate_field(f_p,field_t,type_real,llm+1)
18  END SUBROUTINE init_vertical_interp
19   
20  SUBROUTINE vertical_interp(f_pmid,f_in,f_out,pval)
21    TYPE(t_field),POINTER :: f_pmid(:)
22    TYPE(t_field),POINTER :: f_in(:)
23    TYPE(t_field),POINTER :: f_out(:)
24    REAL(rstd),INTENT(IN) :: pval
25
26    REAL(rstd),POINTER :: in(:,:)
27    REAL(rstd),POINTER :: out(:)
28    REAL(rstd),POINTER :: pmid(:,:)
29   
30    INTEGER :: ind
31       
32    DO ind=1,ndomain
33      IF (.NOT. assigned_domain(ind)) CYCLE
34      CALL swap_dimensions(ind)
35      CALL swap_geometry(ind)
36      pmid=f_pmid(ind)
37      in=f_in(ind)
38      out=f_out(ind)
39      CALL compute_vertical_interp(pmid,in,out,pval)
40    ENDDO
41   
42  END SUBROUTINE  vertical_interp
43
44!-------------- Wrappers for F2008 conformity -----------------
45
46  SUBROUTINE compute_vertical_interp_hex(pmid,in,out,pval)
47    REAL(rstd),INTENT(IN) :: pmid(:,:), in(:,:), pval
48    REAL(rstd),INTENT(OUT):: out(:)
49    CALL compute_vertical_interp_hex_(pmid,in,out,pval)
50  END SUBROUTINE compute_vertical_interp_hex
51
52  SUBROUTINE compute_vertical_interp_unst(pmid,in,out,pval)
53    REAL(rstd),INTENT(IN) :: pmid(:,:), in(:,:), pval
54    REAL(rstd),INTENT(OUT):: out(:)
55    CALL compute_vertical_interp_unst_(pmid,in,out,pval)
56  END SUBROUTINE compute_vertical_interp_unst
57
58!--------------------------------------------------------------
59
60  SUBROUTINE compute_vertical_interp_hex_(pmid,in,out,pval)
61    REAL(rstd),INTENT(IN) :: pmid(iim*jjm,llm)
62    REAL(rstd),INTENT(IN) :: in(iim*jjm,llm)
63    REAL(rstd),INTENT(OUT):: out(iim*jjm)
64    REAL(rstd),INTENT(IN) :: pval
65    INTEGER :: i,j,ij
66       
67!$OMP BARRIER   
68    IF (is_omp_level_master) THEN
69   
70      DO j=jj_begin-1,jj_end+1
71        DO i=ii_begin-1,ii_end+1
72          ij=(j-1)*iim+i
73          CALL interp_1d(pmid(ij,:), in(ij,:), out(ij), pval)
74        ENDDO
75      ENDDO   
76    ENDIF
77!$OMP BARRIER
78
79  END SUBROUTINE compute_vertical_interp_hex_
80
81  SUBROUTINE compute_vertical_interp_unst_(pmid,in,out,pval)
82    REAL(rstd),INTENT(IN) :: pmid(llm, primal_num)
83    REAL(rstd),INTENT(IN) :: in(llm, primal_num)
84    REAL(rstd),INTENT(OUT) :: out(primal_num)
85    REAL(rstd) :: pval
86    INTEGER :: ij       
87!$OMP BARRIER
88!$OMP MASTER
89    DO ij=1, primal_num
90       CALL interp_1d(pmid(:,ij), in(:,ij), out(ij), pval)
91    END DO
92!$OMP END MASTER
93!$OMP BARRIER
94  END SUBROUTINE compute_vertical_interp_unst_
95
96  PURE SUBROUTINE interp_1d(pmid,in,out,pval)
97    REAL(rstd),INTENT(IN)  :: pmid(:)
98    REAL(rstd),INTENT(IN)  :: in(:)
99    REAL(rstd),INTENT(OUT) :: out
100    REAL(rstd),INTENT(IN)  :: pval
101    REAL(rstd) :: coeff
102    INTEGER :: l
103    l=llm-1
104    DO WHILE(pmid(l)<pval .AND. l>1)
105       l=l-1
106    END DO
107    coeff=(pval-pmid(l))/(pmid(l)-pmid(l+1))
108    out=in(l)+coeff*(in(l)-in(l+1))
109  END SUBROUTINE interp_1d
110
111END MODULE vertical_interp_mod
Note: See TracBrowser for help on using the repository browser.