Changeset 958 for codes


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

devel : vertical interpolation for unstructured mesh

Location:
codes/icosagcm/devel/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/devel/src/base/init_grid_param.f90

    r955 r958  
    55  USE compute_pression_mod 
    66  USE compute_temperature_mod 
     7  USE vertical_interp_mod 
    78 
    89  USE compute_caldyn_mod 
     
    7172    compute_temperature  => compute_temperature_hex 
    7273    compute_hydrostatic_pressure => compute_hydrostatic_pressure_hex 
     74    compute_vertical_interp => compute_vertical_interp_hex 
    7375    ! dynamics 
    7476    compute_pvort_only        => compute_pvort_only_hex 
     
    8789    compute_temperature  => compute_temperature_unst 
    8890    compute_hydrostatic_pressure => compute_hydrostatic_pressure_unst 
     91    compute_vertical_interp => compute_vertical_interp_unst 
    8992    ! dynamics 
    9093    compute_pvort_only         => compute_pvort_only_unst 
  • codes/icosagcm/devel/src/diagnostics/compute_diagnostics.f90

    r955 r958  
    3939    END SUBROUTINE comp_hydro_press 
    4040 
     41    SUBROUTINE comp_vert_interp(pmid,in,out,pval) 
     42      IMPORT 
     43      REAL(rstd),INTENT(IN) :: pmid(iim_jjm_i, llm_) 
     44      REAL(rstd),INTENT(IN) :: in(iim_jjm_i, llm_) 
     45      REAL(rstd),INTENT(OUT):: out(iim_jjm_i) 
     46      REAL(rstd),INTENT(IN) :: pval 
     47    END SUBROUTINE comp_vert_interp 
     48 
    4149  END INTERFACE 
    4250 
     
    4553  PROCEDURE(comp_temperature), POINTER :: compute_temperature => NULL() 
    4654  PROCEDURE(comp_hydro_press), POINTER :: compute_hydrostatic_pressure => NULL() 
     55  PROCEDURE(comp_vert_interp), POINTER :: compute_vertical_interp => NULL() 
    4756 
    48   PUBLIC :: compute_rhodz, compute_pression, compute_pression_mid, compute_temperature, compute_hydrostatic_pressure 
     57  PUBLIC :: compute_rhodz, compute_pression, compute_pression_mid, compute_temperature, compute_hydrostatic_pressure, & 
     58       compute_vertical_interp 
    4959 
    5060END MODULE compute_diagnostics_mod 
  • 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.