Changeset 436
- Timestamp:
- 06/16/16 06:29:34 (8 years ago)
- Location:
- codes/icosagcm/trunk/src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/trunk/src/observable.f90
r434 r436 101 101 ELSE 102 102 CALL output_field("temp",f_buf_i) 103 CALL vertical_interp(f_p s,f_buf_i,f_buf_s,85000.)103 CALL vertical_interp(f_pmid,f_buf_i,f_buf_s,85000.) 104 104 CALL output_field("t850",f_buf_s) 105 CALL vertical_interp(f_p s,f_buf_i,f_buf_s,50000.)105 CALL vertical_interp(f_pmid,f_buf_i,f_buf_s,50000.) 106 106 CALL output_field("t500",f_buf_s) 107 CALL vertical_interp(f_p s,f_buf_i,f_buf_s,preff)107 CALL vertical_interp(f_pmid,f_buf_i,f_buf_s,preff) 108 108 CALL output_field("SST",f_buf_s) 109 109 END IF … … 135 135 ! CALL output_field("pv",f_qv) 136 136 137 CALL vertical_interp(f_p s,f_buf_ulon,f_buf_s,85000.)137 CALL vertical_interp(f_pmid,f_buf_ulon,f_buf_s,85000.) 138 138 CALL output_field("u850",f_buf_s) 139 CALL vertical_interp(f_p s,f_buf_ulon,f_buf_s,50000.)139 CALL vertical_interp(f_pmid,f_buf_ulon,f_buf_s,50000.) 140 140 CALL output_field("u500",f_buf_s) 141 141 142 CALL vertical_interp(f_p s,f_buf_ulat,f_buf_s,85000.)142 CALL vertical_interp(f_pmid,f_buf_ulat,f_buf_s,85000.) 143 143 CALL output_field("v850",f_buf_s) 144 CALL vertical_interp(f_p s,f_buf_ulat,f_buf_s,50000.)144 CALL vertical_interp(f_pmid,f_buf_ulat,f_buf_s,50000.) 145 145 CALL output_field("v500",f_buf_s) 146 146 147 CALL vertical_interp(f_p s,f_buf_i,f_buf_s,85000.)147 CALL vertical_interp(f_pmid,f_buf_i,f_buf_s,85000.) 148 148 CALL output_field("w850",f_buf_s) 149 CALL vertical_interp(f_p s,f_buf_i,f_buf_s,50000.)149 CALL vertical_interp(f_pmid,f_buf_i,f_buf_s,50000.) 150 150 CALL output_field("w500",f_buf_s) 151 151 152 152 CALL w_omega(f_ps, f_u, f_buf_i) 153 153 CALL output_field("omega",f_buf_i) 154 CALL vertical_interp(f_p s,f_buf_i,f_buf_s,85000.)154 CALL vertical_interp(f_pmid,f_buf_i,f_buf_s,85000.) 155 155 CALL output_field("omega850",f_buf_s) 156 CALL vertical_interp(f_p s,f_buf_i,f_buf_s,50000.)156 CALL vertical_interp(f_pmid,f_buf_i,f_buf_s,50000.) 157 157 CALL output_field("omega500",f_buf_s) 158 158 END IF -
codes/icosagcm/trunk/src/vertical_interp.f90
r295 r436 3 3 PRIVATE 4 4 5 TYPE(t_field),SAVE, POINTER :: f_p(:)5 ! TYPE(t_field),SAVE, POINTER :: f_p(:) 6 6 7 7 … … 14 14 IMPLICIT NONE 15 15 16 CALL allocate_field(f_p,field_t,type_real,llm+1)16 ! CALL allocate_field(f_p,field_t,type_real,llm+1) 17 17 18 18 END SUBROUTINE init_vertical_interp 19 19 20 SUBROUTINE vertical_interp(f_p s,f_in,f_out,pval)20 SUBROUTINE vertical_interp(f_pmid,f_in,f_out,pval) 21 21 USE icosa 22 22 USE pression_mod 23 23 USE omp_para 24 24 IMPLICIT NONE 25 TYPE(t_field),POINTER :: f_p s(:)25 TYPE(t_field),POINTER :: f_pmid(:) 26 26 TYPE(t_field),POINTER :: f_in(:) 27 27 TYPE(t_field),POINTER :: f_out(:) … … 30 30 REAL(rstd),POINTER :: in(:,:) 31 31 REAL(rstd),POINTER :: out(:) 32 REAL(rstd),POINTER :: p (:,:)32 REAL(rstd),POINTER :: pmid(:,:) 33 33 34 34 INTEGER :: ind 35 35 36 CALL pression(f_ps,f_p)37 38 36 DO ind=1,ndomain 39 37 IF (.NOT. assigned_domain(ind)) CYCLE 40 38 CALL swap_dimensions(ind) 41 39 CALL swap_geometry(ind) 42 p =f_p(ind)40 pmid=f_pmid(ind) 43 41 in=f_in(ind) 44 42 out=f_out(ind) 45 CALL compute_vertical_interp(p ,in,out,pval)43 CALL compute_vertical_interp(pmid,in,out,pval) 46 44 ENDDO 47 45 48 46 END SUBROUTINE vertical_interp 49 47 50 SUBROUTINE compute_vertical_interp(p ,in,out,pval)48 SUBROUTINE compute_vertical_interp(pmid,in,out,pval) 51 49 USE omp_para 52 50 IMPLICIT NONE 53 REAL(rstd),INTENT(IN) :: p (iim*jjm,llm+1)51 REAL(rstd),INTENT(IN) :: pmid(iim*jjm,llm) 54 52 REAL(rstd),INTENT(IN) :: in(iim*jjm,llm) 55 53 REAL(rstd),INTENT(OUT) :: out(iim*jjm) 56 REAL(rstd) :: pval 57 REAL(rstd) :: coeff, pmid,pmidp1 54 REAL(rstd) :: pval, coeff 58 55 INTEGER :: i,j,ij,l 59 56 … … 65 62 ij=(j-1)*iim+i 66 63 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) 68 65 l=l-1 69 66 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)) 75 68 out(ij)=in(ij,l)+coeff*(in(ij,l)-in(ij,l+1)) 76 69 ENDDO 77 ENDDO 78 70 ENDDO 79 71 ENDIF 80 !$OMP BARRIER 81 72 !$OMP BARRIER 73 82 74 END SUBROUTINE compute_vertical_interp 83 75
Note: See TracChangeset
for help on using the changeset viewer.