Changeset 436


Ignore:
Timestamp:
06/16/16 06:29:34 (8 years ago)
Author:
dubos
Message:

Correct output for Lagrangian vertical coordinate

Location:
codes/icosagcm/trunk/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/trunk/src/observable.f90

    r434 r436  
    101101    ELSE 
    102102       CALL output_field("temp",f_buf_i) 
    103        CALL vertical_interp(f_ps,f_buf_i,f_buf_s,85000.) 
     103       CALL vertical_interp(f_pmid,f_buf_i,f_buf_s,85000.) 
    104104       CALL output_field("t850",f_buf_s) 
    105        CALL vertical_interp(f_ps,f_buf_i,f_buf_s,50000.) 
     105       CALL vertical_interp(f_pmid,f_buf_i,f_buf_s,50000.) 
    106106       CALL output_field("t500",f_buf_s) 
    107        CALL vertical_interp(f_ps,f_buf_i,f_buf_s,preff) 
     107       CALL vertical_interp(f_pmid,f_buf_i,f_buf_s,preff) 
    108108       CALL output_field("SST",f_buf_s)        
    109109    END IF 
     
    135135       !       CALL output_field("pv",f_qv) 
    136136        
    137        CALL vertical_interp(f_ps,f_buf_ulon,f_buf_s,85000.) 
     137       CALL vertical_interp(f_pmid,f_buf_ulon,f_buf_s,85000.) 
    138138       CALL output_field("u850",f_buf_s) 
    139        CALL vertical_interp(f_ps,f_buf_ulon,f_buf_s,50000.) 
     139       CALL vertical_interp(f_pmid,f_buf_ulon,f_buf_s,50000.) 
    140140       CALL output_field("u500",f_buf_s) 
    141141        
    142        CALL vertical_interp(f_ps,f_buf_ulat,f_buf_s,85000.) 
     142       CALL vertical_interp(f_pmid,f_buf_ulat,f_buf_s,85000.) 
    143143       CALL output_field("v850",f_buf_s) 
    144        CALL vertical_interp(f_ps,f_buf_ulat,f_buf_s,50000.) 
     144       CALL vertical_interp(f_pmid,f_buf_ulat,f_buf_s,50000.) 
    145145       CALL output_field("v500",f_buf_s) 
    146146 
    147        CALL vertical_interp(f_ps,f_buf_i,f_buf_s,85000.) 
     147       CALL vertical_interp(f_pmid,f_buf_i,f_buf_s,85000.) 
    148148       CALL output_field("w850",f_buf_s) 
    149        CALL vertical_interp(f_ps,f_buf_i,f_buf_s,50000.) 
     149       CALL vertical_interp(f_pmid,f_buf_i,f_buf_s,50000.) 
    150150       CALL output_field("w500",f_buf_s)     
    151151 
    152152       CALL w_omega(f_ps, f_u, f_buf_i) 
    153153       CALL output_field("omega",f_buf_i) 
    154        CALL vertical_interp(f_ps,f_buf_i,f_buf_s,85000.) 
     154       CALL vertical_interp(f_pmid,f_buf_i,f_buf_s,85000.) 
    155155       CALL output_field("omega850",f_buf_s) 
    156        CALL vertical_interp(f_ps,f_buf_i,f_buf_s,50000.) 
     156       CALL vertical_interp(f_pmid,f_buf_i,f_buf_s,50000.) 
    157157       CALL output_field("omega500",f_buf_s) 
    158158    END IF 
  • codes/icosagcm/trunk/src/vertical_interp.f90

    r295 r436  
    33  PRIVATE 
    44   
    5   TYPE(t_field),SAVE, POINTER :: f_p(:) 
     5!  TYPE(t_field),SAVE, POINTER :: f_p(:) 
    66   
    77 
     
    1414  IMPLICIT NONE 
    1515     
    16     CALL allocate_field(f_p,field_t,type_real,llm+1) 
     16!    CALL allocate_field(f_p,field_t,type_real,llm+1) 
    1717     
    1818  END SUBROUTINE init_vertical_interp 
    1919     
    20   SUBROUTINE vertical_interp(f_ps,f_in,f_out,pval) 
     20  SUBROUTINE vertical_interp(f_pmid,f_in,f_out,pval) 
    2121  USE icosa 
    2222  USE pression_mod 
    2323  USE omp_para 
    2424  IMPLICIT NONE 
    25     TYPE(t_field),POINTER :: f_ps(:) 
     25    TYPE(t_field),POINTER :: f_pmid(:) 
    2626    TYPE(t_field),POINTER :: f_in(:) 
    2727    TYPE(t_field),POINTER :: f_out(:) 
     
    3030    REAL(rstd),POINTER :: in(:,:) 
    3131    REAL(rstd),POINTER :: out(:) 
    32     REAL(rstd),POINTER :: p(:,:) 
     32    REAL(rstd),POINTER :: pmid(:,:) 
    3333     
    3434    INTEGER :: ind 
    3535         
    36     CALL pression(f_ps,f_p) 
    37   
    3836    DO ind=1,ndomain 
    3937      IF (.NOT. assigned_domain(ind)) CYCLE 
    4038      CALL swap_dimensions(ind) 
    4139      CALL swap_geometry(ind) 
    42       p=f_p(ind) 
     40      pmid=f_pmid(ind) 
    4341      in=f_in(ind) 
    4442      out=f_out(ind) 
    45       CALL compute_vertical_interp(p,in,out,pval) 
     43      CALL compute_vertical_interp(pmid,in,out,pval) 
    4644    ENDDO 
    4745     
    4846  END SUBROUTINE  vertical_interp 
    4947 
    50   SUBROUTINE compute_vertical_interp(p,in,out,pval) 
     48  SUBROUTINE compute_vertical_interp(pmid,in,out,pval) 
    5149  USE omp_para 
    5250  IMPLICIT NONE 
    53     REAL(rstd),INTENT(IN) :: p(iim*jjm,llm+1) 
     51    REAL(rstd),INTENT(IN) :: pmid(iim*jjm,llm) 
    5452    REAL(rstd),INTENT(IN) :: in(iim*jjm,llm) 
    5553    REAL(rstd),INTENT(OUT) :: out(iim*jjm) 
    56     REAL(rstd) :: pval 
    57     REAL(rstd) :: coeff, pmid,pmidp1 
     54    REAL(rstd) :: pval, coeff 
    5855    INTEGER :: i,j,ij,l 
    5956         
     
    6562          ij=(j-1)*iim+i 
    6663          l=llm-1 
    67           DO WHILE(0.5*(p(ij,l)+p(ij,l+1))<pval .AND. l>1) 
     64          DO WHILE(pmid(ij,l)<pval .AND. l>1) 
    6865            l=l-1 
    6966          ENDDO 
    70           pmid=0.5*(p(ij,l)+p(ij,l+1)) 
    71           pmidp1=0.5*(p(ij,l+1)+p(ij,l+2)) 
    72  
    73           coeff=(pval-pmid)/(pmid-pmidp1) 
    74          
     67          coeff=(pval-pmid(ij,l))/(pmid(ij,l)-pmid(ij,l+1)) 
    7568          out(ij)=in(ij,l)+coeff*(in(ij,l)-in(ij,l+1)) 
    7669        ENDDO 
    77       ENDDO 
    78     
     70      ENDDO    
    7971    ENDIF 
    80 !$OMP BARRIER     
    81          
     72!$OMP BARRIER 
     73 
    8274  END SUBROUTINE compute_vertical_interp 
    8375 
Note: See TracChangeset for help on using the changeset viewer.