Changeset 427 for codes


Ignore:
Timestamp:
06/14/16 07:04:15 (8 years ago)
Author:
dubos
Message:

New kinetic energy (diagnostic)

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

Legend:

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

    r393 r427  
    2424    TYPE(t_field),POINTER :: le_de(:) ! le/de, 0. if de=0. 
    2525    TYPE(t_field),POINTER :: Riv(:) 
     26    TYPE(t_field),POINTER :: S1(:) 
     27    TYPE(t_field),POINTER :: S2(:) 
    2628    TYPE(t_field),POINTER :: Riv2(:) 
    2729    TYPE(t_field),POINTER :: ne(:) 
     
    7072  REAL(rstd),POINTER :: le(:)          ! lenght of a edge 
    7173!$OMP THREADPRIVATE(le) 
    72   REAL(rstd),POINTER :: le_de(:)          ! le/de 
     74  REAL(rstd),POINTER :: le_de(:)       ! le/de 
    7375!$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) 
    7480  REAL(rstd),POINTER :: Riv(:,:)       ! weight 
    7581!$OMP THREADPRIVATE(Riv) 
     
    122128    CALL allocate_field(geom%bi,field_t,type_real) 
    123129    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) 
    124132    CALL allocate_field(geom%Riv,field_t,type_real,6) 
    125133    CALL allocate_field(geom%Riv2,field_t,type_real,6) 
     
    156164    le_de=geom%le_de(ind) 
    157165    Av=geom%Av(ind) 
     166    S1=geom%S1(ind) 
     167    S2=geom%S2(ind) 
    158168    Riv=geom%Riv(ind) 
    159169    Riv2=geom%Riv2(ind) 
     
    420430    INTEGER :: ind,i,j,k,n 
    421431    TYPE(t_domain),POINTER :: d 
    422     REAL(rstd) ::  S 
     432    REAL(rstd) ::  S12 
    423433    REAL(rstd) :: w(6) 
    424434    REAL(rstd) :: lon,lat 
    425435    INTEGER :: ii_glo,jj_glo 
    426     REAL(rstd) :: S1,S2 
     436    REAL(rstd) :: S 
    427437           
    428438       
     
    569579           
    570580          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) 
    576586          ENDDO 
    577587 
  • codes/icosagcm/trunk/src/kinetic.f90

    r295 r427  
    11MODULE kinetic_mod 
     2IMPLICIT NONE 
     3PRIVATE 
    24 
     5PUBLIC :: kinetic, kinetic_v, kinetic_new, gradient 
    36 
    47CONTAINS 
     
    2427      Ki=f_Ki(ind) 
    2528      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) 
    2652    ENDDO 
     53  END SUBROUTINE kinetic_new 
    2754   
    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 
    2977   
    3078  SUBROUTINE compute_kinetic(ue, Ki) 
     
    5199      ENDDO 
    52100    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 
    53113     
     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 
    54128   
    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 
    57198END MODULE kinetic_mod 
Note: See TracChangeset for help on using the changeset viewer.