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

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

devel : compute_pression for unstructured mesh

File size: 1.7 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
11  PUBLIC init_vertical_interp, vertical_interp, compute_vertical_interp
12
13CONTAINS
14
[913]15  SUBROUTINE init_vertical_interp   
[436]16!    CALL allocate_field(f_p,field_t,type_real,llm+1)
[90]17  END SUBROUTINE init_vertical_interp
18   
[436]19  SUBROUTINE vertical_interp(f_pmid,f_in,f_out,pval)
20    TYPE(t_field),POINTER :: f_pmid(:)
[90]21    TYPE(t_field),POINTER :: f_in(:)
22    TYPE(t_field),POINTER :: f_out(:)
23    REAL(rstd),INTENT(IN) :: pval
24
25    REAL(rstd),POINTER :: in(:,:)
26    REAL(rstd),POINTER :: out(:)
[436]27    REAL(rstd),POINTER :: pmid(:,:)
[90]28   
29    INTEGER :: ind
30       
31    DO ind=1,ndomain
[186]32      IF (.NOT. assigned_domain(ind)) CYCLE
[90]33      CALL swap_dimensions(ind)
34      CALL swap_geometry(ind)
[436]35      pmid=f_pmid(ind)
[90]36      in=f_in(ind)
37      out=f_out(ind)
[436]38      CALL compute_vertical_interp(pmid,in,out,pval)
[90]39    ENDDO
40   
41  END SUBROUTINE  vertical_interp
42
[436]43  SUBROUTINE compute_vertical_interp(pmid,in,out,pval)
44    REAL(rstd),INTENT(IN) :: pmid(iim*jjm,llm)
[90]45    REAL(rstd),INTENT(IN) :: in(iim*jjm,llm)
46    REAL(rstd),INTENT(OUT) :: out(iim*jjm)
[436]47    REAL(rstd) :: pval, coeff
[90]48    INTEGER :: i,j,ij,l
49       
[295]50!$OMP BARRIER   
51    IF (is_omp_level_master) THEN
52   
53      DO j=jj_begin-1,jj_end+1
54        DO i=ii_begin-1,ii_end+1
55          ij=(j-1)*iim+i
56          l=llm-1
[436]57          DO WHILE(pmid(ij,l)<pval .AND. l>1)
[295]58            l=l-1
59          ENDDO
[436]60          coeff=(pval-pmid(ij,l))/(pmid(ij,l)-pmid(ij,l+1))
[295]61          out(ij)=in(ij,l)+coeff*(in(ij,l)-in(ij,l+1))
62        ENDDO
[436]63      ENDDO   
[295]64    ENDIF
[436]65!$OMP BARRIER
66
[90]67  END SUBROUTINE compute_vertical_interp
68
69END MODULE vertical_interp_mod
Note: See TracBrowser for help on using the repository browser.