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

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

devel : vertical interpolation for unstructured mesh

File size: 2.5 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  SUBROUTINE compute_vertical_interp_hex(pmid,in,out,pval)
45    REAL(rstd),INTENT(IN) :: pmid(iim*jjm,llm)
46    REAL(rstd),INTENT(IN) :: in(iim*jjm,llm)
47    REAL(rstd),INTENT(OUT):: out(iim*jjm)
48    REAL(rstd),INTENT(IN) :: pval
49    INTEGER :: i,j,ij
50       
51!$OMP BARRIER   
52    IF (is_omp_level_master) THEN
53   
54      DO j=jj_begin-1,jj_end+1
55        DO i=ii_begin-1,ii_end+1
56          ij=(j-1)*iim+i
57          CALL interp_1d(pmid(ij,:), in(ij,:), out(ij), pval)
58        ENDDO
59      ENDDO   
60    ENDIF
61!$OMP BARRIER
62
63  END SUBROUTINE compute_vertical_interp_hex
64
65  SUBROUTINE compute_vertical_interp_unst(pmid,in,out,pval)
66    REAL(rstd),INTENT(IN) :: pmid(llm, primal_num)
67    REAL(rstd),INTENT(IN) :: in(llm, primal_num)
68    REAL(rstd),INTENT(OUT) :: out(primal_num)
69    REAL(rstd) :: pval
70    INTEGER :: ij       
71!$OMP BARRIER
72!$OMP MASTER
73    DO ij=1, primal_num
74       CALL interp_1d(pmid(:,ij), in(:,ij), out(ij), pval)
75    END DO
76!$OMP END MASTER
77!$OMP BARRIER
78  END SUBROUTINE compute_vertical_interp_unst
79
80  PURE SUBROUTINE interp_1d(pmid,in,out,pval)
81    REAL(rstd),INTENT(IN)  :: pmid(:)
82    REAL(rstd),INTENT(IN)  :: in(:)
83    REAL(rstd),INTENT(OUT) :: out
84    REAL(rstd),INTENT(IN)  :: pval
85    REAL(rstd) :: coeff
86    INTEGER :: l
87    l=llm-1
88    DO WHILE(pmid(l)<pval .AND. l>1)
89       l=l-1
90    END DO
91    coeff=(pval-pmid(l))/(pmid(l)-pmid(l+1))
92    out=in(l)+coeff*(in(l)-in(l+1))
93  END SUBROUTINE interp_1d
94
95END MODULE vertical_interp_mod
Note: See TracBrowser for help on using the repository browser.