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

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

devel : vertical interpolation for unstructured mesh

File size: 2.5 KB
RevLine 
[90]1MODULE vertical_interp_mod
2  USE icosa
[913]3  USE omp_para
4  USE compute_diagnostics_mod
5  IMPLICIT NONE
[90]6  PRIVATE
7 
[436]8!  TYPE(t_field),SAVE, POINTER :: f_p(:)
[90]9 
10
[958]11  PUBLIC init_vertical_interp, vertical_interp, &
12       compute_vertical_interp_hex, compute_vertical_interp_unst
[90]13
14CONTAINS
15
[913]16  SUBROUTINE init_vertical_interp   
[436]17!    CALL allocate_field(f_p,field_t,type_real,llm+1)
[90]18  END SUBROUTINE init_vertical_interp
19   
[436]20  SUBROUTINE vertical_interp(f_pmid,f_in,f_out,pval)
21    TYPE(t_field),POINTER :: f_pmid(:)
[90]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(:)
[436]28    REAL(rstd),POINTER :: pmid(:,:)
[90]29   
30    INTEGER :: ind
31       
32    DO ind=1,ndomain
[186]33      IF (.NOT. assigned_domain(ind)) CYCLE
[90]34      CALL swap_dimensions(ind)
35      CALL swap_geometry(ind)
[436]36      pmid=f_pmid(ind)
[90]37      in=f_in(ind)
38      out=f_out(ind)
[436]39      CALL compute_vertical_interp(pmid,in,out,pval)
[90]40    ENDDO
41   
42  END SUBROUTINE  vertical_interp
43
[958]44  SUBROUTINE compute_vertical_interp_hex(pmid,in,out,pval)
[436]45    REAL(rstd),INTENT(IN) :: pmid(iim*jjm,llm)
[90]46    REAL(rstd),INTENT(IN) :: in(iim*jjm,llm)
[958]47    REAL(rstd),INTENT(OUT):: out(iim*jjm)
48    REAL(rstd),INTENT(IN) :: pval
49    INTEGER :: i,j,ij
[90]50       
[295]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
[958]57          CALL interp_1d(pmid(ij,:), in(ij,:), out(ij), pval)
[295]58        ENDDO
[436]59      ENDDO   
[295]60    ENDIF
[436]61!$OMP BARRIER
62
[958]63  END SUBROUTINE compute_vertical_interp_hex
[90]64
[958]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
[90]95END MODULE vertical_interp_mod
Note: See TracBrowser for help on using the repository browser.