Changeset 151


Ignore:
Timestamp:
05/13/13 14:30:31 (11 years ago)
Author:
ymipsl
Message:

Implementation of mixte parallelism MPI/OpenMP into src directory

YM

Location:
codes/icosagcm/trunk/src
Files:
1 added
3 deleted
24 edited

Legend:

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

    r148 r151  
    5353  SUBROUTINE compute_gradq3d(qi,one_over_sqrt_leng,gradq3d) 
    5454    USE trace 
     55    USE omp_para 
    5556    IMPLICIT NONE 
    5657    REAL(rstd),INTENT(IN)  :: qi(iim*jjm,llm) 
     
    7273    ! Compute gradient at triangles solving a linear system 
    7374    ! arr = area of triangle joining centroids of hexagons 
    74     Do l = 1,llm  
     75     DO l = ll_begin,ll_end  
    7576       DO j=jj_begin-1,jj_end+1 
    7677          DO i=ii_begin-1,ii_end+1 
     
    9091       
    9192    DO k=1,3 
    92       DO l =1,llm 
     93      DO l =ll_begin,ll_end 
    9394        DO j=jj_begin,jj_end 
    9495           DO i=ii_begin,ii_end 
     
    103104 
    104105    !============================================================================================= LIMITING  
    105     ! GO TO 120  
    106     DO l =1,llm 
     106    DO l =ll_begin,ll_end 
    107107       DO j=jj_begin,jj_end 
    108108          DO i=ii_begin,ii_end 
     
    110110             maggrd =  dot_product(gradq3d(n,l,:),gradq3d(n,l,:)) 
    111111             maggrd = sqrt(maggrd)  
    112 !             leng = max(sum((xyz_v(n+z_up,:) - xyz_i(n,:))**2),sum((xyz_v(n+z_down,:) - xyz_i(n,:))**2), & 
    113 !                  sum((xyz_v(n+z_rup,:) - xyz_i(n,:))**2),sum((xyz_v(n+z_rdown,:) - xyz_i(n,:))**2),  & 
    114 !                  sum((xyz_v(n+z_lup,:) - xyz_i(n,:))**2),sum((xyz_v(n+z_ldown,:) - xyz_i(n,:))**2)) 
    115 !             maxq_c = qi(n,l) + maggrd*sqrt(leng(n)) 
    116 !             minq_c = qi(n,l) - maggrd*sqrt(leng(n)) 
    117112             maxq_c = qi(n,l) + maggrd*one_over_sqrt_leng(n) 
    118113             minq_c = qi(n,l) - maggrd*one_over_sqrt_leng(n) 
     
    137132  SUBROUTINE compute_backward_traj(normal,tangent,ue,tau, cc) 
    138133    USE trace 
     134    USE omp_para 
    139135    IMPLICIT NONE 
    140136    REAL(rstd),INTENT(IN)    :: normal(3*iim*jjm,3) 
     
    152148     
    153149    ! reconstruct tangential wind then 3D wind at edge then cc = edge midpoint - u*tau 
    154     DO l = 1,llm 
     150    DO l = ll_begin,ll_end 
    155151       DO j=jj_begin-1,jj_end+1 
    156152          DO i=ii_begin-1,ii_end+1 
     
    213209  SUBROUTINE compute_advect_horiz(update_mass,hfluxt,cc,gradq3d, mass,qi)  
    214210    USE trace 
     211    USE omp_para 
    215212    IMPLICIT NONE 
    216213    LOGICAL, INTENT(IN)       :: update_mass 
     
    230227    ! q(cc)= q0 + gradq.(cc-xyz_i)  with xi centroid of hexagon 
    231228    ! ne*hfluxt>0 iff outgoing 
    232     DO l = 1,llm 
     229    DO l = ll_begin,ll_end 
    233230       DO j=jj_begin-1,jj_end+1 
    234231          DO i=ii_begin-1,ii_end+1 
     
    265262 
    266263    ! update q and, if update_mass, update mass 
    267     DO l = 1,llm 
     264    DO l = ll_begin,ll_end 
    268265       DO j=jj_begin,jj_end 
    269266          DO i=ii_begin,ii_end 
  • codes/icosagcm/trunk/src/advect_tracer.f90

    r149 r151  
    99  TYPE(t_field),POINTER :: f_cc(:)  ! starting point of backward-trajectory (Miura approach) 
    1010  TYPE(t_field),POINTER :: f_one_over_sqrt_leng(:) 
    11   
     11 
     12  TYPE(t_message) :: req_u, req_wfluxt, req_q, req_rhodz, req_gradq3d 
     13 
    1214  REAL(rstd), PARAMETER :: pente_max=2.0 ! for vlz 
     15 
     16! temporary shared variable for vlz 
     17  TYPE(t_field),POINTER :: f_dzqw(:)   ! vertical finite difference of q  
     18  TYPE(t_field),POINTER :: f_adzqw(:)  ! abs(dzqw) 
     19  TYPE(t_field),POINTER :: f_dzq(:)    ! limited slope of q 
     20  TYPE(t_field),POINTER :: f_wq(:)     ! time-integrated flux of q 
    1321 
    1422  PUBLIC init_advect_tracer, advect_tracer 
     
    2836    CALL allocate_field(f_cc,field_u,type_real,llm,3, name='cc') 
    2937    CALL allocate_field(f_one_over_sqrt_leng,field_t,type_real, name='one_over_sqrt_leng') 
    30  
     38    CALL allocate_field(f_dzqw, field_t, type_real, llm, name='dzqw') 
     39    CALL allocate_field(f_adzqw, field_t, type_real, llm, name='adzqw') 
     40    CALL allocate_field(f_dzq, field_t, type_real, llm, name='dzq') 
     41    CALL allocate_field(f_wq, field_t, type_real, llm+1, name='wq') 
     42     
    3143    DO ind=1,ndomain 
    3244       CALL swap_dimensions(ind) 
     
    5668    REAL(rstd),POINTER :: hfluxt(:,:), wfluxt(:,:) 
    5769    REAL(rstd),POINTER :: rhodz(:,:), u(:,:)  
    58     INTEGER :: ind,k 
     70! temporary shared variable for vlz 
     71    REAL(rstd),POINTER ::  dzqw(:,:)         ! vertical finite difference of q  
     72    REAL(rstd),POINTER ::  adzqw(:,:)        ! abs(dzqw) 
     73    REAL(rstd),POINTER ::  dzq(:,:)          ! limited slope of q 
     74    REAL(rstd),POINTER ::  wq(:,:)           ! time-integrated flux of q 
     75     
     76     INTEGER :: ind,k 
     77    LOGICAL,SAVE :: first=.TRUE. 
     78!$OMP THREADPRIVATE(first) 
     79 
     80    IF (first) THEN 
     81      first=.FALSE. 
     82      CALL init_message(f_u,req_e1_vect,req_u) 
     83      CALL init_message(f_wfluxt,req_i1,req_wfluxt) 
     84      CALL init_message(f_q,req_i1,req_q) 
     85      CALL init_message(f_rhodz,req_i1,req_rhodz) 
     86      CALL init_message(f_gradq3d,req_i1,req_gradq3d) 
     87    ENDIF 
     88     
     89!$OMP BARRIER 
    5990 
    6091    CALL trace_start("advect_tracer")  
    6192 
    62     CALL transfert_request(f_u,req_e1_vect) 
    63 !    CALL transfert_request(f_hfluxt,req_e1)  ! BUG : This (unnecessary) transfer makes the computation go wrong 
    64     CALL transfert_request(f_wfluxt,req_i1) 
    65     CALL transfert_request(f_q,req_i1) 
    66     CALL transfert_request(f_rhodz,req_i1) 
    67          
    68 !    IF (is_mpi_root) PRINT *, 'Advection scheme' 
    69  
    70 !    DO ind=1,ndomain 
    71 !       CALL swap_dimensions(ind) 
    72 !       CALL swap_geometry(ind) 
    73 !       normal  = f_normal(ind) 
    74 !       tangent = f_tangent(ind) 
    75 !       cc      = f_cc(ind) 
    76 !       u       = f_u(ind) 
    77 !       q       = f_q(ind) 
    78 !       rhodz   = f_rhodz(ind) 
    79 !       hfluxt  = f_hfluxt(ind)  
    80 !       wfluxt  = f_wfluxt(ind)  
    81 !       gradq3d = f_gradq3d(ind) 
    82 ! 
    83 !       ! 1/2 vertical transport 
    84 !       DO k = 1, nqtot 
    85 !          CALL vlz(k==nqtot,0.5, wfluxt,rhodz,q(:,:,k)) 
    86 !       END DO 
    87 ! 
    88 !       ! horizontal transport 
    89 !       CALL compute_backward_traj(tangent,normal,u,0.5*dt*itau_adv, cc)  
    90 !       DO k = 1,nqtot 
    91 !          CALL compute_gradq3d(q(:,:,k),gradq3d) 
    92 !          CALL compute_advect_horiz(k==nqtot,hfluxt,cc,gradq3d, rhodz,q(:,:,k)) 
    93 !       END DO 
    94 ! 
    95 !       ! 1/2 vertical transport 
    96 !       DO k = 1,nqtot 
    97 !          CALL vlz(k==nqtot, 0.5,wfluxt,rhodz, q(:,:,k)) 
    98 !       END DO 
    99 !    END DO 
    100  
     93    CALL send_message(f_u,req_u) 
     94    CALL send_message(f_wfluxt,req_wfluxt) 
     95    CALL send_message(f_q,req_q) 
     96    CALL send_message(f_rhodz,req_rhodz) 
     97    CALL wait_message(req_u) 
     98    CALL wait_message(req_wfluxt) 
     99    CALL wait_message(req_q) 
     100    CALL wait_message(req_rhodz) 
     101     
    101102    ! 1/2 vertical transport + back-trajectories 
    102103    DO ind=1,ndomain 
     
    110111       rhodz   = f_rhodz(ind) 
    111112       wfluxt  = f_wfluxt(ind)  
     113       dzqw    = f_dzqw(ind) 
     114       adzqw   = f_adzqw(ind) 
     115       dzq     = f_dzq(ind) 
     116       wq      = f_wq(ind)  
    112117 
    113118       DO k = 1, nqtot 
    114           CALL vlz(k==nqtot,0.5, wfluxt,rhodz,q(:,:,k),1) 
     119          CALL vlz(k==nqtot,0.5, wfluxt,rhodz,q(:,:,k),1,dzqw, adzqw, dzq, wq) 
    115120       END DO 
    116121 
    117122       CALL compute_backward_traj(tangent,normal,u,0.5*dt*itau_adv, cc)  
    118     END DO 
    119  
    120 !    CALL transfert_request(f_q,req_i1)      ! necessary ? 
    121 !    CALL transfert_request(f_rhodz,req_i1)  ! necessary ? 
     123 
     124    END DO 
     125 
    122126 
    123127    ! horizontal transport - split in two to place transfer of gradq3d 
    124  
     128!$OMP BARRIER 
    125129    DO k = 1, nqtot 
    126130       DO ind=1,ndomain 
     
    133137       END DO 
    134138 
    135        CALL transfert_request(f_gradq3d,req_i1) 
    136  
     139       CALL send_message(f_gradq3d,req_gradq3d) 
     140       CALL wait_message(req_gradq3d) 
    137141 
    138142 
     
    149153    END DO  
    150154     
    151 !    CALL transfert_request(f_q,req_i1)      ! necessary ? 
    152 !    CALL transfert_request(f_rhodz,req_i1)  ! necessary ? 
    153      
    154155    ! 1/2 vertical transport 
     156!$OMP BARRIER 
     157 
    155158    DO ind=1,ndomain 
    156159       CALL swap_dimensions(ind) 
     
    159162       rhodz   = f_rhodz(ind) 
    160163       wfluxt  = f_wfluxt(ind)  
     164       dzqw    = f_dzqw(ind) 
     165       adzqw   = f_adzqw(ind) 
     166       dzq     = f_dzq(ind) 
     167       wq      = f_wq(ind)  
     168 
    161169       DO k = 1,nqtot 
    162           CALL vlz(k==nqtot, 0.5,wfluxt,rhodz, q(:,:,k),0) 
     170          CALL vlz(k==nqtot, 0.5,wfluxt,rhodz, q(:,:,k),0, dzqw, adzqw, dzq, wq) 
    163171       END DO 
     172 
    164173    END DO 
    165174 
    166175    CALL trace_end("advect_tracer") 
    167176 
     177!$OMP BARRIER 
     178 
    168179  END SUBROUTINE advect_tracer 
    169180 
    170   SUBROUTINE vlz(update_mass, fac,wfluxt,mass, q, halo) 
     181  SUBROUTINE vlz(update_mass, fac,wfluxt,mass, q, halo, dzqw, adzqw, dzq, wq) 
    171182    ! 
    172183    !     Auteurs:   P.Le Van, F.Hourdin, F.Forget, T. Dubos 
     
    178189    !    ******************************************************************** 
    179190    USE trace 
     191    USE omp_para 
    180192    IMPLICIT NONE 
    181193    LOGICAL, INTENT(IN)       :: update_mass 
     
    185197    INTEGER, INTENT(IN) :: halo 
    186198 
    187     REAL(rstd) :: dq(iim*jjm,llm), & ! increase of q 
    188          dzqw(iim*jjm,llm),        & ! vertical finite difference of q  
    189          adzqw(iim*jjm,llm),       & ! abs(dzqw) 
    190          dzq(iim*jjm,llm),         & ! limited slope of q 
    191          wq(iim*jjm,llm+1)           ! time-integrated flux of q 
     199! temporary shared variable 
     200    REAL(rstd),INTENT(INOUT) :: dzqw(iim*jjm,llm),        & ! vertical finite difference of q  
     201                                adzqw(iim*jjm,llm),       & ! abs(dzqw) 
     202                                dzq(iim*jjm,llm),         & ! limited slope of q 
     203                                wq(iim*jjm,llm+1)           ! time-integrated flux of q 
     204 
     205 
    192206    REAL(rstd) :: dzqmax, newmass, sigw, qq, w 
    193207    INTEGER :: i,ij,l,j 
     
    196210 
    197211    ! finite difference of q 
    198     DO l=2,llm 
     212 
     213     DO l=ll_beginp1,ll_end 
    199214       DO j=jj_begin-halo,jj_end+halo 
    200215          DO i=ii_begin-halo,ii_end+halo 
     
    206221    ENDDO 
    207222 
     223!--> flush dzqw, adzqw 
     224!$OMP BARRIER 
     225 
    208226    ! minmod-limited slope of q 
    209227    ! dzq = slope*dz, i.e. the reconstructed q varies by dzq inside level l 
    210     DO l=2,llm-1 
     228 
     229     DO l=ll_beginp1,ll_endm1 
    211230       DO j=jj_begin-halo,jj_end+halo 
    212231          DO i=ii_begin-halo,ii_end+halo 
     
    223242    ENDDO 
    224243 
     244 
    225245    ! 0 slope in top and bottom layers 
    226     DO j=jj_begin-halo,jj_end+halo 
    227        DO i=ii_begin-halo,ii_end+halo 
    228           ij=(j-1)*iim+i 
    229           dzq(ij,1)=0. 
     246    IF (omp_first) THEN 
     247      DO j=jj_begin-halo,jj_end+halo 
     248         DO i=ii_begin-halo,ii_end+halo 
     249           ij=(j-1)*iim+i 
     250           dzq(ij,1)=0. 
     251         ENDDO 
     252      ENDDO 
     253    ENDIF 
     254       
     255    IF (omp_last) THEN 
     256      DO j=jj_begin-halo,jj_end+halo 
     257         DO i=ii_begin-halo,ii_end+halo 
    230258          dzq(ij,llm)=0. 
    231        ENDDO 
    232     ENDDO 
     259         ENDDO 
     260      ENDDO 
     261    ENDIF 
     262 
     263!---> flush dzq 
     264!$OMP BARRIER   
    233265 
    234266    ! sigw = fraction of mass that leaves level l/l+1 
    235267    ! then amount of q leaving level l/l+1 = wq = w * qq 
    236     DO l = 1,llm-1 
     268     DO l=ll_beginp1,ll_end 
    237269       DO j=jj_begin-halo,jj_end+halo 
    238270          DO i=ii_begin-halo,ii_end+halo 
    239271             ij=(j-1)*iim+i 
    240              w = fac*wfluxt(ij,l+1) 
     272             w = fac*wfluxt(ij,l) 
    241273             IF(w>0.) THEN  ! upward transport, upwind side is at level l  
     274                sigw       = w/mass(ij,l-1) 
     275                qq         = q(ij,l-1)+0.5*(1.-sigw)*dzq(ij,l-1) ! qq = q if sigw=1 , qq = q+dzq/2 if sigw=0 
     276             ELSE           ! downward transport, upwind side is at level l+1 
    242277                sigw       = w/mass(ij,l) 
    243                 qq         = q(ij,l)+0.5*(1.-sigw)*dzq(ij,l) ! qq = q if sigw=1 , qq = q+dzq/2 if sigw=0 
    244              ELSE           ! downward transport, upwind side is at level l+1 
    245                 sigw       = w/mass(ij,l+1) 
    246                 qq         = q(ij,l+1)-0.5*(1.+sigw)*dzq(ij,l+1) ! qq = q if sigw=-1 , qq = q-dzq/2 if sigw=0                 
     278                qq         = q(ij,l)-0.5*(1.+sigw)*dzq(ij,l) ! qq = q if sigw=-1 , qq = q-dzq/2 if sigw=0                 
    247279             ENDIF 
    248              wq(ij,l+1) = w*qq 
     280             wq(ij,l) = w*qq 
    249281          ENDDO 
    250282       ENDDO 
    251283    END DO 
    252284    ! wq = 0 at top and bottom 
    253     DO j=jj_begin-halo,jj_end+halo 
    254        DO i=ii_begin-halo,ii_end+halo 
    255           ij=(j-1)*iim+i 
    256           wq(ij,llm+1)=0. 
    257           wq(ij,1)=0. 
    258        ENDDO 
    259     END DO 
     285    IF (omp_first) THEN 
     286      DO j=jj_begin-halo,jj_end+halo 
     287         DO i=ii_begin-halo,ii_end+halo 
     288            ij=(j-1)*iim+i 
     289            wq(ij,1)=0. 
     290         ENDDO 
     291      END DO 
     292    ENDIF 
     293     
     294    IF (omp_last) THEN 
     295      DO j=jj_begin-halo,jj_end+halo 
     296         DO i=ii_begin-halo,ii_end+halo 
     297            ij=(j-1)*iim+i 
     298            wq(ij,llm+1)=0. 
     299         ENDDO 
     300      END DO 
     301    ENDIF 
     302 
     303! --> flush wq 
     304!$OMP BARRIER 
     305 
    260306 
    261307    ! update q, mass is updated only after all q's have been updated 
    262     DO l=1,llm 
     308    DO l=ll_begin,ll_end 
    263309       DO j=jj_begin-halo,jj_end+halo 
    264310          DO i=ii_begin-halo,ii_end+halo 
  • codes/icosagcm/trunk/src/caldyn.f90

    r146 r151  
    1111  USE icosa 
    1212  USE caldyn_gcm_mod, ONLY : init_caldyn_gcm=>init_caldyn 
    13   USE caldyn_gcm_opt_mod, ONLY : init_caldyn_gcm_opt=>init_caldyn 
    1413  USE caldyn_adv_mod, ONLY : init_caldyn_adv=>init_caldyn 
    1514  IMPLICIT NONE 
     
    2120      CASE('gcm') 
    2221        CALL init_caldyn_gcm 
    23       CASE('gcm_opt') 
    24         CALL init_caldyn_gcm_opt 
    2522      CASE('adv') 
    2623        CALL init_caldyn_adv 
     
    3734  USE icosa 
    3835  USE caldyn_gcm_mod, ONLY : caldyn_gcm=>caldyn 
    39   USE caldyn_gcm_opt_mod, ONLY : caldyn_gcm_opt=>caldyn 
    4036  USE caldyn_adv_mod, ONLY : caldyn_adv=>caldyn 
    4137  IMPLICIT NONE 
     
    5652        CALL caldyn_gcm(write_out,f_phis, f_ps, f_theta_rhodz, f_u, f_q, & 
    5753             f_hflux, f_wflux, f_dps, f_dtheta_rhodz, f_du) 
    58       CASE('gcm_opt') 
    59         CALL caldyn_gcm_opt(write_out,f_phis, f_ps, f_theta_rhodz, f_u, f_q, & 
    60              f_hflux, f_wflux, f_dps, f_dtheta_rhodz, f_du) 
    6154      CASE('adv') 
    6255        CALL caldyn_adv(write_out,f_phis, f_ps, f_theta_rhodz, f_u, f_q, & 
  • codes/icosagcm/trunk/src/caldyn_gcm.f90

    r149 r151  
    11MODULE caldyn_gcm_mod 
    22  USE icosa 
    3  
     3  USE transfert_mod 
    44  PRIVATE 
    55 
     
    1111  TYPE(t_field),POINTER :: f_buf_v(:), f_buf_s(:), f_buf_p(:) 
    1212 
    13   PUBLIC init_caldyn, caldyn, write_output_fields,un2ulonlat 
    14  
     13! temporary shared variable for caldyn 
     14  TYPE(t_field),POINTER :: f_theta(:) 
     15  TYPE(t_field),POINTER :: f_pk(:) 
     16  TYPE(t_field),POINTER :: f_pks(:) 
     17  TYPE(t_field),POINTER :: f_phi(:) 
     18  TYPE(t_field),POINTER :: f_divm(:) 
     19  TYPE(t_field),POINTER :: f_wwuu(:) 
     20    
    1521  INTEGER :: caldyn_hydrostat, caldyn_conserv 
     22   
     23  TYPE(t_message) :: req_ps, req_theta_rhodz, req_u, req_qu 
     24 
     25  PUBLIC init_caldyn, caldyn, write_output_fields,req_ps 
    1626 
    1727CONTAINS 
     
    6979  IMPLICIT NONE 
    7080 
    71   CALL allocate_field(f_out_u,field_u,type_real,llm)  
    72   CALL allocate_field(f_p,field_t,type_real,llm+1) 
    73   CALL allocate_field(f_rhodz,field_t,type_real,llm)  
    74   CALL allocate_field(f_qu,field_u,type_real,llm)  
    75    
    76   CALL allocate_field(f_buf_i,field_t,type_real,llm) 
    77   CALL allocate_field(f_buf_p,field_t,type_real,llm+1) 
    78   CALL allocate_field(f_buf_u3d,field_t,type_real,3,llm)  ! 3D vel at cell centers 
    79   CALL allocate_field(f_buf_ulon,field_t,type_real,llm) 
    80   CALL allocate_field(f_buf_ulat,field_t,type_real,llm) 
    81   CALL allocate_field(f_buf_v,field_z,type_real,llm) 
    82   CALL allocate_field(f_buf_s,field_t,type_real) 
     81    CALL allocate_field(f_out_u,field_u,type_real,llm)  
     82    CALL allocate_field(f_p,field_t,type_real,llm+1) 
     83    CALL allocate_field(f_rhodz,field_t,type_real,llm)  
     84    CALL allocate_field(f_qu,field_u,type_real,llm)  
     85   
     86    CALL allocate_field(f_buf_i,field_t,type_real,llm) 
     87    CALL allocate_field(f_buf_p,field_t,type_real,llm+1)  
     88    CALL allocate_field(f_buf_u3d,field_t,type_real,3,llm)  ! 3D vel at cell centers 
     89    CALL allocate_field(f_buf_ulon,field_t,type_real,llm) 
     90    CALL allocate_field(f_buf_ulat,field_t,type_real,llm) 
     91    CALL allocate_field(f_buf_v,field_z,type_real,llm) 
     92    CALL allocate_field(f_buf_s,field_t,type_real) 
     93 
     94    CALL allocate_field(f_theta,field_t,type_real,llm)  ! potential temperature 
     95    CALL allocate_field(f_pk,field_t,type_real,llm) 
     96    CALL allocate_field(f_pks,field_t,type_real) ! Exner function 
     97    CALL allocate_field(f_phi,field_t,type_real,llm)    ! geopotential 
     98    CALL allocate_field(f_divm,field_t,type_real,llm)  ! mass flux divergence 
     99    CALL allocate_field(f_wwuu,field_u,type_real,llm+1)  
    83100 
    84101  END SUBROUTINE allocate_caldyn 
     
    92109    USE mpipara 
    93110    USE trace 
     111    USE omp_para 
    94112    IMPLICIT NONE 
    95113    LOGICAL,INTENT(IN)    :: write_out 
     
    108126    REAL(rstd),POINTER :: u(:,:), du(:,:), hflux(:,:), wflux(:,:) 
    109127    REAL(rstd),POINTER :: p(:,:), rhodz(:,:), qu(:,:) 
     128 
     129! temporary shared variable 
     130    REAL(rstd),POINTER  :: theta(:,:)   
     131    REAL(rstd),POINTER  :: pk(:,:), pks(:) 
     132    REAL(rstd),POINTER  :: phi(:,:)     
     133    REAL(rstd),POINTER  :: divm(:,:)  
     134    REAL(rstd),POINTER  :: wwuu(:,:) 
     135     
     136     
    110137    INTEGER :: ind,ij 
     138    LOGICAL,SAVE :: first=.TRUE. 
     139!$OMP THREADPRIVATE(first) 
     140 
     141     
     142    IF (first) THEN 
     143      first=.FALSE. 
     144      CALL init_message(f_ps,req_i1,req_ps) 
     145      CALL init_message(f_theta_rhodz,req_i1,req_theta_rhodz) 
     146      CALL init_message(f_u,req_e1_vect,req_u) 
     147      CALL init_message(f_qu,req_e1_scal,req_qu) 
     148      CALL send_message(f_ps,req_ps)  
     149    ENDIF 
    111150     
    112151    CALL trace_start("caldyn") 
    113     CALL transfert_request(f_phis,req_i1)  
    114     CALL transfert_request(f_ps,req_i1)  
    115     CALL transfert_request(f_theta_rhodz,req_i1)  
    116     CALL transfert_request(f_u,req_e1_vect) 
     152 
     153    CALL send_message(f_u,req_u) 
     154    CALL send_message(f_theta_rhodz,req_theta_rhodz)  
    117155 
    118156    SELECT CASE(caldyn_conserv) 
     
    126164          qu=f_qu(ind) 
    127165          u=f_u(ind) 
    128           !$OMP PARALLEL DEFAULT(SHARED) 
     166 
    129167          CALL compute_pvort(ps, u, p,rhodz,qu) 
    130           !$OMP END PARALLEL 
     168 
    131169       ENDDO 
    132170 
    133        CALL transfert_request(f_qu,req_e1_scal) 
     171       CALL send_message(f_qu,req_qu) 
    134172 
    135173       DO ind=1,ndomain 
     
    148186          u=f_u(ind) 
    149187          du=f_du(ind) 
    150           out_u=f_out_u(ind)  
    151           !$OMP PARALLEL DEFAULT(SHARED) 
    152           CALL compute_caldyn(ps, u, p,rhodz,qu, phis, theta_rhodz, & 
    153                hflux, wflux, dps, dtheta_rhodz, du) 
    154           !$OMP END PARALLEL 
     188          out_u=f_out_u(ind) 
     189          theta = f_theta(ind) 
     190          pk = f_pk(ind) 
     191          pks = f_pks(ind) 
     192          phi = f_phi(ind)   
     193          divm = f_divm(ind) 
     194          wwuu=f_wwuu(ind) 
     195 
     196          CALL compute_caldyn(ps, u, p,rhodz,qu, phis, theta_rhodz, hflux, wflux, dps, dtheta_rhodz, du, & 
     197                              theta,pk, pks, phi, divm, wwuu) 
    155198       ENDDO        
    156199        
     
    172215          du=f_du(ind) 
    173216          out_u=f_out_u(ind)  
    174           !$OMP PARALLEL DEFAULT(SHARED) 
     217          wwuu=f_wwuu(ind) 
    175218          CALL compute_pvort(ps, u, p,rhodz,qu) 
    176           CALL compute_caldyn(ps, u, p,rhodz,qu, phis, theta_rhodz, & 
    177                hflux, wflux, dps, dtheta_rhodz, du) 
    178           !$OMP END PARALLEL 
     219          CALL compute_caldyn(ps, u, p,rhodz,qu, phis, theta_rhodz, hflux, wflux, dps, dtheta_rhodz, du,   & 
     220                              theta,pk, pks, phi, divm, wwuu) 
    179221       ENDDO 
    180222        
     
    183225    END SELECT 
    184226 
     227!$OMP BARRIER 
    185228    IF (write_out) THEN 
     229 
    186230       IF (is_mpi_root) PRINT *,'CALL write_output_fields' 
    187        CALL write_output_fields(f_ps, f_phis, f_dps, f_u, f_theta_rhodz, f_q, & 
    188             f_buf_i, f_buf_v, f_buf_u3d, f_buf_ulon, f_buf_ulat, f_buf_s, f_buf_p) 
     231 
     232! ---> for openMP test to fix later 
     233!       CALL write_output_fields(f_ps, f_phis, f_dps, f_u, f_theta_rhodz, f_q, & 
     234!            f_buf_i, f_buf_v, f_buf_u3d, f_buf_ulon, f_buf_ulat, f_buf_s, f_buf_p) 
     235       CALL writefield("ps",f_ps) 
     236       CALL writefield("dps",f_dps) 
     237       CALL writefield("vort",f_qu) 
     238       CALL writefield("theta",f_theta) 
     239 
    189240    END IF 
    190241     
    191242    !    CALL check_mass_conservation(f_ps,f_dps) 
    192243    CALL trace_end("caldyn") 
     244!$OMP BARRIER 
    193245     
    194246END SUBROUTINE caldyn 
     
    199251  USE exner_mod 
    200252  USE trace 
     253  USE omp_para 
    201254  IMPLICIT NONE 
    202255  REAL(rstd),INTENT(IN)  :: u(iim*3*jjm,llm) 
     
    208261  INTEGER :: i,j,ij,l 
    209262  REAL(rstd) :: etav,hv 
    210   REAL(rstd),ALLOCATABLE,SAVE :: qv(:,:)     ! potential velocity   
    211    
    212   LOGICAL,SAVE :: first=.TRUE. 
    213   !$OMP THREADPRIVATE(first) 
    214  
     263  REAL(rstd) :: qv(2*iim*jjm,llm)     ! potential velocity   
     264   
    215265 
    216266  CALL trace_start("compute_pvort")   
    217   !$OMP BARRIER       
    218   !$OMP MASTER   
    219   !    IF (first) THEN 
    220   ALLOCATE(qv(2*iim*jjm,llm))     ! potential velocity   
    221    
     267 
     268  CALL wait_message(req_ps)    
    222269!!! Compute pressure 
    223   DO    l    = 1, llm+1 
    224      !$OMP DO 
     270   DO    l    = ll_begin, ll_endp1 
     271    CALL test_message(req_u)  
     272 
    225273     DO j=jj_begin-1,jj_end+1 
    226274        DO i=ii_begin-1,ii_end+1 
     
    230278     ENDDO 
    231279  ENDDO 
    232    
     280 
     281!$OMP BARRIER   
     282 
    233283!!! Compute mass 
    234   DO l = 1, llm 
    235      !$OMP DO 
     284   DO l = ll_begin,ll_end 
     285     CALL test_message(req_u)  
    236286     DO j=jj_begin-1,jj_end+1 
    237287        DO i=ii_begin-1,ii_end+1 
     
    241291     ENDDO 
    242292  ENDDO 
     293 
     294  CALL wait_message(req_u)    
    243295   
    244296!!! Compute shallow-water potential vorticity 
    245   DO l = 1,llm 
    246 !$OMP DO 
     297  DO l = ll_begin,ll_end 
     298    CALL test_message(req_theta_rhodz)  
     299 
    247300    DO j=jj_begin-1,jj_end+1 
    248301       DO i=ii_begin-1,ii_end+1 
    249302          ij=(j-1)*iim+i 
    250303           
    251           etav= 1./Av(ij+z_up)*(  ne(ij,rup)        * u(ij+u_rup,l)        * de(ij+u_rup)         & 
    252                                 + ne(ij+t_rup,left) * u(ij+t_rup+u_left,l) * de(ij+t_rup+u_left)  & 
    253                                 - ne(ij,lup)        * u(ij+u_lup,l)        * de(ij+u_lup) )                                
     304          etav= 1./Av(ij+z_up)*(  ne_rup        * u(ij+u_rup,l)        * de(ij+u_rup)         & 
     305                                + ne_left * u(ij+t_rup+u_left,l) * de(ij+t_rup+u_left)  & 
     306                                - ne_lup        * u(ij+u_lup,l)        * de(ij+u_lup) )                                
    254307 
    255308          hv =  Riv2(ij,vup)          * rhodz(ij,l)            & 
     
    259312          qv(ij+z_up,l) = ( etav+fv(ij+z_up) )/hv 
    260313           
    261           etav = 1./Av(ij+z_down)*(  ne(ij,ldown)         * u(ij+u_ldown,l)          * de(ij+u_ldown)          & 
    262                                    + ne(ij+t_ldown,right) * u(ij+t_ldown+u_right,l)  * de(ij+t_ldown+u_right)  & 
    263                                    - ne(ij,rdown)         * u(ij+u_rdown,l)          * de(ij+u_rdown) ) 
     314          etav = 1./Av(ij+z_down)*(  ne_ldown         * u(ij+u_ldown,l)          * de(ij+u_ldown)          & 
     315                                   + ne_right * u(ij+t_ldown+u_right,l)  * de(ij+t_ldown+u_right)  & 
     316                                   - ne_rdown         * u(ij+u_rdown,l)          * de(ij+u_rdown) ) 
    264317        
    265318          hv =  Riv2(ij,vdown)        * rhodz(ij,l)          & 
     
    283336   ENDDO 
    284337 
    285 !!$OMP BARRIER 
    286 !!$OMP MASTER   
    287     DEALLOCATE(qv)       ! potential velocity   
    288 !!$OMP END MASTER 
    289 !!$OMP BARRIER    
    290     CALL trace_end("compute_pvort") 
     338   CALL trace_end("compute_pvort") 
    291339                                                        
    292340  END SUBROUTINE compute_pvort 
    293    
    294   SUBROUTINE compute_caldyn(ps, u, p,rhodz,qu, phis, theta_rhodz, hflux, wflux, dps, dtheta_rhodz, du) 
     341 
     342   
     343  SUBROUTINE compute_caldyn(ps, u, p,rhodz,qu, phis, theta_rhodz, hflux, wflux, dps, dtheta_rhodz, du,   & 
     344                            theta,pk, pks, phi, divm, wwuu)  
    295345  USE icosa 
    296346  USE disvert_mod 
    297347  USE exner_mod 
    298348  USE trace 
     349  USE omp_para 
    299350  IMPLICIT NONE 
    300351    REAL(rstd),INTENT(IN)  :: phis(iim*jjm) 
     
    310361    REAL(rstd),INTENT(OUT) :: dps(iim*jjm) 
    311362    REAL(rstd),INTENT(OUT) :: wflux(iim*jjm,llm+1) ! vertical mass flux (kg/m2/s) 
    312      
    313     REAL(rstd),ALLOCATABLE,SAVE :: theta(:,:)  ! potential temperature 
    314     REAL(rstd),ALLOCATABLE,SAVE :: pk(:,:), pks(:) ! Exner function 
    315     REAL(rstd),ALLOCATABLE,SAVE :: alpha(:,:), beta(:,:) 
    316     REAL(rstd),ALLOCATABLE,SAVE :: phi(:,:)    ! geopotential 
    317     REAL(rstd),ALLOCATABLE,SAVE :: Ftheta(:,:) ! theta flux 
    318     REAL(rstd),ALLOCATABLE,SAVE :: divm(:,:)  ! mass flux divergence 
    319     REAL(rstd),ALLOCATABLE,SAVE :: berni(:,:)  ! Bernouilli function 
     363 
     364! temporary variable 
     365    REAL(rstd),INTENT(INOUT) :: theta(iim*jjm,llm)  ! potential temperature 
     366    REAL(rstd),INTENT(INOUT) :: pk(iim*jjm,llm), pks(iim*jjm) ! Exner function 
     367    REAL(rstd),INTENT(INOUT) :: phi(iim*jjm,llm)    ! geopotential 
     368    REAL(rstd),INTENT(INOUT) :: divm(iim*jjm,llm)  ! mass flux divergence 
     369    REAL(rstd),INTENT(INOUT) :: wwuu(iim*3*jjm,llm+1) 
     370 
     371     
     372    REAL(rstd) :: Ftheta(3*iim*jjm,llm) ! theta flux 
     373    REAL(rstd) :: berni(iim*jjm,llm)  ! Bernouilli function 
    320374     
    321375    INTEGER :: i,j,ij,l 
    322376    REAL(rstd) :: ww,uu 
    323377 
    324     LOGICAL,SAVE :: first=.TRUE. 
    325 !$OMP THREADPRIVATE(first) 
    326      
    327378    CALL trace_start("compute_caldyn") 
    328 !$OMP BARRIER       
    329 !$OMP MASTER   
    330 !    IF (first) THEN 
    331     ALLOCATE(theta(iim*jjm,llm))    ! potential temperature 
    332     ALLOCATE(pk(iim*jjm,llm))       ! Exner function 
    333     ALLOCATE(pks(iim*jjm)) 
    334     ALLOCATE(alpha(iim*jjm,llm)) 
    335     ALLOCATE(beta(iim*jjm,llm)) 
    336     ALLOCATE(phi(iim*jjm,llm))      ! geopotential 
    337     ALLOCATE(Ftheta(3*iim*jjm,llm)) ! theta flux    
    338     ALLOCATE(divm(iim*jjm,llm))    ! mass flux divvergence 
    339     ALLOCATE(berni(iim*jjm,llm))    ! bernouilli term 
     379 
     380    CALL wait_message(req_theta_rhodz)  
    340381 
    341382!!! Compute theta 
    342    DO l = 1, llm 
    343 !$OMP DO 
     383   DO l = ll_begin, ll_end 
     384      IF (caldyn_conserv==energy) CALL test_message(req_qu)  
    344385      DO j=jj_begin-1,jj_end+1 
    345386         DO i=ii_begin-1,ii_end+1 
     
    350391   ENDDO 
    351392 
    352   DO l = 1, llm 
     393  DO l = ll_begin, ll_end 
    353394!!!  Compute mass and theta fluxes 
     395    IF (caldyn_conserv==energy) CALL test_message(req_qu)  
    354396    DO j=jj_begin-1,jj_end+1 
    355397      DO i=ii_begin-1,ii_end+1 
     
    370412        ij=(j-1)*iim+i   
    371413        ! divm = +div(mass flux), sign convention as in Ringler et al. 2012, eq. 21 
    372         divm(ij,l)= 1./Ai(ij)*(ne(ij,right)*hflux(ij+u_right,l)   +  & 
    373                                 ne(ij,rup)*hflux(ij+u_rup,l)       +  &   
    374                                 ne(ij,lup)*hflux(ij+u_lup,l)       +  &   
    375                                 ne(ij,left)*hflux(ij+u_left,l)     +  &   
    376                                 ne(ij,ldown)*hflux(ij+u_ldown,l)   +  &   
    377                                 ne(ij,rdown)*hflux(ij+u_rdown,l))     
     414        divm(ij,l)= 1./Ai(ij)*(ne_right*hflux(ij+u_right,l)   +  & 
     415                                ne_rup*hflux(ij+u_rup,l)       +  &   
     416                                ne_lup*hflux(ij+u_lup,l)       +  &   
     417                                ne_left*hflux(ij+u_left,l)     +  &   
     418                                ne_ldown*hflux(ij+u_ldown,l)   +  &   
     419                                ne_rdown*hflux(ij+u_rdown,l))     
    378420 
    379421        ! signe ? attention d (rho theta dz) 
    380422        ! dtheta_rhodz =  -div(flux.theta) 
    381         dtheta_rhodz(ij,l)=-1./Ai(ij)*(ne(ij,right)*Ftheta(ij+u_right,l)    +  & 
    382                                  ne(ij,rup)*Ftheta(ij+u_rup,l)        +  &   
    383                                  ne(ij,lup)*Ftheta(ij+u_lup,l)        +  &   
    384                                  ne(ij,left)*Ftheta(ij+u_left,l)      +  &   
    385                                  ne(ij,ldown)*Ftheta(ij+u_ldown,l)    +  &   
    386                                  ne(ij,rdown)*Ftheta(ij+u_rdown,l)) 
     423        dtheta_rhodz(ij,l)=-1./Ai(ij)*(ne_right*Ftheta(ij+u_right,l)    +  & 
     424                                 ne_rup*Ftheta(ij+u_rup,l)        +  &   
     425                                 ne_lup*Ftheta(ij+u_lup,l)        +  &   
     426                                 ne_left*Ftheta(ij+u_left,l)      +  &   
     427                                 ne_ldown*Ftheta(ij+u_ldown,l)    +  &   
     428                                 ne_rdown*Ftheta(ij+u_rdown,l)) 
    387429      ENDDO 
    388430    ENDDO 
    389431  ENDDO 
    390     
     432 
     433!$OMP BARRIER    
    391434!!! cumulate mass flux divergence from top to bottom 
    392435  DO  l = llm-1, 1, -1 
    393 !$OMP DO 
     436    IF (caldyn_conserv==energy) CALL test_message(req_qu)  
     437!$OMP DO SCHEDULE(STATIC)  
    394438    DO j=jj_begin,jj_end 
    395439      DO i=ii_begin,ii_end 
     
    399443    ENDDO 
    400444  ENDDO 
     445 
     446! IMPLICIT FLUSH on divm 
     447!!!!!!!!!!!!!!!!!!!!!!!!! 
    401448   
    402449!!! Compute vertical mass flux 
    403   DO l = 1,llm-1 
    404 !$OMP DO 
     450!  DO l = 2,llm 
     451  DO l=ll_beginp1,ll_end 
     452    IF (caldyn_conserv==energy) CALL test_message(req_qu)  
    405453    DO j=jj_begin,jj_end 
    406454      DO i=ii_begin,ii_end 
     
    408456        ! w = int(z,ztop,div(flux)dz) + B(eta)dps/dt 
    409457        ! => w>0 for upward transport 
    410         wflux( ij, l+1 ) = divm( ij, l+1 ) - bp(l+1) * divm( ij, 1 ) 
     458        wflux( ij, l ) = divm( ij, l ) - bp(l) * divm( ij, 1 ) 
    411459      ENDDO 
    412460    ENDDO 
     
    414462 
    415463! compute dps, set vertical mass flux at the surface to 0 
    416 !$OMP DO 
    417   DO j=jj_begin,jj_end 
    418     DO i=ii_begin,ii_end 
    419       ij=(j-1)*iim+i 
    420       wflux(ij,1)  = 0. 
    421       wflux(ij,llm+1)  = 0. 
    422       ! dps/dt = -int(div flux)dz 
    423       dps(ij)=-divm(ij,1) * g  
    424     ENDDO 
    425   ENDDO 
    426  
     464  IF (omp_first) THEN 
     465    DO j=jj_begin,jj_end 
     466      DO i=ii_begin,ii_end 
     467        ij=(j-1)*iim+i 
     468        wflux(ij,1)  = 0. 
     469        ! dps/dt = -int(div flux)dz 
     470        dps(ij)=-divm(ij,1) * g  
     471      ENDDO 
     472    ENDDO 
     473  ENDIF 
     474 
     475 
     476  IF (omp_last) THEN 
     477    DO j=jj_begin,jj_end 
     478      DO i=ii_begin,ii_end 
     479        ij=(j-1)*iim+i 
     480        wflux(ij,llm+1)  = 0. 
     481      ENDDO 
     482    ENDDO 
     483  ENDIF 
    427484!!! Compute potential vorticity (Coriolis) contribution to du 
    428485 
     
    430487    CASE(energy) ! energy-conserving TRiSK 
    431488 
    432        DO l=1,llm 
    433           !$OMP DO 
     489       CALL wait_message(req_qu) 
     490 
     491        DO l=ll_begin,ll_end 
    434492          DO j=jj_begin,jj_end 
    435493             DO i=ii_begin,ii_end 
     
    479537    CASE(enstrophy) ! enstrophy-conserving TRiSK 
    480538   
    481        DO l=1,llm 
    482           !$OMP DO 
     539        DO l=ll_begin,ll_end 
    483540          DO j=jj_begin,jj_end 
    484541             DO i=ii_begin,ii_end 
     
    531588   
    532589!!! Compute Exner function 
    533 !    PRINT *, 'Computing Exner' 
    534     CALL compute_exner(ps,p,pks,pk,1)  
     590!    CALL compute_exner(ps,p,pks,pk,1)  
     591! replaced in source 
     592    IF (omp_first) THEN     
     593       DO j=jj_begin-1,jj_end+1 
     594          DO i=ii_begin-1,ii_end+1 
     595             ij=(j-1)*iim+i 
     596             pks(ij) = cpp * ( ps(ij)/preff ) ** kappa 
     597          ENDDO 
     598       ENDDO 
     599     ENDIF 
     600      
     601       ! 3D : pk 
     602     DO l = ll_begin, ll_end 
     603        DO j=jj_begin-1,jj_end+1 
     604           DO i=ii_begin-1,ii_end+1 
     605              ij=(j-1)*iim+i 
     606              pk(ij,l) = cpp * ((.5/preff)*(p(ij,l)+p(ij,l+1))) ** kappa 
     607           ENDDO 
     608        ENDDO 
     609     ENDDO 
     610 
     611!---> flush pk,pks, theta 
     612!$OMP BARRIER 
    535613 
    536614!!! Compute geopotential 
    537615 
    538616  ! for first layer 
    539 !$OMP DO 
    540    DO j=jj_begin-1,jj_end+1 
    541      DO i=ii_begin-1,ii_end+1 
    542        ij=(j-1)*iim+i 
    543        phi( ij,1 ) = phis( ij ) + theta(ij,1) * ( pks(ij) - pk(ij,1) ) 
     617  IF (omp_first) THEN 
     618    DO j=jj_begin-1,jj_end+1 
     619      DO i=ii_begin-1,ii_end+1 
     620        ij=(j-1)*iim+i 
     621        phi( ij,1 ) = phis( ij ) + theta(ij,1) * ( pks(ij) - pk(ij,1) ) 
     622      ENDDO 
     623    ENDDO 
     624  ENDIF 
     625!!-> implicit flush on phi(:,1) 
     626           
     627  ! for other layers 
     628   DO l = ll_beginp1, ll_end 
     629     DO j=jj_begin-1,jj_end+1 
     630       DO i=ii_begin-1,ii_end+1 
     631         ij=(j-1)*iim+i 
     632         phi(ij,l) =  0.5 * ( theta(ij,l)  + theta(ij,l-1) )  &  
     633                          * (  pk(ij,l-1) -  pk(ij,l)    ) 
     634       ENDDO 
    544635     ENDDO 
    545636   ENDDO 
    546            
    547   ! for other layers 
     637 
     638!$OMP BARRIER 
    548639   DO l = 2, llm 
    549640!$OMP DO 
     
    551642       DO i=ii_begin-1,ii_end+1 
    552643         ij=(j-1)*iim+i 
    553          phi(ij,l) = phi(ij,l-1) + 0.5 * ( theta(ij,l)  + theta(ij,l-1) )  &  
    554                                        * (  pk(ij,l-1) -  pk(ij,l)    ) 
     644         phi(ij,l) = phi(ij,l)+ phi(ij,l-1) 
    555645       ENDDO 
    556646     ENDDO 
    557647   ENDDO 
    558  
    559     
     648! --> IMPLICIT FLUSH on phi 
     649       
    560650!!! Compute bernouilli term = Kinetic Energy + geopotential 
    561   DO l=1,llm 
    562 !$OMP DO 
     651   DO l=ll_begin,ll_end 
    563652    DO j=jj_begin,jj_end 
    564653      DO i=ii_begin,ii_end 
     
    576665    ENDDO 
    577666  ENDDO 
    578    
     667 
    579668  
    580669!!! gradients of Bernoulli and Exner functions 
    581   DO l=1,llm 
    582 !$OMP DO 
     670 
     671   DO l=ll_begin,ll_end 
    583672    DO j=jj_begin,jj_end 
    584673      DO i=ii_begin,ii_end 
    585674        ij=(j-1)*iim+i 
    586675         
    587         out_u(ij+u_right,l)=  1/de(ij+u_right) * (                              & 
    588                           0.5*(theta(ij,l)+theta(ij+t_right,l))                             & 
    589                              *( ne(ij,right)*pk(ij,l)+ne(ij+t_right,left)*pk(ij+t_right,l)) & 
    590                         + ne(ij,right)*berni(ij,l)+ne(ij+t_right,left)*berni(ij+t_right,l) ) 
     676        du(ij+u_right,l) = du(ij+u_right,l) + 1/de(ij+u_right) * (             & 
     677                          0.5*(theta(ij,l)+theta(ij+t_right,l))                & 
     678                             *( ne_right*pk(ij,l)+ne_left*pk(ij+t_right,l))    & 
     679                        + ne_right*berni(ij,l)+ne_left*berni(ij+t_right,l) ) 
    591680         
    592         du(ij+u_right,l) = du(ij+u_right,l) + out_u(ij+u_right,l) 
    593681         
    594         out_u(ij+u_lup,l)=  1/de(ij+u_lup) * (                                  & 
    595                           0.5*(theta(ij,l)+theta(ij+t_lup,l))                             & 
    596                              *( ne(ij,lup)*pk(ij,l)+ne(ij+t_lup,rdown)*pk(ij+t_lup,l))    & 
    597                         + ne(ij,lup)*berni(ij,l)+ne(ij+t_lup,rdown)*berni(ij+t_lup,l) ) 
    598          
    599         du(ij+u_lup,l) = du(ij+u_lup,l) + out_u(ij+u_lup,l) 
     682        du(ij+u_lup,l) = du(ij+u_lup,l) +  1/de(ij+u_lup) * (                  & 
     683                          0.5*(theta(ij,l)+theta(ij+t_lup,l))                  & 
     684                             *( ne_lup*pk(ij,l)+ne_rdown*pk(ij+t_lup,l))       & 
     685                        + ne_lup*berni(ij,l)+ne_rdown*berni(ij+t_lup,l) ) 
    600686                 
    601         out_u(ij+u_ldown,l)= 1/de(ij+u_ldown) * (                                & 
    602                           0.5*(theta(ij,l)+theta(ij+t_ldown,l))                               & 
    603                              *( ne(ij,ldown)*pk(ij,l)+ne(ij+t_ldown,rup)*pk(ij+t_ldown,l))    & 
    604                         + ne(ij,ldown)*berni(ij,l)+ne(ij+t_ldown,rup)*berni(ij+t_ldown,l) ) 
    605          
    606         du(ij+u_ldown,l) = du(ij+u_ldown,l) + out_u(ij+u_ldown,l) 
     687        du(ij+u_ldown,l) = du(ij+u_ldown,l) + 1/de(ij+u_ldown) * (             & 
     688                          0.5*(theta(ij,l)+theta(ij+t_ldown,l))                & 
     689                             *( ne_ldown*pk(ij,l)+ne_rup*pk(ij+t_ldown,l))     & 
     690                        + ne_ldown*berni(ij,l)+ne_rup*berni(ij+t_ldown,l) ) 
    607691 
    608692      ENDDO 
    609693    ENDDO 
    610694  ENDDO 
    611   
    612 !!! contributions of vertical advection to du, dtheta 
    613   
    614   DO l=1,llm-1 
    615 !$OMP DO 
    616     DO j=jj_begin,jj_end 
    617       DO i=ii_begin,ii_end 
    618         ij=(j-1)*iim+i 
    619          ! ww>0 <=> upward transport 
    620  
    621         ww            =   0.5 * wflux(ij,l+1) * (theta(ij,l) + theta(ij,l+1) ) 
    622         dtheta_rhodz(ij, l ) = dtheta_rhodz(ij, l )  -  ww 
    623         dtheta_rhodz(ij,l+1) = dtheta_rhodz(ij,l+1)  +  ww 
    624  
    625         ww  = 0.5 * ( wflux(ij,l+1) + wflux(ij+t_right,l+1)) 
    626         uu  = u(ij+u_right,l+1) - u(ij+u_right,l)   
    627         du(ij+u_right, l )   = du(ij+u_right,l)   - 0.5 * ww * uu / (0.5*(rhodz(ij,l)+rhodz(ij+t_right,l))) 
    628         du(ij+u_right, l+1 ) = du(ij+u_right,l+1) - 0.5 * ww * uu / (0.5*(rhodz(ij,l+1)+rhodz(ij+t_right,l+1))) 
    629  
    630         ww  = 0.5 * ( wflux(ij,l+1) + wflux(ij+t_lup,l+1)) 
    631         uu  = u(ij+u_lup,l+1) - u(ij+u_lup,l)   
    632         du(ij+u_lup, l )   = du(ij+u_lup,l)   - 0.5 * ww * uu / (0.5*(rhodz(ij,l)+rhodz(ij+t_lup,l))) 
    633         du(ij+u_lup, l+1 ) = du(ij+u_lup,l+1) - 0.5 * ww * uu / (0.5*(rhodz(ij,l+1)+rhodz(ij+t_lup,l+1))) 
    634  
    635         ww  = 0.5 * ( wflux(ij,l+1) + wflux(ij+t_ldown,l+1)) 
    636         uu  = u(ij+u_ldown,l+1) - u(ij+u_ldown,l)   
    637         du(ij+u_ldown, l )   = du(ij+u_ldown,l)   - 0.5 * ww * uu / (0.5*(rhodz(ij,l)+rhodz(ij+t_ldown,l))) 
    638         du(ij+u_ldown, l+1 ) = du(ij+u_ldown,l+1) - 0.5 * ww * uu / (0.5*(rhodz(ij,l+1)+rhodz(ij+t_ldown,l+1))) 
    639  
     695 
     696    
     697  DO l=ll_begin,ll_endm1 
     698    DO j=jj_begin,jj_end 
     699      DO i=ii_begin,ii_end 
     700        ij=(j-1)*iim+i 
     701        dtheta_rhodz(ij, l ) = dtheta_rhodz(ij, l )  -   0.5 * (  wflux(ij,l+1) * (theta(ij,l) + theta(ij,l+1))) 
     702      ENDDO 
     703    ENDDO 
     704  ENDDO 
     705   
     706  DO l=ll_beginp1,ll_end 
     707    DO j=jj_begin,jj_end 
     708      DO i=ii_begin,ii_end 
     709        ij=(j-1)*iim+i 
     710        dtheta_rhodz(ij, l ) = dtheta_rhodz(ij, l )  +   0.5 * ( wflux(ij,l  ) * (theta(ij,l-1) + theta(ij,l) ) ) 
     711      ENDDO 
     712    ENDDO 
     713  ENDDO 
     714   
     715  IF (omp_first) THEN 
     716    DO j=jj_begin,jj_end 
     717      DO i=ii_begin,ii_end 
     718        ij=(j-1)*iim+i 
     719        wwuu(ij+u_right,1)=0    
     720        wwuu(ij+u_lup,1)=0    
     721        wwuu(ij+u_ldown,1)=0 
     722      ENDDO 
     723    ENDDO 
     724  ENDIF    
     725 
     726  IF (omp_last) THEN 
     727    DO j=jj_begin,jj_end 
     728      DO i=ii_begin,ii_end 
     729        ij=(j-1)*iim+i 
     730        wwuu(ij+u_right,llm+1)=0    
     731        wwuu(ij+u_lup,llm+1)=0    
     732        wwuu(ij+u_ldown,llm+1)=0 
     733      ENDDO 
     734    ENDDO 
     735  ENDIF    
     736   
     737  DO l=ll_beginp1,ll_end 
     738    DO j=jj_begin,jj_end 
     739      DO i=ii_begin,ii_end 
     740        ij=(j-1)*iim+i 
     741        wwuu(ij+u_right,l) = 0.5*( wflux(ij,l) + wflux(ij+t_right,l)) * (u(ij+u_right,l) - u(ij+u_right,l-1)) 
     742        wwuu(ij+u_lup,l) = 0.5* ( wflux(ij,l) + wflux(ij+t_lup,l)) * (u(ij+u_lup,l) - u(ij+u_lup,l-1)) 
     743        wwuu(ij+u_ldown,l) = 0.5*( wflux(ij,l) + wflux(ij+t_ldown,l)) * (u(ij+u_ldown,l) - u(ij+u_ldown,l-1)) 
     744       ENDDO 
     745     ENDDO 
     746   ENDDO 
     747 
     748 !--> flush wwuu   
     749 !$OMP BARRIER 
     750 
     751  DO l=ll_begin,ll_end 
     752    DO j=jj_begin,jj_end 
     753      DO i=ii_begin,ii_end 
     754        ij=(j-1)*iim+i 
     755        du(ij+u_right, l )   = du(ij+u_right,l)  - (wwuu(ij+u_right,l+1)+ wwuu(ij+u_right,l)) / (rhodz(ij,l)+rhodz(ij+t_right,l)) 
     756        du(ij+u_lup, l )     = du(ij+u_lup,l)    - (wwuu(ij+u_lup,l+1)  + wwuu(ij+u_lup,l))   / (rhodz(ij,l)+rhodz(ij+t_lup,l)) 
     757        du(ij+u_ldown, l )   = du(ij+u_ldown,l)  - (wwuu(ij+u_ldown,l+1)+ wwuu(ij+u_ldown,l)) / (rhodz(ij,l)+rhodz(ij+t_ldown,l)) 
    640758      ENDDO 
    641759    ENDDO 
    642760  ENDDO       
    643     
    644 !!$OMP BARRIER 
    645 !!$OMP MASTER   
    646     DEALLOCATE(theta)   ! potential temperature 
    647     DEALLOCATE(pk)      ! Exner function 
    648     DEALLOCATE(pks) 
    649     DEALLOCATE(alpha) 
    650     DEALLOCATE(beta) 
    651     DEALLOCATE(phi)     ! geopotential 
    652     DEALLOCATE(Ftheta)  ! theta flux    
    653     DEALLOCATE(divm)    ! mass flux divergence 
    654     DEALLOCATE(berni)   ! bernouilli term 
    655 !!$OMP END MASTER 
    656 !!$OMP BARRIER                                                       
    657     CALL trace_end("compute_caldyn") 
     761   
     762  CALL trace_end("compute_caldyn") 
    658763 
    659764  END SUBROUTINE compute_caldyn 
     
    709814    USE write_field 
    710815    USE vertical_interp_mod 
     816    USE wind_mod 
    711817    TYPE(t_field),POINTER :: f_ps(:), f_phis(:), f_u(:), f_theta_rhodz(:), f_q(:), f_dps(:), & 
    712818         f_buf_i(:), f_buf_v(:), f_buf_i3(:), f_buf1_i(:), f_buf2_i(:), f_buf_s(:), f_buf_p(:) 
     
    722828     
    723829    CALL writefield("ps",f_ps) 
    724 !    CALL writefield("dps",f_dps) 
    725 !    CALL writefield("phis",f_phis) 
    726 !    CALL vorticity(f_u,f_buf_v) 
    727 !    CALL writefield("vort",f_buf_v) 
    728  
    729 !    CALL w_omega(f_ps, f_u, f_buf_i) 
    730 !    CALL writefield('omega', f_buf_i) 
    731 !    IF (out_pression_level<=preff .AND. out_pression_level > 0) THEN 
    732 !      CALL vertical_interp(f_ps,f_buf_i,f_buf_s,out_pression_level) 
    733 !      CALL writefield("omega"//TRIM(str_pression),f_buf_s) 
    734 !    ENDIF 
     830    CALL writefield("dps",f_dps) 
     831    CALL writefield("phis",f_phis) 
     832    CALL vorticity(f_u,f_buf_v) 
     833    CALL writefield("vort",f_buf_v) 
     834 
     835    CALL w_omega(f_ps, f_u, f_buf_i) 
     836    CALL writefield('omega', f_buf_i) 
     837    IF (out_pression_level<=preff .AND. out_pression_level > 0) THEN 
     838      CALL vertical_interp(f_ps,f_buf_i,f_buf_s,out_pression_level) 
     839      CALL writefield("omega"//TRIM(str_pression),f_buf_s) 
     840    ENDIF 
    735841     
    736842    ! Temperature 
     
    754860    
    755861    ! velocity components 
    756     CALL un2ulonlat(f_u, f_buf_i3, f_buf1_i, f_buf2_i) 
     862    CALL un2ulonlat(f_u, f_buf1_i, f_buf2_i) 
    757863    CALL writefield("ulon",f_buf1_i) 
    758864    CALL writefield("ulat",f_buf2_i) 
     
    767873    ! geopotential 
    768874    CALL thetarhodz2geopot(f_ps,f_phis,f_theta_rhodz, f_buf_s,f_buf_p,f_buf1_i,f_buf2_i,f_buf_i) 
    769 !    CALL writefield("p",f_buf_p) 
    770 !    CALL writefield("phi",f_buf_i) 
    771      CALL writefield("theta",f_buf1_i) ! potential temperature 
    772 !    CALL writefield("pk",f_buf2_i) ! Exner pressure 
     875    CALL writefield("p",f_buf_p) 
     876    CALL writefield("phi",f_buf_i) 
     877    CALL writefield("theta",f_buf1_i) ! potential temperature 
     878    CALL writefield("pk",f_buf2_i) ! Exner pressure 
    773879   
    774880   
     
    806912  END SUBROUTINE thetarhodz2geopot 
    807913   
    808   SUBROUTINE un2ulonlat(f_u, f_u3d, f_ulon, f_ulat) 
    809     USE field_mod 
    810     USE wind_mod 
    811     TYPE(t_field), POINTER :: f_u(:), & ! IN  : normal velocity components on edges 
    812          f_u3d(:), f_ulon(:), f_ulat(:) ! OUT : velocity reconstructed at hexagons 
    813     REAL(rstd),POINTER :: u(:,:), u3d(:,:,:), ulon(:,:), ulat(:,:) 
    814     INTEGER :: ind 
    815     DO ind=1,ndomain 
    816        CALL swap_dimensions(ind) 
    817        CALL swap_geometry(ind) 
    818        u=f_u(ind) 
    819        u3d=f_u3d(ind) 
    820        CALL compute_wind_centered(u,u3d) 
    821        ulon=f_ulon(ind) 
    822        ulat=f_ulat(ind) 
    823        CALL compute_wind_centered_lonlat_compound(u3d, ulon, ulat) 
    824     END DO 
    825   END SUBROUTINE un2ulonlat 
    826  
    827914  SUBROUTINE Tv2T(f_Tv, f_q, f_T) 
    828915  USE icosa 
  • codes/icosagcm/trunk/src/check_conserve.f90

    r149 r151  
    11MODULE check_conserve_mod 
    2         USE icosa  
    3         IMPLICIT NONE  
    4  
    5         PRIVATE  
    6      TYPE(t_field),POINTER,SAVE :: f_pk(:), f_pks(:), f_p(:) 
    7      TYPE(t_field),POINTER,SAVE :: f_vort(:) 
    8      TYPE(t_field),POINTER,SAVE :: f_rhodz(:)  
     2  USE icosa  
     3  IMPLICIT NONE  
     4 
     5  PRIVATE  
     6    TYPE(t_field),POINTER,SAVE :: f_pk(:), f_pks(:), f_p(:) 
     7    TYPE(t_field),POINTER,SAVE :: f_vort(:) 
     8    TYPE(t_field),POINTER,SAVE :: f_rhodz(:)  
    99    
    10      PUBLIC compute_conserve  
    11      REAL(rstd),SAVE:: mtot0,ztot0,etot0,ang0,stot0,rmsv0 
    12      REAL(rstd),SAVE::rmsdpdt,etot,ang,stot,rmsv 
    13      REAL(rstd),SAVE:: ztot,mtot 
     10  PUBLIC init_check_conserve, check_conserve  
     11    REAL(rstd),SAVE:: mtot0,ztot0,etot0,ang0,stot0,rmsv0 
     12    REAL(rstd),SAVE::rmsdpdt,etot,ang,stot,rmsv 
     13    REAL(rstd),SAVE:: ztot,mtot 
    1414         
    1515      
    16 Contains  
    17  
    18 !--------------------------------------------------------------------- 
    19  
    20    SUBROUTINE allocate_check_conserve 
    21     USE icosa 
    22     IMPLICIT NONE 
     16CONTAINS  
     17 
     18!--------------------------------------------------------------------- 
     19 
     20  SUBROUTINE init_check_conserve 
     21  USE icosa 
     22  IMPLICIT NONE 
    2323    CALL allocate_field(f_pk,field_t,type_real,llm) 
    2424    CALL allocate_field(f_p,field_t,type_real,llm+1) 
     
    2626    CALL allocate_field(f_rhodz,field_t,type_real,llm) 
    2727    CALL allocate_field(f_vort,field_z,type_real,llm) 
    28    END SUBROUTINE allocate_check_conserve 
    29  
    30 !--------------------------------------------------------------------- 
    31  
    32    SUBROUTINE check_mass_conserve(f_ps,f_dps) 
     28  END SUBROUTINE init_check_conserve 
     29 
     30  SUBROUTINE check_conserve(f_ps,f_dps,f_ue,f_theta_rhodz,f_phis,it)  
     31  USE icosa  
     32  USE pression_mod 
     33  USE vorticity_mod 
     34  USE caldyn_gcm_mod 
     35  USE exner_mod  
     36  USE mpipara 
     37  IMPLICIT NONE 
     38    TYPE(t_field),POINTER :: f_ps(:) 
     39    TYPE(t_field),POINTER :: f_dps(:) 
     40    TYPE(t_field),POINTER :: f_ue(:) 
     41    TYPE(t_field),POINTER :: f_theta_rhodz(:) 
     42    TYPE(t_field),POINTER :: f_phis(:) 
     43    INTEGER::it  
     44    REAL(rstd),POINTER :: p(:,:),rhodz(:,:)  
     45    INTEGER::ind  
     46 
     47    etot=0.0; ang=0.0;stot=0.0;rmsv=0.0  
     48    mtot=0.0 ; rmsdpdt=0.0 ; ztot = 0.0  
     49 
     50    CALL pression(f_ps,f_p) 
     51 
     52    DO ind=1,ndomain  
     53      CALL swap_dimensions(ind) 
     54      CALL swap_geometry(ind) 
     55        p=f_p(ind)  
     56       rhodz=f_rhodz(ind) 
     57      CALL compute_rhodz(p,rhodz)  
     58    END DO  
     59 
     60    CALL vorticity(f_ue,f_vort) 
     61    CALL check_mass_conserve(f_ps,f_dps) 
     62    CALL check_PV  
     63    CALL exner(f_ps,f_p,f_pks,f_pk) 
     64    CALL check_EN(f_ue,f_theta_rhodz,f_phis)  
     65        
     66     IF ( it == 0  ) Then  
     67       ztot0 = ztot 
     68       mtot0 = mtot 
     69       etot0 = etot  
     70       ang0  = ang  
     71       stot0 = stot  
     72     END IF  
     73 
     74     rmsv=SQRT(rmsv/mtot)  
     75     ztot=ztot/ztot0 ; mtot=mtot/mtot0  
     76     etot=etot/etot0 ; ang=ang/ang0 ; stot=stot/stot0  
     77     rmsdpdt= daysec*1.e-2*sqrt(rmsdpdt/ncell_glo)   
     78 
     79 
     80     IF (is_mpi_root) THEN  
     81       OPEN(134,file="checkconsicosa.txt",position='append') 
     82       WRITE(134,4000)mtot,rmsdpdt,etot,ztot,stot,rmsv,ang 
     83       WRITE(134,*)mtot,rmsdpdt,etot,ztot,stot,rmsv,ang  
     84       WRITE(134,*)"==================================================" 
     85       WRITE(*,4000)mtot,rmsdpdt,etot,ztot,stot,rmsv,ang 
     86 
     874000   FORMAT(10x,'masse',4x,'rmsdpdt',7x,'energie',2x,'enstrophie'  & 
     88     ,2x,'entropie',3x,'rmsv',4x,'mt.ang',/,'GLOB  '                & 
     89      ,f10.6,e13.6,5f10.3/)      
     90       close(134)  
     91     END IF  
     92  END SUBROUTINE check_conserve 
     93   
     94!--------------------------------------------------------------------- 
     95 
     96  SUBROUTINE check_mass_conserve(f_ps,f_dps) 
    3397  USE icosa 
    3498  IMPLICIT NONE 
     
    38102    INTEGER :: ind,i,j,ij   
    39103 
    40    DO ind=1,ndomain 
     104    DO ind=1,ndomain 
    41105      CALL swap_dimensions(ind) 
    42106      CALL swap_geometry(ind) 
     
    49113            mtot=mtot+ps(ij)*Ai(ij) 
    50114               rmsdpdt=rmsdpdt+dps(ij)*dps(ij) 
    51              ENDIF 
     115          ENDIF 
    52116        ENDDO 
    53117      ENDDO 
     
    57121!--------------------------------------------------------------------- 
    58122 
    59    SUBROUTINE check_EN(f_ue,f_theta_rhodz,f_phis)  
    60     USE icosa 
    61     USE pression_mod 
    62     USE vorticity_mod 
    63     IMPLICIT NONE 
     123  SUBROUTINE check_en(f_ue,f_theta_rhodz,f_phis)  
     124  USE icosa 
     125  USE pression_mod 
     126  USE vorticity_mod 
     127  IMPLICIT NONE 
    64128    TYPE(t_field), POINTER :: f_ue(:) 
    65129    TYPE(t_field), POINTER :: f_theta_rhodz(:) 
     
    74138 
    75139 
    76       Do ind=1,ndomain  
    77         CALL swap_dimensions(ind) 
    78         CALL swap_geometry(ind) 
    79          ue=f_ue(ind)  
    80          p=f_p(ind) 
    81          rhodz=f_rhodz(ind)  
    82          theta_rhodz=f_theta_rhodz(ind)  
    83             pk=f_pk(ind)  
    84             phis=f_phis(ind)  
    85         CALL compute_en(ind,ue,p,rhodz,theta_rhodz,pk,phis) 
    86          END DO  
    87   END SUBROUTINE CHECK_EN  
    88  
    89    SUBROUTINE compute_en(ind,u,p,rhodz,theta_rhodz,pk,phis) 
    90          USE icosa 
    91       USE disvert_mod 
    92       USE wind_mod 
    93      IMPLICIT NONE 
     140    DO ind=1,ndomain  
     141      CALL swap_dimensions(ind) 
     142      CALL swap_geometry(ind) 
     143      ue=f_ue(ind)  
     144      p=f_p(ind) 
     145      rhodz=f_rhodz(ind)  
     146      theta_rhodz=f_theta_rhodz(ind)  
     147      pk=f_pk(ind)  
     148      phis=f_phis(ind)  
     149      CALL compute_en(ind,ue,p,rhodz,theta_rhodz,pk,phis) 
     150    END DO  
     151  
     152  END SUBROUTINE check_en  
     153 
     154  SUBROUTINE compute_en(ind,u,p,rhodz,theta_rhodz,pk,phis) 
     155  USE icosa 
     156  USE disvert_mod 
     157  USE wind_mod 
     158  IMPLICIT NONE 
    94159    INTEGER,INTENT(IN)::ind  
    95160    REAL(rstd),INTENT(IN) :: u(3*iim*jjm,llm) 
     
    110175 
    111176   
    112        DO l = 1, llm 
    113         DO j=jj_begin,jj_end 
    114          DO i=ii_begin,ii_end 
    115                 ij=(j-1)*iim+i 
    116                  masse(ij,l) = rhodz(ij,l)*Ai(ij)  
    117               theta(ij,l) = theta_rhodz(ij,l)/rhodz(ij,l) 
    118              IF (domain(ind)%own(i,j)) THEN 
    119                  stot = stot + Ai(ij)*theta_rhodz(ij,l) 
    120              END IF  
    121           END DO  
    122          END DO 
    123            END DO  
    124  
    125        DO l = 1, llm 
    126         DO j=jj_begin,jj_end 
    127          DO i=ii_begin,ii_end 
    128                 ij=(j-1)*iim+i 
    129            IF (domain(ind)%own(i,j)) THEN 
    130                 KE(ij,l)=   1/(4*Ai(ij))*(le(ij+u_right)*de(ij+u_right)*u(ij+u_right,l)**2 +   & 
    131                                      le(ij+u_rup)*de(ij+u_rup)*u(ij+u_rup,l)**2 +           & 
    132                                      le(ij+u_lup)*de(ij+u_lup)*u(ij+u_lup,l)**2 +           & 
    133                                      le(ij+u_left)*de(ij+u_left)*u(ij+u_left,l)**2 +        & 
    134                                      le(ij+u_ldown)*de(ij+u_ldown)*u(ij+u_ldown,l)**2 +     & 
    135                                      le(ij+u_rdown)*de(ij+u_rdown)*u(ij+u_rdown,l)**2 )   
    136              rmsv = rmsv + 2*masse(ij,l)*KE(ij,l)  
    137             END IF  
    138              END DO 
    139          END DO  
    140         END DO   
    141  
    142        DO l = 1, llm 
    143         DO j=jj_begin,jj_end 
    144          DO i=ii_begin,ii_end 
    145                 ij=(j-1)*iim+i 
    146            IF (domain(ind)%own(i,j)) THEN 
    147               etot = etot + masse(ij,l)*(phis(ij)+theta(ij,l)*pk(ij,l)+KE(ij,l)) 
    148            END IF  
    149           END DO  
     177    DO l = 1, llm 
     178      DO j=jj_begin,jj_end 
     179        DO i=ii_begin,ii_end 
     180          ij=(j-1)*iim+i 
     181          masse(ij,l) = rhodz(ij,l)*Ai(ij)  
     182          theta(ij,l) = theta_rhodz(ij,l)/rhodz(ij,l) 
     183          IF (domain(ind)%own(i,j)) THEN 
     184            stot = stot + Ai(ij)*theta_rhodz(ij,l) 
     185          END IF  
    150186        END DO  
    151        END DO  
     187      END DO 
     188    END DO  
     189 
     190    DO l = 1, llm 
     191      DO j=jj_begin,jj_end 
     192        DO i=ii_begin,ii_end 
     193          ij=(j-1)*iim+i 
     194          IF (domain(ind)%own(i,j)) THEN 
     195            KE(ij,l)=   1/(4*Ai(ij))*(le(ij+u_right)*de(ij+u_right)*u(ij+u_right,l)**2 +   & 
     196                                      le(ij+u_rup)*de(ij+u_rup)*u(ij+u_rup,l)**2 +           & 
     197                                      le(ij+u_lup)*de(ij+u_lup)*u(ij+u_lup,l)**2 +           & 
     198                                      le(ij+u_left)*de(ij+u_left)*u(ij+u_left,l)**2 +        & 
     199                                      le(ij+u_ldown)*de(ij+u_ldown)*u(ij+u_ldown,l)**2 +     & 
     200                                      le(ij+u_rdown)*de(ij+u_rdown)*u(ij+u_rdown,l)**2 )   
     201            rmsv = rmsv + 2*masse(ij,l)*KE(ij,l)  
     202          END IF  
     203        END DO 
     204      END DO  
     205    END DO   
     206 
     207    DO l = 1, llm 
     208      DO j=jj_begin,jj_end 
     209        DO i=ii_begin,ii_end 
     210          ij=(j-1)*iim+i 
     211          IF (domain(ind)%own(i,j)) THEN 
     212            etot = etot + masse(ij,l)*(phis(ij)+theta(ij,l)*pk(ij,l)+KE(ij,l)) 
     213          END IF  
     214        END DO  
     215      END DO  
     216    END DO  
    152217 
    153218!------------------------------ ANGULAR VELOCITY  
    154         CALL compute_wind_centered(u,ucenter) 
    155      CALL compute_wind_centered_lonlat_compound(ucenter,ulon,ulat) 
    156         rad = radius  
    157       radomeg = rad*omega 
    158  
    159       DO l = 1, llm 
    160         DO j=jj_begin,jj_end 
    161          DO i=ii_begin,ii_end 
    162                 ij=(j-1)*iim+i 
    163            IF (domain(ind)%own(i,j)) THEN 
    164              CALL xyz2lonlat(xyz_i(ij,:),lon,lat)  
    165                 ang=ang+rad*cos(lat)*masse(ij,l)*(ulon(ij,l)+ radomeg*cos(lat)) 
    166            END IF  
    167          END DO 
    168        END DO 
    169       END DO     
     219    CALL compute_wind_centered(u,ucenter) 
     220    CALL compute_wind_centered_lonlat_compound(ucenter,ulon,ulat) 
     221    rad = radius  
     222    radomeg = rad*omega 
     223 
     224    DO l = 1, llm 
     225      DO j=jj_begin,jj_end 
     226        DO i=ii_begin,ii_end 
     227          ij=(j-1)*iim+i 
     228          IF (domain(ind)%own(i,j)) THEN 
     229            CALL xyz2lonlat(xyz_i(ij,:),lon,lat)  
     230            ang=ang+rad*cos(lat)*masse(ij,l)*(ulon(ij,l)+ radomeg*cos(lat)) 
     231          END IF  
     232        END DO 
     233      END DO 
     234    END DO     
    170235           
    171         END SUBROUTINE compute_en 
    172  
    173 !--------------------------------------------------------------------- 
    174  
    175    SUBROUTINE check_PV  
    176     USE icosa 
    177     IMPLICIT NONE 
    178  
    179     REAL(rstd), POINTER :: vort(:,:) 
    180     REAL(rstd), POINTER :: rhodz(:,:)  
    181     INTEGER :: ind 
    182  
    183     Do ind=1,ndomain  
    184       CALL swap_dimensions(ind) 
    185       CALL swap_geometry(ind) 
    186       vort=f_vort(ind) 
    187       rhodz=f_rhodz(ind)  
    188       CALL compute_PV(vort,rhodz)  
    189     ENDDO 
     236  END SUBROUTINE compute_en 
     237 
     238!--------------------------------------------------------------------- 
     239 
     240  SUBROUTINE check_PV  
     241  USE icosa 
     242  IMPLICIT NONE 
     243     REAL(rstd), POINTER :: vort(:,:) 
     244     REAL(rstd), POINTER :: rhodz(:,:)  
     245     INTEGER :: ind 
     246 
     247     DO ind=1,ndomain  
     248       CALL swap_dimensions(ind) 
     249       CALL swap_geometry(ind) 
     250       vort=f_vort(ind) 
     251       rhodz=f_rhodz(ind)  
     252       CALL compute_PV(vort,rhodz)  
     253     ENDDO 
    190254  
    191    END SUBROUTINE check_PV  
    192  
    193         SUBROUTINE compute_PV(vort,rhodz)  
    194           USE icosa 
    195       USE disvert_mod 
    196      IMPLICIT NONE  
     255  END SUBROUTINE check_PV  
     256 
     257  SUBROUTINE compute_PV(vort,rhodz)  
     258  USE icosa 
     259  USE disvert_mod 
     260  IMPLICIT NONE  
    197261    REAL(rstd),INTENT(IN) :: vort(2*iim*jjm,llm) 
    198262    REAL(rstd),INTENT(IN) :: rhodz(iim*jjm,llm)  
     
    201265    INTEGER :: i,j,ij,l,ij2 
    202266 
    203         hv1 = 0.0 ; hv2 = 0.0  
     267    hv1 = 0.0 ; hv2 = 0.0  
    204268    
    205      DO l = 1,llm 
     269    DO l = 1,llm 
    206270      DO j=jj_begin+1,jj_end-1 
    207        DO i=ii_begin+1,ii_end-1 
    208            ij=(j-1)*iim+i 
    209             hv1 =  Riv2(ij,vup)        * rhodz(ij,l)           & 
    210               + Riv2(ij+t_rup,vldown) * rhodz(ij+t_rup,l)     & 
    211               + Riv2(ij+t_lup,vrdown) * rhodz(ij+t_lup,l) 
    212        
    213             qv1 = ( vort(ij+z_up,l)+fv(ij+z_up) )/hv1 
    214              
    215             hv2  =  Riv2(ij,vdown)     * rhodz(ij,l)          & 
    216               + Riv2(ij+t_ldown,vrup) * rhodz(ij+t_ldown,l)  & 
    217               + Riv2(ij+t_rdown,vlup) * rhodz(ij+t_rdown,l) 
    218                         
    219             qv2 =( vort(ij+z_down,l)+fv(ij+z_down) )/hv2 
    220  
    221             ztot = ztot + (qv1*qv1*hv1 + qv2*qv2*hv2)  
    222           ENDDO 
    223          ENDDO 
     271        DO i=ii_begin+1,ii_end-1 
     272          ij=(j-1)*iim+i 
     273          hv1 =  Riv2(ij,vup)        * rhodz(ij,l)           & 
     274            + Riv2(ij+t_rup,vldown) * rhodz(ij+t_rup,l)     & 
     275            + Riv2(ij+t_lup,vrdown) * rhodz(ij+t_lup,l) 
     276     
     277          qv1 = ( vort(ij+z_up,l)+fv(ij+z_up) )/hv1 
     278           
     279          hv2  =  Riv2(ij,vdown)     * rhodz(ij,l)          & 
     280            + Riv2(ij+t_ldown,vrup) * rhodz(ij+t_ldown,l)  & 
     281            + Riv2(ij+t_rdown,vlup) * rhodz(ij+t_rdown,l) 
     282                      
     283          qv2 =( vort(ij+z_down,l)+fv(ij+z_down) )/hv2 
     284 
     285          ztot = ztot + (qv1*qv1*hv1 + qv2*qv2*hv2)  
     286 
    224287        ENDDO 
    225     END SUBROUTINE compute_PV 
    226 !--------------------------------------------------------------------- 
    227  
    228     SUBROUTINE compute_rhodz(p,rhodz)  
    229         USE icosa  
    230         IMPLICIT NONE  
     288      ENDDO 
     289    ENDDO 
     290 
     291  END SUBROUTINE compute_PV 
     292!--------------------------------------------------------------------- 
     293 
     294   SUBROUTINE compute_rhodz(p,rhodz)  
     295   USE icosa  
     296   IMPLICIT NONE  
    231297     REAL(rstd),INTENT(IN) :: p(iim*jjm,llm+1) 
    232298     REAL(rstd),INTENT(OUT):: rhodz(iim*jjm,llm) 
     
    244310     ENDDO 
    245311 
    246         END SUBROUTINE compute_rhodz 
     312   END SUBROUTINE compute_rhodz 
    247313!==================================================================== 
    248314 
    249         SUBROUTINE compute_conserve(f_ps,f_dps,f_ue,f_theta_rhodz,f_phis,it)  
    250          USE icosa  
    251       USE pression_mod 
    252       USE vorticity_mod 
    253       USE caldyn_gcm_mod 
    254       USE exner_mod  
    255       USE mpipara 
    256      TYPE(t_field),POINTER :: f_ps(:) 
    257      TYPE(t_field),POINTER :: f_dps(:) 
    258      TYPE(t_field),POINTER :: f_ue(:) 
    259      TYPE(t_field),POINTER :: f_theta_rhodz(:) 
    260      TYPE(t_field),POINTER :: f_phis(:) 
    261      INTEGER::it  
    262      REAL(rstd),POINTER :: p(:,:),rhodz(:,:)  
    263      INTEGER::ind  
    264  
    265      etot=0.0; ang=0.0;stot=0.0;rmsv=0.0  
    266      mtot=0.0 ; rmsdpdt=0.0 ; ztot = 0.0  
    267  
    268      CALL allocate_check_conserve 
    269  
    270      CALL pression(f_ps,f_p) 
    271  
    272      Do ind=1,ndomain  
    273        CALL swap_dimensions(ind) 
    274        CALL swap_geometry(ind) 
    275          p=f_p(ind)  
    276         rhodz=f_rhodz(ind) 
    277        CALL compute_rhodz(p,rhodz)  
    278       END DO  
    279  
    280      CALL vorticity(f_ue,f_vort) 
    281      CALL check_mass_conserve(f_ps,f_dps) 
    282      CALL check_PV  
    283      CALL exner(f_ps,f_p,f_pks,f_pk) 
    284      CALL check_EN(f_ue,f_theta_rhodz,f_phis)  
    285          
    286            IF ( it == 0  ) Then  
    287            ztot0 = ztot 
    288            mtot0 = mtot 
    289            etot0 = etot  
    290            ang0  = ang  
    291            stot0 = stot  
    292         END IF  
    293  
    294       rmsv=SQRT(rmsv/mtot)  
    295       ztot=ztot/ztot0 ; mtot=mtot/mtot0  
    296       etot=etot/etot0 ; ang=ang/ang0 ; stot=stot/stot0  
    297       rmsdpdt= daysec*1.e-2*sqrt(rmsdpdt/ncell_glo)   
    298  
    299  
    300           IF (is_mpi_root) THEN  
    301        OPEN(134,file="checkconsicosa.txt",position='append') 
    302        write(134,4000)mtot,rmsdpdt,etot,ztot,stot,rmsv,ang 
    303        write(134,*)mtot,rmsdpdt,etot,ztot,stot,rmsv,ang  
    304        write(134,*)"==================================================" 
    305        write(*,4000)mtot,rmsdpdt,etot,ztot,stot,rmsv,ang 
    306  
    307 4000   FORMAT(10x,'masse',4x,'rmsdpdt',7x,'energie',2x,'enstrophie'  & 
    308       ,2x,'entropie',3x,'rmsv',4x,'mt.ang',/,'GLOB  '                & 
    309        ,f10.6,e13.6,5f10.3/)      
    310        close(134)  
    311        END IF  
    312     END SUBROUTINE compute_conserve 
    313315 
    314316 END MODULE check_conserve_mod 
  • codes/icosagcm/trunk/src/dimensions.f90

    r12 r151  
    4444    TYPE(t_domain),POINTER :: d 
    4545     
     46     
     47!$OMP MASTER 
    4648    d=>domain(ind) 
    4749      
     
    7981     u_pos(:)=d%u_pos(:) 
    8082     z_pos(:)=d%z_pos(:) 
    81       
     83 
     84!$OMP END MASTER      
     85!$OMP BARRIER 
    8286   END SUBROUTINE swap_dimensions 
    8387    
  • codes/icosagcm/trunk/src/dissip_gcm.f90

    r149 r151  
    1010  TYPE(t_field),POINTER,SAVE :: f_dtheta_diss(:) 
    1111  TYPE(t_field),POINTER,SAVE :: f_dtheta_rhodz_diss(:) 
    12    
     12  TYPE(t_message) :: req_due, req_dtheta  
    1313  
    1414  INTEGER,SAVE :: nitergdiv=1 
     
    2929!  INTEGER,SAVE :: itau_dissip 
    3030  REAL,SAVE    :: dtdissip 
    31    
     31  
    3232  PUBLIC init_dissip, dissip 
    3333CONTAINS 
     
    5757  USE mpi_mod 
    5858  USE mpipara 
     59  USE transfert_mod 
    5960  USE time_mod 
    6061   
     
    9697      IF (is_mpi_root) PRINT *, 'Rayleigh friction : Schaer-like mountain with shear DCMIP2.2' 
    9798   CASE DEFAULT 
    98       IF (is_mpi_root) PRINT *, 'Bad selector : rayleigh_friction_type =', TRIM(rayleigh_friction_key), &  
    99         ' in dissip_gcm.f90/init_dissip' 
     99      IF (is_mpi_root) PRINT *, 'Bad selector : rayleigh_friction_type =', TRIM(rayleigh_friction_key), ' in dissip_gcm.f90/init_dissip' 
    100100      STOP 
    101101   END SELECT 
     
    116116    CALL allocate_field(f_theta,field_t,type_real) 
    117117    CALL allocate_field(f_dtheta,field_t,type_real) 
     118     
     119    CALL init_message(f_due_diss1,req_e1_vect,req_due) 
     120    CALL init_message(f_dtheta_diss,req_i1,req_dtheta) 
    118121 
    119122    tau_graddiv(:)=5000 
     
    135138 
    136139    CALL getin("niterdivgrad",niterdivgrad) 
    137    
    138 !   CALL create_request(field_u,req_dissip) 
    139  
    140 !   DO ind=1,ndomain 
    141 !     DO i=ii_begin,ii_end 
    142 !       CALL request_add_point(ind,i,jj_begin-1,req_dissip,rup) 
    143 !       CALL request_add_point(ind,i+1,jj_begin-1,req_dissip,lup) 
    144 !     ENDDO 
    145  
    146 !     DO j=jj_begin,jj_end 
    147 !       CALL request_add_point(ind,ii_end+1,j,req_dissip,left) 
    148 !       CALL request_add_point(ind,ii_end+1,j-1,req_dissip,lup) 
    149 !     ENDDO     
    150 !    
    151 !     DO i=ii_begin,ii_end 
    152 !       CALL request_add_point(ind,i,jj_end+1,req_dissip,ldown) 
    153 !       CALL request_add_point(ind,i-1,jj_end+1,req_dissip,rdown) 
    154 !     ENDDO     
    155  
    156 !     DO j=jj_begin,jj_end 
    157 !       CALL request_add_point(ind,ii_begin-1,j,req_dissip,right) 
    158 !       CALL request_add_point(ind,ii_begin-1,j+1,req_dissip,rdown) 
    159 !     ENDDO    
    160  
    161 !     DO i=ii_begin+1,ii_end-1 
    162 !       CALL request_add_point(ind,i,jj_begin,req_dissip,right) 
    163 !       CALL request_add_point(ind,i,jj_end,req_dissip,right) 
    164 !     ENDDO 
    165 !    
    166 !     DO j=jj_begin+1,jj_end-1 
    167 !       CALL request_add_point(ind,ii_begin,j,req_dissip,rup) 
    168 !       CALL request_add_point(ind,ii_end,j,req_dissip,rup) 
    169 !     ENDDO    
    170  
    171 !     CALL request_add_point(ind,ii_begin+1,jj_begin,req_dissip,left) 
    172 !     CALL request_add_point(ind,ii_begin,jj_begin+1,req_dissip,ldown) 
    173 !     CALL request_add_point(ind,ii_begin+1,jj_end,req_dissip,left) 
    174 !     CALL request_add_point(ind,ii_end,jj_begin+1,req_dissip,ldown) 
    175 !     
    176 !   ENDDO 
    177140 
    178141 
     
    214177          u=f_u(ind) 
    215178          du=f_du(ind) 
    216           CALL compute_gradiv(u,du,1) 
     179          CALL compute_gradiv(u,du,1,1) 
    217180          u=du 
    218181        ENDDO 
     
    238201 
    239202      IF (using_mpi) THEN  
    240                           CALL MPI_ALLREDUCE(dumax,dumax1,1,MPI_REAL8,MPI_MAX,comm_icosa,ierr) 
     203        CALL MPI_ALLREDUCE(dumax,dumax1,1,MPI_REAL8,MPI_MAX,comm_icosa,ierr) 
    241204        dumax=dumax1 
    242205      ENDIF 
     
    291254          u=f_u(ind) 
    292255          du=f_du(ind) 
    293           CALL compute_gradrot(u,du,1) 
     256          CALL compute_gradrot(u,du,1,1) 
    294257          u=du 
    295258        ENDDO 
     
    362325          theta=f_theta(ind) 
    363326          dtheta=f_dtheta(ind) 
    364           CALL compute_divgrad(theta,dtheta,1) 
     327          CALL compute_divgrad(theta,dtheta,1,1) 
    365328          theta=dtheta 
    366329        ENDDO 
    367330      ENDDO 
    368 !      CALL writefield("divgrad",f_dtheta) 
    369331 
    370332      CALL transfert_request(f_dtheta,req_i1) 
     
    398360    ENDDO  
    399361 
    400 !    CALL writefield("divgrad",f_dtheta) 
    401362    IF (is_mpi_root) PRINT *,"divgrad : divgrad",dthetamax 
    402363   
    403364    cdivgrad=dthetamax**(-1./niterdivgrad)  
    404365    IF (is_mpi_root) PRINT *,"cdivgrad : ",cdivgrad 
    405      
    406  
    407  
    408  
    409  
    410366 
    411367      
     
    442398  USE trace 
    443399  USE time_mod 
     400  USE omp_para 
    444401  IMPLICIT NONE 
    445402    TYPE(t_field),POINTER :: f_ue(:) 
     
    458415    INTEGER :: ind, shear 
    459416    INTEGER :: l,i,j,n 
     417 
     418!$OMP BARRIER 
    460419     
    461420    CALL trace_start("dissip") 
    462421    CALL gradiv(f_ue,f_due_diss1) 
    463422    CALL gradrot(f_ue,f_due_diss2) 
    464     CALL theta_rhodz2theta(f_ps,f_theta_rhodz,f_theta) 
    465     CALL divgrad(f_theta,f_dtheta_diss) 
    466     CALL theta2theta_rhodz(f_ps,f_dtheta_diss,f_dtheta_rhodz_diss) 
    467      
    468     IF(rayleigh_friction_type>0) THEN 
    469        CALL pression(f_ps, f_p) 
    470        CALL exner(f_ps, f_p, f_pks, f_pk) 
    471        CALL geopotential(f_phis,f_pks,f_pk,f_theta,f_phi) 
    472     END IF 
     423     
     424    CALL divgrad_theta_rhodz(f_ps,f_theta_rhodz,f_dtheta_rhodz_diss) 
     425     
     426! later for openmp     
     427!    IF(rayleigh_friction_type>0) THEN 
     428!       CALL pression(f_ps, f_p) 
     429!       CALL exner(f_ps, f_p, f_pks, f_pk) 
     430!       CALL geopotential(f_phis,f_pks,f_pk,f_theta,f_phi) 
     431!    END IF 
    473432 
    474433    DO ind=1,ndomain 
     
    480439      dtheta_rhodz=f_dtheta_rhodz(ind) 
    481440      dtheta_rhodz_diss=f_dtheta_rhodz_diss(ind) 
    482              
    483       DO l=1,llm 
     441 
     442      DO l=ll_begin,ll_end 
    484443        DO j=jj_begin,jj_end 
    485444          DO i=ii_begin,ii_end 
     
    495454      ENDDO 
    496455 
    497       IF(rayleigh_friction_type>0) THEN 
    498          phi=f_phi(ind) 
    499          ue=f_ue(ind) 
    500          DO l=1,llm 
    501             DO j=jj_begin,jj_end 
    502                DO i=ii_begin,ii_end 
    503                   n=(j-1)*iim+i 
    504                   CALL relax(t_right, u_right) 
    505                   CALL relax(t_lup,   u_lup) 
    506                   CALL relax(t_ldown, u_ldown) 
    507                ENDDO 
    508             ENDDO 
    509          END DO 
    510       END IF 
     456!      dtheta_rhodz=0 
     457!      due=0 
     458 
     459! later for openmp   
     460!      IF(rayleigh_friction_type>0) THEN 
     461!         phi=f_phi(ind) 
     462!         ue=f_ue(ind) 
     463!         DO l=1,llm 
     464!            DO j=jj_begin,jj_end 
     465!               DO i=ii_begin,ii_end 
     466!                  n=(j-1)*iim+i 
     467!                  CALL relax(t_right, u_right) 
     468!                  CALL relax(t_lup,   u_lup) 
     469!                  CALL relax(t_ldown, u_ldown) 
     470!               ENDDO 
     471!            ENDDO 
     472!         END DO 
     473!      END IF 
    511474   END DO 
    512475 
    513476   CALL trace_end("dissip") 
     477 
     478!$OMP BARRIER 
    514479 
    515480    CONTAINS 
     
    524489        z = (phi(n,l)+phi(n+shift_t,l))/(2.*g) 
    525490        IF(z>zh) THEN  ! relax only in the sponge layer z>zh 
    526 !           PRINT *, 'z>zh : z,zh,l',z,zh,l 
    527 !           STOP 
     491 
    528492           nn = n+shift_u 
    529493           CALL xyz2lonlat(xyz_e(nn,:),lon,lat) 
     
    548512  USE icosa 
    549513  USE trace 
     514  USE omp_para 
    550515  IMPLICIT NONE 
    551516    TYPE(t_field),POINTER :: f_ue(:) 
     
    554519    REAL(rstd),POINTER    :: due(:,:) 
    555520    INTEGER :: ind 
    556     INTEGER :: it 
     521    INTEGER :: it,i,j,l,ij 
    557522        
    558523    CALL trace_start("gradiv") 
     
    563528      ue=f_ue(ind) 
    564529      due=f_due(ind)  
    565       due=ue 
     530      DO  l = ll_begin, ll_end 
     531        DO j=jj_begin,jj_end 
     532          DO i=ii_begin,ii_end 
     533            ij=(j-1)*iim+i 
     534             due(ij+u_right,l)=ue(ij+u_right,l) 
     535             due(ij+u_lup,l)=ue(ij+u_lup,l) 
     536             due(ij+u_ldown,l)=ue(ij+u_ldown,l) 
     537          ENDDO 
     538        ENDDO 
     539      ENDDO 
    566540    ENDDO 
    567541 
    568542    DO it=1,nitergdiv 
    569543         
    570       CALL transfert_request(f_due,req_e1_vect) 
     544      CALL send_message(f_due,req_due) 
     545      CALL wait_message(req_due) 
    571546         
    572547      DO ind=1,ndomain 
     
    574549        CALL swap_geometry(ind) 
    575550        due=f_due(ind)  
    576         CALL compute_gradiv(due,due,llm) 
     551        CALL compute_gradiv(due,due,ll_begin,ll_end) 
    577552      ENDDO 
    578553    ENDDO 
     
    586561  USE icosa 
    587562  USE trace 
     563  USE omp_para 
    588564  IMPLICIT NONE 
    589565    TYPE(t_field),POINTER :: f_ue(:) 
     
    592568    REAL(rstd),POINTER    :: due(:,:) 
    593569    INTEGER :: ind 
    594     INTEGER :: it 
     570    INTEGER :: it,i,j,l,ij 
    595571        
    596572    CALL trace_start("gradrot") 
     
    601577      ue=f_ue(ind) 
    602578      due=f_due(ind)  
    603       due=ue 
     579      DO  l = ll_begin, ll_end 
     580        DO j=jj_begin,jj_end 
     581          DO i=ii_begin,ii_end 
     582            ij=(j-1)*iim+i 
     583             due(ij+u_right,l)=ue(ij+u_right,l) 
     584             due(ij+u_lup,l)=ue(ij+u_lup,l) 
     585             due(ij+u_ldown,l)=ue(ij+u_ldown,l) 
     586          ENDDO 
     587        ENDDO 
     588      ENDDO 
    604589    ENDDO 
    605590 
    606591    DO it=1,nitergrot 
    607592         
    608       CALL transfert_request(f_due,req_e1_vect) 
     593      CALL send_message(f_due,req_due) 
     594      CALL wait_message(req_due) 
    609595         
    610596      DO ind=1,ndomain 
     
    612598        CALL swap_geometry(ind) 
    613599        due=f_due(ind)  
    614         CALL compute_gradrot(due,due,llm) 
     600        CALL compute_gradrot(due,due,ll_begin,ll_end) 
    615601      ENDDO 
    616602 
     
    624610  USE icosa 
    625611  USE trace 
     612  USE omp_para 
    626613  IMPLICIT NONE 
    627614    TYPE(t_field),POINTER :: f_theta(:) 
     
    650637        CALL swap_geometry(ind) 
    651638        dtheta=f_dtheta(ind)  
    652         CALL compute_divgrad(dtheta,dtheta,llm) 
     639        CALL compute_divgrad(dtheta,dtheta,ll_begin,ll_end) 
    653640      ENDDO 
    654641 
     
    659646  END SUBROUTINE divgrad 
    660647    
    661    
    662  
    663 !  SUBROUTINE compute_dissip(ue,due,ps,theta_rhodz,dtheta_rhodz) 
    664 !  USE icosa 
    665 !  USE theta2theta_rhodz_mod 
    666 !  IMPLICIT NONE 
    667 !    REAL(rstd)         :: ue(3*iim*jjm,llm) 
    668 !    REAL(rstd)         :: due(3*iim*jjm,llm) 
    669 !    REAL(rstd)         :: ps(iim*jjm) 
    670 !    REAL(rstd)         :: theta_rhodz(iim*jjm,llm) 
    671 !    REAL(rstd)         :: dtheta_rhodz(iim*jjm,llm) 
    672 ! 
    673 !    REAL(rstd),SAVE,ALLOCATABLE :: theta(:,:) 
    674 !    REAL(rstd),SAVE,ALLOCATABLE :: du_dissip(:,:) 
    675 !    REAL(rstd),SAVE,ALLOCATABLE :: dtheta_dissip(:,:) 
    676 !    REAL(rstd),SAVE,ALLOCATABLE :: dtheta_rhodz_dissip(:,:) 
    677 ! 
    678 !    INTEGER :: ind 
    679 !    INTEGER :: l,i,j,n 
    680 ! 
    681 !!$OMP BARRIER 
    682 !!$OMP MASTER 
    683 !      ALLOCATE(theta(iim*jjm,llm)) 
    684 !      ALLOCATE(du_dissip(3*iim*jjm,llm)) 
    685 !      ALLOCATE(dtheta_dissip(iim*jjm,llm)) 
    686 !      ALLOCATE(dtheta_rhodz_dissip(iim*jjm,llm)) 
    687 !!$OMP END MASTER 
    688 !!$OMP BARRIER 
    689 !     
    690 !      CALL gradiv(ue,du_dissip,llm) 
    691 !      DO l=1,llm 
    692 !!$OMP DO 
    693 !        DO j=jj_begin,jj_end 
    694 !          DO i=ii_begin,ii_end 
    695 !            n=(j-1)*iim+i 
    696 !            due(n+u_right,l)=due(n+u_right,l)+du_dissip(n+u_right,l)/tau_graddiv(l)*0.5 
    697 !            due(n+u_lup,l)=due(n+u_lup,l)+du_dissip(n+u_lup,l)/tau_graddiv(l)*0.5 
    698 !            due(n+u_ldown,l)=due(n+u_ldown,l)+du_dissip(n+u_ldown,l)/tau_graddiv(l)*0.5 
    699 !          ENDDO 
    700 !        ENDDO 
    701 !      ENDDO 
    702 !       
    703 !      CALL gradrot(ue,du_dissip,llm) 
    704 ! 
    705 !      DO l=1,llm 
    706 !!$OMP DO 
    707 !        DO j=jj_begin,jj_end 
    708 !          DO i=ii_begin,ii_end 
    709 !            n=(j-1)*iim+i 
    710 !            due(n+u_right,l)=due(n+u_right,l)+du_dissip(n+u_right,l)/tau_gradrot(l)*0.5 
    711 !            due(n+u_lup,l)=due(n+u_lup,l)+du_dissip(n+u_lup,l)/tau_gradrot(l)*0.5 
    712 !            due(n+u_ldown,l)=due(n+u_ldown,l)+du_dissip(n+u_ldown,l)/tau_gradrot(l)*0.5 
    713 !          ENDDO 
    714 !        ENDDO 
    715 !      ENDDO  
    716 !       
    717 !      CALL compute_theta_rhodz2theta(ps,theta_rhodz,theta,1) 
    718 !      CALL divgrad(theta,dtheta_dissip,llm) 
    719 !      CALL compute_theta2theta_rhodz(ps,dtheta_dissip,dtheta_rhodz_dissip,0) 
    720 ! 
    721 !      DO l=1,llm 
    722 !!$OMP DO 
    723 !        DO j=jj_begin,jj_end 
    724 !          DO i=ii_begin,ii_end 
    725 !            n=(j-1)*iim+i 
    726 !            dtheta_rhodz(n,l)=dtheta_rhodz(n,l)+dtheta_rhodz_dissip(n,l)/tau_divgrad(l)*0.5 
    727 !          ENDDO 
    728 !        ENDDO 
    729 !      ENDDO  
    730 ! 
    731 !!$OMP BARRIER 
    732 !!$OMP MASTER 
    733 !      DEALLOCATE(theta) 
    734 !      DEALLOCATE(du_dissip) 
    735 !      DEALLOCATE(dtheta_dissip) 
    736 !      DEALLOCATE(dtheta_rhodz_dissip) 
    737 !!$OMP END MASTER 
    738 !!$OMP BARRIER       
    739 ! 
    740 !  END SUBROUTINE compute_dissip 
    741    
    742    
    743   SUBROUTINE compute_gradiv(ue,gradivu_e,ll) 
    744   USE icosa 
     648  SUBROUTINE divgrad_theta_rhodz(f_ps,f_theta_rhodz,f_dtheta_rhodz) 
     649  USE icosa 
     650  USE trace 
     651  USE omp_para 
     652  USE disvert_mod 
    745653  IMPLICIT NONE 
    746     INTEGER,INTENT(IN)     :: ll 
    747     REAL(rstd),INTENT(IN)  :: ue(iim*3*jjm,ll) 
    748     REAL(rstd),INTENT(OUT) :: gradivu_e(iim*3*jjm,ll) 
    749     REAL(rstd) :: divu_i(iim*jjm,ll) 
     654    TYPE(t_field),POINTER :: f_ps(:) 
     655    TYPE(t_field),POINTER :: f_theta_rhodz(:) 
     656    TYPE(t_field),POINTER :: f_dtheta_rhodz(:) 
     657     
     658    REAL(rstd),POINTER :: ps(:) 
     659    REAL(rstd),POINTER :: theta_rhodz(:,:) 
     660    REAL(rstd),POINTER :: dtheta_rhodz(:,:) 
     661 
     662    INTEGER :: ind 
     663    INTEGER :: it,i,j,l,ij 
     664 
     665    CALL trace_start("divgrad") 
     666        
     667    DO ind=1,ndomain 
     668      CALL swap_dimensions(ind) 
     669      CALL swap_geometry(ind) 
     670      ps=f_ps(ind) 
     671      theta_rhodz=f_theta_rhodz(ind) 
     672      dtheta_rhodz=f_dtheta_rhodz(ind)  
     673      DO  l = ll_begin, ll_end 
     674        DO j=jj_begin,jj_end 
     675          DO i=ii_begin,ii_end 
     676            ij=(j-1)*iim+i 
     677            dtheta_rhodz(ij,l) = theta_rhodz(ij,l) / ( ap(l)-ap(l+1) + (bp(l)-bp(l+1))*ps(ij))/g 
     678          ENDDO 
     679        ENDDO 
     680      ENDDO 
     681    ENDDO 
     682 
     683    DO it=1,niterdivgrad 
     684         
     685      CALL send_message(f_dtheta_rhodz,req_dtheta) 
     686      CALL wait_message(req_dtheta) 
     687      DO ind=1,ndomain 
     688        CALL swap_dimensions(ind) 
     689        CALL swap_geometry(ind) 
     690        dtheta_rhodz=f_dtheta_rhodz(ind)  
     691        CALL compute_divgrad(dtheta_rhodz,dtheta_rhodz,ll_begin,ll_end) 
     692      ENDDO 
     693 
     694    ENDDO 
     695 
     696    DO ind=1,ndomain 
     697      CALL swap_dimensions(ind) 
     698      CALL swap_geometry(ind) 
     699      dtheta_rhodz=f_dtheta_rhodz(ind)  
     700     
     701      DO  l = ll_begin, ll_end 
     702        DO j=jj_begin,jj_end 
     703          DO i=ii_begin,ii_end 
     704            ij=(j-1)*iim+i 
     705            dtheta_rhodz(ij,l) = dtheta_rhodz(ij,l) * ( ap(l)-ap(l+1) + (bp(l)-bp(l+1))*ps(ij))/g 
     706          ENDDO 
     707        ENDDO 
     708      ENDDO 
     709    ENDDO 
     710 
     711 
     712    CALL trace_end("divgrad") 
     713 
     714  END SUBROUTINE divgrad_theta_rhodz   
     715   
     716  SUBROUTINE compute_gradiv(ue,gradivu_e,llb,lle) 
     717  USE icosa 
     718  IMPLICIT NONE 
     719    INTEGER,INTENT(IN)     :: llb 
     720    INTEGER,INTENT(IN)     :: lle 
     721    REAL(rstd),INTENT(IN)  :: ue(iim*3*jjm,llm) 
     722    REAL(rstd),INTENT(OUT) :: gradivu_e(iim*3*jjm,llm) 
     723    REAL(rstd) :: divu_i(iim*jjm,llb:lle) 
    750724     
    751725    INTEGER :: i,j,n,l 
    752726 
    753     DO l=1,ll 
     727    DO l=llb,lle 
    754728      DO j=jj_begin,jj_end 
    755729        DO i=ii_begin,ii_end 
     
    765739    ENDDO 
    766740     
    767     DO l=1,ll 
     741    DO l=llb,lle 
    768742      DO j=jj_begin,jj_end 
    769743        DO i=ii_begin,ii_end 
     
    781755    ENDDO 
    782756 
    783     DO l=1,ll 
     757    DO l=llb,lle 
    784758      DO j=jj_begin,jj_end 
    785759        DO i=ii_begin,ii_end 
     
    795769  END SUBROUTINE compute_gradiv 
    796770   
    797   SUBROUTINE compute_divgrad(theta,divgrad_i,ll) 
     771  SUBROUTINE compute_divgrad(theta,divgrad_i,llb,lle) 
    798772  USE icosa 
    799773  IMPLICIT NONE 
    800     INTEGER,INTENT(IN)     :: ll 
    801     REAL(rstd),INTENT(IN)  :: theta(iim*jjm,ll) 
    802     REAL(rstd),INTENT(OUT) :: divgrad_i(iim*jjm,ll) 
    803     REAL(rstd)  :: grad_e(3*iim*jjm,ll) 
     774    INTEGER,INTENT(IN)     :: llb 
     775    INTEGER,INTENT(IN)     :: lle 
     776    REAL(rstd),INTENT(IN)  :: theta(iim*jjm,llm) 
     777    REAL(rstd),INTENT(OUT) :: divgrad_i(iim*jjm,llm) 
     778    REAL(rstd)  :: grad_e(3*iim*jjm,llb:lle) 
    804779 
    805780    INTEGER :: i,j,n,l 
    806781 
    807782        
    808     DO l=1,ll 
     783    DO l=llb,lle 
    809784      DO j=jj_begin-1,jj_end+1 
    810785        DO i=ii_begin-1,ii_end+1 
     
    823798     
    824799     
    825     DO l=1,ll 
     800    DO l=llb,lle 
    826801      DO j=jj_begin,jj_end 
    827802        DO i=ii_begin,ii_end 
     
    837812    ENDDO 
    838813    
    839     DO l=1,ll 
     814    DO l=llb,lle 
    840815      DO j=jj_begin,jj_end 
    841816        DO i=ii_begin,ii_end 
     
    849824 
    850825     
    851   SUBROUTINE compute_gradrot(ue,gradrot_e,ll) 
     826  SUBROUTINE compute_gradrot(ue,gradrot_e,llb,lle) 
    852827  USE icosa 
    853828  IMPLICIT NONE 
    854     INTEGER,INTENT(IN)     :: ll 
    855     REAL(rstd),INTENT(IN)  :: ue(iim*3*jjm,ll) 
    856     REAL(rstd),INTENT(OUT) :: gradrot_e(iim*3*jjm,ll) 
    857     REAL(rstd) :: rot_v(2*iim*jjm,ll) 
     829    INTEGER,INTENT(IN)     :: llb 
     830    INTEGER,INTENT(IN)     :: lle 
     831    REAL(rstd),INTENT(IN)  :: ue(iim*3*jjm,llm) 
     832    REAL(rstd),INTENT(OUT) :: gradrot_e(iim*3*jjm,llm) 
     833    REAL(rstd) :: rot_v(2*iim*jjm,llb:lle) 
    858834 
    859835    INTEGER :: i,j,n,l 
    860836      
    861     DO l=1,ll 
     837    DO l=llb,lle 
    862838      DO j=jj_begin-1,jj_end+1 
    863839        DO i=ii_begin-1,ii_end+1 
     
    876852    ENDDO                               
    877853   
    878     DO l=1,ll 
     854    DO l=llb,lle 
    879855      DO j=jj_begin,jj_end 
    880856        DO i=ii_begin,ii_end 
     
    891867    ENDDO 
    892868 
    893     DO l=1,ll 
     869    DO l=llb,lle 
    894870      DO j=jj_begin,jj_end 
    895871        DO i=ii_begin,ii_end 
  • codes/icosagcm/trunk/src/domain.f90

    r149 r151  
    7171  SUBROUTINE create_domain 
    7272  USE grid_param 
     73  USE mpipara 
    7374  IMPLICIT NONE 
    7475  INTEGER :: ind,nf,ni,nj,i,j 
     
    9899          d%ii_end_glo=d%ii_begin_glo+d%ii_nb-1 
    99100  
    100           IF (ni/=nsplit_i) THEN  
     101          IF (ni/=1) THEN  
    101102            d%ii_nb=d%ii_nb+1 
    102             d%ii_end_glo=d%ii_end_glo+1 
     103            d%ii_begin_glo=d%ii_begin_glo-1 
    103104          ENDIF 
    104105          
     
    115116          d%jj_end_glo=d%jj_begin_glo+d%jj_nb-1 
    116117 
    117           IF (nj/=nsplit_j) THEN  
     118          IF (nj/=1) THEN  
    118119            d%jj_nb=d%jj_nb+1 
    119             d%jj_end_glo=d%jj_end_glo+1 
     120            d%jj_begin_glo=d%jj_begin_glo-1 
    120121          ENDIF 
    121122 
     
    142143          ALLOCATE(d%own(d%iim,d%jjm)) 
    143144          ALLOCATE(d%ne(0:5,d%iim,d%jjm)) 
     145           
     146          IF (is_mpi_root) PRINT *,"Domain ",ind," : size ",d%ii_nb,"x",d%jj_nb 
     147           
    144148        END DO 
    145149      END DO 
     
    261265            d%neighbour(:,k,i,j)=cell_glo(ind2)%xyz(:) 
    262266 
    263 !            d%ne(k,i,j)=vertex_glo(ii,jj,nf)%ne(k) 
    264267            d%ne(k,i,j)=1-2*MOD(k,2) 
    265268 
     
    298301      edge_glo(e)%assign_pos=k 
    299302      edge_glo(e)%assign_delta=delta 
    300 !      PRINT*,"Assign_edge",ind_d,ind,i,j,k,e 
     303 
    301304     END  SUBROUTINE assign_edge 
    302305          
  • codes/icosagcm/trunk/src/dynetat0_gcm_mod.f90

    r149 r151  
    1818CONTAINS 
    1919 
    20         SUBROUTINE etat0(f_ps,f_phis,f_theta_rhodz,f_u,f_q)  
     20  SUBROUTINE etat0(f_ps,f_phis,f_theta_rhodz,f_u,f_q)  
    2121  USE icosa 
    22   USE caldyn_mod 
    2322  USE write_field   
    2423  USE maxicosa 
     
    9897!---------------------------------------------------- 
    9998!------------- OUTPUT OF Variables  
    100         CALL un2ulonlat(f_u,f_buf_i3,f_buf1_i,f_buf2_i)  
    101         CALL writefield("buf1",f_buf1_i) 
    10299  END SUBROUTINE etat0 
    103100 
  • codes/icosagcm/trunk/src/dynetat0_hz_mod.f90

    r149 r151  
    22  USE genmod 
    33  USE icosa 
    4   USE caldyn_gcm_mod  
    54  IMPLICIT NONE  
    65  PRIVATE 
     
    2322  USE write_field   
    2423  USE maxicosa 
     24  USE wind_mod 
    2525        IMPLICIT NONE 
    2626     TYPE(t_domain),POINTER :: d  
     
    9797        ENDDO 
    9898!------------- OUTPUT OF Variables  
    99         CALL un2ulonlat(f_u,f_buf_i3,f_buf1_i,f_buf2_i)  
     99        CALL un2ulonlat(f_u,f_buf1_i,f_buf2_i)  
    100100        CALL writefield("buf1",f_buf1_i) 
    101101  END SUBROUTINE etat0 
  • codes/icosagcm/trunk/src/exner.f90

    r133 r151  
    5050        
    5151       ! for llm layer 
    52        !$OMP DO 
    5352       DO j=jj_begin-offset,jj_end+offset 
    5453          DO i=ii_begin-offset,ii_end+offset 
     
    6160       ! for other layer    
    6261       DO l = llm-1 , 2 , -1 
    63           !$OMP DO 
    6462          DO j=jj_begin-offset,jj_end+offset 
    6563             DO i=ii_begin-offset,ii_end+offset 
     
    7573        
    7674       ! for first layer 
    77        !$OMP DO 
    7875       DO j=jj_begin-offset,jj_end+offset 
    7976          DO i=ii_begin-offset,ii_end+offset 
     
    8885        
    8986       DO l = 2, llm 
    90           !$OMP DO 
    9187          DO j=jj_begin-offset,jj_end+offset 
    9288             DO i=ii_begin-offset,ii_end+offset 
     
    9995    ELSE ! Simple calculation of Exner pressure based on centered average 
    10096       ! surface : pks 
    101        !$OMP DO 
    10297       DO j=jj_begin-offset,jj_end+offset 
    10398          DO i=ii_begin-offset,ii_end+offset 
     
    109104       ! 3D : pk 
    110105       DO l = 1, llm 
    111           !$OMP DO 
    112106          DO j=jj_begin-offset,jj_end+offset 
    113107             DO i=ii_begin-offset,ii_end+offset 
  • codes/icosagcm/trunk/src/geometry.f90

    r146 r151  
    9191  IMPLICIT NONE 
    9292    INTEGER,INTENT(IN) :: ind 
     93!$OMP MASTER 
    9394    Ai=geom%Ai(ind) 
    9495    xyz_i=geom%xyz_i(ind) 
     
    111112    bi=geom%bi(ind) 
    112113    fv=geom%fv(ind) 
    113      
     114!$OMP END MASTER 
     115!$OMP BARRIER     
    114116  END SUBROUTINE swap_geometry 
    115117   
     
    213215          ENDDO 
    214216        ENDDO 
    215 !        i=ii_begin ; j=jj_begin ; n=(j-1)*iim+i ; xyz_i(n,:)=domain(ind)%xyz(:,i,j)  
    216 !        i=ii_begin ; j=jj_end   ; n=(j-1)*iim+i ; xyz_i(n,:)=domain(ind)%xyz(:,i,j) 
    217 !        i=ii_end   ; j=jj_begin ; n=(j-1)*iim+i ;   xyz_i(n,:)=domain(ind)%xyz(:,i,j) 
    218 !        PRINT *,"Pb ?? : "  
    219 !        PRINT *, xyz_i(n,:), domain(ind)%xyz(:,i,j), norm(xyz_i(n,:)- domain(ind)%xyz(:,i,j)) 
    220 !        i=ii_end   ; j=jj_end   ; n=(j-1)*iim+i ; xyz_i(n,:)=domain(ind)%xyz(:,i,j) 
    221217         
    222218      ENDDO 
    223219 
    224220      IF (check) THEN 
    225 !        sum=sum/(ndomain*ii_nb*jj_nb) 
    226221        PRINT *,"it = ",it,"  diff centroid circumcenter ",sum 
    227222      ENDIF  
     
    287282            ne(n,k+1)=d%ne(k,i,j) 
    288283          ENDDO 
    289                    
    290 !          xyz_i(n,:)=d%xyz(:,i,j)  
    291 !          xyz_v(n+z_up,:)=d%vertex(:,vup-1,i,j)  
    292 !          xyz_v(n+z_down,:)=d%vertex(:,vdown-1,i,j)  
    293284 
    294285          vect(:,1)=xyz_v(n+z_rup,:) 
     
    309300          bi(n)=0.  
    310301         
    311 !          CALL dist_cart(d%xyz(:,i,j),d%neighbour(:,right-1,i,j),de(n+u_right)) 
    312 !          CALL dist_cart(d%xyz(:,i,j),d%neighbour(:,lup-1,i,j),de(n+u_lup)) 
    313 !          CALL dist_cart(d%xyz(:,i,j),d%neighbour(:,ldown-1,i,j),de(n+u_ldown)) 
    314  
    315302          CALL dist_cart(xyz_i(n,:),xyz_i(n+t_right,:),de(n+u_right)) 
    316303          CALL dist_cart(xyz_i(n,:),xyz_i(n+t_lup,:),de(n+u_lup)) 
    317304          CALL dist_cart(xyz_i(n,:),xyz_i(n+t_ldown,:),de(n+u_ldown)) 
    318305           
    319 !          CALL div_arc_bis(d%xyz(:,i,j),d%neighbour(:,right-1,i,j),0.5,xyz_e(n+u_right,:)) 
    320 !          CALL div_arc_bis(d%xyz(:,i,j),d%neighbour(:,lup-1,i,j),0.5,xyz_e(n+u_lup,:)) 
    321 !          CALL div_arc_bis(d%xyz(:,i,j),d%neighbour(:,ldown-1,i,j),0.5,xyz_e(n+u_ldown,:)) 
    322  
    323306          CALL div_arc_bis(xyz_i(n,:),xyz_i(n+t_right,:),0.5,xyz_e(n+u_right,:)) 
    324307          CALL div_arc_bis(xyz_i(n,:),xyz_i(n+t_lup,:),0.5,xyz_e(n+u_lup,:)) 
    325308          CALL div_arc_bis(xyz_i(n,:),xyz_i(n+t_ldown,:),0.5,xyz_e(n+u_ldown,:)) 
    326           
    327 !          CALL dist_cart(d%vertex(:,vrdown-1,i,j),d%vertex(:,vrup-1,i,j),le(n+u_right)) 
    328 !          CALL dist_cart(d%vertex(:,vup-1,i,j),d%vertex(:,vlup-1,i,j),le(n+u_lup)) 
    329 !          CALL dist_cart(d%vertex(:,vldown-1,i,j),d%vertex(:,vdown-1,i,j),le(n+u_ldown)) 
    330309 
    331310          CALL dist_cart(xyz_v(n+z_rdown,:), xyz_v(n+z_rup,:),le(n+u_right)) 
     
    335314          Ai(n)=0 
    336315          DO k=0,5 
    337 !            CALL surf_triangle(d%xyz(:,i,j),d%neighbour(:,k,i,j),d%neighbour(:,MOD((k+1+6),6),i,j),surf_v(k+1)) 
    338 !            CALL surf_triangle(d%xyz(:,i,j),d%vertex(:,MOD((k-1+6),6),i,j),d%vertex(:,k,i,j),surf(k+1)) 
    339316            CALL surf_triangle(xyz_i(n,:),xyz_i(n+t_pos(k+1),:),xyz_i(n+t_pos(MOD((k+1+6),6)+1),:),surf_v(k+1)) 
    340317            CALL surf_triangle(xyz_i(n,:),xyz_v(n+z_pos(MOD((k-1+6),6)+1),:),xyz_v(n+z_pos(k+1),:),surf(k+1)) 
     
    414391           
    415392          DO k=0,5 
    416 !            CALL surf_triangle(d%xyz(:,i,j),d%vertex(:,k,i,j),d%neighbour(:,k,i,j),S1) 
    417 !            CALL surf_triangle(d%xyz(:,i,j),d%vertex(:,k,i,j),d%neighbour(:,MOD(k+1+6,6),i,j),S2) 
    418393            CALL surf_triangle(xyz_i(n,:), xyz_v(n+z_pos(k+1),:), xyz_i(n+t_pos(k+1),:),S1) 
    419394            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) 
     
    516491    CALL transfert_request(geom%centroid,req_i1) 
    517492    CALL surf_triangle(d%xyz(:,ii_begin,jj_begin),d%xyz(:,ii_begin,jj_end),d%xyz(:,ii_end,jj_begin),S) 
    518 !    PRINT *,"Surf triangle : ",S*20/(4*Pi) 
    519    
     493  
    520494  END SUBROUTINE set_geometry 
    521495   
  • codes/icosagcm/trunk/src/icosa_gcm.f90

    r149 r151  
    66  USE wind_mod 
    77  USE mpipara 
     8  USE omp_para 
    89  USE vertical_interp_mod 
     10  USE trace 
    911  IMPLICIT NONE 
    1012   
     
    2123  CALL init_earth_const  
    2224  CALL init_grid_param 
     25  CALL init_omp_para 
    2326  CALL compute_metric 
    2427  CALL compute_domain 
    2528  CALL init_transfert 
    2629  CALL init_writefield 
     30  CALL init_trace 
    2731 
    28 !  CALL allocate_field(sum_ne,field_T,type_real) 
    29 !  CALL allocate_field_glo(sum_ne_glo,field_T,type_real) 
    30  
    31 ! DO ind=1,ndomain 
    32 !   CALL swap_dimensions(ind) 
    33 !   pt_sum_ne=sum_ne(ind) 
    34 !   DO j=jj_begin,jj_end 
    35 !     DO i=ii_begin,ii_end     
    36 !       n=(j-1)*iim+i 
    37 !       pt_sum_ne(n)=domloc_glo_ind(ind) 
    38 !     ENDDO 
    39 !   ENDDO 
    40 ! ENDDO 
    41  
    42 ! CALL WriteField("domain",sum_ne) 
    43 ! CALL WriteField_mpi("domain",sum_ne) 
    44 ! CALL transfert_request(sum_ne,req_i1) 
    45 ! CALL WriteField_mpi("domain",sum_ne) 
    46 ! CALL close_files 
    47 ! CALL finalize_mpipara 
    48 ! STOP 
    4932   
    5033  CALL compute_geometry 
     
    8063   
    8164  CALL WriteField("Ai",geom%Ai) 
    82 !  CALL WriteField("sum_ne",sum_ne) 
     65 
    8366  IF (is_mpi_root) CALL write_apbp 
    8467  CALL init_time 
     68 
     69  CALL init_timeloop 
     70 
     71!$OMP PARALLEL 
    8572  CALL timeloop 
     73!$OMP END PARALLEL 
    8674 
    8775  CALL close_files 
  • codes/icosagcm/trunk/src/mpi_mod.F90

    r118 r151  
    1111  INTEGER :: MPI_INFO_NULL 
    1212  INTEGER :: MPI_STATUS_SIZE  
     13  INTEGER,PARAMETER :: MPI_ADDRESS_KIND=KIND(INTEGER) 
    1314#endif 
    1415 
     
    4041 END 
    4142 
     43 SUBROUTINE MPI_ISSEND 
     44 END 
     45 
    4246 SUBROUTINE MPI_IRECV 
    4347 END 
    4448 
    4549 SUBROUTINE MPI_WAITALL 
     50 END 
     51 
     52 SUBROUTINE MPI_TESTALL 
    4653 END 
    4754 
     
    5158 SUBROUTINE MPI_ALLGATHER 
    5259 END 
     60  
     61 SUBROUTINE MPI_TYPE_EXTENT 
     62 END 
     63  
     64 SUBROUTINE MPI_ALLOC_MEM 
     65 END 
    5366 
    5467#endif 
  • codes/icosagcm/trunk/src/mpipara.F90

    r118 r151  
    88  LOGICAL,SAVE :: using_mpi 
    99  LOGICAL,SAVE :: is_mpi_root 
     10   
     11  INTERFACE allocate_mpi_buffer 
     12    MODULE PROCEDURE allocate_mpi_buffer_r2, allocate_mpi_buffer_r3,allocate_mpi_buffer_r4 
     13  END INTERFACE allocate_mpi_buffer 
    1014 
    1115CONTAINS 
     
    4852   END SUBROUTINE  finalize_mpipara 
    4953    
     54 
     55  SUBROUTINE allocate_mpi_buffer_r2(buffer,length) 
     56  USE ISO_C_BINDING 
     57  USE mpi_mod 
     58  USE prec 
     59  IMPLICIT NONE 
     60    REAL(rstd), POINTER :: buffer(:) 
     61    INTEGER,INTENT(IN)  :: length 
     62 
     63    TYPE(C_PTR)         :: base_ptr 
     64    INTEGER(KIND=MPI_ADDRESS_KIND) :: size 
     65    INTEGER :: real_size,ierr 
     66     
     67    CALL MPI_TYPE_EXTENT(MPI_REAL8, real_size, ierr) 
     68    size=length*real_size 
     69     
     70    CALL MPI_ALLOC_MEM(size,MPI_INFO_NULL,base_ptr,ierr) 
     71    CALL C_F_POINTER(base_ptr, buffer, (/ length /)) 
     72 
     73   END SUBROUTINE allocate_mpi_buffer_r2 
     74 
     75  SUBROUTINE allocate_mpi_buffer_r3(buffer,length,dim3) 
     76  USE ISO_C_BINDING 
     77  USE mpi_mod 
     78  USE prec 
     79    IMPLICIT NONE 
     80    REAL(rstd), POINTER :: buffer(:,:) 
     81    INTEGER,INTENT(IN)  :: length 
     82    INTEGER,INTENT(IN)  :: dim3 
     83 
     84    TYPE(C_PTR)         :: base_ptr 
     85    INTEGER(KIND=MPI_ADDRESS_KIND) :: size 
     86    INTEGER :: real_size,ierr 
     87     
     88    CALL MPI_TYPE_EXTENT(MPI_REAL8, real_size, ierr) 
     89    size=length*real_size*dim3 
     90     
     91    CALL MPI_ALLOC_MEM(size,MPI_INFO_NULL,base_ptr,ierr) 
     92    CALL C_F_POINTER(base_ptr, buffer, (/ length,dim3 /)) 
     93     
     94   END SUBROUTINE allocate_mpi_buffer_r3 
     95 
     96  SUBROUTINE allocate_mpi_buffer_r4(buffer,length,dim3,dim4) 
     97  USE ISO_C_BINDING 
     98  USE mpi_mod 
     99  USE prec 
     100  IMPLICIT NONE 
     101    REAL(rstd), POINTER :: buffer(:,:,:) 
     102    INTEGER,INTENT(IN)  :: length 
     103    INTEGER,INTENT(IN)  :: dim3 
     104    INTEGER,INTENT(IN)  :: dim4 
     105 
     106    TYPE(C_PTR)         :: base_ptr 
     107    INTEGER(KIND=MPI_ADDRESS_KIND) :: size 
     108    INTEGER :: real_size,ierr 
     109     
     110    CALL MPI_TYPE_EXTENT(MPI_REAL8, real_size, ierr) 
     111    size=length*real_size*dim3*dim4 
     112     
     113    CALL MPI_ALLOC_MEM(size,MPI_INFO_NULL,base_ptr,ierr) 
     114    CALL C_F_POINTER(base_ptr, buffer, (/ length, dim3, dim4 /)) 
     115     
     116   END SUBROUTINE allocate_mpi_buffer_r4 
    50117    
    51118END MODULE mpipara 
  • codes/icosagcm/trunk/src/pression.f90

    r19 r151  
    3333 
    3434    DO    l    = 1, llm+1 
    35 !$OMP DO 
    3635      DO j=jj_begin-offset,jj_end+offset 
    3736        DO i=ii_begin-offset,ii_end+offset 
  • codes/icosagcm/trunk/src/theta_rhodz.f90

    r35 r151  
    8383    REAL(rstd),ALLOCATABLE,SAVE :: p(:,:) 
    8484 
    85 !$OMP BARRIER 
    86 !$OMP MASTER 
    87       ALLOCATE( p(iim*jjm,llm+1)) 
    88 !$OMP END MASTER 
    89 !$OMP BARRIER 
    90  
     85    ALLOCATE( p(iim*jjm,llm+1)) 
    9186    CALL compute_pression(ps,p,offset) 
    9287     
    9388    DO    l    = 1, llm 
    94 !$OMP DO 
    9589      DO j=jj_begin-offset,jj_end+offset 
    9690        DO i=ii_begin-offset,ii_end+offset 
     
    10195    ENDDO 
    10296 
    103 !$OMP BARRIER 
    104 !$OMP MASTER 
    105       DEALLOCATE( p) 
    106 !$OMP END MASTER 
    107 !$OMP BARRIER     
     97    DEALLOCATE( p) 
    10898 
    10999  END SUBROUTINE compute_theta2theta_rhodz 
     
    120110    REAL(rstd),SAVE,ALLOCATABLE :: p(:,:) 
    121111 
    122 !$OMP BARRIER 
    123 !$OMP MASTER 
    124       ALLOCATE( p(iim*jjm,llm+1)) 
    125 !$OMP END MASTER 
    126 !$OMP BARRIER 
     112    ALLOCATE( p(iim*jjm,llm+1)) 
     113 
    127114    CALL compute_pression(ps,p,offset) 
    128115     
     
    136123    ENDDO 
    137124 
    138 !$OMP BARRIER 
    139 !$OMP MASTER 
    140       DEALLOCATE( p) 
    141 !$OMP END MASTER 
    142 !$OMP BARRIER     
     125    DEALLOCATE( p) 
    143126     
    144127  END SUBROUTINE compute_theta_rhodz2theta 
     
    193176        DO i=ii_begin-offset,ii_end+offset 
    194177          ij=(j-1)*iim+i 
    195 !          temp(ij,l) = ( theta_rhodz(ij,l) / ((p(ij,l)-p(ij,l+1))/g) ) * pk(ij,l) / cpp 
    196178          theta_rhodz(ij,l) = temp(ij,l) * ((p(ij,l)-p(ij,l+1))/g) / (pk(ij,l) / cpp ) 
    197179        ENDDO 
  • codes/icosagcm/trunk/src/time.f90

    r149 r151  
    119119  INTEGER :: status 
    120120  REAL(rstd) ::time_array(1) 
     121 
     122!$OMP MASTER 
    121123    time_array(1)=time 
    122124   
     
    126128      status=NF90_SYNC(ncid) 
    127129    ENDIF 
     130!$OMP END MASTER 
    128131 
    129132  END SUBROUTINE update_time_counter     
  • codes/icosagcm/trunk/src/timeloop_gcm.f90

    r149 r151  
    11MODULE timeloop_gcm_mod 
    2  
     2  USE transfert_mod 
     3  USE icosa 
    34  PRIVATE 
    45   
    5   PUBLIC :: timeloop 
     6  PUBLIC :: init_timeloop, timeloop 
    67 
    78  INTEGER, PARAMETER :: euler=1, rk4=2, mlf=3 
    89  INTEGER  :: itau_sync=10 
    910 
     11  TYPE(t_message) :: req_ps0, req_theta_rhodz0, req_u0, req_q0 
     12 
     13  TYPE(t_field),POINTER :: f_phis(:) 
     14  TYPE(t_field),POINTER :: f_q(:) 
     15  TYPE(t_field),POINTER :: f_dtheta(:), f_rhodz(:) 
     16  TYPE(t_field),POINTER :: f_ps(:),f_psm1(:), f_psm2(:) 
     17  TYPE(t_field),POINTER :: f_u(:),f_um1(:),f_um2(:) 
     18  TYPE(t_field),POINTER :: f_theta_rhodz(:),f_theta_rhodzm1(:),f_theta_rhodzm2(:) 
     19  TYPE(t_field),POINTER :: f_dps(:),f_dpsm1(:), f_dpsm2(:) 
     20  TYPE(t_field),POINTER :: f_du(:),f_dum1(:),f_dum2(:) 
     21  TYPE(t_field),POINTER :: f_dtheta_rhodz(:),f_dtheta_rhodzm1(:),f_dtheta_rhodzm2(:) 
     22  TYPE(t_field),POINTER :: f_hflux(:), f_wflux(:), f_hfluxt(:), f_wfluxt(:)   
     23 
     24  INTEGER :: nb_stage, matsuno_period, scheme     
     25 
     26  REAL(rstd),SAVE :: jD_cur, jH_cur 
     27  REAL(rstd),SAVE :: start_time 
     28 
    1029CONTAINS 
    1130   
    12   SUBROUTINE timeloop 
     31  SUBROUTINE init_timeloop 
    1332  USE icosa 
    1433  USE dissip_gcm_mod 
     
    1938  USE physics_mod 
    2039  USE mpipara 
    21   USE IOIPSL 
    22   USE maxicosa 
    23   USE check_conserve_mod 
     40  USE omp_para 
    2441  USE trace 
    2542  USE transfert_mod 
     43  USE check_conserve_mod 
     44  USE ioipsl 
    2645  IMPLICIT NONE 
    27   TYPE(t_field),POINTER :: f_phis(:) 
    28 !  TYPE(t_field),POINTER :: f_theta(:) 
    29   TYPE(t_field),POINTER :: f_q(:) 
    30   TYPE(t_field),POINTER :: f_dtheta(:), f_rhodz(:) 
    31   TYPE(t_field),POINTER :: f_ps(:),f_psm1(:), f_psm2(:) 
    32   TYPE(t_field),POINTER :: f_u(:),f_um1(:),f_um2(:) 
    33   TYPE(t_field),POINTER :: f_theta_rhodz(:),f_theta_rhodzm1(:),f_theta_rhodzm2(:) 
    34   TYPE(t_field),POINTER :: f_dps(:),f_dpsm1(:), f_dpsm2(:) 
    35   TYPE(t_field),POINTER :: f_du(:),f_dum1(:),f_dum2(:) 
    36   TYPE(t_field),POINTER :: f_dtheta_rhodz(:),f_dtheta_rhodzm1(:),f_dtheta_rhodzm2(:) 
    37   TYPE(t_field),POINTER :: f_hflux(:), f_wflux(:), f_hfluxt(:), f_wfluxt(:) 
    38  
    39   REAL(rstd),POINTER :: phis(:) 
    40   REAL(rstd),POINTER :: q(:,:,:) 
    41   REAL(rstd),POINTER :: ps(:) ,psm1(:), psm2(:) 
    42   REAL(rstd),POINTER :: u(:,:) , um1(:,:), um2(:,:) 
    43   REAL(rstd),POINTER :: rhodz(:,:), theta_rhodz(:,:) , theta_rhodzm1(:,:), theta_rhodzm2(:,:) 
    44   REAL(rstd),POINTER :: dps(:), dpsm1(:), dpsm2(:) 
    45   REAL(rstd),POINTER :: du(:,:), dum1(:,:), dum2(:,:) 
    46   REAL(rstd),POINTER :: dtheta_rhodz(:,:),dtheta_rhodzm1(:,:),dtheta_rhodzm2(:,:) 
    47   REAL(rstd),POINTER :: hflux(:,:),wflux(:,:),hfluxt(:,:),wfluxt(:,:) 
    48 !  REAL(rstd) :: dt, run_length 
    49   INTEGER :: ind 
    50   INTEGER :: it,i,j,n, nb_stage, stage, matsuno_period, scheme 
    51   CHARACTER(len=255) :: scheme_name 
    52   LOGICAL :: fluxt_zero(ndomain) ! set to .TRUE. to start accumulating fluxes in time 
    53   CHARACTER(len=7) :: first  
    54   REAL(rstd),SAVE :: jD_cur, jH_cur 
    55   REAL(rstd),SAVE :: start_time 
    56   LOGICAL, PARAMETER :: check=.FALSE. 
    57 !  INTEGER :: itaumax 
    58 !  REAL(rstd) ::write_period 
    59 !  INTEGER    :: itau_out 
    60    
    61 !  dt=90. 
    62 !  CALL getin('dt',dt) 
    63    
    64 !  itaumax=100 
    65 !  CALL getin('itaumax',itaumax) 
    66  
    67 !  run_length=dt*itaumax 
    68 !  CALL getin('run_length',run_length) 
    69 !  itaumax=run_length/dt 
    70 !  PRINT *,'itaumax=',itaumax 
    71 !  dt=dt/scale_factor 
    72  
    73 ! Trends 
    74   CALL allocate_field(f_dps,field_t,type_real) 
    75   CALL allocate_field(f_du,field_u,type_real,llm) 
    76   CALL allocate_field(f_dtheta_rhodz,field_t,type_real,llm) 
     46 
     47    CHARACTER(len=255) :: scheme_name 
     48 
     49    CALL allocate_field(f_dps,field_t,type_real) 
     50    CALL allocate_field(f_du,field_u,type_real,llm) 
     51    CALL allocate_field(f_dtheta_rhodz,field_t,type_real,llm) 
    7752! Model state at current time step (RK/MLF/Euler) 
    78   CALL allocate_field(f_phis,field_t,type_real) 
    79   CALL allocate_field(f_ps,field_t,type_real) 
    80   CALL allocate_field(f_u,field_u,type_real,llm) 
    81   CALL allocate_field(f_theta_rhodz,field_t,type_real,llm) 
     53    CALL allocate_field(f_phis,field_t,type_real) 
     54    CALL allocate_field(f_ps,field_t,type_real) 
     55    CALL allocate_field(f_u,field_u,type_real,llm) 
     56    CALL allocate_field(f_theta_rhodz,field_t,type_real,llm) 
    8257! Model state at previous time step (RK/MLF) 
    83   CALL allocate_field(f_psm1,field_t,type_real) 
    84   CALL allocate_field(f_um1,field_u,type_real,llm) 
    85   CALL allocate_field(f_theta_rhodzm1,field_t,type_real,llm) 
     58    CALL allocate_field(f_psm1,field_t,type_real) 
     59    CALL allocate_field(f_um1,field_u,type_real,llm) 
     60    CALL allocate_field(f_theta_rhodzm1,field_t,type_real,llm) 
    8661! Tracers 
    87   CALL allocate_field(f_q,field_t,type_real,llm,nqtot) 
    88   CALL allocate_field(f_rhodz,field_t,type_real,llm) 
     62    CALL allocate_field(f_q,field_t,type_real,llm,nqtot) 
     63    CALL allocate_field(f_rhodz,field_t,type_real,llm) 
    8964! Mass fluxes 
    90   CALL allocate_field(f_hflux,field_u,type_real,llm)    ! instantaneous mass fluxes 
    91   CALL allocate_field(f_wflux,field_t,type_real,llm+1)  ! computed by caldyn 
    92   CALL allocate_field(f_hfluxt,field_u,type_real,llm)   ! mass "fluxes" accumulated in time 
    93   CALL allocate_field(f_wfluxt,field_t,type_real,llm+1) 
     65    CALL allocate_field(f_hflux,field_u,type_real,llm)    ! instantaneous mass fluxes 
     66    CALL allocate_field(f_wflux,field_t,type_real,llm+1)  ! computed by caldyn 
     67    CALL allocate_field(f_hfluxt,field_u,type_real,llm)   ! mass "fluxes" accumulated in time 
     68    CALL allocate_field(f_wfluxt,field_t,type_real,llm+1) 
     69 
    9470 
    9571!---------------------------------------------------- 
     
    145121!---------------------------------------------------- 
    146122 
    147   scheme_name='runge_kutta' 
    148   CALL getin('scheme',scheme_name) 
    149  
    150   SELECT CASE (TRIM(scheme_name)) 
    151   CASE('euler') 
    152      scheme=euler 
    153      nb_stage=1 
    154   CASE ('runge_kutta') 
    155      scheme=rk4 
    156      nb_stage=4 
    157   CASE ('leapfrog_matsuno') 
    158      scheme=mlf 
    159      matsuno_period=5 
    160      CALL getin('matsuno_period',matsuno_period) 
    161      nb_stage=matsuno_period+1 
     123 
     124 
     125 
     126 
     127    scheme_name='runge_kutta' 
     128    CALL getin('scheme',scheme_name) 
     129 
     130    SELECT CASE (TRIM(scheme_name)) 
     131      CASE('euler') 
     132        scheme=euler 
     133        nb_stage=1 
     134      CASE ('runge_kutta') 
     135        scheme=rk4 
     136        nb_stage=4 
     137      CASE ('leapfrog_matsuno') 
     138        scheme=mlf 
     139        matsuno_period=5 
     140        CALL getin('matsuno_period',matsuno_period) 
     141        nb_stage=matsuno_period+1 
    162142     ! Model state 2 time steps ago (MLF) 
    163      CALL allocate_field(f_psm2,field_t,type_real) 
    164      CALL allocate_field(f_theta_rhodzm2,field_t,type_real,llm) 
    165      CALL allocate_field(f_um2,field_u,type_real,llm) 
    166   CASE default 
    167      PRINT*,'Bad selector for variable scheme : <', TRIM(scheme_name),             & 
    168           ' > options are <euler>, <runge_kutta>, <leapfrog_matsuno>' 
    169      STOP 
    170   END SELECT 
     143        CALL allocate_field(f_psm2,field_t,type_real) 
     144        CALL allocate_field(f_theta_rhodzm2,field_t,type_real,llm) 
     145        CALL allocate_field(f_um2,field_u,type_real,llm) 
     146    CASE default 
     147       PRINT*,'Bad selector for variable scheme : <', TRIM(scheme_name),             & 
     148            ' > options are <euler>, <runge_kutta>, <leapfrog_matsuno>' 
     149       STOP 
     150    END SELECT 
     151 
     152 
     153    CALL init_dissip 
     154    CALL init_caldyn 
     155    CALL init_guided 
     156    CALL init_advect_tracer 
     157    CALL init_check_conserve 
     158    CALL init_physics 
     159    CALL etat0(f_ps,f_phis,f_theta_rhodz,f_u, f_q) 
     160 
     161    CALL transfert_request(f_phis,req_i0)  
     162    CALL transfert_request(f_phis,req_i1)  
     163    CALL writefield("phis",f_phis,once=.TRUE.) 
     164 
     165    CALL init_message(f_ps,req_i0,req_ps0) 
     166    CALL init_message(f_theta_rhodz,req_i0,req_theta_rhodz0) 
     167    CALL init_message(f_u,req_e0_vect,req_u0) 
     168    CALL init_message(f_q,req_i0,req_q0) 
     169 
     170  END SUBROUTINE init_timeloop 
    171171   
    172 !  write_period=0 
    173 !  CALL getin('write_period',write_period) 
    174 !  write_period=write_period/scale_factor 
    175 !  itau_out=FLOOR(.5+write_period/dt) 
    176 !  PRINT *, 'Output frequency (scaled) set to ',write_period, ' : itau_out = ',itau_out 
    177   
    178 ! Trends at previous time steps needed only by Adams-Bashforth 
    179 !  CALL allocate_field(f_dpsm1,field_t,type_real) 
    180 !  CALL allocate_field(f_dpsm2,field_t,type_real) 
    181 !  CALL allocate_field(f_dum1,field_u,type_real,llm) 
    182 !  CALL allocate_field(f_dum2,field_u,type_real,llm) 
    183 !  CALL allocate_field(f_dtheta_rhodzm1,field_t,type_real,llm) 
    184 !  CALL allocate_field(f_dtheta_rhodzm2,field_t,type_real,llm) 
    185 !  CALL allocate_field(f_theta,field_t,type_real,llm) 
    186 !  CALL allocate_field(f_dtheta,field_t,type_real,llm) 
    187  
    188   CALL init_dissip 
    189   CALL init_caldyn 
    190   CALL init_guided 
    191   CALL init_advect_tracer 
    192   CALL init_physics 
    193 !========================================= INITIALIZATION  
    194 ! CALL dynetat0(f_ps,f_phis,f_theta_rhodz,f_u,f_q) 
    195   CALL etat0(f_ps,f_phis,f_theta_rhodz,f_u,f_q) 
    196   CALL writefield("phis",f_phis,once=.TRUE.) 
    197   CALL transfert_request(f_q,req_i1)  
    198  
     172  SUBROUTINE timeloop 
     173  USE icosa 
     174  USE dissip_gcm_mod 
     175  USE caldyn_mod 
     176  USE etat0_mod 
     177  USE guided_mod 
     178  USE advect_tracer_mod 
     179  USE physics_mod 
     180  USE mpipara 
     181  USE omp_para 
     182  USE trace 
     183  USE transfert_mod 
     184  USE check_conserve_mod 
     185  IMPLICIT NONE   
     186    REAL(rstd),POINTER :: phis(:) 
     187    REAL(rstd),POINTER :: q(:,:,:) 
     188    REAL(rstd),POINTER :: ps(:) ,psm1(:), psm2(:) 
     189    REAL(rstd),POINTER :: u(:,:) , um1(:,:), um2(:,:) 
     190    REAL(rstd),POINTER :: rhodz(:,:), theta_rhodz(:,:) , theta_rhodzm1(:,:), theta_rhodzm2(:,:) 
     191    REAL(rstd),POINTER :: dps(:), dpsm1(:), dpsm2(:) 
     192    REAL(rstd),POINTER :: du(:,:), dum1(:,:), dum2(:,:) 
     193    REAL(rstd),POINTER :: dtheta_rhodz(:,:),dtheta_rhodzm1(:,:),dtheta_rhodzm2(:,:) 
     194    REAL(rstd),POINTER :: hflux(:,:),wflux(:,:),hfluxt(:,:),wfluxt(:,:) 
     195 
     196    INTEGER :: ind 
     197    INTEGER :: it,i,j,n,  stage 
     198    CHARACTER(len=255) :: scheme_name 
     199    LOGICAL :: fluxt_zero(ndomain) ! set to .TRUE. to start accumulating fluxes in time 
     200    LOGICAL, PARAMETER :: check=.FALSE. 
     201 
     202!$OMP BARRIER 
    199203  DO ind=1,ndomain 
    200204     CALL swap_dimensions(ind) 
    201205     CALL swap_geometry(ind) 
    202206     rhodz=f_rhodz(ind); ps=f_ps(ind) 
    203      CALL compute_rhodz(.TRUE., ps,rhodz) ! save rhodz for transport scheme before dynamics update ps 
     207     CALL compute_rhodz(.TRUE., ps, rhodz) ! save rhodz for transport scheme before dynamics update ps 
    204208  END DO 
    205209  fluxt_zero=.TRUE. 
    206210 
    207   ! check that rhodz is consistent with ps 
    208   CALL transfert_request(f_rhodz,req_i1) 
    209   CALL transfert_request(f_ps,req_i1) 
    210   DO ind=1,ndomain 
    211      CALL swap_dimensions(ind) 
    212      CALL swap_geometry(ind) 
    213      rhodz=f_rhodz(ind); ps=f_ps(ind) 
    214      CALL compute_rhodz(.FALSE., ps, rhodz)    
    215   END DO 
    216  
    217   CALL transfert_request(f_phis,req_i0)  
    218   CALL transfert_request(f_phis,req_i1)  
    219   CALL transfert_request(f_phis,req_i1)  
     211! check that rhodz is consistent with ps 
     212!  CALL transfert_request(f_rhodz,req_i1) 
     213!  CALL transfert_request(f_ps,req_i1) 
     214!  DO ind=1,ndomain 
     215!     CALL swap_dimensions(ind) 
     216!     CALL swap_geometry(ind) 
     217!     rhodz=f_rhodz(ind); ps=f_ps(ind) 
     218!     CALL compute_rhodz(.FALSE., ps, rhodz)    
     219!  END DO 
     220   
    220221 
    221222  DO it=0,itaumax 
    222223    IF (MOD(it,itau_sync)==0) THEN 
    223       CALL transfert_request(f_ps,req_i0) 
    224       CALL transfert_request(f_theta_rhodz,req_i0)  
    225       CALL transfert_request(f_u,req_e0_vect) 
    226       CALL transfert_request(f_q,req_i0)  
     224      CALL send_message(f_ps,req_ps0) 
     225      CALL send_message(f_theta_rhodz,req_theta_rhodz0)  
     226      CALL send_message(f_u,req_u0) 
     227      CALL send_message(f_q,req_q0)  
     228      CALL wait_message(req_ps0) 
     229      CALL wait_message(req_theta_rhodz0)  
     230      CALL wait_message(req_u0) 
     231      CALL wait_message(req_q0)  
    227232    ENDIF 
    228233     
     234!    IF (is_mpi_root) PRINT *,"It No :",It,"   t :",dt*It 
    229235    IF (mod(it,itau_out)==0 ) THEN 
    230 !      IF (is_mpi_root) PRINT *,"It No :",It,"   t :",dt*It 
     236      CALL writefield("q",f_q) 
    231237      CALL update_time_counter(dt*it) 
    232       CALL compute_conserve(f_ps,f_dps,f_u,f_theta_rhodz,f_phis,it)   
     238      CALL check_conserve(f_ps,f_dps,f_u,f_theta_rhodz,f_phis,it)   
    233239    ENDIF 
    234  
    235       CALL guided(it*dt,f_ps,f_theta_rhodz,f_u,f_q) 
     240     
     241    CALL guided(it*dt,f_ps,f_theta_rhodz,f_u,f_q) 
    236242 
    237243    DO stage=1,nb_stage 
     
    246252       CASE (mlf) 
    247253          CALL  leapfrog_matsuno_scheme(stage) 
     254           
    248255          !      CASE ('leapfrog') 
    249           !      CALL leapfrog_scheme 
     256          !        CALL leapfrog_scheme 
    250257          ! 
    251258          !      CASE ('adam_bashforth') 
    252           !      CALL dissip(f_u,f_du,f_ps,f_phis, f_theta_rhodz,f_dtheta_rhodz) 
    253           !      CALL adam_bashforth_scheme 
     259          !        CALL dissip(f_u,f_du,f_ps,f_phis, f_theta_rhodz,f_dtheta_rhodz) 
     260          !        CALL adam_bashforth_scheme 
    254261       CASE DEFAULT 
    255262          STOP 
     
    263270 
    264271    IF(MOD(it+1,itau_adv)==0) THEN 
    265 !       CALL transfert_request(f_wfluxt,req_i1) ! FIXME 
    266 !      CALL transfert_request(f_hfluxt,req_e1) ! FIXME 
    267272 
    268273       CALL advect_tracer(f_hfluxt,f_wfluxt,f_u, f_q,f_rhodz)  ! update q and rhodz after RK step 
     
    271276       ! FIXME : check that rhodz is consistent with ps 
    272277       IF (check) THEN 
    273          CALL transfert_request(f_rhodz,req_i1) 
    274          CALL transfert_request(f_ps,req_i1) 
    275          CALL transfert_request(f_dps,req_i1) ! FIXME 
    276          CALL transfert_request(f_wflux,req_i1) ! FIXME 
    277278         DO ind=1,ndomain 
    278279            CALL swap_dimensions(ind) 
    279280            CALL swap_geometry(ind) 
    280             rhodz=f_rhodz(ind); ps=f_ps(ind); dps=f_dps(ind);  
    281             wflux=f_wflux(ind); wfluxt=f_wfluxt(ind) 
     281            rhodz=f_rhodz(ind); ps=f_ps(ind); 
    282282            CALL compute_rhodz(.FALSE., ps, rhodz)    
    283283         END DO 
    284284       ENDIF 
     285 
    285286    END IF 
     287 
     288 
     289 
    286290!---------------------------------------------------- 
    287   jD_cur = jD_ref + day_ini - day_ref + it/day_step 
    288   jH_cur = jH_ref + start_time + mod(it,day_step)/float(day_step) 
    289   jD_cur = jD_cur + int(jH_cur) 
    290   jH_cur = jH_cur - int(jH_cur) 
    291 !       print*,"Just b4 phys" 
    292     CALL physics(it,jD_cur,jH_cur,f_phis, f_ps, f_theta_rhodz, f_u, f_q) 
    293 !---------------------------------------------------- 
     291!    jD_cur = jD_ref + day_ini - day_ref + it/day_step 
     292!    jH_cur = jH_ref + start_time + mod(it,day_step)/float(day_step) 
     293!    jD_cur = jD_cur + int(jH_cur) 
     294!    jH_cur = jH_cur - int(jH_cur) 
     295!    CALL physics(it,jD_cur,jH_cur,f_phis, f_ps, f_theta_rhodz, f_u, f_q) 
     296 
    294297!    CALL physics(it,f_phis, f_ps, f_theta_rhodz, f_u, f_q) 
    295298    ENDDO 
     299 
    296300  
    297301  CONTAINS 
     
    310314         ps=f_ps(ind) ; dps=f_dps(ind) ;  
    311315 
    312          DO j=jj_begin,jj_end 
    313            DO i=ii_begin,ii_end 
    314              ij=(j-1)*iim+i 
    315              ps(ij)=ps(ij)+dt*dps(ij) 
    316            ENDDO 
    317          ENDDO 
     316         IF (omp_first) THEN 
     317           DO j=jj_begin,jj_end 
     318             DO i=ii_begin,ii_end 
     319               ij=(j-1)*iim+i 
     320               ps(ij)=ps(ij)+dt*dps(ij) 
     321             ENDDO 
     322           ENDDO 
     323         ENDIF 
     324          
    318325         hflux=f_hflux(ind);     hfluxt=f_hfluxt(ind) 
    319326         wflux=f_wflux(ind);     wfluxt=f_wfluxt(ind) 
     
    324331       du=f_du(ind) ; dtheta_rhodz=f_dtheta_rhodz(ind) 
    325332 
    326        DO l=1,llm 
     333       DO l=ll_begin,ll_end 
    327334         DO j=jj_begin,jj_end 
    328335           DO i=ii_begin,ii_end 
     
    342349 
    343350    SUBROUTINE RK_scheme(stage) 
     351      USE caldyn_gcm_mod 
    344352      IMPLICIT NONE 
    345353      INTEGER :: ind, stage 
     
    351359 
    352360      tau = dt*coef(stage) 
     361 
     362      DO ind=1,ndomain 
     363         CALL swap_dimensions(ind) 
     364         CALL swap_geometry(ind) 
     365         ps=f_ps(ind)    
     366         psm1=f_psm1(ind)  
     367         dps=f_dps(ind)  
     368          
     369         IF (stage==1) THEN ! first stage : save model state in XXm1 
     370           IF (omp_first) THEN 
     371             DO j=jj_begin,jj_end 
     372               DO i=ii_begin,ii_end 
     373                 ij=(j-1)*iim+i 
     374                 psm1(ij)=ps(ij) 
     375               ENDDO 
     376             ENDDO 
     377           ENDIF 
     378         END IF 
     379          
     380         ! updates are of the form x1 := x0 + tau*f(x1) 
     381           IF (omp_first) THEN 
     382             DO j=jj_begin,jj_end 
     383               DO i=ii_begin,ii_end 
     384                 ij=(j-1)*iim+i 
     385                 ps(ij)=psm1(ij)+tau*dps(ij) 
     386               ENDDO 
     387             ENDDO 
     388           ENDIF 
     389        
     390       ENDDO 
     391 
     392       CALL send_message(f_ps,req_ps)       
     393 
     394 
    353395       
    354396      DO ind=1,ndomain 
     
    360402          
    361403         IF (stage==1) THEN ! first stage : save model state in XXm1 
    362  
    363            DO j=jj_begin,jj_end 
    364              DO i=ii_begin,ii_end 
    365                ij=(j-1)*iim+i 
    366                psm1(ij)=ps(ij) 
    367              ENDDO 
    368            ENDDO 
    369404               
    370            DO l=1,llm 
     405         DO l=ll_begin,ll_end 
    371406             DO j=jj_begin,jj_end 
    372407               DO i=ii_begin,ii_end 
     
    382417         END IF 
    383418         ! updates are of the form x1 := x0 + tau*f(x1) 
    384          DO j=jj_begin,jj_end 
    385            DO i=ii_begin,ii_end 
    386              ij=(j-1)*iim+i 
    387              ps(ij)=psm1(ij)+tau*dps(ij) 
    388            ENDDO 
    389          ENDDO 
    390419          
    391          DO l=1,llm 
     420         DO l=ll_begin,ll_end 
    392421           DO j=jj_begin,jj_end 
    393422             DO i=ii_begin,ii_end 
     
    468497 
    469498         
    470 !        IF (MOD(it,matsuno_period+1)==0) THEN 
    471499        IF (stage==1) THEN 
    472500          psm1(:)=ps(:) ; um1(:,:)=u(:,:) ; theta_rhodzm1(:,:)=theta_rhodz(:,:) 
     
    475503          theta_rhodz(:,:)=theta_rhodzm1(:,:)+tau*dtheta_rhodz(:,:) 
    476504 
    477 !        ELSE IF (MOD(it,matsuno_period+1)==1) THEN 
    478505        ELSE IF (stage==2) THEN 
    479506 
     
    538565    USE icosa 
    539566    USE disvert_mod 
     567    USE omp_para 
    540568    LOGICAL, INTENT(IN) :: comp ! .TRUE. to compute, .FALSE. to check 
    541569    REAL(rstd), INTENT(IN) :: ps(iim*jjm) 
     
    544572    INTEGER :: l,i,j,ij,dd 
    545573    err=0. 
    546     IF(comp) THEN  
    547        dd=1 
    548     ELSE 
    549 !       dd=-1 
    550        dd=0 
    551     END IF 
    552  
    553     DO l = 1, llm 
     574 
     575    dd=0 
     576 
     577    DO l = ll_begin, ll_end 
    554578       DO j=jj_begin-dd,jj_end+dd 
    555579          DO i=ii_begin-dd,ii_end+dd 
    556580             ij=(j-1)*iim+i 
    557              m = ( ap(l) - ap(l+1) + (bp(l)-bp(l+1))*ps(ij) )/g 
     581             m = ( ap(l) - ap(l+1) + (bp(l)-bp(l+1))*ps(ij) )/g  
    558582             IF(comp) THEN 
    559583                rhodz(ij,l) = m 
     
    570594          STOP 
    571595       ELSE 
    572           PRINT *, 'No discrepancy between ps and rhodz detected' 
     596!          PRINT *, 'No discrepancy between ps and rhodz detected' 
    573597       END IF 
    574598    END IF 
     
    578602  SUBROUTINE accumulate_fluxes(hflux,wflux, hfluxt,wfluxt, tau,fluxt_zero) 
    579603    USE icosa 
     604    USE omp_para 
    580605    REAL(rstd), INTENT(IN)    :: hflux(3*iim*jjm,llm), wflux(iim*jjm,llm+1) 
    581606    REAL(rstd), INTENT(INOUT) :: hfluxt(3*iim*jjm,llm), wfluxt(iim*jjm,llm+1) 
     
    585610 
    586611    IF(fluxt_zero) THEN 
    587 !       PRINT *, 'Accumulating fluxes (first)' 
     612 
    588613       fluxt_zero=.FALSE. 
    589        DO l=1,llm 
     614 
     615       DO l=ll_begin,ll_end 
    590616         DO j=jj_begin-1,jj_end+1 
    591617           DO i=ii_begin-1,ii_end+1 
     
    598624       ENDDO 
    599625 
    600        DO l=1,llm+1 
     626       DO l=ll_begin,ll_endp1 
    601627         DO j=jj_begin,jj_end 
    602628           DO i=ii_begin,ii_end 
     
    607633       ENDDO 
    608634    ELSE 
    609 !       PRINT *, 'Accumulating fluxes (next)' 
    610        DO l=1,llm 
     635 
     636       DO l=ll_begin,ll_end 
    611637         DO j=jj_begin-1,jj_end+1 
    612638           DO i=ii_begin-1,ii_end+1 
     
    619645       ENDDO 
    620646 
    621        DO l=1,llm+1 
     647       DO l=ll_begin,ll_endp1 
    622648         DO j=jj_begin,jj_end 
    623649           DO i=ii_begin,ii_end 
     
    629655 
    630656    END IF 
     657 
    631658  END SUBROUTINE accumulate_fluxes 
    632659   
  • codes/icosagcm/trunk/src/trace.F90

    r145 r151  
    11MODULE trace 
    22 
    3  
     3  INTEGER,SAVE :: markId 
     4   
    45CONTAINS 
    56 
     7  SUBROUTINE init_trace 
     8  IMPLICIT NONE 
     9#ifdef VTRACE 
     10#include <vt_user.inc> 
     11#endif  
     12 
     13#ifdef VTRACE 
     14     VT_MARKER_DEF("marker", VT_MARKER_TYPE_HINT, markId) 
     15#endif 
     16   
     17  END SUBROUTINE init_trace 
     18   
     19   
    620  SUBROUTINE trace_start(name) 
    721  IMPLICIT NONE 
     
    1125#endif  
    1226 
     27!$OMP MASTER 
    1328#ifdef VTRACE 
    1429     VT_USER_START(name) 
    1530#endif 
     31!$OMP END MASTER 
    1632 
    1733  END SUBROUTINE trace_start     
     
    2541    CHARACTER(LEN=*),INTENT(IN) :: name 
    2642 
     43!$OMP MASTER 
    2744#ifdef VTRACE 
    2845     VT_USER_END(name) 
    2946#endif 
     47!$OMP END MASTER 
    3048 
    3149  END SUBROUTINE trace_end     
    3250 
     51  SUBROUTINE Marker(name) 
     52  IMPLICIT NONE 
     53  CHARACTER(LEN=*),INTENT(IN) :: name 
     54#ifdef VTRACE 
     55#include <vt_user.inc> 
     56#endif  
     57 
     58!$OMP MASTER 
     59#ifdef VTRACE 
     60     VT_MARKER(markId,name) 
     61#endif 
     62!$OMP END MASTER 
     63 
     64  END SUBROUTINE Marker 
     65 
    3366END MODULE trace 
  • codes/icosagcm/trunk/src/transfert.F90

    r148 r151  
    33#ifdef CPP_USING_MPI 
    44  USE transfert_mpi_mod, ONLY : init_transfert, transfert_request=>transfert_request_mpi, req_i1,req_e1_vect, & 
    5                                 req_e1_scal, req_i0, req_e0_vect, req_e0_scal, request_add_point, create_request, gather_field 
     5                                req_e1_scal, req_i0, req_e0_vect, req_e0_scal, request_add_point, create_request, gather_field, & 
     6                                t_message,init_message=>init_message_mpi,transfert_message=>transfert_message_mpi,  & 
     7                                send_message=>send_message_mpi,test_message=>test_message_mpi,wait_message=>wait_message_mpi,barrier 
    68#else  
    7   USE transfert_mpi_mod, ONLY : init_transfert, transfert_request, req_i1,req_e1_vect, & 
    8                                 req_e1_scal,request_add_point, create_request, gather_field 
     9  USE transfert_mpi_mod, ONLY : init_transfert, transfert_request=>transfert_request_seq, req_i1,req_e1_vect, & 
     10                                req_e1_scal,req_i0, req_e0_vect, req_e0_scal, request_add_point, create_request, gather_field, & 
     11                                t_message,init_message=>init_message_seq,transfert_message=>transfert_message_seq,  & 
     12                                send_message=>send_message_seq,test_message=>test_message_seq,wait_message=>wait_message_seq,barrier 
    913#endif 
    1014   
  • codes/icosagcm/trunk/src/transfert_mpi.f90

    r148 r151  
    11MODULE transfert_mpi_mod 
    22USE genmod 
     3USE field_mod 
    34   
    45  TYPE array 
     
    1314    REAL,POINTER    :: buffer_r4(:,:,:) 
    1415  END TYPE array 
     16   
     17  TYPE t_buffer 
     18    REAL,POINTER    :: r2(:) 
     19    REAL,POINTER    :: r3(:,:) 
     20    REAL,POINTER    :: r4(:,:,:) 
     21  END TYPE t_buffer     
    1522     
    1623  TYPE t_request 
     
    4148  TYPE(t_request),POINTER :: req_e0_vect(:) 
    4249   
     50  TYPE t_message 
     51    TYPE(t_request), POINTER :: request(:) 
     52    INTEGER :: nreq 
     53    INTEGER, POINTER :: mpi_req(:) 
     54    INTEGER, POINTER :: status(:,:) 
     55    TYPE(t_buffer),POINTER :: buffers(:)  
     56    TYPE(t_field),POINTER :: field(:) 
     57    LOGICAL :: completed 
     58    LOGICAL :: pending 
     59  END TYPE t_message 
    4360   
    4461CONTAINS 
    45  
     62   
    4663  SUBROUTINE init_transfert 
    4764  USE domain_mod 
     
    7087      DO j=jj_begin,jj_end+1 
    7188        CALL request_add_point(ind,ii_begin-1,j,req_i1) 
    72       ENDDO     
    73      
    74       DO i=ii_begin,ii_end 
    75 !        CALL request_add_point(ind,i,jj_begin,req_i1) 
    76       ENDDO 
    77  
    78       DO j=jj_begin,jj_end 
    79 !        CALL request_add_point(ind,ii_end,j,req_i1) 
    80       ENDDO     
    81      
    82       DO i=ii_begin,ii_end 
    83 !        CALL request_add_point(ind,i,jj_end,req_i1) 
    84       ENDDO     
    85  
    86       DO j=jj_begin,jj_end 
    87 !        CALL request_add_point(ind,ii_begin,j,req_i1) 
    8889      ENDDO     
    8990     
     
    142143      ENDDO    
    143144 
    144       DO i=ii_begin+1,ii_end-1 
    145 !        CALL request_add_point(ind,i,jj_begin,req_e1_scal,right) 
    146 !        CALL request_add_point(ind,i,jj_end,req_e1_scal,right) 
    147       ENDDO 
    148      
    149       DO j=jj_begin+1,jj_end-1 
    150 !        CALL request_add_point(ind,ii_begin,j,req_e1_scal,rup) 
    151 !        CALL request_add_point(ind,ii_end,j,req_e1_scal,rup) 
    152       ENDDO    
    153  
    154 !      CALL request_add_point(ind,ii_begin+1,jj_begin,req_e1_scal,left) 
    155 !      CALL request_add_point(ind,ii_begin,jj_begin+1,req_e1_scal,ldown) 
    156 !      CALL request_add_point(ind,ii_begin+1,jj_end,req_e1_scal,left) 
    157 !      CALL request_add_point(ind,ii_end,jj_begin+1,req_e1_scal,ldown) 
    158  
    159145    ENDDO 
    160146 
     
    211197      ENDDO    
    212198 
    213       DO i=ii_begin+1,ii_end-1 
    214 !        CALL request_add_point(ind,i,jj_begin,req_e1_vect,right) 
    215 !        CALL request_add_point(ind,i,jj_end,req_e1_vect,right) 
    216       ENDDO 
    217      
    218       DO j=jj_begin+1,jj_end-1 
    219 !        CALL request_add_point(ind,ii_begin,j,req_e1_vect,rup) 
    220 !        CALL request_add_point(ind,ii_end,j,req_e1_vect,rup) 
    221       ENDDO    
    222  
    223 !      CALL request_add_point(ind,ii_begin+1,jj_begin,req_e1_vect,left) 
    224 !      CALL request_add_point(ind,ii_begin,jj_begin+1,req_e1_vect,ldown) 
    225 !      CALL request_add_point(ind,ii_begin+1,jj_end,req_e1_vect,left) 
    226 !      CALL request_add_point(ind,ii_end,jj_begin+1,req_e1_vect,ldown) 
    227199   
    228200    ENDDO   
     
    322294    target_j=>req%target_j 
    323295    target_sign=>req%target_sign 
    324 !    req%max_size=req%max_size*2 
     296 
    325297    ALLOCATE(req%src_domain(req%max_size*2)) 
    326298    ALLOCATE(req%src_ind(req%max_size*2)) 
     
    610582 
    611583 
     584  SUBROUTINE init_message_seq(field, request, message) 
     585  USE field_mod 
     586  USE domain_mod 
     587  USE mpi_mod 
     588  USE mpipara 
     589  USE mpi_mod 
     590  IMPLICIT NONE 
     591    TYPE(t_field),POINTER :: field(:) 
     592    TYPE(t_request),POINTER :: request(:) 
     593    TYPE(t_message) :: message 
     594 
     595!$OMP MASTER     
     596    message%request=>request 
     597!$OMP END MASTER     
     598!$OMP BARRIER     
     599 
     600  END SUBROUTINE init_message_seq 
     601 
     602  SUBROUTINE send_message_seq(field,message) 
     603  USE field_mod 
     604  USE domain_mod 
     605  USE mpi_mod 
     606  USE mpipara 
     607  USE omp_para 
     608  USE trace 
     609  IMPLICIT NONE 
     610    TYPE(t_field),POINTER :: field(:) 
     611    TYPE(t_message) :: message 
     612 
     613    CALL transfert_request_seq(field,message%request) 
     614     
     615  END SUBROUTINE send_message_seq 
     616   
     617  SUBROUTINE test_message_seq(message) 
     618  IMPLICIT NONE 
     619    TYPE(t_message) :: message 
     620  END SUBROUTINE  test_message_seq 
     621   
     622    
     623  SUBROUTINE wait_message_seq(message) 
     624  IMPLICIT NONE 
     625    TYPE(t_message) :: message 
     626     
     627  END SUBROUTINE wait_message_seq     
     628 
     629  SUBROUTINE transfert_message_seq(field,message) 
     630  USE field_mod 
     631  USE domain_mod 
     632  USE mpi_mod 
     633  USE mpipara 
     634  USE omp_para 
     635  USE trace 
     636  IMPLICIT NONE 
     637    TYPE(t_field),POINTER :: field(:) 
     638    TYPE(t_message) :: message 
     639 
     640   CALL send_message_seq(field,message) 
     641     
     642  END SUBROUTINE transfert_message_seq     
     643     
     644     
     645  SUBROUTINE init_message_mpi(field,request, message) 
     646  USE field_mod 
     647  USE domain_mod 
     648  USE mpi_mod 
     649  USE mpipara 
     650  USE mpi_mod 
     651  IMPLICIT NONE 
     652   
     653    TYPE(t_field),POINTER :: field(:) 
     654    TYPE(t_request),POINTER :: request(:) 
     655    TYPE(t_message) :: message 
     656 
     657    TYPE(ARRAY),POINTER :: recv,send  
     658    TYPE(t_request),POINTER :: req 
     659    INTEGER :: irecv,isend 
     660    INTEGER :: ireq,nreq 
     661    INTEGER :: ind 
     662    INTEGER :: dim3,dim4 
     663 
     664!$OMP MASTER 
     665    message%request=>request 
     666    nreq=sum(request(:)%nsend)+sum(request(:)%nrecv) 
     667    message%nreq=nreq 
     668    ALLOCATE(message%mpi_req(nreq)) 
     669    ALLOCATE(message%buffers(nreq)) 
     670    ALLOCATE(message%status(MPI_STATUS_SIZE,nreq)) 
     671     
     672    message%pending=.FALSE. 
     673    message%completed=.FALSE. 
     674     
     675    IF (field(1)%data_type==type_real) THEN 
     676 
     677      IF (field(1)%ndim==2) THEN 
     678       
     679        ireq=0 
     680        DO ind=1,ndomain 
     681          req=>request(ind) 
     682       
     683          DO isend=1,req%nsend 
     684            ireq=ireq+1 
     685            send=>req%send(isend) 
     686            CALL allocate_mpi_buffer(message%buffers(ireq)%r2,send%size) 
     687          ENDDO 
     688         
     689          DO irecv=1,req%nrecv 
     690            ireq=ireq+1 
     691            recv=>req%recv(irecv) 
     692            CALL allocate_mpi_buffer(message%buffers(ireq)%r2,recv%size) 
     693          ENDDO 
     694         
     695        ENDDO 
     696       
     697       
     698      ELSE  IF (field(1)%ndim==3) THEN 
     699     
     700        ireq=0 
     701        DO ind=1,ndomain 
     702          dim3=size(field(ind)%rval3d,2) 
     703          req=>request(ind) 
     704  
     705          DO isend=1,req%nsend 
     706            ireq=ireq+1 
     707            send=>req%send(isend) 
     708            CALL allocate_mpi_buffer(message%buffers(ireq)%r3,send%size,dim3) 
     709          ENDDO 
     710         
     711          DO irecv=1,req%nrecv 
     712            ireq=ireq+1 
     713            recv=>req%recv(irecv) 
     714            CALL allocate_mpi_buffer(message%buffers(ireq)%r3,recv%size,dim3) 
     715 
     716          ENDDO 
     717         
     718        ENDDO 
     719 
     720 
     721      ELSE  IF (field(1)%ndim==4) THEN 
     722    
     723        ireq=0 
     724        DO ind=1,ndomain 
     725          dim3=size(field(ind)%rval4d,2) 
     726          dim4=size(field(ind)%rval4d,3) 
     727          req=>request(ind) 
     728 
     729          DO isend=1,req%nsend 
     730            ireq=ireq+1 
     731            send=>req%send(isend) 
     732            CALL allocate_mpi_buffer(message%buffers(ireq)%r4,send%size,dim3,dim4) 
     733          ENDDO 
     734         
     735          DO irecv=1,req%nrecv 
     736            ireq=ireq+1 
     737            recv=>req%recv(irecv) 
     738            CALL allocate_mpi_buffer(message%buffers(ireq)%r4,recv%size,dim3,dim4) 
     739          ENDDO 
     740         
     741        ENDDO 
     742       
     743      ENDIF       
     744    ENDIF 
     745!$OMP END MASTER 
     746!$OMP BARRIER     
     747  END SUBROUTINE init_message_mpi 
     748   
     749  SUBROUTINE barrier 
     750  USE mpi_mod 
     751  USE mpipara 
     752  IMPLICIT NONE 
     753     
     754    CALL MPI_BARRIER(comm_icosa,ierr) 
     755     
     756  END SUBROUTINE barrier   
     757     
     758  SUBROUTINE transfert_message_mpi(field,message) 
     759  USE field_mod 
     760  IMPLICIT NONE 
     761    TYPE(t_field),POINTER :: field(:) 
     762    TYPE(t_message) :: message 
     763     
     764    CALL send_message_mpi(field,message) 
     765    CALL wait_message_mpi(message) 
     766     
     767  END SUBROUTINE transfert_message_mpi 
     768 
     769 
     770  SUBROUTINE send_message_mpi(field,message) 
     771  USE field_mod 
     772  USE domain_mod 
     773  USE mpi_mod 
     774  USE mpipara 
     775  USE omp_para 
     776  USE trace 
     777  IMPLICIT NONE 
     778    TYPE(t_field),POINTER :: field(:) 
     779    TYPE(t_message) :: message 
     780    REAL(rstd),POINTER :: rval2d(:)  
     781    REAL(rstd),POINTER :: rval3d(:,:)  
     782    REAL(rstd),POINTER :: rval4d(:,:,:)  
     783    REAL(rstd),POINTER :: buffer_r2(:)  
     784    REAL(rstd),POINTER :: buffer_r3(:,:)  
     785    REAL(rstd),POINTER :: buffer_r4(:,:,:)  
     786    INTEGER,POINTER :: value(:)  
     787    INTEGER,POINTER :: sgn(:)  
     788    TYPE(ARRAY),POINTER :: recv,send  
     789    TYPE(t_request),POINTER :: req 
     790    INTEGER, ALLOCATABLE :: mpi_req(:) 
     791    INTEGER, ALLOCATABLE :: status(:,:) 
     792    INTEGER :: irecv,isend 
     793    INTEGER :: ireq,nreq 
     794    INTEGER :: ind,n,l,m 
     795    INTEGER :: dim3,dim4 
     796 
     797!$OMP BARRIER 
     798 
     799    CALL trace_start("transfert_mpi") 
     800 
     801    nreq=message%nreq 
     802    message%field=>field 
     803 
     804!$OMP MASTER 
     805    message%completed=.FALSE. 
     806    message%pending=.TRUE. 
     807!$OMP END MASTER 
     808     
     809    IF (field(1)%data_type==type_real) THEN 
     810      IF (field(1)%ndim==2) THEN 
     811 
     812        ireq=0 
     813        DO ind=1,ndomain 
     814          rval2d=>field(ind)%rval2d 
     815         
     816          req=>message%request(ind) 
     817          DO isend=1,req%nsend 
     818            ireq=ireq+1 
     819            send=>req%send(isend) 
     820            buffer_r2=>message%buffers(ireq)%r2 
     821            value=>send%value 
     822 
     823            CALL trace_in 
     824 
     825!$OMP DO SCHEDULE(STATIC) 
     826            DO n=1,send%size 
     827              buffer_r2(n)=rval2d(value(n)) 
     828            ENDDO 
     829             
     830            CALL trace_out 
     831 
     832!$OMP MASTER 
     833            CALL MPI_ISSEND(buffer_r2,send%size,MPI_REAL8,send%rank,ind,comm_icosa, message%mpi_req(ireq),ierr) 
     834!$OMP END MASTER 
     835          ENDDO 
     836         
     837          DO irecv=1,req%nrecv 
     838            ireq=ireq+1 
     839            recv=>req%recv(irecv) 
     840            buffer_r2=>message%buffers(ireq)%r2 
     841!$OMP MASTER 
     842            CALL MPI_IRECV(buffer_r2,recv%size,MPI_REAL8,recv%rank,recv%domain,comm_icosa, message%mpi_req(ireq),ierr) 
     843!$OMP END MASTER 
     844          ENDDO 
     845         
     846        ENDDO 
     847       
     848      ELSE  IF (field(1)%ndim==3) THEN 
     849       
     850        ireq=0 
     851        DO ind=1,ndomain 
     852          dim3=size(field(ind)%rval3d,2) 
     853          rval3d=>field(ind)%rval3d 
     854          req=>message%request(ind) 
     855  
     856          DO isend=1,req%nsend 
     857            ireq=ireq+1 
     858            send=>req%send(isend) 
     859            buffer_r3=>message%buffers(ireq)%r3 
     860            value=>send%value 
     861 
     862            CALL trace_in 
     863             
     864!$OMP DO SCHEDULE(STATIC) 
     865              DO n=1,send%size 
     866                buffer_r3(n,:)=rval3d(value(n),:) 
     867              ENDDO 
     868 
     869             CALL trace_out 
     870 
     871!$OMP MASTER 
     872            CALL MPI_ISSEND(buffer_r3,send%size*dim3,MPI_REAL8,send%rank,ind,comm_icosa, message%mpi_req(ireq),ierr) 
     873!$OMP END MASTER 
     874          ENDDO 
     875         
     876          DO irecv=1,req%nrecv 
     877            ireq=ireq+1 
     878            recv=>req%recv(irecv) 
     879            buffer_r3=>message%buffers(ireq)%r3 
     880!$OMP MASTER            
     881            CALL MPI_IRECV(buffer_r3,recv%size*dim3,MPI_REAL8,recv%rank,recv%domain,comm_icosa, message%mpi_req(ireq),ierr) 
     882!$OMP END MASTER 
     883 
     884          ENDDO 
     885         
     886        ENDDO 
     887 
     888      ELSE  IF (field(1)%ndim==4) THEN 
     889     
     890        ireq=0 
     891        DO ind=1,ndomain 
     892          dim3=size(field(ind)%rval4d,2) 
     893          dim4=size(field(ind)%rval4d,3) 
     894          rval4d=>field(ind)%rval4d 
     895          req=>message%request(ind) 
     896 
     897          DO isend=1,req%nsend 
     898            ireq=ireq+1 
     899            send=>req%send(isend) 
     900            buffer_r4=>message%buffers(ireq)%r4 
     901            value=>send%value 
     902 
     903            CALL trace_in 
     904 
     905!$OMP DO SCHEDULE(STATIC) 
     906            DO n=1,send%size 
     907               buffer_r4(n,:,:)=rval4d(value(n),:,:) 
     908            ENDDO 
     909 
     910           CALL trace_out 
     911 
     912!$OMP MASTER 
     913            CALL MPI_ISSEND(buffer_r4,send%size*dim3*dim4,MPI_REAL8,send%rank,ind,comm_icosa, message%mpi_req(ireq),ierr) 
     914!$OMP END MASTER 
     915          ENDDO 
     916         
     917          DO irecv=1,req%nrecv 
     918            ireq=ireq+1 
     919            recv=>req%recv(irecv) 
     920            buffer_r4=>message%buffers(ireq)%r4 
     921!$OMP MASTER            
     922            CALL MPI_IRECV(buffer_r4,recv%size*dim3*dim4,MPI_REAL8,recv%rank,recv%domain,comm_icosa, message%mpi_req(ireq),ierr) 
     923!$OMP END MASTER 
     924          ENDDO 
     925         
     926        ENDDO 
     927       
     928      ENDIF       
     929       
     930    ENDIF 
     931 
     932    CALL trace_end("transfert_mpi") 
     933!$OMP BARRIER 
     934     
     935  END SUBROUTINE send_message_mpi 
     936   
     937  SUBROUTINE test_message_mpi(message) 
     938  IMPLICIT NONE 
     939    TYPE(t_message) :: message 
     940     
     941    INTEGER :: ierr 
     942!$OMP MASTER 
     943     IF (.NOT. message%pending) RETURN 
     944!$OMP END MASTER 
     945 
     946!$OMP MASTER 
     947     IF (.NOT. message%completed) CALL MPI_TESTALL(message%nreq,message%mpi_req,message%completed,message%status,ierr) 
     948!$OMP END MASTER 
     949  END SUBROUTINE  test_message_mpi 
     950   
     951    
     952  SUBROUTINE wait_message_mpi(message) 
     953  USE field_mod 
     954  USE domain_mod 
     955  USE mpi_mod 
     956  USE mpipara 
     957  USE omp_para 
     958  USE trace 
     959  IMPLICIT NONE 
     960    TYPE(t_message) :: message 
     961 
     962    TYPE(t_field),POINTER :: field(:) 
     963    REAL(rstd),POINTER :: rval2d(:)  
     964    REAL(rstd),POINTER :: rval3d(:,:)  
     965    REAL(rstd),POINTER :: rval4d(:,:,:)  
     966    REAL(rstd),POINTER :: buffer_r2(:)  
     967    REAL(rstd),POINTER :: buffer_r3(:,:)  
     968    REAL(rstd),POINTER :: buffer_r4(:,:,:)  
     969    INTEGER,POINTER :: value(:)  
     970    INTEGER,POINTER :: sgn(:)  
     971    TYPE(ARRAY),POINTER :: recv,send  
     972    TYPE(t_request),POINTER :: req 
     973    INTEGER, ALLOCATABLE :: mpi_req(:) 
     974    INTEGER, ALLOCATABLE :: status(:,:) 
     975    INTEGER :: irecv,isend 
     976    INTEGER :: ireq,nreq 
     977    INTEGER :: ind,n,l,m 
     978    INTEGER :: dim3,dim4 
     979 
     980!$OMP BARRIER 
     981 
     982    CALL trace_start("transfert_mpi") 
     983 
     984    IF (.NOT. message%pending) RETURN 
     985     
     986    field=>message%field 
     987    nreq=message%nreq 
     988     
     989    IF (field(1)%data_type==type_real) THEN 
     990      IF (field(1)%ndim==2) THEN 
     991 
     992!$OMP MASTER 
     993        IF (.NOT. message%completed) CALL MPI_WAITALL(nreq,message%mpi_req,message%status,ierr) 
     994!$OMP END MASTER 
     995!$OMP BARRIER 
     996 
     997        ireq=0         
     998        DO ind=1,ndomain 
     999          rval2d=>field(ind)%rval2d 
     1000          req=>message%request(ind) 
     1001 
     1002          DO isend=1,req%nsend 
     1003            ireq=ireq+1 
     1004          ENDDO 
     1005      
     1006          DO irecv=1,req%nrecv 
     1007            ireq=ireq+1 
     1008            recv=>req%recv(irecv) 
     1009            buffer_r2=>message%buffers(ireq)%r2 
     1010            value=>recv%value 
     1011            sgn=>recv%sign 
     1012 
     1013            CALL trace_in 
     1014             
     1015!$OMP DO SCHEDULE(STATIC) 
     1016            DO n=1,recv%size 
     1017              rval2d(value(n))=buffer_r2(n)*sgn(n)   
     1018            ENDDO         
     1019 
     1020            CALL trace_out 
     1021 
     1022          ENDDO 
     1023         
     1024        ENDDO 
     1025       
     1026       
     1027      ELSE  IF (field(1)%ndim==3) THEN 
     1028 
     1029!$OMP MASTER 
     1030        IF (.NOT. message%completed) CALL MPI_WAITALL(nreq,message%mpi_req,message%status,ierr) 
     1031!$OMP END MASTER 
     1032!$OMP BARRIER 
     1033 
     1034        ireq=0         
     1035        DO ind=1,ndomain 
     1036          rval3d=>field(ind)%rval3d 
     1037          req=>message%request(ind) 
     1038 
     1039          DO isend=1,req%nsend 
     1040            ireq=ireq+1 
     1041          ENDDO 
     1042         
     1043          DO irecv=1,req%nrecv 
     1044            ireq=ireq+1 
     1045            recv=>req%recv(irecv) 
     1046            buffer_r3=>message%buffers(ireq)%r3 
     1047            value=>recv%value 
     1048            sgn=>recv%sign 
     1049 
     1050            CALL trace_in 
     1051             
     1052!$OMP DO SCHEDULE(STATIC) 
     1053            DO n=1,recv%size 
     1054              rval3d(value(n),:)=buffer_r3(n,:)*sgn(n)   
     1055            ENDDO   
     1056 
     1057            CALL trace_out 
     1058 
     1059          ENDDO 
     1060         
     1061        ENDDO 
     1062 
     1063      ELSE  IF (field(1)%ndim==4) THEN 
     1064!$OMP MASTER 
     1065        IF (.NOT. message%completed) CALL MPI_WAITALL(nreq,message%mpi_req,message%status,ierr) 
     1066!$OMP END MASTER 
     1067!$OMP BARRIER 
     1068 
     1069        ireq=0         
     1070        DO ind=1,ndomain 
     1071          rval4d=>field(ind)%rval4d 
     1072          req=>message%request(ind) 
     1073 
     1074          DO isend=1,req%nsend 
     1075            ireq=ireq+1 
     1076          ENDDO 
     1077         
     1078          DO irecv=1,req%nrecv 
     1079            ireq=ireq+1 
     1080            recv=>req%recv(irecv) 
     1081            buffer_r4=>message%buffers(ireq)%r4 
     1082            value=>recv%value 
     1083            sgn=>recv%sign 
     1084 
     1085            CALL trace_in 
     1086 
     1087!$OMP DO SCHEDULE(STATIC) 
     1088            DO n=1,recv%size 
     1089              rval4d(value(n),:,:)=buffer_r4(n,:,:)*sgn(n)  
     1090            ENDDO 
     1091 
     1092            CALL trace_out 
     1093 
     1094          ENDDO 
     1095         
     1096        ENDDO 
     1097       
     1098      ENDIF       
     1099       
     1100    ENDIF 
     1101 
     1102!$OMP MASTER 
     1103    message%pending=.FALSE. 
     1104!$OMP END MASTER 
     1105 
     1106    CALL trace_end("transfert_mpi") 
     1107!$OMP BARRIER 
     1108     
     1109  END SUBROUTINE wait_message_mpi 
     1110 
     1111 
    6121112  SUBROUTINE transfert_request_mpi(field,request) 
    6131113  USE field_mod 
     
    6371137 
    6381138    CALL trace_start("transfert_mpi") 
    639      
     1139 
    6401140    IF (field(1)%data_type==type_real) THEN 
    6411141      IF (field(1)%ndim==2) THEN 
     
    6751175         
    6761176        CALL MPI_WAITALL(nreq,mpi_req,status,ierr) 
    677 !        DO ind=1,ndomain 
    678 !          field(ind)%rval2d(:)=0. 
    679 !        ENDDO 
    6801177         
    6811178        DO ind=1,ndomain 
     
    7391236         
    7401237        CALL MPI_WAITALL(nreq,mpi_req,status,ierr) 
    741 !        DO ind=1,ndomain 
    742 !          field(ind)%rval2d(:)=0. 
    743 !        ENDDO 
    7441238         
    7451239        DO ind=1,ndomain 
     
    8031297         
    8041298        CALL MPI_WAITALL(nreq,mpi_req,status,ierr) 
    805 !        DO ind=1,ndomain 
    806 !          field(ind)%rval2d(:)=0. 
    807 !        ENDDO 
    8081299         
    8091300        DO ind=1,ndomain 
     
    8371328  END SUBROUTINE transfert_request_mpi 
    8381329    
    839   SUBROUTINE transfert_request(field,request) 
     1330  SUBROUTINE transfert_request_seq(field,request) 
    8401331  USE field_mod 
    8411332  USE domain_mod 
     
    8751366    ENDDO 
    8761367     
    877   END SUBROUTINE transfert_request 
     1368  END SUBROUTINE transfert_request_seq 
    8781369   
    8791370   
     
    9491440         
    9501441  END SUBROUTINE gather_field 
    951    
     1442 
     1443    
     1444  SUBROUTINE trace_in 
     1445  USE trace 
     1446  IMPLICIT NONE 
     1447   
     1448    CALL trace_start("transfert_buffer") 
     1449  END SUBROUTINE trace_in               
     1450 
     1451  SUBROUTINE trace_out 
     1452  USE trace 
     1453  IMPLICIT NONE 
     1454   
     1455    CALL trace_end("transfert_buffer") 
     1456  END SUBROUTINE trace_out               
    9521457 
    9531458END MODULE transfert_mpi_mod 
  • codes/icosagcm/trunk/src/wind.f90

    r49 r151  
    33CONTAINS 
    44 
     5  SUBROUTINE un2ulonlat(f_u, f_ulon, f_ulat) 
     6  USE icosa 
     7  IMPLICIT NONE 
     8    TYPE(t_field), POINTER :: f_u(:) ! IN  : normal velocity components on edges 
     9    TYPE(t_field), POINTER :: f_ulon(:), f_ulat(:) ! OUT : velocity reconstructed at hexagons 
     10     
     11    REAL(rstd),POINTER :: u(:,:),  ulon(:,:), ulat(:,:) 
     12    INTEGER :: ind 
     13 
     14    DO ind=1,ndomain 
     15       CALL swap_dimensions(ind) 
     16       CALL swap_geometry(ind) 
     17       u=f_u(ind) 
     18       ulon=f_ulon(ind) 
     19       ulat=f_ulat(ind) 
     20       CALL compute_un2ulonlat(u,ulon, ulat) 
     21    END DO 
     22 
     23  END SUBROUTINE un2ulonlat 
    524 
    625  
     
    214233 END SUBROUTINE compute_wind_centered_lonlat_compound 
    215234 
     235 SUBROUTINE compute_un2ulonlat(un, ulon, ulat) 
     236  USE icosa   
     237     
     238  IMPLICIT NONE 
     239  REAL(rstd),INTENT(IN)  :: un(3*iim*jjm,llm) 
     240  REAL(rstd),INTENT(OUT) :: ulon(iim*jjm,llm) 
     241  REAL(rstd),INTENT(OUT) :: ulat(iim*jjm,llm) 
     242 
     243  REAL(rstd)             :: uc(iim*jjm,3,llm) 
     244     
     245  CALL compute_wind_centered(un,uc)   
     246  CALL compute_wind_centered_lonlat_compound(uc, ulon, ulat) 
     247  
     248 END SUBROUTINE compute_un2ulonlat 
    216249 
    217250END MODULE wind_mod 
  • codes/icosagcm/trunk/src/write_field.f90

    r119 r151  
    7575       
    7676      TYPE(t_field),POINTER :: field_glo(:) 
    77        
     77 
     78!$OMP MASTER       
    7879      IF(PRESENT(once)) THEN 
    7980         once_=once 
     
    101102       
    102103      CALL deallocate_field_glo(field_glo) 
     104!$OMP END MASTER 
    103105       
    104106   END SUBROUTINE writefield 
     
    333335    USE domain_mod 
    334336    USE field_mod 
    335 !    USE dimensions 
    336 !    USE geometry 
    337337    IMPLICIT NONE 
    338338      CHARACTER(LEN=*),INTENT(IN) :: name_in 
     
    482482        ENDIF 
    483483         
    484 !        PRINT *,NF90_STRERROR(status) 
    485 !        ncell=ncell+n 
    486  
    487 !     ENDDO 
    488484      
    489485     ELSE IF (Field(ind_b)%field_type==field_Z) THEN 
     
    604600          ENDDO 
    605601        ENDIF 
    606          
    607 !        PRINT *,NF90_STRERROR(status) 
    608 !        ncell=ncell+n 
    609 ! 
    610 !     ENDDO 
    611602      
    612603     ENDIF 
     
    712703            ENDDO 
    713704          ENDDO 
    714 !           DO l=1,size(field(ind)%rval3d,2) 
    715             status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val3d,  & 
     705          status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val3d,  & 
    716706                                start=(/ displ+ncell,1,FieldIndex(Index) /), count=(/n,size(field(ind)%rval3d,2),1 /)) 
    717 !           ENDDO 
    718707          DEALLOCATE(field_val3d) 
     708 
    719709        ELSE IF (field(1)%ndim==4) THEN 
    720710 
     
    732722              ENDDO 
    733723             ENDDO 
    734 !            DO l=1,size(field(ind)%rval4d,2) 
     724 
    735725            status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(q),Field_val3d(:,l), & 
    736726                                start=(/ displ+ncell,l,FieldIndex(Index) /), count=(/n,size(field(ind)%rval4d,2),1 /)) 
    737 !            ENDDO 
    738727            DEALLOCATE(field_val3d) 
    739728          ENDDO          
    740729        ENDIF 
    741730         
    742 !        PRINT *,NF90_STRERROR(status) 
    743731        ncell=ncell+n 
    744732 
     
    810798            ENDDO 
    811799          ENDDO 
    812 !           DO l=1,size(field(ind)%rval3d,2) 
     800 
    813801           status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(1),Field_val3d,    & 
    814802                               start=(/ displ+ncell,1,FieldIndex(Index) /), count=(/n,size(field(ind)%rval3d,2),1 /)) 
    815 !           ENDDO 
    816803          DEALLOCATE(field_val3d) 
     804 
    817805        ELSE IF (field(1)%ndim==4) THEN 
    818806 
     
    836824            ENDDO 
    837825 
    838 !            DO l=1,size(field(ind)%rval4d,2) 
    839  
    840826            status=NF90_PUT_VAR(FieldId(Index),FieldVarId(index)%nc_id(q),Field_val3d,  & 
    841827                                start=(/ displ+ncell,1,FieldIndex(Index) /), count=(/n,size(field(ind)%rval4d,2),1 /)) 
    842 !            ENDDO 
    843828            DEALLOCATE(field_val3d) 
    844829          ENDDO 
    845830        ENDIF 
    846831         
    847 !        PRINT *,NF90_STRERROR(status) 
    848832        ncell=ncell+n 
    849833 
     
    11591143    USE metric 
    11601144    USE spherical_geom_mod 
    1161 !    USE dimensions 
    1162 !    USE geometry 
    11631145    IMPLICIT NONE 
    11641146      CHARACTER(LEN=*),INTENT(IN) :: name_in 
     
    12921274       
    12931275        status = NF90_ENDDEF(ncid)       
    1294  
    1295 !        ncell=1 
    1296 !        DO ind=ind_b,ind_e 
    1297 !          d=>domain_type(ind) 
    1298    
    1299 !          n=0 
    1300 !          DO j=d%jj_begin-halo_size,d%jj_end+halo_size 
    1301 !            DO i=d%ii_begin-halo_size,d%ii_end+halo_size 
    1302 !              IF (single .OR. d%assign_domain(i,j)==ind) n=n+1 
    1303 !            ENDDO 
    1304 !          ENDDO 
    1305            
     1276          
    13061277         ALLOCATE(lon(ncell),lat(ncell),bounds_lon(0:nvert-1,ncell),bounds_lat(0:nvert-1,ncell)) 
    13071278           
     
    13301301         status=NF90_PUT_VAR(ncid,bounds_latId,REAL(bounds_lat,r8),start=(/ 1,1 /),count=(/ nvert,ncell /)) 
    13311302   
    1332 !         ncell=ncell+n 
    13331303         DEALLOCATE(lon,lat,bounds_lon,bounds_lat) 
    1334 !      END DO  
    13351304 
    13361305    ELSE IF (Field(ind_b)%field_type==field_Z) THEN 
     
    14161385        status = NF90_ENDDEF(ncid)       
    14171386 
    1418 !        ncell=1 
    1419 !        DO ind=ind_b,ind_e 
    1420 !          d=>domain_type(ind) 
    1421  
    1422 !          n=0 
    1423 !          DO j=d%jj_begin+1,d%jj_end 
    1424 !            DO i=d%ii_begin,d%ii_end-1 
    1425 !              n=n+1 
    1426 !            ENDDO 
    1427 !          ENDDO 
    1428 ! 
    1429 !          DO j=d%jj_begin,d%jj_end-1 
    1430 !            DO i=d%ii_begin+1,d%ii_end 
    1431 !              n=n+1 
    1432 !            ENDDO 
    1433 !          ENDDO 
    1434  
    1435 !         ALLOCATE(lon(n),lat(n),bounds_lon(0:nvert-1,n),bounds_lat(0:nvert-1,n)) 
    14361387         ALLOCATE(lon(ncell),lat(ncell),bounds_lon(0:nvert-1,ncell),bounds_lat(0:nvert-1,ncell)) 
    14371388           
     
    14461397               CALL xyz2lonlat(d%vertex(:,vdown,i,j),lon(n),lat(n)) 
    14471398               lon(n)=lon(n)*180/Pi 
    1448  !              IF (lon(n)<0) lon(n)=lon(n)+360 
    14491399               lat(n)=lat(n)*180/Pi 
    1450 !               CALL xyz2lonlat(xyz_i(nij,:)/radius,bounds_lon(0,n), bounds_lat(0,n)) 
    1451 !               CALL xyz2lonlat(xyz_i(nij+t_ldown,:)/radius,bounds_lon(1,n), bounds_lat(1,n)) 
    1452 !               CALL xyz2lonlat(xyz_i(nij+t_rdown,:)/radius,bounds_lon(2,n), bounds_lat(2,n)) 
    14531400 
    14541401               CALL xyz2lonlat(d%xyz(:,i,j),bounds_lon(0,n), bounds_lat(0,n)) 
     
    14591406                 bounds_lat(k,n)=bounds_lat(k,n)*180/Pi 
    14601407                 bounds_lon(k,n)=bounds_lon(k,n)*180/Pi 
    1461 !                IF (bounds_lon(k,n)<0) bounds_lon(k,n)=bounds_lon(k,n)+360 
    14621408               ENDDO 
    14631409             ENDDO 
     
    14681414               nij=(j-1)*d%iim+i 
    14691415               n=n+1 
    1470 !              CALL xyz2lonlat(xyz_v(nij+z_up,:)/radius,lon(n),lat(n)) 
    14711416               CALL xyz2lonlat(d%vertex(:,vup,i,j),lon(n),lat(n)) 
    14721417               lon(n)=lon(n)*180/Pi 
    1473 !              IF (lon(n)<0) lon(n)=lon(n)+360 
    14741418               lat(n)=lat(n)*180/Pi 
    1475 !              CALL xyz2lonlat(xyz_i(nij,:)/radius,bounds_lon(0,n), bounds_lat(0,n)) 
    1476 !              CALL xyz2lonlat(xyz_i(nij+t_rup,:)/radius,bounds_lon(1,n), bounds_lat(1,n)) 
    1477 !              CALL xyz2lonlat(xyz_i(nij+t_lup,:)/radius,bounds_lon(2,n), bounds_lat(2,n)) 
    14781419               CALL xyz2lonlat(d%xyz(:,i,j),bounds_lon(0,n), bounds_lat(0,n)) 
    14791420               CALL xyz2lonlat(d%xyz(:,i,j+1),bounds_lon(1,n), bounds_lat(1,n)) 
     
    14831424                 bounds_lat(k,n)=bounds_lat(k,n)*180/Pi 
    14841425                 bounds_lon(k,n)=bounds_lon(k,n)*180/Pi 
    1485 !                 IF (bounds_lon(k,n)<0) bounds_lon(k,n)=bounds_lon(k,n)+360 
    14861426               ENDDO 
    14871427             ENDDO 
     
    14941434         status=NF90_PUT_VAR(ncid,bounds_latId,REAL(bounds_lat,r8),start=(/ 1,1 /),count=(/ nvert,ncell /)) 
    14951435   
    1496 !          ncell=ncell+n 
    14971436          DEALLOCATE(lon,lat,bounds_lon,bounds_lat) 
    1498 !      END DO           
    1499     ENDIF 
    1500  
    1501  
    1502        
    1503 !      status = NF90_CLOSE(ncid) 
     1437      ENDIF 
     1438 
    15041439 
    15051440    END SUBROUTINE Create_Header_gen 
     
    17831718              CALL xyz2lonlat(xyz_v(nij+z_down,:)/radius,lon(n),lat(n)) 
    17841719              lon(n)=lon(n)*180/Pi 
    1785  !             IF (lon(n)<0) lon(n)=lon(n)+360 
    17861720              lat(n)=lat(n)*180/Pi 
    17871721              CALL xyz2lonlat(xyz_i(nij,:)/radius,bounds_lon(0,n), bounds_lat(0,n)) 
     
    17921726                bounds_lat(k,n)=bounds_lat(k,n)*180/Pi 
    17931727                bounds_lon(k,n)=bounds_lon(k,n)*180/Pi 
    1794 !                IF (bounds_lon(k,n)<0) bounds_lon(k,n)=bounds_lon(k,n)+360 
    17951728              ENDDO 
    17961729            ENDDO 
     
    18031736              CALL xyz2lonlat(xyz_v(nij+z_up,:)/radius,lon(n),lat(n)) 
    18041737              lon(n)=lon(n)*180/Pi 
    1805 !              IF (lon(n)<0) lon(n)=lon(n)+360 
    18061738              lat(n)=lat(n)*180/Pi 
    18071739              CALL xyz2lonlat(xyz_i(nij,:)/radius,bounds_lon(0,n), bounds_lat(0,n)) 
     
    18121744                bounds_lat(k,n)=bounds_lat(k,n)*180/Pi 
    18131745                bounds_lon(k,n)=bounds_lon(k,n)*180/Pi 
    1814 !                IF (bounds_lon(k,n)<0) bounds_lon(k,n)=bounds_lon(k,n)+360 
    18151746              ENDDO 
    18161747            ENDDO 
     
    18291760 
    18301761 
    1831        
    1832 !      status = NF90_CLOSE(ncid) 
    1833  
    1834     end subroutine Create_Header_mpi   
     1762   END SUBROUTINE Create_Header_mpi   
    18351763    
    18361764   SUBROUTINE Close_files 
Note: See TracChangeset for help on using the changeset viewer.