Changeset 350


Ignore:
Timestamp:
08/02/15 00:53:35 (9 years ago)
Author:
dubos
Message:

Move geopotential to timeloop, prepare for prognostic geopotential (NH)

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

Legend:

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

    r251 r350  
    3131  END SUBROUTINE init_caldyn 
    3232 
    33   SUBROUTINE caldyn_BC(f_phis, f_wflux) 
     33  SUBROUTINE caldyn_BC(f_phis, f_geopot, f_wflux) 
    3434    USE caldyn_gcm_mod, ONLY : caldyn_gcm_BC=>caldyn_BC 
    3535    IMPLICIT NONE 
    36     TYPE(t_field), POINTER :: f_phis(:), f_wflux(:) 
     36    TYPE(t_field), POINTER :: f_phis(:), f_geopot(:), f_wflux(:) 
    3737    SELECT CASE (TRIM(caldyn_type)) 
    3838    CASE('gcm') 
    39        CALL caldyn_gcm_BC(f_phis, f_wflux) 
     39       CALL caldyn_gcm_BC(f_phis, f_geopot, f_wflux) 
    4040    END SELECT 
    4141  END SUBROUTINE caldyn_BC 
    4242   
    4343  SUBROUTINE caldyn(write_out,f_phis, f_ps, f_mass, f_theta_rhodz, f_u, f_q, & 
    44        f_hflux, f_wflux, f_dps, f_dmass, f_dtheta_rhodz, f_du) 
     44       f_geopot, f_hflux, f_wflux, f_dps, f_dmass, f_dtheta_rhodz, f_du) 
    4545  USE icosa 
    4646  USE caldyn_gcm_mod, ONLY : caldyn_gcm=>caldyn 
     
    5454  TYPE(t_field),POINTER :: f_u(:) 
    5555  TYPE(t_field),POINTER :: f_q(:) 
     56  TYPE(t_field),POINTER :: f_geopot(:) 
    5657  TYPE(t_field),POINTER :: f_hflux(:) 
    5758  TYPE(t_field),POINTER :: f_wflux(:) 
     
    6465      CASE('gcm') 
    6566        CALL caldyn_gcm(write_out,f_phis, f_ps, f_mass, f_theta_rhodz, f_u, f_q, & 
    66              f_hflux, f_wflux, f_dps, f_dmass, f_dtheta_rhodz, f_du) 
     67             f_geopot, f_hflux, f_wflux, f_dps, f_dmass, f_dtheta_rhodz, f_du) 
    6768      CASE('adv') 
    6869        CALL caldyn_adv(write_out,f_phis, f_ps, f_theta_rhodz, f_u, f_q, & 
  • codes/icosagcm/trunk/src/caldyn_gcm.f90

    r349 r350  
    22  USE icosa 
    33  USE transfert_mod 
     4  IMPLICIT NONE 
    45  PRIVATE 
    56 
     
    1516  TYPE(t_field),POINTER :: f_theta(:) 
    1617  TYPE(t_field),POINTER :: f_pk(:) 
    17   TYPE(t_field),POINTER :: f_geopot(:) 
    1818  TYPE(t_field),POINTER :: f_wwuu(:) 
    1919  TYPE(t_field),POINTER :: f_planetvel(:) 
     
    8383    CALL allocate_field(f_theta, field_t,type_real,llm,  name='theta')   ! potential temperature 
    8484    CALL allocate_field(f_pk,    field_t,type_real,llm,  name='pk') 
    85     CALL allocate_field(f_geopot,field_t,type_real,llm+1,name='geopot')  ! geopotential 
    8685    CALL allocate_field(f_wwuu,  field_u,type_real,llm+1,name='wwuu') 
    8786    CALL allocate_field(f_planetvel,  field_u,type_real, name='planetvel') ! planetary velocity at r=a 
     
    8988  END SUBROUTINE allocate_caldyn 
    9089 
    91   SUBROUTINE caldyn_BC(f_phis, f_wflux) 
     90  SUBROUTINE caldyn_BC(f_phis, f_geopot, f_wflux) 
    9291    USE icosa 
    9392    USE mpipara 
    9493    USE omp_para 
    95     IMPLICIT NONE 
    9694    TYPE(t_field),POINTER :: f_phis(:) 
     95    TYPE(t_field),POINTER :: f_geopot(:) 
    9796    TYPE(t_field),POINTER :: f_wflux(:) 
    9897    REAL(rstd),POINTER  :: phis(:) 
     
    133132    
    134133  SUBROUTINE caldyn(write_out,f_phis, f_ps, f_mass, f_theta_rhodz, f_u, f_q, & 
    135        f_hflux, f_wflux, f_dps, f_dmass, f_dtheta_rhodz, f_du) 
     134       f_geopot, f_hflux, f_wflux, f_dps, f_dmass, f_dtheta_rhodz, f_du) 
    136135    USE icosa 
    137136    USE disvert_mod, ONLY : caldyn_eta, eta_mass 
     
    153152    TYPE(t_field),POINTER :: f_u(:) 
    154153    TYPE(t_field),POINTER :: f_q(:) 
     154    TYPE(t_field),POINTER :: f_geopot(:) 
    155155    TYPE(t_field),POINTER :: f_hflux(:), f_wflux(:) 
    156156    TYPE(t_field),POINTER :: f_dps(:) 
     
    329329  INTEGER :: ij 
    330330  DO ij=ij_begin_ext,ij_end_ext 
    331      ulon(ij+u_right)=a*omega*cos(lat_e(ij+u_right)) 
     331     ulon(ij+u_right)=radius*omega*cos(lat_e(ij+u_right)) 
    332332     ulat(ij+u_right)=0 
    333333 
    334      ulon(ij+u_lup)=a*omega*cos(lat_e(ij+u_lup)) 
     334     ulon(ij+u_lup)=radius*omega*cos(lat_e(ij+u_lup)) 
    335335     ulat(ij+u_lup)=0 
    336336 
    337      ulon(ij+u_ldown)=a*omega*cos(lat_e(ij+u_ldown)) 
     337     ulon(ij+u_ldown)=radius*omega*cos(lat_e(ij+u_ldown)) 
    338338     ulat(ij+u_ldown)=0 
    339339  END DO 
     
    959959         f_buf_i(:), f_buf_v(:), f_buf_i3(:), f_buf1_i(:), f_buf2_i(:), f_buf_s(:), f_buf_p(:) 
    960960     
    961     REAL(rstd) :: out_pression_lev 
     961    REAL(rstd) :: out_pression_level 
    962962    CHARACTER(LEN=255) :: str_pression 
    963963    CHARACTER(LEN=255) :: physics_type 
    964964     
    965     out_pression_level=0 
     965    out_pression_level=0. 
    966966    CALL getin("out_pression_level",out_pression_level)  
    967967    WRITE(str_pression,*) INT(out_pression_level/100) 
     
    10151015    CALL thetarhodz2geopot(f_ps,f_phis,f_theta_rhodz, f_buf_s,f_buf_p,f_buf1_i,f_buf2_i,f_buf_i) 
    10161016    CALL writefield("p",f_buf_p) 
    1017     CALL writefield("phi",f_geopot)   ! geopotential 
     1017!    CALL writefield("phi",f_geopot)   ! geopotential 
    10181018    CALL writefield("theta",f_buf1_i) ! potential temperature 
    10191019    CALL writefield("pk",f_buf2_i)    ! Exner pressure 
  • codes/icosagcm/trunk/src/field.f90

    r295 r350  
    11MODULE field_mod 
    22  USE genmod 
     3  IMPLICIT NONE 
    34   
    45  INTEGER,PARAMETER :: field_T=1 
     
    4344  END INTERFACE 
    4445 
     46  PRIVATE :: allocate_field_ 
    4547 
    4648CONTAINS 
     
    4951  USE domain_mod 
    5052  USE omp_para 
    51   IMPLICIT NONE 
    5253    TYPE(t_field),POINTER :: field(:) 
     54    INTEGER,INTENT(IN) :: field_type 
     55    INTEGER,INTENT(IN) :: data_type 
     56    INTEGER,OPTIONAL :: dim1,dim2 
     57    CHARACTER(*), OPTIONAL :: name 
     58!$OMP BARRIER 
     59!$OMP MASTER 
     60    ALLOCATE(field(ndomain)) 
     61!$OMP END MASTER 
     62!$OMP BARRIER 
     63    CALL allocate_field_(field,field_type,data_type,dim1,dim2,name) 
     64  END SUBROUTINE allocate_field 
     65 
     66  SUBROUTINE allocate_fields(nfield,field,field_type,data_type,dim1,dim2,name) 
     67  USE domain_mod 
     68  USE omp_para 
     69    INTEGER,INTENT(IN) :: nfield 
     70    TYPE(t_field),POINTER :: field(:,:) 
     71    INTEGER,INTENT(IN) :: field_type 
     72    INTEGER,INTENT(IN) :: data_type 
     73    INTEGER,OPTIONAL :: dim1,dim2 
     74    CHARACTER(*), OPTIONAL :: name 
     75    INTEGER :: i 
     76!$OMP BARRIER 
     77!$OMP MASTER 
     78    ALLOCATE(field(ndomain,nfield)) 
     79!$OMP END MASTER 
     80!$OMP BARRIER 
     81    DO i=1,nfield 
     82       CALL allocate_field_(field(:,i),field_type,data_type,dim1,dim2,name) 
     83    END DO 
     84  END SUBROUTINE allocate_fields 
     85 
     86  SUBROUTINE allocate_field_(field,field_type,data_type,dim1,dim2,name) 
     87  USE domain_mod 
     88  USE omp_para 
     89  IMPLICIT NONE 
     90    TYPE(t_field) :: field(:) 
    5391    INTEGER,INTENT(IN) :: field_type 
    5492    INTEGER,INTENT(IN) :: data_type 
     
    5795    INTEGER :: ind 
    5896    INTEGER :: ii_size,jj_size 
    59  
    60 !$OMP BARRIER 
    61 !$OMP MASTER 
    62     ALLOCATE(field(ndomain)) 
    63 !$OMP END MASTER 
    64 !$OMP BARRIER 
    6597 
    6698    DO ind=1,ndomain 
     
    115147!$OMP BARRIER 
    116148    
    117   END SUBROUTINE allocate_field 
     149 END SUBROUTINE allocate_field_ 
    118150 
    119151  SUBROUTINE allocate_field_glo(field,field_type,data_type,dim1,dim2,name) 
     
    181213 
    182214  SUBROUTINE deallocate_field(field) 
     215    USE domain_mod 
     216    USE omp_para 
     217    IMPLICIT NONE 
     218    TYPE(t_field),POINTER :: field(:) 
     219    !$OMP BARRIER 
     220    CALL deallocate_field_(field) 
     221    !$OMP BARRIER 
     222    !$OMP MASTER 
     223    DEALLOCATE(field) 
     224    !$OMP END MASTER 
     225    !$OMP BARRIER 
     226  END SUBROUTINE deallocate_field 
     227   
     228  SUBROUTINE deallocate_fields(field) 
     229    USE domain_mod 
     230    USE omp_para 
     231    IMPLICIT NONE 
     232    TYPE(t_field),POINTER :: field(:,:) 
     233    INTEGER :: i 
     234    !$OMP BARRIER 
     235    DO i=1,SIZE(field,2) 
     236       CALL deallocate_field_(field(:,i)) 
     237    END DO 
     238    !$OMP BARRIER 
     239    !$OMP MASTER 
     240    DEALLOCATE(field) 
     241    !$OMP END MASTER 
     242    !$OMP BARRIER 
     243  END SUBROUTINE deallocate_fields 
     244 
     245  SUBROUTINE deallocate_field_(field) 
    183246  USE domain_mod 
    184247  USE omp_para 
    185248  IMPLICIT NONE 
    186     TYPE(t_field),POINTER :: field(:) 
     249    TYPE(t_field) :: field(:) 
    187250    INTEGER :: data_type 
    188251    INTEGER :: ind 
    189  
    190 !$OMP BARRIER 
    191252    DO ind=1,ndomain 
    192253      IF (.NOT. assigned_domain(ind)  .OR. .NOT. is_omp_level_master) CYCLE 
     
    209270       
    210271   ENDDO 
    211 !$OMP BARRIER 
    212 !$OMP MASTER 
    213    DEALLOCATE(field) 
    214 !$OMP END MASTER 
    215 !$OMP BARRIER 
    216         
    217   END SUBROUTINE deallocate_field 
     272  END SUBROUTINE deallocate_field_ 
    218273 
    219274  SUBROUTINE deallocate_field_glo(field) 
  • codes/icosagcm/trunk/src/timeloop_gcm.f90

    r347 r350  
    22  USE transfert_mod 
    33  USE icosa 
     4  IMPLICIT NONE 
    45  PRIVATE 
    56   
     
    1314  TYPE(t_message),SAVE :: req_ps0, req_mass0, req_theta_rhodz0, req_u0, req_q0 
    1415 
     16  TYPE(t_field),POINTER,SAVE :: f_geopot(:) 
    1517  TYPE(t_field),POINTER,SAVE :: f_q(:) 
    1618  TYPE(t_field),POINTER,SAVE :: f_rhodz(:), f_mass(:), f_massm1(:), f_massm2(:), f_dmass(:) 
     
    4345  USE theta2theta_rhodz_mod 
    4446  USE sponge_mod 
    45   IMPLICIT NONE 
    46  
    47     CHARACTER(len=255) :: def 
     47 
     48  CHARACTER(len=255) :: def 
    4849 
    4950 
     
    5859! Model state at current time step (RK/MLF/Euler) 
    5960    CALL allocate_field(f_ps,field_t,type_real, name='ps') 
     61    CALL allocate_field(f_geopot,field_t,type_real,llm+1,name='geopot') 
    6062    CALL allocate_field(f_mass,field_t,type_real,llm,name='mass') 
    6163    CALL allocate_field(f_u,field_u,type_real,llm,name='u') 
     
    189191    
    190192    CALL switch_omp_distrib_level 
    191     CALL caldyn_BC(f_phis, f_wflux) ! set constant values in first/last interfaces 
     193    CALL caldyn_BC(f_phis, f_geopot, f_wflux) ! set constant values in first/last interfaces 
    192194     
    193195!$OMP BARRIER 
     
    251253       CALL caldyn((stage==1) .AND. (MOD(it,itau_out)==0), & 
    252254            f_phis,f_ps,f_mass,f_theta_rhodz,f_u, f_q, & 
    253             f_hflux, f_wflux, f_dps, f_dmass, f_dtheta_rhodz, f_du) 
     255            f_geopot, f_hflux, f_wflux, f_dps, f_dmass, f_dtheta_rhodz, f_du) 
    254256!       CALL checksum(f_dps) 
    255257!       CALL checksum(f_dtheta_rhodz) 
Note: See TracChangeset for help on using the changeset viewer.