Ignore:
Timestamp:
07/16/19 01:46:14 (5 years ago)
Author:
dubos
Message:

devel : vertical interpolation for unstructured mesh

File:
1 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/devel/src/vertical/vertical_interp.f90

    r913 r958  
    99   
    1010 
    11   PUBLIC init_vertical_interp, vertical_interp, compute_vertical_interp 
     11  PUBLIC init_vertical_interp, vertical_interp, & 
     12       compute_vertical_interp_hex, compute_vertical_interp_unst 
    1213 
    1314CONTAINS 
     
    4142  END SUBROUTINE  vertical_interp 
    4243 
    43   SUBROUTINE compute_vertical_interp(pmid,in,out,pval) 
     44  SUBROUTINE compute_vertical_interp_hex(pmid,in,out,pval) 
    4445    REAL(rstd),INTENT(IN) :: pmid(iim*jjm,llm) 
    4546    REAL(rstd),INTENT(IN) :: in(iim*jjm,llm) 
    46     REAL(rstd),INTENT(OUT) :: out(iim*jjm) 
    47     REAL(rstd) :: pval, coeff 
    48     INTEGER :: i,j,ij,l 
     47    REAL(rstd),INTENT(OUT):: out(iim*jjm) 
     48    REAL(rstd),INTENT(IN) :: pval 
     49    INTEGER :: i,j,ij 
    4950         
    5051!$OMP BARRIER     
     
    5455        DO i=ii_begin-1,ii_end+1 
    5556          ij=(j-1)*iim+i 
    56           l=llm-1 
    57           DO WHILE(pmid(ij,l)<pval .AND. l>1) 
    58             l=l-1 
    59           ENDDO 
    60           coeff=(pval-pmid(ij,l))/(pmid(ij,l)-pmid(ij,l+1)) 
    61           out(ij)=in(ij,l)+coeff*(in(ij,l)-in(ij,l+1)) 
     57          CALL interp_1d(pmid(ij,:), in(ij,:), out(ij), pval) 
    6258        ENDDO 
    6359      ENDDO    
     
    6561!$OMP BARRIER 
    6662 
    67   END SUBROUTINE compute_vertical_interp 
     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 
    6894 
    6995END MODULE vertical_interp_mod 
Note: See TracChangeset for help on using the changeset viewer.