- Timestamp:
- 06/14/16 07:04:15 (8 years ago)
- Location:
- codes/icosagcm/trunk/src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/trunk/src/geometry.f90
r393 r427 24 24 TYPE(t_field),POINTER :: le_de(:) ! le/de, 0. if de=0. 25 25 TYPE(t_field),POINTER :: Riv(:) 26 TYPE(t_field),POINTER :: S1(:) 27 TYPE(t_field),POINTER :: S2(:) 26 28 TYPE(t_field),POINTER :: Riv2(:) 27 29 TYPE(t_field),POINTER :: ne(:) … … 70 72 REAL(rstd),POINTER :: le(:) ! lenght of a edge 71 73 !$OMP THREADPRIVATE(le) 72 REAL(rstd),POINTER :: le_de(:) 74 REAL(rstd),POINTER :: le_de(:) ! le/de 73 75 !$OMP THREADPRIVATE(le_de) 76 REAL(rstd),POINTER :: S1(:,:) ! area of sub-triangle 77 !$OMP THREADPRIVATE(S1) 78 REAL(rstd),POINTER :: S2(:,:) ! area of sub-tirangle 79 !$OMP THREADPRIVATE(S2) 74 80 REAL(rstd),POINTER :: Riv(:,:) ! weight 75 81 !$OMP THREADPRIVATE(Riv) … … 122 128 CALL allocate_field(geom%bi,field_t,type_real) 123 129 CALL allocate_field(geom%Av,field_z,type_real) 130 CALL allocate_field(geom%S1,field_t,type_real,6) 131 CALL allocate_field(geom%S2,field_t,type_real,6) 124 132 CALL allocate_field(geom%Riv,field_t,type_real,6) 125 133 CALL allocate_field(geom%Riv2,field_t,type_real,6) … … 156 164 le_de=geom%le_de(ind) 157 165 Av=geom%Av(ind) 166 S1=geom%S1(ind) 167 S2=geom%S2(ind) 158 168 Riv=geom%Riv(ind) 159 169 Riv2=geom%Riv2(ind) … … 420 430 INTEGER :: ind,i,j,k,n 421 431 TYPE(t_domain),POINTER :: d 422 REAL(rstd) :: S 432 REAL(rstd) :: S12 423 433 REAL(rstd) :: w(6) 424 434 REAL(rstd) :: lon,lat 425 435 INTEGER :: ii_glo,jj_glo 426 REAL(rstd) :: S 1,S2436 REAL(rstd) :: S 427 437 428 438 … … 569 579 570 580 DO k=0,5 571 CALL surf_triangle(xyz_i(n,:), xyz_v(n+z_pos(k+1),:), xyz_i(n+t_pos(k+1),:),S1 )572 CALL surf_triangle(xyz_i(n,:), xyz_v(n+z_pos(k+1),:), xyz_i(n+t_pos(MOD(k+1+6,6)+1),:),S2 )573 ! Riv(n,k+1)=0.5*(S1+S2)*(radius**2) ! Definition modified for DEC 574 Riv(n,k+1)= 0.5*(S1+S2)/Ai(n)575 Riv2(n,k+1)= 0.5*(S1+S2)/surf_v(k+1)581 CALL surf_triangle(xyz_i(n,:), xyz_v(n+z_pos(k+1),:), xyz_i(n+t_pos(k+1),:),S1(n,k+1) ) 582 CALL surf_triangle(xyz_i(n,:), xyz_v(n+z_pos(k+1),:), xyz_i(n+t_pos(MOD(k+1+6,6)+1),:),S2(n,k+1) ) 583 S12 = .5*(S1(n,k+1)+S2(n,k+1)) 584 Riv(n,k+1)=S12/Ai(n) 585 Riv2(n,k+1)=S12/surf_v(k+1) 576 586 ENDDO 577 587 -
codes/icosagcm/trunk/src/kinetic.f90
r295 r427 1 1 MODULE kinetic_mod 2 IMPLICIT NONE 3 PRIVATE 2 4 5 PUBLIC :: kinetic, kinetic_v, kinetic_new, gradient 3 6 4 7 CONTAINS … … 24 27 Ki=f_Ki(ind) 25 28 CALL compute_kinetic(ue, Ki) 29 ENDDO 30 END SUBROUTINE kinetic 31 32 SUBROUTINE kinetic_new(f_ue,f_Ki) 33 USE icosa 34 IMPLICIT NONE 35 TYPE(t_field), POINTER :: f_ue(:) 36 TYPE(t_field), POINTER :: f_Ki(:) 37 38 REAL(rstd), POINTER :: ue(:,:) 39 REAL(rstd), POINTER :: Ki(:,:) 40 INTEGER :: ind 41 42 CALL transfert_request(f_ue,req_e1_vect) 43 CALL transfert_request(f_ue,req_e1_vect) 44 45 DO ind=1,ndomain 46 IF (.NOT. assigned_domain(ind)) CYCLE 47 CALL swap_dimensions(ind) 48 CALL swap_geometry(ind) 49 ue=f_ue(ind) 50 Ki=f_Ki(ind) 51 CALL compute_Ki_new(ue, Ki) 26 52 ENDDO 53 END SUBROUTINE kinetic_new 27 54 28 END SUBROUTINE kinetic 55 SUBROUTINE kinetic_v(f_ue,f_Kv) 56 USE icosa 57 IMPLICIT NONE 58 TYPE(t_field), POINTER :: f_ue(:) 59 TYPE(t_field), POINTER :: f_Kv(:) 60 61 REAL(rstd), POINTER :: ue(:,:) 62 REAL(rstd), POINTER :: Kv(:,:) 63 INTEGER :: ind 64 65 CALL transfert_request(f_ue,req_e1_vect) 66 CALL transfert_request(f_ue,req_e1_vect) 67 68 DO ind=1,ndomain 69 IF (.NOT. assigned_domain(ind)) CYCLE 70 CALL swap_dimensions(ind) 71 CALL swap_geometry(ind) 72 ue=f_ue(ind) 73 Kv=f_Kv(ind) 74 CALL compute_kv(ue, Kv) 75 ENDDO 76 END SUBROUTINE kinetic_v 29 77 30 78 SUBROUTINE compute_kinetic(ue, Ki) … … 51 99 ENDDO 52 100 ENDDO 101 END SUBROUTINE compute_kinetic 102 103 SUBROUTINE compute_kv(ue, Kv) 104 USE icosa 105 USE omp_para 106 IMPLICIT NONE 107 REAL(rstd),INTENT(IN) :: ue(3*iim*jjm,llm) 108 REAL(rstd),INTENT(OUT) :: Kv(2*iim*jjm,llm) 109 INTEGER :: ij,l, u_up, u_down 110 111 u_up = t_lup + u_right 112 u_down = t_rdown + u_left 53 113 114 DO l=ll_begin,ll_end 115 DO ij=ij_begin,ij_end 116 Kv(ij+z_up,l) = (radius**2/Av(ij+z_up))*( & 117 S1(ij,vup)*ue(ij+u_rup,l)**2 + & 118 S2(ij,vup)*ue(ij+u_lup,l)**2 + & 119 S2(ij+t_lup,vrdown)*ue(ij+u_up,l)**2) 120 121 Kv(ij+z_down,l) = (radius**2/Av(ij+z_down))*( & 122 S1(ij,vdown)*ue(ij+u_ldown,l)**2 + & 123 S2(ij,vdown)*ue(ij+u_rdown,l)**2 + & 124 S2(ij+t_rdown,vlup)*ue(ij+u_down,l)**2 ) 125 ENDDO 126 ENDDO 127 END SUBROUTINE compute_kv 54 128 55 END SUBROUTINE compute_kinetic 56 129 SUBROUTINE compute_Ki_new(ue, Ki) 130 USE icosa 131 USE omp_para 132 IMPLICIT NONE 133 REAL(rstd),INTENT(IN) :: ue(3*iim*jjm,llm) 134 REAL(rstd),INTENT(OUT):: Ki(iim*jjm,llm) 135 REAL(rstd) :: Kv(2*iim*jjm,llm) 136 INTEGER :: ij,l, u_up, u_down 137 138 CALL compute_kv(ue,Kv) 139 140 DO l=ll_begin,ll_end 141 DO ij=ij_begin,ij_end 142 Ki(ij,l) = Riv(ij,vup)*Kv(ij+z_up,l) + & 143 Riv(ij,vlup) *Kv(ij+z_lup,l) + & 144 Riv(ij,vldown)*Kv(ij+z_ldown,l) + & 145 Riv(ij,vdown) *Kv(ij+z_down,l) + & 146 Riv(ij,vrdown)*Kv(ij+z_rdown,l) + & 147 Riv(ij,vrup) *Kv(ij+z_rup,l) 148 END DO 149 END DO 150 END SUBROUTINE compute_Ki_new 151 152 SUBROUTINE gradient(f_berni, f_du) 153 USE icosa 154 IMPLICIT NONE 155 TYPE(t_field), POINTER :: f_berni(:) 156 TYPE(t_field), POINTER :: f_du(:) 157 158 REAL(rstd), POINTER :: du(:,:) 159 REAL(rstd), POINTER :: berni(:,:) 160 INTEGER :: ind 161 162 CALL transfert_request(f_du,req_e1_vect) 163 CALL transfert_request(f_du,req_e1_vect) 164 165 DO ind=1,ndomain 166 IF (.NOT. assigned_domain(ind)) CYCLE 167 CALL swap_dimensions(ind) 168 CALL swap_geometry(ind) 169 berni=f_berni(ind) 170 du=f_du(ind) 171 CALL compute_grad(berni, du) 172 ENDDO 173 174 END SUBROUTINE gradient 175 176 SUBROUTINE compute_grad(berni, du) 177 USE icosa 178 USE omp_para 179 IMPLICIT NONE 180 REAL(rstd),INTENT(IN) :: berni(iim*jjm,llm) 181 REAL(rstd),INTENT(OUT) :: du(3*iim*jjm,llm) 182 INTEGER :: i,j,ij,l 183 184 DO l=ll_begin,ll_end 185 DO j=jj_begin,jj_end 186 DO i=ii_begin,ii_end 187 ij=(j-1)*iim+i 188 du(ij+u_right,l) = ne_right*(berni(ij,l)-berni(ij+t_right,l))/de(ij+u_right) 189 du(ij+u_lup,l) = ne_lup*(berni(ij,l)-berni(ij+t_lup,l))/de(ij+u_right) 190 du(ij+u_ldown,l) = ne_ldown*(berni(ij,l)-berni(ij+t_ldown,l))/de(ij+u_right) 191 ENDDO 192 ENDDO 193 ENDDO 194 195 END SUBROUTINE compute_grad 196 197 57 198 END MODULE kinetic_mod
Note: See TracChangeset
for help on using the changeset viewer.